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
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # ForemanNetbox
2
+
3
+ [<img src="https://opensourcelogos.aws.dmtech.cloud/dmTECH_opensource_logo.svg" height="21" width="130">](https://www.dmtech.de/)
4
+
5
+ This is a plugin for Foreman that introduces integration with [NetBox](https://netbox.readthedocs.io)
6
+
7
+ ## Installation
8
+
9
+ See [How_to_Install_a_Plugin](https://theforeman.org/manuals/2.3/index.html#6.1InstallaPlugin)
10
+ for how to install Foreman plugins.
11
+
12
+ The gem name is "foreman_netbox".
13
+
14
+
15
+
16
+ ## Integration tests
17
+
18
+ The easiest way to start Netbox is to use [netbox-docker](https://github.com/netbox-community/netbox-docker). To run integration tests provide `FOREMAN_NETBOX_URL` and `FOREMAN_NETBOX_TOKEN` variables, eg.
19
+
20
+ ```
21
+ $ FOREMAN_NETBOX_URL=http://0.0.0.0:8000 FOREMAN_NETBOX_TOKEN=0123456789abcdef0123456789abcdef01234567 bundle exec rake test:foreman_netbox
22
+ ```
23
+
24
+ After installation of the plugin you can find these settings as well under Administer/Settings/Netbox tab.
25
+
26
+ You will find there as well a Netbox Orchestration Switch.
27
+
28
+ If the switch is enabled every change of a Foreman Hostobject will be synced with your netbox instance.
29
+
30
+ ## Contributing
31
+
32
+ Fork and send a Pull Request. Thanks!
33
+
34
+ ## Copyright
35
+
36
+ Copyright (c) 2019 dmTECH GmbH, [dmtech.de](https://www.dmtech.de/)
37
+
38
+ This program is free software: you can redistribute it and/or modify
39
+ it under the terms of the GNU General Public License as published by
40
+ the Free Software Foundation, either version 3 of the License, or
41
+ (at your option) any later version.
42
+
43
+ This program is distributed in the hope that it will be useful,
44
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
45
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
46
+ GNU General Public License for more details.
47
+
48
+ You should have received a copy of the GNU General Public License
49
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
50
+
data/Rakefile ADDED
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ # !/usr/bin/env rake
4
+
5
+ begin
6
+ require 'bundler/setup'
7
+ rescue LoadError
8
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
9
+ end
10
+ begin
11
+ require 'rdoc/task'
12
+ rescue LoadError
13
+ require 'rdoc/rdoc'
14
+ require 'rake/rdoctask'
15
+ RDoc::Task = Rake::RDocTask
16
+ end
17
+
18
+ RDoc::Task.new(:rdoc) do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'ForemanNetbox'
21
+ rdoc.options << '--line-numbers'
22
+ rdoc.rdoc_files.include('README.rdoc')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
25
+
26
+ APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
27
+
28
+ Bundler::GemHelper.install_tasks
29
+
30
+ require 'rake/testtask'
31
+
32
+ Rake::TestTask.new(:test) do |t|
33
+ t.libs << 'lib'
34
+ t.libs << 'test'
35
+ t.pattern = 'test/**/*_test.rb'
36
+ t.verbose = false
37
+ end
38
+
39
+ task default: :test
40
+
41
+ begin
42
+ require 'rubocop/rake_task'
43
+ RuboCop::RakeTask.new
44
+ rescue StandardError
45
+ puts 'Rubocop not loaded.'
46
+ end
47
+
48
+ task :default do
49
+ Rake::Task['rubocop'].execute
50
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ class DeviceContract < Dry::Validation::Contract
5
+ # rubocop:disable Metrics/BlockLength
6
+ params do
7
+ optional(:tenant).hash(ForemanNetbox::Params::TenantParams.new)
8
+ optional(:ip_addresses).array(ForemanNetbox::Params::IpAddressParams.new)
9
+ optional(:interfaces).array(ForemanNetbox::Params::InterfaceParams.new)
10
+
11
+ required(:device).filled(:hash) do
12
+ required(:name).filled(:string)
13
+ optional(:serial).maybe(:string)
14
+ optional(:tags).array(:string)
15
+ end
16
+
17
+ required(:device_type).filled(:hash) do
18
+ required(:model).filled(:string)
19
+ required(:slug).filled(:string)
20
+ optional(:tags).array(:string)
21
+ end
22
+
23
+ required(:device_role).filled(:hash) do
24
+ required(:name).filled(:string)
25
+ required(:slug).filled(:string)
26
+ optional(:color).maybe(:string)
27
+ end
28
+
29
+ required(:manufacturer).filled(:hash) do
30
+ required(:name).filled(:string)
31
+ required(:slug).filled(:string)
32
+ end
33
+
34
+ required(:site).filled(:hash) do
35
+ required(:name).filled(:string)
36
+ required(:slug).filled(:string)
37
+ optional(:tags).array(:string)
38
+ end
39
+ end
40
+ # rubocop:enable Metrics/BlockLength
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module Params
5
+ class InterfaceParams < Dry::Schema::Params
6
+ define do
7
+ required(:name).filled(:string)
8
+ required(:type).filled(:hash) do
9
+ required(:value).filled(:string)
10
+ end
11
+ optional(:mac_address).maybe(:string)
12
+ optional(:tags).array(:string)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module Params
5
+ class IpAddressParams < Dry::Schema::Params
6
+ define do
7
+ required(:address).filled(:string)
8
+ required(:interface).filled(:hash) do
9
+ required(:name).filled(:string)
10
+ end
11
+ optional(:tags).array(:string)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module Params
5
+ class TenantParams < Dry::Schema::Params
6
+ define do
7
+ required(:name).filled(:string)
8
+ required(:slug).filled(:string)
9
+ optional(:tags).array(:string)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ class VirtualMachineContract < Dry::Validation::Contract
5
+ params do
6
+ optional(:tenant).hash(ForemanNetbox::Params::TenantParams.new)
7
+ optional(:ip_addresses).array(ForemanNetbox::Params::IpAddressParams.new)
8
+ optional(:interfaces).array(ForemanNetbox::Params::InterfaceParams.new)
9
+
10
+ required(:virtual_machine).filled(:hash) do
11
+ required(:name).filled(:string)
12
+ optional(:vcpus).maybe(:integer)
13
+ optional(:memory).maybe(:integer)
14
+ optional(:disk).maybe(:integer)
15
+ optional(:tags).array(:string)
16
+ end
17
+
18
+ required(:cluster).filled(:hash) do
19
+ required(:name).filled(:string)
20
+ optional(:tags).array(:string)
21
+ end
22
+
23
+ required(:cluster_type).filled(:hash) do
24
+ required(:name).filled(:string)
25
+ required(:slug).filled(:string)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module Concerns
5
+ module Facts
6
+ def facts
7
+ context.host.facts.symbolize_keys
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module Concerns
5
+ module PrimaryIps
6
+ def primary_ip4
7
+ return if context.host.ip.blank?
8
+
9
+ ip_addresses_map[IPAddr.new(context.host.ip).to_i]
10
+ end
11
+
12
+ def primary_ip6
13
+ return if context.host.ip6.blank?
14
+
15
+ ip_addresses_map[IPAddr.new(context.host.ip6).to_i]
16
+ end
17
+
18
+ def ip_addresses_map
19
+ @ip_addresses_map ||= context.ip_addresses.each_with_object({}) do |ip, hash|
20
+ hash[ip.address.to_i] = ip.id
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module DeleteHost
5
+ class DeleteDevice
6
+ include ::Interactor
7
+
8
+ around do |interactor|
9
+ interactor.call unless context.host.compute?
10
+ end
11
+
12
+ def call
13
+ ForemanNetbox::API.client.dcim.devices.find_by(name: context.host.name)&.delete
14
+ rescue NetboxClientRuby::LocalError, NetboxClientRuby::ClientError, NetboxClientRuby::RemoteError => e
15
+ ::Foreman::Logging.logger('foreman_netbox/import').error("#{self.class} error #{e}: #{e.backtrace}")
16
+ context.fail!(error: "#{self.class}: #{e}")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module DeleteHost
5
+ class DeleteVirtualMachine
6
+ include ::Interactor
7
+
8
+ around do |interactor|
9
+ interactor.call if context.host.compute?
10
+ end
11
+
12
+ def call
13
+ ForemanNetbox::API.client.virtualization.virtual_machines.find_by(name: context.host.name)&.delete
14
+ rescue NetboxClientRuby::LocalError, NetboxClientRuby::ClientError, NetboxClientRuby::RemoteError => e
15
+ ::Foreman::Logging.logger('foreman_netbox/import').error("#{self.class} error #{e}: #{e.backtrace}")
16
+ context.fail!(error: "#{self.class}: #{e}")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module DeleteHost
5
+ class Organizer
6
+ include ::Interactor::Organizer
7
+
8
+ organize DeleteHost::DeleteVirtualMachine,
9
+ DeleteHost::DeleteDevice
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module SyncHost
5
+ class Organizer
6
+ include ::Interactor::Organizer
7
+
8
+ before do
9
+ context.netbox_params = context.host.netbox_facet.netbox_params
10
+ context.raw_data = {}
11
+ end
12
+
13
+ organize SyncHost::SyncVirtualMachine::Organizer,
14
+ SyncHost::SyncDevice::Organizer
15
+
16
+ def call
17
+ super
18
+
19
+ update_status
20
+ rescue Interactor::Failure => e
21
+ update_status
22
+ raise e
23
+ end
24
+
25
+ private
26
+
27
+ delegate :host, :error, to: :context
28
+ delegate :netbox_facet, to: :host
29
+
30
+ def update_status
31
+ netbox_facet.update(synchronized_at: Time.zone.now, synchronization_error: error, raw_data: context.raw_data)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module SyncHost
5
+ module SyncDevice
6
+ class Create
7
+ include ::Interactor
8
+
9
+ around do |interactor|
10
+ interactor.call unless context.device
11
+ end
12
+
13
+ def call
14
+ context.device = ForemanNetbox::API.client::DCIM::Device.new(params).save
15
+ rescue NetboxClientRuby::LocalError, NetboxClientRuby::ClientError, NetboxClientRuby::RemoteError => e
16
+ ::Foreman::Logging.logger('foreman_netbox/import').error("#{self.class} error #{e}: #{e.backtrace}")
17
+ context.fail!(error: "#{self.class}: #{e}")
18
+ end
19
+
20
+ private
21
+
22
+ delegate :netbox_params, :device_type, :device_role, :site, to: :context
23
+ delegate :tenant, to: :context, allow_nil: true
24
+
25
+ def params
26
+ netbox_params.fetch(:device).merge(
27
+ device_type: device_type.id,
28
+ device_role: device_role.id,
29
+ site: site.id,
30
+ tenant: tenant&.id
31
+ ).compact
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module SyncHost
5
+ module SyncDevice
6
+ class Find
7
+ include ::Interactor
8
+
9
+ def call
10
+ # rubocop:disable Rails/DynamicFindBy
11
+ context.device = find_by_serial || find_by_mac || find_by_name
12
+ # rubocop:enable Rails/DynamicFindBy
13
+ rescue NetboxClientRuby::LocalError, NetboxClientRuby::ClientError, NetboxClientRuby::RemoteError => e
14
+ ::Foreman::Logging.logger('foreman_netbox/import').error("#{self.class} error #{e}: #{e.backtrace}")
15
+ context.fail!(error: "#{self.class}: #{e}")
16
+ end
17
+
18
+ private
19
+
20
+ delegate :host, :netbox_params, to: :context
21
+ delegate :mac, to: :host, allow_nil: true
22
+
23
+ def find_by_serial
24
+ serial = netbox_params.dig(:device, :serial)
25
+
26
+ ForemanNetbox::API.client.dcim.devices.filter(serial: serial).first if serial
27
+ end
28
+
29
+ def find_by_mac
30
+ ForemanNetbox::API.client.dcim.devices.filter(mac_address: mac).first if mac
31
+ end
32
+
33
+ def find_by_name
34
+ name = netbox_params.dig(:device, :name)
35
+
36
+ ForemanNetbox::API.client.dcim.devices.find_by(name: name)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanNetbox
4
+ module SyncHost
5
+ module SyncDevice
6
+ class Organizer
7
+ include ::Interactor::Organizer
8
+
9
+ around do |interactor|
10
+ interactor.call unless context.host.compute?
11
+ end
12
+
13
+ after do
14
+ context.raw_data[:device] = context.device.raw_data!
15
+ end
16
+
17
+ organize SyncDevice::Validate,
18
+ SyncHost::SyncTenant::Organizer,
19
+ SyncDevice::SyncSite::Organizer,
20
+ SyncDevice::SyncDeviceRole::Organizer,
21
+ SyncDevice::SyncDeviceType::Organizer,
22
+ SyncDevice::Find,
23
+ SyncDevice::Create,
24
+ SyncDevice::SyncInterfaces::Organizer,
25
+ SyncDevice::Update,
26
+ SyncDevice::SaveNetboxUrl
27
+ end
28
+ end
29
+ end
30
+ end