foreman_netbox 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +50 -0
  4. data/Rakefile +50 -0
  5. data/app/contracts/foreman_netbox/device_contract.rb +42 -0
  6. data/app/contracts/foreman_netbox/params/interface_params.rb +16 -0
  7. data/app/contracts/foreman_netbox/params/ip_address_params.rb +15 -0
  8. data/app/contracts/foreman_netbox/params/tenant_params.rb +13 -0
  9. data/app/contracts/foreman_netbox/virtual_machine_contract.rb +29 -0
  10. data/app/interactors/foreman_netbox/concerns/facts.rb +11 -0
  11. data/app/interactors/foreman_netbox/concerns/primary_ips.rb +25 -0
  12. data/app/interactors/foreman_netbox/delete_host/delete_device.rb +20 -0
  13. data/app/interactors/foreman_netbox/delete_host/delete_virtual_machine.rb +20 -0
  14. data/app/interactors/foreman_netbox/delete_host/organizer.rb +12 -0
  15. data/app/interactors/foreman_netbox/sync_host/organizer.rb +35 -0
  16. data/app/interactors/foreman_netbox/sync_host/sync_device/create.rb +36 -0
  17. data/app/interactors/foreman_netbox/sync_host/sync_device/find.rb +41 -0
  18. data/app/interactors/foreman_netbox/sync_host/sync_device/organizer.rb +30 -0
  19. data/app/interactors/foreman_netbox/sync_host/sync_device/save_netbox_url.rb +29 -0
  20. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_role/create.rb +32 -0
  21. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_role/find.rb +28 -0
  22. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_role/organizer.rb +20 -0
  23. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/create.rb +34 -0
  24. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/find.rb +28 -0
  25. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/organizer.rb +22 -0
  26. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/sync_manufacturer/create.rb +34 -0
  27. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/sync_manufacturer/find.rb +40 -0
  28. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/sync_manufacturer/organizer.rb +22 -0
  29. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/update.rb +33 -0
  30. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/create.rb +37 -0
  31. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/delete.rb +36 -0
  32. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/find.rb +30 -0
  33. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/organizer.rb +23 -0
  34. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/create.rb +46 -0
  35. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/delete.rb +40 -0
  36. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/find.rb +32 -0
  37. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/organizer.rb +24 -0
  38. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/update.rb +39 -0
  39. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/update.rb +38 -0
  40. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_site/create.rb +32 -0
  41. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_site/find.rb +28 -0
  42. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_site/organizer.rb +25 -0
  43. data/app/interactors/foreman_netbox/sync_host/sync_device/sync_site/update.rb +35 -0
  44. data/app/interactors/foreman_netbox/sync_host/sync_device/update.rb +85 -0
  45. data/app/interactors/foreman_netbox/sync_host/sync_device/validate.rb +25 -0
  46. data/app/interactors/foreman_netbox/sync_host/sync_tenant/create.rb +30 -0
  47. data/app/interactors/foreman_netbox/sync_host/sync_tenant/find.rb +26 -0
  48. data/app/interactors/foreman_netbox/sync_host/sync_tenant/organizer.rb +19 -0
  49. data/app/interactors/foreman_netbox/sync_host/sync_tenant/update.rb +33 -0
  50. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/create.rb +34 -0
  51. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/find.rb +34 -0
  52. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/organizer.rb +28 -0
  53. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/save_netbox_url.rb +31 -0
  54. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/create.rb +35 -0
  55. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/find.rb +28 -0
  56. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/organizer.rb +22 -0
  57. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/sync_cluster_type/create.rb +34 -0
  58. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/sync_cluster_type/find.rb +32 -0
  59. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/sync_cluster_type/organizer.rb +22 -0
  60. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/update.rb +35 -0
  61. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/create.rb +33 -0
  62. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/delete.rb +36 -0
  63. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/find.rb +30 -0
  64. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/organizer.rb +23 -0
  65. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/create.rb +46 -0
  66. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/delete.rb +40 -0
  67. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/find.rb +28 -0
  68. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/organizer.rb +24 -0
  69. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/update.rb +39 -0
  70. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/update.rb +38 -0
  71. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/update.rb +82 -0
  72. data/app/interactors/foreman_netbox/sync_host/sync_virtual_machine/validate.rb +25 -0
  73. data/app/jobs/foreman_netbox/sync_host_job.rb +19 -0
  74. data/app/lib/foreman_netbox/api.rb +12 -0
  75. data/app/models/concerns/foreman_netbox/host_extensions.rb +27 -0
  76. data/app/models/concerns/foreman_netbox/location_extensions.rb +13 -0
  77. data/app/models/concerns/foreman_netbox/nic/base_extensions.rb +23 -0
  78. data/app/models/concerns/foreman_netbox/user_usergroup_common_extensions.rb +18 -0
  79. data/app/models/foreman_netbox/netbox_facet.rb +34 -0
  80. data/app/models/orchestration/netbox.rb +64 -0
  81. data/app/models/setting/netbox.rb +32 -0
  82. data/app/services/foreman_netbox/cached_netbox_parameters.rb +103 -0
  83. data/app/services/foreman_netbox/netbox_parameters.rb +185 -0
  84. data/app/services/foreman_netbox/netbox_parameters_comparator.rb +96 -0
  85. data/app/views/hosts/_netbox_tab.html.erb +28 -0
  86. data/config/routes.rb +4 -0
  87. data/db/migrate/20200527135812_create_netbox_facet.rb +12 -0
  88. data/db/migrate/20200604141933_add_sync_info_to_netbox_facet.rb +8 -0
  89. data/db/migrate/20200708093607_add_raw_data_to_netbox_facet.rb +7 -0
  90. data/lib/foreman_netbox.rb +6 -0
  91. data/lib/foreman_netbox/engine.rb +64 -0
  92. data/lib/foreman_netbox/version.rb +5 -0
  93. data/lib/tasks/foreman_netbox_tasks.rake +67 -0
  94. data/test/factories/host.rb +17 -0
  95. data/test/factories/netbox_facet.rb +17 -0
  96. data/test/fixtures/facts/k8s_physical_host.json +328 -0
  97. data/test/fixtures/facts/rhel_physical_host.json +512 -0
  98. data/test/fixtures/facts/rhel_virtual_host.json +455 -0
  99. data/test/fixtures/netbox_device_raw_data.json +330 -0
  100. data/test/fixtures/netbox_virtual_machine_raw_data.json +241 -0
  101. data/test/integration/foreman_netbox/sync_k8s_physical_host_test.rb +81 -0
  102. data/test/integration/foreman_netbox/sync_rhel_physical_host_test.rb +81 -0
  103. data/test/integration/foreman_netbox/sync_rhel_virtual_host_test.rb +93 -0
  104. data/test/interactors/foreman_netbox/sync_host/organizer_test.rb +78 -0
  105. data/test/interactors/foreman_netbox/sync_host/sync_device/create_test.rb +65 -0
  106. data/test/interactors/foreman_netbox/sync_host/sync_device/find_test.rb +105 -0
  107. data/test/interactors/foreman_netbox/sync_host/sync_device/save_netbox_url_test.rb +39 -0
  108. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_device_role/create_test.rb +45 -0
  109. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_device_role/find_test.rb +58 -0
  110. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/create_test.rb +55 -0
  111. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/find_test.rb +63 -0
  112. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/sync_manufacturer/create_test.rb +48 -0
  113. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/sync_manufacturer/find_test.rb +105 -0
  114. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_device_type/update_test.rb +54 -0
  115. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/create_test.rb +51 -0
  116. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/delete_test.rb +41 -0
  117. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/find_test.rb +53 -0
  118. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/create_test.rb +80 -0
  119. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/delete_test.rb +72 -0
  120. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/find_test.rb +51 -0
  121. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/sync_ip_addresses/update_test.rb +64 -0
  122. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_interfaces/update_test.rb +92 -0
  123. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_site/create_test.rb +51 -0
  124. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_site/find_test.rb +59 -0
  125. data/test/interactors/foreman_netbox/sync_host/sync_device/sync_site/update_test.rb +54 -0
  126. data/test/interactors/foreman_netbox/sync_host/sync_device/update_test.rb +188 -0
  127. data/test/interactors/foreman_netbox/sync_host/sync_tenant/create_test.rb +50 -0
  128. data/test/interactors/foreman_netbox/sync_host/sync_tenant/find_test.rb +58 -0
  129. data/test/interactors/foreman_netbox/sync_host/sync_tenant/update_test.rb +59 -0
  130. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/create_test.rb +74 -0
  131. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/find_test.rb +77 -0
  132. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/save_netbox_url_test.rb +39 -0
  133. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/create_test.rb +54 -0
  134. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/find_test.rb +58 -0
  135. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/sync_cluster_type/create_test.rb +50 -0
  136. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/sync_cluster_type/find_test.rb +65 -0
  137. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_cluster/update_test.rb +54 -0
  138. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/create_test.rb +53 -0
  139. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/delete_test.rb +37 -0
  140. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/find_test.rb +53 -0
  141. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/create_test.rb +80 -0
  142. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/delete_test.rb +73 -0
  143. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/find_test.rb +51 -0
  144. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/sync_ip_addresses/update_test.rb +64 -0
  145. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/sync_interfaces/update_test.rb +88 -0
  146. data/test/interactors/foreman_netbox/sync_host/sync_virtual_machine/update_test.rb +171 -0
  147. data/test/jobs/foreman_netbox/sync_host_job_test.rb +14 -0
  148. data/test/models/foreman_netbox/location_test.rb +42 -0
  149. data/test/models/foreman_netbox/netbox_facet_test.rb +219 -0
  150. data/test/models/foreman_netbox/nics/base_test.rb +81 -0
  151. data/test/models/foreman_netbox/usergroup_test.rb +23 -0
  152. data/test/models/host/managed_test.rb +63 -0
  153. data/test/services/foreman_netbox/netbox_attributes_test.rb +278 -0
  154. data/test/services/foreman_netbox/netbox_parameters_comparator_test.rb +136 -0
  155. data/test/test_plugin_helper.rb +25 -0
  156. metadata +343 -0
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ class NetboxParametersComparator
5
+ def self.call(old_hash, new_hash)
6
+ new(old_hash, new_hash).call
7
+ end
8
+
9
+ def initialize(old_hash, new_hash)
10
+ @old_hash = old_hash
11
+ @new_hash = new_hash
12
+ end
13
+
14
+ def call
15
+ keys_diff.deep_merge(diff_old)
16
+ .deep_merge(diff_new)
17
+ .compact
18
+ end
19
+
20
+ attr_reader :old_hash, :new_hash
21
+
22
+ private
23
+
24
+ def added_keys
25
+ new_hash.keys - old_hash.keys
26
+ end
27
+
28
+ def removed_keys
29
+ old_hash.keys - new_hash.keys
30
+ end
31
+
32
+ def keys_diff
33
+ result = {}
34
+
35
+ result[:added] = added_keys.each_with_object({}) { |key, memo| memo[key] = new_hash[key] } if added_keys.any?
36
+ result[:removed] = removed_keys.each_with_object({}) { |key, memo| memo[key] = old_hash[key] } if removed_keys.any?
37
+
38
+ result
39
+ end
40
+
41
+ def diff_old
42
+ old_hash.except(*removed_keys).each_with_object({}) do |(key, old_value), memo|
43
+ if old_value.is_a?(Hash)
44
+ new_value = new_hash.fetch(key, {})
45
+ diff = ForemanNetbox::NetboxParametersComparator.call(old_value, new_value)
46
+
47
+ next unless diff.keys.any?
48
+
49
+ memo[key] = diff
50
+ elsif old_value.is_a?(Array)
51
+ next unless !new_hash[key] && key != :tags
52
+
53
+ memo[key] = { added: [], removed: old_value }
54
+ else
55
+ new_value = new_hash.fetch(key, nil)
56
+
57
+ next if old_value == new_value
58
+
59
+ memo[key] = { old: old_value, new: new_value }
60
+ end
61
+ end.compact
62
+ end
63
+
64
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
65
+ def diff_new
66
+ new_hash.except(*added_keys).each_with_object({}) do |(key, new_value), memo|
67
+ if new_value.is_a?(Hash)
68
+ old_value = old_hash.fetch(key, {})
69
+
70
+ next if old_value == new_value
71
+
72
+ diff = ForemanNetbox::NetboxParametersComparator.call(old_value, new_value)
73
+
74
+ next unless diff.keys.any?
75
+
76
+ memo[key] = diff
77
+ elsif new_value.is_a?(Array)
78
+ old_value = old_hash.fetch(key, [])
79
+ added = new_value.reject { |item| old_value.find { |x| x == item } }
80
+ removed = key == :tags ? [] : old_value.reject { |item| new_value.find { |x| x == item } }
81
+
82
+ next unless added.any? || removed.any?
83
+
84
+ memo[key] = { added: added, removed: removed }
85
+ else
86
+ old_value = old_hash.fetch(key, nil)
87
+
88
+ next if old_value == new_value
89
+
90
+ memo[key] = { old: old_value, new: new_value }
91
+ end
92
+ end.compact
93
+ end
94
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
95
+ end
96
+ end
@@ -0,0 +1,28 @@
1
+ <table id="netbox_table" class="<%= table_css_classes %>">
2
+ <tr>
3
+ <td><%= _('Last Synchronization') %></td>
4
+ <td><%= date_time_relative(@host.netbox_facet.synchronized_at) %></td>
5
+ </tr>
6
+ <tr>
7
+ <td><%= _('Status') %></td>
8
+ <td>
9
+ <% if @host.netbox_facet.synchronization_success? %>
10
+ <%= icon_text('ok', '', kind: 'pficon') %>
11
+ <%= content_tag(:span, _('OK'), class: 'status-ok') %>
12
+ <% else %>
13
+ <%= icon_text('error-circle-o', '', kind: 'pficon') %>
14
+ <%= content_tag(:span, @host.netbox_facet.synchronization_error, class: 'status-error') %>
15
+ <% end %>
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td><%= _('Link') %></td>
20
+ <td>
21
+ <% if @host.netbox_facet.url %>
22
+ <%= link_to(@host.netbox_facet.url, @host.netbox_facet.url, target: :_blank) %>
23
+ <% else %>
24
+ <%= content_tag(:span, _('No Netbox object is associated with this host'), class: 'status-warn') %>
25
+ <% end %>
26
+ </td>
27
+ </tr>
28
+ </table>
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateNetboxFacet < ActiveRecord::Migration[5.2]
4
+ def change
5
+ create_table :netbox_facets do |t|
6
+ t.references :host, null: false, foreign_key: true, index: true, unique: true
7
+ t.string :url, unique: true
8
+
9
+ t.timestamps null: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddSyncInfoToNetboxFacet < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :netbox_facets, :synchronized_at, :datetime
6
+ add_column :netbox_facets, :synchronization_error, :string
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddRawDataToNetboxFacet < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :netbox_facets, :raw_data, :jsonb, default: {}
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'foreman_netbox/engine'
4
+
5
+ module ForemanNetbox
6
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-validation'
4
+ require 'netbox-client-ruby'
5
+ require 'interactor'
6
+
7
+ module ForemanNetbox
8
+ class Engine < ::Rails::Engine
9
+ engine_name 'foreman_netbox'
10
+
11
+ config.autoload_paths += Dir["#{config.root}/app/interactors"]
12
+
13
+ initializer 'foreman_netbox.load_default_settings', before: :load_config_initializers do
14
+ require_dependency File.expand_path('../../app/models/setting/netbox.rb', __dir__) if begin
15
+ Setting.table_exists?
16
+ rescue StandardError
17
+ (false)
18
+ end
19
+ end
20
+
21
+ # Add any db migrations
22
+ initializer 'foreman_netbox.load_app_instance_data' do |app|
23
+ ForemanNetbox::Engine.paths['db/migrate'].existent.each do |path|
24
+ app.config.paths['db/migrate'] << path
25
+ end
26
+ end
27
+
28
+ initializer 'foreman_netbox.register_plugin', :before => :finisher_hook do |_app|
29
+ Foreman::Plugin.register :foreman_netbox do
30
+ requires_foreman '>= 1.24'
31
+
32
+ # Netbox Facet
33
+ register_facet(ForemanNetbox::NetboxFacet, :netbox_facet) do
34
+ set_dependent_action :destroy
35
+ end
36
+
37
+ # extend host show page
38
+ extend_page('hosts/show') do |context|
39
+ context.add_pagelet :main_tabs,
40
+ name: N_('Netbox'),
41
+ partial: 'hosts/netbox_tab',
42
+ onlyif: proc { |host| host.netbox_facet.synchronized_at }
43
+ end
44
+
45
+ logger :import, enabled: true
46
+ end
47
+ end
48
+
49
+ config.to_prepare do
50
+ ::Host::Managed.include(ForemanNetbox::HostExtensions)
51
+ ::Location.include(ForemanNetbox::LocationExtensions)
52
+ ::Nic::Base.include(ForemanNetbox::Nic::BaseExtensions)
53
+ ::User.include(ForemanNetbox::UserUsergroupCommonExtensions)
54
+ ::Usergroup.include(ForemanNetbox::UserUsergroupCommonExtensions)
55
+
56
+ NetboxClientRuby.configure do |config|
57
+ config.netbox.api_base_url = Setting::Netbox['netbox_url']
58
+ config.netbox.auth.token = Setting::Netbox['netbox_api_token']
59
+ end
60
+ rescue StandardError => e
61
+ Rails.logger.warn "ForemanNetbox: skipping engine hook (#{e})\n#{e.backtrace.join("\n")}"
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ VERSION = '1.0.2'
5
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rake/testtask'
4
+
5
+ namespace :foreman_netbox do
6
+ namespace :sync do
7
+ desc 'Example Task'
8
+ task full: :environment do
9
+ User.as_anonymous_admin do
10
+ Host::Managed.where(managed: true).each do |host|
11
+ unless host.netbox_facet.netbox_params_diff.empty?
12
+ puts "Nothing to push for #{host.name}"
13
+ next
14
+ end
15
+
16
+ puts "Pushing #{host.name} to Netbox"
17
+ result = host.push_to_netbox
18
+
19
+ if result.success?
20
+ puts "#{host.name} pushed"
21
+ else
22
+ puts "Failed to push #{host.name}: #{result.error}"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ # Tests
31
+ namespace :test do
32
+ desc 'Test ForemanNetbox'
33
+ Rake::TestTask.new(:foreman_netbox) do |t|
34
+ test_dir = File.join(File.dirname(__FILE__), '../..', 'test')
35
+ t.libs << ['test', test_dir]
36
+ t.pattern = "#{test_dir}/**/*_test.rb"
37
+ t.verbose = true
38
+ t.warning = false
39
+ end
40
+ end
41
+
42
+ namespace :foreman_netbox do
43
+ task rubocop: :environment do
44
+ begin
45
+ require 'rubocop/rake_task'
46
+ RuboCop::RakeTask.new(:rubocop_foreman_netbox) do |task|
47
+ task.patterns = ["#{ForemanNetbox::Engine.root}/app/**/*.rb",
48
+ "#{ForemanNetbox::Engine.root}/lib/**/*.rb",
49
+ "#{ForemanNetbox::Engine.root}/test/**/*.rb"]
50
+ end
51
+ rescue StandardError
52
+ puts 'Rubocop not loaded.'
53
+ end
54
+
55
+ Rake::Task['rubocop_foreman_netbox'].invoke
56
+ end
57
+ end
58
+
59
+ Rake::Task[:test].enhance ['test:foreman_netbox']
60
+
61
+ load 'tasks/jenkins.rake'
62
+
63
+ # rubocop:disable Style/IfUnlessModifier
64
+ if Rake::Task.task_defined?(:'jenkins:unit')
65
+ Rake::Task['jenkins:unit'].enhance ['test:foreman_netbox', 'foreman_netbox:rubocop']
66
+ end
67
+ # rubocop:enable Style/IfUnlessModifier
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.modify do
4
+ factory :host do
5
+ trait :with_netbox_facet do
6
+ association :netbox_facet, factory: :netbox_facet, strategy: :build
7
+ end
8
+
9
+ trait :with_device_netbox_facet do
10
+ association :netbox_facet, factory: %i[netbox_facet with_device_raw_data]
11
+ end
12
+
13
+ trait :with_virtual_machine_netbox_facet do
14
+ association :netbox_facet, factory: %i[netbox_facet with_virtual_machine_raw_data]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :netbox_facet, class: 'ForemanNetbox::NetboxFacet' do
5
+ host
6
+ synchronized_at { Time.zone.now }
7
+ sequence(:url) { |n| "https://netbox.example.com/#{n}" }
8
+
9
+ trait :with_device_raw_data do
10
+ raw_data { JSON.parse(File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', 'netbox_device_raw_data.json'))) }
11
+ end
12
+
13
+ trait :with_virtual_machine_raw_data do
14
+ raw_data { JSON.parse(File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', 'netbox_virtual_machine_raw_data.json'))) }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,328 @@
1
+ {
2
+ "networking::interfaces::tunl0": null,
3
+ "networking::interfaces::tunl0::mtu": "1440",
4
+ "networking::interfaces::tunl0::network": "100.192.4.1",
5
+ "networking::interfaces::tunl0::netmask": "255.255.255.255",
6
+ "networking::interfaces::tunl0::ip": "100.192.4.1",
7
+ "networking::interfaces::tunl0::bindings": "[{\"address\"=>\"100.192.4.1\", \"netmask\"=>\"255.255.255.255\", \"network\"=>\"100.192.4.1\"}]",
8
+ "processors": null,
9
+ "os::release": null,
10
+ "os": null,
11
+ "networking::interfaces": null,
12
+ "networking::interfaces::bond0": null,
13
+ "networking": null,
14
+ "disks::sda": null,
15
+ "disks::nvme1n1": null,
16
+ "disks": null,
17
+ "disks::nvme0n1": null,
18
+ "productname": "PowerEdge R640",
19
+ "processors::isa": "x86_64",
20
+ "processors::models": "[\"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\", \"Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz\"]",
21
+ "processors::physicalcount": "2",
22
+ "processors::count": "80",
23
+ "os::release::patch": "0",
24
+ "os::release::minor": "5",
25
+ "os::release::major": "7",
26
+ "os::release::full": "7.5.1804",
27
+ "os::architecture": "x86_64",
28
+ "os::family": "RedHat",
29
+ "operatingsystemrelease": "1967.4.0",
30
+ "operatingsystemmajrelease": "1967",
31
+ "operatingsystem": "CoreOS",
32
+ "networking::primary": "bond0",
33
+ "networking::network6": "fe80::",
34
+ "networking::network": "172.22.255.0",
35
+ "networking::netmask6": "ffff:ffff:ffff:ffff::",
36
+ "networking::netmask": "255.255.255.0",
37
+ "networking::ip6": "fc00::",
38
+ "networking::ip": "172.22.255.185",
39
+ "networking::interfaces::bond0::mtu": "1500",
40
+ "networking::interfaces::bond0::mac": "aa:bb:cc:dd:ee:fe",
41
+ "networking::interfaces::bond0::network6": "fe80::",
42
+ "networking::interfaces::bond0::network": "172.22.255.0",
43
+ "networking::interfaces::bond0::netmask6": "ffff:ffff:ffff:ffff::",
44
+ "networking::interfaces::bond0::netmask": "255.255.255.0",
45
+ "networking::interfaces::bond0::ip6": "fc00::",
46
+ "networking::interfaces::bond0::ip": "172.22.255.185",
47
+ "networking::interfaces::bond0::bindings6": "[{\"address\"=>\"fc00::\", \"netmask\"=>\"ffff:ffff:ffff:ffff::\", \"network\"=>\"fc00::\"}]",
48
+ "networking::interfaces::bond0::bindings": "[{\"address\"=>\"172.22.255.185\", \"netmask\"=>\"255.255.255.0\", \"network\"=>\"172.22.255.0\"}]",
49
+ "networking::domain": "prod.location.de.local",
50
+ "machineid": "123456789abcdefghijklmnopqrstuvwxyz",
51
+ "domain": "prod.location.de.local",
52
+ "disks::sda::vendor": "ATA",
53
+ "disks::sda::model": "DELLBOSS VD",
54
+ "disks::sda::size": "223.51 GB",
55
+ "disks::sda::size_bytes": "239990276096",
56
+ "disks::nvme1n1::vendor": "Error: open /sys/block/nvme1n1/device/vendor: no such file or directory",
57
+ "disks::nvme1n1::model": "Dell Express Flash PM1725a 6.4TB SFF",
58
+ "disks::nvme1n1::size": "5.82 TB",
59
+ "disks::nvme1n1::size_bytes": "6401252745216",
60
+ "disks::nvme0n1::vendor": "Error: open /sys/block/nvme0n1/device/vendor: no such file or directory",
61
+ "disks::nvme0n1::model": "Dell Express Flash PM1725a 6.4TB SFF",
62
+ "disks::nvme0n1::size": "5.82 TB",
63
+ "disks::nvme0n1::size_bytes": "6401252745216",
64
+ "architecture": "x86_64",
65
+ "dhcp_servers": null,
66
+ "discovery_proxy_type": "proxy",
67
+ "discovery_proxy_uri": "https://foremansp.prod.location.de.local:8443",
68
+ "nmprimary_ip6_route": "dst = ff00::/8, nh = ::, mt = 256, table=255",
69
+ "nmprimary_ip6_address": "fc80::/64",
70
+ "nmprimary_dhcp4_option_requested_ntp_servers": "1",
71
+ "nmprimary_dhcp4_option_dhcp_server_identifier": "172.23.35.145",
72
+ "nmprimary_dhcp4_option_requested_host_name": "1",
73
+ "nmprimary_dhcp4_option_requested_nis_domain": "1",
74
+ "nmprimary_dhcp4_option_requested_routers": "1",
75
+ "nmprimary_dhcp4_option_requested_ms_classless_static_routes": "1",
76
+ "nmprimary_dhcp4_option_routers": "172.22.255.254",
77
+ "nmprimary_dhcp4_option_requested_domain_name_servers": "1",
78
+ "nmprimary_dhcp4_option_domain_name_servers": "172.23.1.210 10.0.33.10",
79
+ "nmprimary_dhcp4_option_subnet_mask": "255.255.255.0",
80
+ "nmprimary_dhcp4_option_requested_nis_servers": "1",
81
+ "nmprimary_dhcp4_option_dhcp_message_type": "5",
82
+ "nmprimary_dhcp4_option_requested_static_routes": "1",
83
+ "nmprimary_dhcp4_option_requested_subnet_mask": "1",
84
+ "nmprimary_dhcp4_option_ip_address": "172.22.255.185",
85
+ "nmprimary_dhcp4_option_requested_broadcast_address": "1",
86
+ "nmprimary_dhcp4_option_requested_interface_mtu": "1",
87
+ "nmprimary_dhcp4_option_broadcast_address": "172.22.255.255",
88
+ "nmprimary_dhcp4_option_next_server": "172.23.35.29",
89
+ "nmprimary_dhcp4_option_expiry": "1553551269",
90
+ "nmprimary_dhcp4_option_requested_wpad": "1",
91
+ "nmprimary_dhcp4_option_requested_classless_static_routes": "1",
92
+ "nmprimary_dhcp4_option_requested_rfc3442_classless_static_routes": "1",
93
+ "nmprimary_dhcp4_option_requested_domain_name": "1",
94
+ "nmprimary_dhcp4_option_filename": "pxelinux.0",
95
+ "nmprimary_dhcp4_option_requested_domain_search": "1",
96
+ "nmprimary_dhcp4_option_network_number": "172.22.255.0",
97
+ "nmprimary_ip4_dns": "172.23.1.210",
98
+ "nmprimary_ip4_route": "dst = 0.0.0.0/0, nh = 172.22.255.254, mt = 100",
99
+ "nmprimary_ip4_gateway": "172.22.255.254",
100
+ "nmprimary_ip4_address": "172.22.255.185/24",
101
+ "nmprimary_general_vpn": "no",
102
+ "nmprimary_general_default6": "no",
103
+ "nmprimary_general_default": "yes",
104
+ "nmprimary_general_state": "activated",
105
+ "nmprimary_general_devices": "p3p1",
106
+ "nmprimary_general_uuid": "aaaaaaaa-bbbb-cccc-eeee-ffffffffffff",
107
+ "nmprimary_general_name": "primary",
108
+ "nmprimary_proxy_browser-only": "no",
109
+ "nmprimary_proxy_method": "none",
110
+ "nmprimary_vlan_flags": "1",
111
+ "nmprimary_vlan_id": "0",
112
+ "nmprimary_ipv6_dhcp-send-hostname": "yes",
113
+ "nmprimary_ipv6_addr-gen-mode": "eui64",
114
+ "nmprimary_ipv6_ip6-privacy": "-1",
115
+ "nmprimary_ipv6_may-fail": "yes",
116
+ "nmprimary_ipv6_never-default": "no",
117
+ "nmprimary_ipv6_ignore-auto-dns": "no",
118
+ "nmprimary_ipv6_ignore-auto-routes": "no",
119
+ "nmprimary_ipv6_route-table": "0",
120
+ "nmprimary_ipv6_route-metric": "-1",
121
+ "nmprimary_ipv6_dns-priority": "0",
122
+ "nmprimary_ipv6_method": "ignore",
123
+ "nmprimary_ipv4_may-fail": "yes",
124
+ "nmprimary_ipv4_never-default": "no",
125
+ "nmprimary_ipv4_dhcp-send-hostname": "no",
126
+ "nmprimary_ipv4_ignore-auto-dns": "no",
127
+ "nmprimary_ipv4_ignore-auto-routes": "no",
128
+ "nmprimary_ipv4_route-table": "0",
129
+ "nmprimary_ipv4_route-metric": "-1",
130
+ "nmprimary_ipv4_dns-priority": "0",
131
+ "nmprimary_ipv4_method": "auto",
132
+ "nmprimary_802-3-ethernet_wake-on-lan": "default",
133
+ "nmprimary_802-3-ethernet_mtu": "auto",
134
+ "nmprimary_802-3-ethernet_mac-address": "aa:bb:cc:dd:ee:ff",
135
+ "nmprimary_802-3-ethernet_auto-negotiate": "no",
136
+ "nmprimary_802-3-ethernet_speed": "0",
137
+ "nmprimary_connection_lldp": "default",
138
+ "nmprimary_connection_metered": "unknown",
139
+ "nmprimary_connection_autoconnect-slaves": "-1",
140
+ "nmprimary_connection_read-only": "no",
141
+ "nmprimary_connection_auth-retries": "-1",
142
+ "nmprimary_connection_autoconnect-retries": "-1",
143
+ "nmprimary_connection_autoconnect-priority": "1",
144
+ "nmprimary_connection_autoconnect": "yes",
145
+ "nmprimary_connection_type": "802-3-ethernet",
146
+ "nmprimary_connection_uuid": "aaaaaaaa-bbbb-cccc-eeee-ffffffffffff",
147
+ "nmprimary_connection_id": "primary",
148
+ "ipmi_1_gateway": "172.23.111.254",
149
+ "ipmi_1_macaddress": "aa:bb:cc:dd:ee:ff",
150
+ "ipmi_1_subnet_mask": "255.255.255.0",
151
+ "ipmi_1_ptr": "machine-prod-cons.location.de.local",
152
+ "ipmi_1_ipaddress": "172.23.111.92",
153
+ "ipmi_1_ipaddress_source": "Static Address",
154
+ "ipmi_gateway": "172.23.111.254",
155
+ "ipmi_macaddress": "aa:bb:cc:dd:ee:ff",
156
+ "ipmi_subnet_mask": "255.255.255.0",
157
+ "ipmi_ptr": "machine-prod-cons.location.de.local",
158
+ "ipmi_ipaddress": "172.23.111.92",
159
+ "ipmi_ipaddress_source": "Static Address",
160
+ "ipmi_enabled": "true",
161
+ "link_p3p2": "true",
162
+ "auto_negotiation_p3p2": "false",
163
+ "port_p3p2": "Direct Attach Copper",
164
+ "duplex_p3p2": "full",
165
+ "speed_p3p2": "25000",
166
+ "link_p3p1": "true",
167
+ "auto_negotiation_p3p1": "false",
168
+ "port_p3p1": "Direct Attach Copper",
169
+ "duplex_p3p1": "full",
170
+ "speed_p3p1": "25000",
171
+ "link_em4": "false",
172
+ "auto_negotiation_em4": "true",
173
+ "port_em4": "Twisted Pair",
174
+ "duplex_em4": "unknown! (255)",
175
+ "link_em3": "false",
176
+ "auto_negotiation_em3": "true",
177
+ "port_em3": "Twisted Pair",
178
+ "duplex_em3": "unknown! (255)",
179
+ "link_em2": "false",
180
+ "wol_em2": "true",
181
+ "auto_negotiation_em2": "true",
182
+ "port_em2": "Twisted Pair",
183
+ "duplex_em2": "unknown! (255)",
184
+ "link_em1": "false",
185
+ "wol_em1": "true",
186
+ "auto_negotiation_em1": "true",
187
+ "port_em1": "Twisted Pair",
188
+ "duplex_em1": "unknown! (255)",
189
+ "uuid": "aaaaaaaa-bbbb-cccc-eeee-ffffffffffff",
190
+ "serialnumber": "abcdefg",
191
+ "manufacturer": "Dell Inc.",
192
+ "bios_release_date": "12/17/2018",
193
+ "bios_version": "1.6.13",
194
+ "bios_vendor": "Dell Inc.",
195
+ "boardserialnumber": "0123456789abcdefghijklmnopqrstuvwxyz",
196
+ "boardproductname": "abcdefg",
197
+ "boardmanufacturer": "Dell Inc.",
198
+ "fqdn": "fdi",
199
+ "uniqueid": "abcdefgh123",
200
+ "ipaddress": "172.22.255.185",
201
+ "macaddress": "aa:bb:cc:dd:ee:fe",
202
+ "network_p3p1": "172.22.255.0",
203
+ "hardwareisa": "x86_64",
204
+ "dhcp_servers::p3p1": "172.23.35.145",
205
+ "dhcp_servers::system": "172.23.35.145",
206
+ "processorcount": "80",
207
+ "processor79": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
208
+ "processor78": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
209
+ "processor77": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
210
+ "processor76": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
211
+ "processor75": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
212
+ "processor74": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
213
+ "processor73": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
214
+ "processor72": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
215
+ "processor71": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
216
+ "processor70": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
217
+ "processor69": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
218
+ "processor68": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
219
+ "processor67": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
220
+ "processor66": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
221
+ "processor65": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
222
+ "processor64": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
223
+ "processor63": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
224
+ "processor62": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
225
+ "processor61": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
226
+ "processor60": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
227
+ "processor59": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
228
+ "processor58": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
229
+ "processor57": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
230
+ "processor56": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
231
+ "processor55": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
232
+ "processor54": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
233
+ "processor53": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
234
+ "processor52": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
235
+ "processor51": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
236
+ "processor50": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
237
+ "processor49": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
238
+ "processor48": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
239
+ "processor47": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
240
+ "processor46": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
241
+ "processor45": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
242
+ "processor44": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
243
+ "processor43": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
244
+ "processor42": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
245
+ "processor41": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
246
+ "processor40": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
247
+ "processor39": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
248
+ "processor38": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
249
+ "processor37": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
250
+ "processor36": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
251
+ "processor35": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
252
+ "processor34": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
253
+ "processor33": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
254
+ "processor32": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
255
+ "processor31": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
256
+ "processor30": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
257
+ "processor29": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
258
+ "processor28": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
259
+ "processor27": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
260
+ "processor26": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
261
+ "processor25": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
262
+ "processor24": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
263
+ "processor23": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
264
+ "processor22": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
265
+ "processor21": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
266
+ "processor20": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
267
+ "processor19": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
268
+ "processor18": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
269
+ "processor17": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
270
+ "processor16": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
271
+ "processor15": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
272
+ "processor14": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
273
+ "processor13": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
274
+ "processor12": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
275
+ "processor11": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
276
+ "processor10": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
277
+ "discovery_bootip": "172.22.255.185",
278
+ "discovery_bootif": "aa:bb:cc:dd:ee:ff:gg",
279
+ "discovery_release": "20180822.1",
280
+ "discovery_version": "3.5.1",
281
+ "hostname": "fdi",
282
+ "gid": "root",
283
+ "memorysize_mb": "515579.70",
284
+ "memorysize": "503.50 GB",
285
+ "blockdevices": "nvme0n1,nvme1n1,sda",
286
+ "blockdevice_nvme1n1_model": "Dell Express Flash PM1725a 6.4TB SFF",
287
+ "blockdevice_nvme1n1_size": "6401252745216",
288
+ "blockdevice_nvme0n1_model": "Dell Express Flash PM1725a 6.4TB SFF",
289
+ "blockdevice_nvme0n1_size": "6401252745216",
290
+ "blockdevice_sda_model": "DELLBOSS VD",
291
+ "blockdevice_sda_vendor": "ATA",
292
+ "blockdevice_sda_size": "239990276096",
293
+ "type": "Rack Mount Chassis",
294
+ "processor9": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
295
+ "processor8": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
296
+ "processor7": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
297
+ "processor6": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
298
+ "processor5": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
299
+ "processor4": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
300
+ "processor3": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
301
+ "processor2": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
302
+ "processor1": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
303
+ "processor0": "Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz",
304
+ "hardwaremodel": "x86_64",
305
+ "virtual": "physical",
306
+ "os::name": "CentOS",
307
+ "physicalprocessorcount": "2",
308
+ "facterversion": "2.4.1",
309
+ "id": "root",
310
+ "netmask": "255.255.255.0",
311
+ "ps": "ps -ef",
312
+ "mtu_p3p2": "1500",
313
+ "macaddress_p3p2": "aa:bb:cc:dd:ee:f1",
314
+ "mtu_p3p1": "1500",
315
+ "netmask_p3p1": "255.255.255.0",
316
+ "macaddress_p3p1": "aa:bb:cc:dd:ee:f2",
317
+ "ipaddress_p3p1": "172.22.255.185",
318
+ "mtu_em4": "1500",
319
+ "macaddress_em4": "aa:bb:cc:dd:ee:f3",
320
+ "mtu_em3": "1500",
321
+ "macaddress_em3": "aa:bb:cc:dd:ee:f4",
322
+ "mtu_em2": "1500",
323
+ "macaddress_em2": "aa:bb:cc:dd:ee:f5",
324
+ "mtu_em1": "1500",
325
+ "macaddress_em1": "aa:bb:cc:dd:ee:f6",
326
+ "interfaces": "em1,em2,em3,em4,lo,p3p1,p3p2",
327
+ "lib": "/usr/share/fdi/facts:/opt/extension/facts"
328
+ }