Ok. Is there anything I could do now to workaround this? The only thing worked for me so far was to periodically go through discovered hosts and remove duplicate entries.
Thanks! Konstantin. > On Oct 26, 2017, at 07:18, Lukas Zapletal <[email protected]> wrote: > > Ok this confirms it. http://projects.theforeman.org/issues/21479 we will fix > later. > > We don't have an unique index on DB level, just in Rails level and a second > NIC with same MAC can sneak in. The relevant code in core is: > > validate :mac_uniqueness, :if => Proc.new { |nic| nic.managed? && > nic.host && nic.host.managed? && !nic.host.compute? && !nic.virtual? && > nic.mac.present? } > > which will not trigger for Discovery at all (host is not managed). In > discovery we try to search for existing host and if not found, we will create > new discovered host. This does not work correctly, we have turned off > validator for some reason: > > host.save(:validate => false) if host.new_record? > > So the validation for uniqueness won't hit. > > >> On Wed, Oct 25, 2017 at 6:50 PM, 'Konstantin Orekhov' via Foreman users >> <[email protected]> wrote: >> >>> >>> Please use foreman-rake (I assume this is a packaged .deb install). >>> >> >> This is CentOS7 install and foreman-rake did work. Here's the result: >> >> [root@spc01 ~]# cd ~foreman >> [root@spc01 foreman]# foreman-rake console >> Successfully encrypted field for Setting::Auth oauth_consumer_key >> Successfully decrypted field for Setting::Auth oauth_consumer_key >> Successfully decrypted field for Setting::Auth oauth_consumer_key >> Successfully decrypted field for Setting::Auth oauth_consumer_key >> Successfully decrypted field for Setting::Auth oauth_consumer_key >> Successfully encrypted field for Setting::Auth oauth_consumer_secret >> Successfully decrypted field for Setting::Auth oauth_consumer_secret >> Successfully decrypted field for Setting::Auth oauth_consumer_secret >> Successfully decrypted field for Setting::Auth oauth_consumer_secret >> Successfully decrypted field for Setting::Auth oauth_consumer_secret >> /usr/share/foreman/lib/tasks/console.rake:6: warning: already initialized >> constant ARGV >> For some operations a user must be set, try User.current = User.first >> Loading production environment (Rails 4.2.5.1) >> Failed to load console gems, starting anyway >> irb(main):001:0> ::Nic::Managed.where(:mac => "b4:99:ba:aa:4b:64", :primary >> => true) >> => #<ActiveRecord::Relation [#<Nic::Managed id: 619163, mac: >> "b4:99:ba:aa:4b:64", ip: "10.8.161.191", type: "Nic::Managed", name: >> "macb499baaa4b64", host_id: 458555, subnet_id: nil, domain_id: nil, attrs: >> {"netmask"=>"255..255.255.0", "mtu"=>"1500", "network"=>"10.8.161.0", >> "speed"=>"1000", "duplex"=>"full", "port"=>"Twisted Pair", >> "auto_negotiation"=>"true", "wol"=>true}, created_at: "2017-10-20 03:44:00", >> updated_at: "2017-10-20 03:44:02", provider: nil, username: nil, password: >> nil, virtual: false, link: true, identifier: "eth0", tag: "", attached_to: >> "", managed: true, mode: "balance-rr", attached_devices: "", bond_options: >> "", primary: true, provision: true, compute_attributes: {}, execution: true, >> ip6: nil, subnet6_id: nil>]> >> irb(main):002:0> >> >> However, just as in my previous example, DB has 2 different IDs with that >> MAC: >> >> [root@spc01 ~]# mysql -u foreman -p$DB_PASS foreman -e "SELECT * FROM hosts >> WHERE type = 'Host::Discovered' and NAME = 'macb499baaa4b64'\G;" >> *************************** 1. row *************************** >> id: 430926 >> name: macb499baaa4b64 >> last_compile: NULL >> last_report: 2017-09-30 06:56:07 >> updated_at: 2017-09-30 06:56:09 >> created_at: 2017-03-17 14:09:15 >> root_pass: NULL >> architecture_id: NULL >> operatingsystem_id: NULL >> environment_id: NULL >> ptable_id: NULL >> medium_id: NULL >> build: 0 >> comment: NULL >> disk: NULL >> installed_at: NULL >> model_id: 7 >> >> hostgroup_id: NULL >> owner_id: 10 >> owner_type: User >> enabled: 1 >> puppet_ca_proxy_id: NULL >> managed: 0 >> use_image: NULL >> image_file: NULL >> uuid: NULL >> compute_resource_id: NULL >> puppet_proxy_id: NULL >> certname: NULL >> image_id: NULL >> organization_id: NULL >> location_id: NULL >> type: Host::Discovered >> otp: NULL >> realm_id: NULL >> compute_profile_id: NULL >> provision_method: NULL >> grub_pass: >> global_status: 0 >> lookup_value_matcher: NULL >> discovery_rule_id: NULL >> salt_proxy_id: NULL >> salt_environment_id: NULL >> pxe_loader: NULL >> *************************** 2. row *************************** >> id: 458555 >> name: macb499baaa4b64 >> last_compile: NULL >> last_report: 2017-10-25 16:47:08 >> updated_at: 2017-10-25 16:47:09 >> created_at: 2017-10-20 03:44:00 >> >> root_pass: NULL >> architecture_id: NULL >> operatingsystem_id: NULL >> environment_id: NULL >> ptable_id: NULL >> medium_id: NULL >> build: 0 >> comment: NULL >> disk: NULL >> installed_at: NULL >> model_id: NULL >> hostgroup_id: NULL >> owner_id: NULL >> owner_type: NULL >> enabled: 1 >> puppet_ca_proxy_id: NULL >> managed: 0 >> use_image: NULL >> image_file: NULL >> uuid: NULL >> compute_resource_id: NULL >> puppet_proxy_id: NULL >> certname: NULL >> image_id: NULL >> organization_id: NULL >> location_id: NULL >> type: Host::Discovered >> otp: NULL >> realm_id: NULL >> compute_profile_id: NULL >> provision_method: NULL >> grub_pass: >> global_status: 0 >> lookup_value_matcher: NULL >> discovery_rule_id: NULL >> salt_proxy_id: NULL >> salt_environment_id: NULL >> pxe_loader: NULL >> [root@spc01 ~]# >> >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Foreman users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at https://groups.google.com/group/foreman-users. >> For more options, visit https://groups.google.com/d/optout. > > > > -- > Later, > Lukas @lzap Zapletal > -- > You received this message because you are subscribed to a topic in the Google > Groups "Foreman users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/foreman-users/xGZvRqHbWcA/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/foreman-users. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Foreman users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/foreman-users. For more options, visit https://groups.google.com/d/optout.
