1.16 duplicate ethN interfaces & dotted vlan interface missing from nics table

Hi all,

I’m having an issue with Foreman 1.16: duplicate ethN interfaces appear in the UI which makes provisioning painful - one has to be renamed before build can commence. Also dot notation vlan bonded interfaces do not show in the UI and do not get created in the database

I would expect to see the interfaces updated when facts are imported so that both ethN interfaces are correct (see db output below) and so that the dotted bonded vlan interface appears with it’s IP address

I’ve enabled debugging in foreman and can see the interfaces being saved - or at least I can see the SQL that believes it saves the interfaces, however the interfaces are not created in the database and there are no errors - in 1.15.6 there was an error about duplicate interfaces - which lead to a small discussion on IRC and the below bug - I beilieve this is fixed in 1.16, so perhaps this is something different or a relic left in the database that is preventing the update?

2018-01-02T15:01:02 1b33f7e5 [app] [D] Saving bond0.240 NIC for host mg1625.service0.mad1.bwcom.net
2018-01-02T15:01:02 1b33f7e5 [sql] [D]    (0.1ms)  BEGIN
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1]]
2018-01-02T15:01:02 1c21517d [sql] [D]   SQL (0.2ms)  UPDATE "fact_values" SET "value" = '1514904027', "updated_at" = '2018-01-02 15:01:02.087273' WHERE "fact_values"."id" = $1  [["id", 207664]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 2]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 3]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 4]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   CACHE (0.0ms)  SELECT  "domains".* FROM "domains" WHERE "domains"."id" = $1  ORDER BY domains.name LIMIT 1  [["id", 20]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 5]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 6]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Nic::Base Load (0.5ms)  SELECT "nics".* FROM "nics" WHERE "nics"."virtual" = $1 AND "nics"."managed" = $2 AND "nics"."mac" = $3  [["virtual", "f"], ["managed", "t"], ["mac", "0c:c4:7a:6e:de:7a"]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 7]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   CACHE (0.0ms)  SELECT  "domains".* FROM "domains" WHERE "domains"."id" = $1  ORDER BY domains.name LIMIT 1  [["id", 20]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 8]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Setting Load (0.2ms)  SELECT  "settings".* FROM "settings" WHERE "settings"."name" = $1  ORDER BY "settings"."name" ASC LIMIT 1  [["name", "token_duration"]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 589]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 590]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Taxonomy Exists (0.4ms)  SELECT  1 AS one FROM "taxonomies" INNER JOIN "taxable_taxonomies" ON "taxonomies"."id" = "taxable_taxonomies"."taxonomy_id" WHERE "taxable_taxonomies"."taxable_id" = $1 AND "taxable_taxonomies"."taxable_ty
pe" = $2 AND "taxonomies"."type" = $3 LIMIT 1  [["taxable_id", 3], ["taxable_type", "Subnet"], ["type", "Location"]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 591]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Taxonomy Exists (0.4ms)  SELECT  1 AS one FROM "taxonomies" INNER JOIN "taxable_taxonomies" ON "taxonomies"."id" = "taxable_taxonomies"."taxonomy_id" WHERE "taxable_taxonomies"."taxable_id" = $1 AND "taxable_taxonomies"."taxable_ty
pe" = $2 AND "taxonomies"."type" = $3 AND "taxonomies"."id" = $4 LIMIT 1  [["taxable_id", 3], ["taxable_type", "Subnet"], ["type", "Location"], ["id", 3]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 592]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Nic::Base Load (0.3ms)  SELECT "nics".* FROM "nics" WHERE "nics"."ip" = $1  [["ip", "10.1.240.32"]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Nic::Base Load (0.3ms)  SELECT "nics".* FROM "nics" WHERE "nics"."domain_id" = $1 AND "nics"."name" = $2  [["domain_id", 20], ["name", "mg1625.service0.mad1.bwcom.net"]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 593]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 594]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   CACHE (0.0ms)  SELECT  "domains".* FROM "domains" WHERE "domains"."id" = $1  ORDER BY domains.name LIMIT 1  [["id", 20]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 11]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   SmartProxy Load (0.2ms)  SELECT  "smart_proxies".* FROM "smart_proxies" WHERE "smart_proxies"."id" = $1  ORDER BY smart_proxies.name LIMIT 1  [["id", 2]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 595]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Medium Load (0.2ms)  SELECT  "media".* FROM "media" WHERE "media"."id" = $1  ORDER BY media.name LIMIT 1  [["id", 12]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 596]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   CACHE (0.0ms)  SELECT  "media".* FROM "media" WHERE "media"."id" = $1  ORDER BY media.name LIMIT 1  [["id", 12]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 597]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Architecture Load (0.2ms)  SELECT  "architectures".* FROM "architectures" WHERE "architectures"."id" = $1 LIMIT 1  [["id", 1]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   CACHE (0.0ms)  SELECT  "operatingsystems".* FROM "operatingsystems" WHERE "operatingsystems"."id" = $1  ORDER BY "operatingsystems"."title" ASC LIMIT 1  [["id", 10]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 598]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1036]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1037]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   SQL (0.4ms)  UPDATE "nics" SET "ip" = $1, "subnet_id" = $2, "identifier" = $3, "attrs" = $4, "updated_at" = $5 WHERE "nics"."id" = $6  [["ip", "10.1.240.32"], ["subnet_id", 3], ["identifier", "bond0.240"], ["attrs", "--- !ruby/hash
:ActiveSupport::HashWithIndifferentAccess\nmtu: 1500\nnetmask6: 'ffff:ffff:ffff:ffff::'\nnetmask: 255.255.255.0\nnetwork6: 'fe80::'\nnetwork: 10.1.240.0\n"], ["updated_at", "2018-01-02 15:01:02.130143"], ["id", 1362]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1038]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]    (0.5ms)  COMMIT
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1039]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]    (0.2ms)  SELECT COUNT(*) FROM "nics" WHERE "nics"."host_id" = $1 AND "nics"."mac" = $2 AND "nics"."virtual" = $3  [["host_id", 568], ["mac", "0c:c4:7a:6e:de:7a"], ["virtual", "f"]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Nic::Base Load (0.2ms)  SELECT  "nics".* FROM "nics" WHERE "nics"."host_id" = $1 AND "nics"."mac" = $2 AND "nics"."virtual" = $3  ORDER BY "nics"."identifier" ASC LIMIT 1  [["host_id", 568], ["mac", "0c:c4:7a:6e:de:7a"], ["virtual"
, "f"]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1040]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Subnet Load (0.2ms)  SELECT  "subnets".* FROM "subnets" WHERE "subnets"."id" = $1 AND "subnets"."type" = $2  ORDER BY vlanid LIMIT 1  [["id", 3], ["type", "Subnet::Ipv4"]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1041]]
2018-01-02T15:01:02 1c21517d [sql] [D]   FactName Load (0.2ms)  SELECT  "fact_names".* FROM "fact_names" WHERE "fact_names"."id" = $1  ORDER BY fact_names.name LIMIT 1  [["id", 1042]]
2018-01-02T15:01:02 1b33f7e5 [sql] [D]   Nic::Base Load (0.2ms)  SELECT "nics".* FROM "nics" WHERE "nics"."host_id" = $1 AND "nics"."attached_to" = $2 AND "nics"."virtual" = $3  ORDER BY "nics"."identifier" ASC  [["host_id", 568], ["attached_to", "bond0.240"], ["virtual",
 "t"]]
2018-01-02T15:01:02 1b33f7e5 [app] [D] Saving eth0 NIC for host mg1625.service0.mad1.bwcom.net
2018-01-02T15:01:02 1b33f7e5 [sql] [D]    (0.1ms)  BEGIN

Note the duplicated eth interface names and missing bond0.240 interface:

foreman=# select id,host_id,ip,mac,identifier,ip6 from nics where host_id=568;
  id  | host_id |     ip      |        mac        | identifier | ip6
------+---------+-------------+-------------------+------------+-----
 1367 |     568 |             | 0c:c4:7a:6e:de:7a | bond0      |
 1363 |     568 |             | 0c:c4:7a:6e:de:7b | eth1       |
 1362 |     568 |             | 0c:c4:7a:6e:de:7a | eth1       |
 1364 |     568 | 10.1.120.77 | 0c:c4:7a:ae:82:54 | ipmi       |
(4 rows)

Bug #17895: Foreman stores link local IPv6 address - Foreman

I’d like to know if there is an easy way to run the SQL that foreman spits to the debug log so that I can manually try the update in an effort to see why the update is not successful?

Thanks!