
Capataz Versión 1.6.3
Cuando intento editar uno de mis hosts (cambiar grupo de hosts), aparece el siguiente error:
ActiveRecord::RecordInvalid
Validation failed: Match has already been taken
app/models/concerns/host_common.rb:48:in `block in lookup_values_attributes='
app/models/concerns/host_common.rb:41:in `each_value'
app/models/concerns/host_common.rb:41:in `lookup_values_attributes='
app/controllers/hosts_controller.rb:113:in `block in update'
app/models/taxonomy.rb:52:in `block in no_taxonomy_scope'
app/models/taxonomy.rb:59:in `block (2 levels) in as_taxonomy'
app/models/concerns/foreman/thread_session.rb:148:in `as_location'
app/models/taxonomy.rb:58:in `block in as_taxonomy'
app/models/concerns/foreman/thread_session.rb:113:in `as_org'
app/models/taxonomy.rb:57:in `as_taxonomy'
app/models/taxonomy.rb:51:in `no_taxonomy_scope'
app/controllers/hosts_controller.rb:105:in `update'
app/models/concerns/foreman/thread_session.rb:33:in `clear_thread'
lib/middleware/catch_json_parse_errors.rb:9:in `call'
registro de producción:
Started PUT "/hosts/puppet-app01" for 10.10.10.24 at 2015-03-05 11:51:32 +0100
Processing by HostsController#update as */*
Parameters: {"utf8"=>"✓", "authenticity_token"=>"/IYvSEW5JWu2dasdadL1Z/6fpjeMLojOFc0I+BIfY=", "host"=>{"name"=>"puppet-app01", "hostgroup_id"=>"", "environment_id"=>"7", "puppet_ca_proxy_id"=>"1", "puppet_proxy_id"=>"2", "config_group_ids"=>[""], "puppetclass_ids"=>["", "339", "293", "348", "349"], "managed"=>"f", "progress_report_id"=>"[FILTERED]", "lookup_values_attributes"=>"[FILTERED]", "is_owned_by"=>"5-Users", "enabled"=>"1", "comment"=>"", "overwrite"=>"false"}, "id"=>"puppet-app01"}
Operation FAILED: Validation failed: Match has already been taken
Rendered common/500.html.erb (3.7ms)
Completed 500 Internal Server Error in 25ms (Views: 4.3ms | ActiveRecord: 3.5ms)
Recibo el mismo error cada vez que intento editar cualquier parámetro en este host. Comenzó a suceder después de que asigné una clase y la eliminé de este host.
Este es mi entorno de producción y debo solucionarlo lo antes posible.
¿Algunas ideas?
Respuesta1
Ahora estoy más que seguro de que mi pregunta no era nada tonta y el comentario de jmp242 no era más que una tonta propuesta de solución. ¡Sin ofender! :P De todos modos, fue mi culpa, SIN EMBARGO, causada por un comportamiento extraño de la interfaz web de Foreman.
Estaba configurando 2 comparadores en 3 parámetros en una clase para 2 anfitriones. Configuré el primero para ambos hosts, luego el segundo y el tercero. Cuando volví al primer parámetro sólo para ver si todo estaba bien antes de enviar los cambios, descubrí que está configurado solo para un host y no para ambos. Entonces, ¿qué he hecho? Lo configuré una vez más :)
¡Ese fue "mi" error! Estaba depurando este caso comparando en modo de depuración la misma solicitud en dos hosts, el malo y el bueno. Descubrí que en el caso malo comienza la transacción de "validación" y se está revirtiendo. Ejecuto manualmente cada consulta de selección que se ejecutó y descubrí que esta me devuelve 1 fila en lugar de 0:
SELECT 1 AS one FROM "lookup_values" WHERE ("lookup_values"."match" = 'fqdn=puppet-app01' AND "lookup_values"."id" != 39 AND "lookup_values"."lookup_key_id" = 1153) LIMIT 1;
Verifiqué qué es qué y de esa manera descubrí que había un conflicto en los parámetros de clase. De todos modos, cuando voy a las clases de Puppet - MyClass - Smart Class Parameters - MyParam, ¡veo un comparador! Luego hago clic en otro parámetro y vuelvo al primero; veo ambos :) Es extraño, ¿no es así? :)