foreman_teamdynamix 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/README.md +3 -8
- data/app/models/concerns/foreman_teamdynamix/host_extensions.rb +13 -3
- data/app/overrides/{add_tab.rb → teamdynamix_add_tab.rb} +1 -1
- data/app/overrides/{add_tab_link.rb → teamdynamix_add_tab_link.rb} +1 -1
- data/app/services/teamdynamix_api.rb +2 -0
- data/lib/foreman_teamdynamix/version.rb +1 -1
- data/lib/tasks/teamdynamix.rake +52 -0
- metadata +5 -5
- data/lib/tasks/sync_hosts_with_teamdynamix.rake +0 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fca2ef501936519c40478d00bea14fed471e379
|
4
|
+
data.tar.gz: 442cd61aa226a3b3ace8b3507963ecf02108b8ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f670d6544df6d4a70c61aed2ff54a498deae3720ad0d9675a507756a2a7c2e5d64af2890d4e9a11710fe10526566e259dc28bee00732e71a3f086a79a6297dd
|
7
|
+
data.tar.gz: 1145611226ba984de9499af93b028cd479d3899e596c6e8b0ba54979370037696b0483263791ee1113101d9e9513a5a0853b55b123cd18ec13773bcf6180ef3f
|
data/README.md
CHANGED
@@ -42,11 +42,6 @@ Example Configuration
|
|
42
42
|
value: "Asset for host running on OS #{host.operatingsystem_id}"
|
43
43
|
:delete:
|
44
44
|
:StatusId: 642
|
45
|
-
:search:
|
46
|
-
AppID: 741
|
47
|
-
StatusName: In Use
|
48
|
-
RequestingCustomerID: 00000000-0000-0000-0000-000000000000
|
49
|
-
OwningDepartmentID: 15798
|
50
45
|
:fields:
|
51
46
|
Asset ID: ID
|
52
47
|
Owner: OwningCustomerName
|
@@ -85,11 +80,11 @@ Add the teamdynamix config to <foreman_repo>/config/settings.yaml
|
|
85
80
|
|
86
81
|
## Rake Task
|
87
82
|
```
|
88
|
-
rake hosts
|
83
|
+
rake teamydynamix:sync:hosts
|
89
84
|
```
|
90
|
-
|
85
|
+
Scans the hosts and sync them with TeamDynamix.
|
91
86
|
* If host has teamdynamix_asset_id, update the corresponding TeamDynamix asset.
|
92
|
-
* If host name matches the asset
|
87
|
+
* If host name matches the asset SerialNumber, update the host and the corresponding TeamDynamix asset.
|
93
88
|
* If host has no matching asset, create an asset in TeamDynamix with configured fields.
|
94
89
|
|
95
90
|
## Test mode
|
@@ -7,7 +7,7 @@ module ForemanTeamdynamix
|
|
7
7
|
end
|
8
8
|
|
9
9
|
included do
|
10
|
-
|
10
|
+
before_create :create_teamdynamix_asset
|
11
11
|
before_destroy :retire_teamdynamix_asset
|
12
12
|
validates :teamdynamix_asset_id, uniqueness: { :allow_blank => true }
|
13
13
|
end
|
@@ -15,8 +15,18 @@ module ForemanTeamdynamix
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def create_teamdynamix_asset
|
18
|
-
asset
|
19
|
-
|
18
|
+
# when the asset is already in teamdynamix
|
19
|
+
assets = td_api.search_asset(SerialLike: name)
|
20
|
+
|
21
|
+
if assets.empty?
|
22
|
+
asset = td_api.create_asset(self)
|
23
|
+
self.teamdynamix_asset_id = asset['ID']
|
24
|
+
elsif assets.length > 1
|
25
|
+
raise 'Found more than 1 existing asset'
|
26
|
+
else
|
27
|
+
self.teamdynamix_asset_id = assets.first['ID']
|
28
|
+
td_api.update_asset(self)
|
29
|
+
end
|
20
30
|
rescue StandardError => e
|
21
31
|
errors.add(:base, _("Could not create the asset for the host in TeamDynamix: #{e.message}"))
|
22
32
|
false
|
@@ -1,6 +1,6 @@
|
|
1
1
|
if SETTINGS[:teamdynamix]
|
2
2
|
Deface::Override.new(:virtual_path => 'hosts/show',
|
3
|
-
:name => '
|
3
|
+
:name => 'teamdynamix_add_tab',
|
4
4
|
:insert_bottom => 'ul#myTab',
|
5
5
|
:text =>
|
6
6
|
"<li><a href='#teamdynamix' data-toggle='tab'><%= _(teamdynamix_title) %></a></li>")
|
@@ -0,0 +1,52 @@
|
|
1
|
+
desc <<-DESC.strip_heredoc.squish
|
2
|
+
Scans existing hosts and creates or updates the asset in TeamDynamix.
|
3
|
+
* If found, update the fields in the TeamDynamix asset.
|
4
|
+
* If not found, create a TeamDynamix asset with desired fields.
|
5
|
+
|
6
|
+
It could be run for all the hosts as:
|
7
|
+
* rake teamydynamix:sync:hosts
|
8
|
+
|
9
|
+
DESC
|
10
|
+
namespace :teamdynamix do
|
11
|
+
namespace :sync do
|
12
|
+
task :hosts => :environment do
|
13
|
+
td_api = TeamdynamixApi.instance
|
14
|
+
errors = []
|
15
|
+
creates = 0
|
16
|
+
updates_from_serial_matching = 0
|
17
|
+
update_from_asset_id = 0
|
18
|
+
|
19
|
+
console_user = User.find_by(login: 'foreman_console_admin')
|
20
|
+
User.current = console_user
|
21
|
+
|
22
|
+
Host.all.each do |h|
|
23
|
+
# if asset exists, update it
|
24
|
+
if td_api.asset_exist?(h.teamdynamix_asset_id)
|
25
|
+
td_api.update_asset(h)
|
26
|
+
update_from_asset_id += 1
|
27
|
+
else
|
28
|
+
assets = td_api.search_asset(SerialLike: h.name)
|
29
|
+
if assets.empty?
|
30
|
+
asset = td_api.create_asset(h)
|
31
|
+
h.teamdynamix_asset_id = asset['ID']
|
32
|
+
errors.push("Could not save host: #{h.name} (#{h.id})") unless h.save
|
33
|
+
creates += 1
|
34
|
+
elsif assets.length > 1
|
35
|
+
errors.push("Could not sync: Found more than 1 asset for #{h.name} (#{h.id})")
|
36
|
+
else
|
37
|
+
h.teamdynamix_asset_id = assets.first['ID']
|
38
|
+
td_api.update_asset(h)
|
39
|
+
errors.push("Could not save host: #{h.name} (#{h.id})") unless h.save
|
40
|
+
updates_from_serial_matching += 1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
puts "Assets created: #{creates}" unless creates.eql?(0)
|
45
|
+
unless updates_from_serial_matching.eql?(0)
|
46
|
+
puts "Assets updated from serial search: #{updates_from_serial_matching}"
|
47
|
+
end
|
48
|
+
puts "Assets updated from ID: #{update_from_asset_id}" unless update_from_asset_id.eql?(0)
|
49
|
+
puts "Errors:\n#{errors.join("\n")}" unless errors.empty?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_teamdynamix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nipendar Tyagi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deface
|
@@ -66,8 +66,8 @@ files:
|
|
66
66
|
- app/controllers/concerns/foreman_teamdynamix/hosts_controller_extensions.rb
|
67
67
|
- app/helpers/concerns/foreman_teamdynamix/hosts_helper_extensions.rb
|
68
68
|
- app/models/concerns/foreman_teamdynamix/host_extensions.rb
|
69
|
-
- app/overrides/
|
70
|
-
- app/overrides/
|
69
|
+
- app/overrides/teamdynamix_add_tab.rb
|
70
|
+
- app/overrides/teamdynamix_add_tab_link.rb
|
71
71
|
- app/services/teamdynamix_api.rb
|
72
72
|
- app/views/foreman_teamdynamix/hosts/_teamdynamix.html.erb
|
73
73
|
- config/routes.rb
|
@@ -76,7 +76,7 @@ files:
|
|
76
76
|
- lib/foreman_teamdynamix/engine.rb
|
77
77
|
- lib/foreman_teamdynamix/version.rb
|
78
78
|
- lib/tasks/foreman_teamdynamix_tasks.rake
|
79
|
-
- lib/tasks/
|
79
|
+
- lib/tasks/teamdynamix.rake
|
80
80
|
- locale/Makefile
|
81
81
|
- locale/en/foreman_teamdynamix.po
|
82
82
|
- locale/foreman_teamdynamix.pot
|
@@ -1,96 +0,0 @@
|
|
1
|
-
desc <<-DESC.strip_heredoc.squish
|
2
|
-
Scans existing hosts and creates or updates the asset in TeamDynamix.
|
3
|
-
* If found, update the fields in the TeamDynamix asset.
|
4
|
-
* If not found, create a TeamDynamix asset with desired fields.
|
5
|
-
* If host does not have a teamdynamix_asset_id or it is deleted via backend, it creates a new asset.
|
6
|
-
|
7
|
-
It could be run for all the hosts as:
|
8
|
-
* rake hosts:sync_with_teamdynamix
|
9
|
-
|
10
|
-
Or for specific hosts as (No space b/w hostnames):
|
11
|
-
* rake hosts:sync_with_teamdynamix[hostname1,hostname2,..,hostnameX]
|
12
|
-
DESC
|
13
|
-
namespace :hosts do
|
14
|
-
task :sync_with_teamdynamix => :environment do |_task|
|
15
|
-
@td_api = TeamdynamixApi.instance
|
16
|
-
@errors = []
|
17
|
-
@hosts_synced = []
|
18
|
-
|
19
|
-
set_current_user
|
20
|
-
|
21
|
-
sync_existing_assets_to_hosts
|
22
|
-
|
23
|
-
create_assets_for_unmapped_hosts
|
24
|
-
|
25
|
-
print_summary
|
26
|
-
end
|
27
|
-
|
28
|
-
def set_current_user
|
29
|
-
console_user = User.find_by(login: 'foreman_console_admin')
|
30
|
-
User.current = console_user
|
31
|
-
end
|
32
|
-
|
33
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
34
|
-
def sync_existing_assets_to_hosts
|
35
|
-
# sending empty search param to get all the assets in TD at once
|
36
|
-
# Note: due to a limitation(possibly a bug) in TD search asset api
|
37
|
-
# each and every search payload returns all the assets.
|
38
|
-
search_params = SETTINGS[:teamdynamix][:api][:search] || {}
|
39
|
-
@teamdynamix_assets = @td_api.search_asset(search_params)
|
40
|
-
@teamdynamix_assets.each do |asset|
|
41
|
-
asset_id = asset['ID']
|
42
|
-
# WHEN Asset is already mapped to a host
|
43
|
-
# THEN update the asset in TD as per current configuration
|
44
|
-
host = Host.find_by(teamdynamix_asset_id: asset_id)
|
45
|
-
if host.present?
|
46
|
-
@hosts_synced << host.id
|
47
|
-
@td_api.update_asset(host)
|
48
|
-
next
|
49
|
-
end
|
50
|
-
hosts = Host.where(name: [asset['Name'], asset['SerialNumber']])
|
51
|
-
# WHEN Asset does not have a matching host, THEN Do nothing
|
52
|
-
next if hosts.blank?
|
53
|
-
# WHEN Asset has more than one matching host, THEN report error
|
54
|
-
if hosts.count > 1
|
55
|
-
@errors << "#{hosts.count} matching hosts found for asset with ID #{asset['ID']}"
|
56
|
-
next
|
57
|
-
end
|
58
|
-
# WHEN Asset has a uniquely matching host which is not yet synced
|
59
|
-
# THEN update the host with the asset ID
|
60
|
-
# AND update the asset in TD as per current configuration
|
61
|
-
host = hosts.first
|
62
|
-
@hosts_synced << host.id
|
63
|
-
host.teamdynamix_asset_id = asset_id
|
64
|
-
@errors << "failed to update host ##{host.id} for asset ID ##{asset_id}" unless host.save
|
65
|
-
@td_api.update_asset(host)
|
66
|
-
end
|
67
|
-
rescue StandardError => e
|
68
|
-
@errors << "component: syncing_assets_to_hosts, asset_id: #{asset['ID']},
|
69
|
-
asset_name: #{asset['Name']}, Error: #{e.message}"
|
70
|
-
end
|
71
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
72
|
-
|
73
|
-
# sync hosts that do not have assets created in Teamdynamix
|
74
|
-
def create_assets_for_unmapped_hosts
|
75
|
-
@unmapped_hosts = Host.where.not(id: @hosts_synced)
|
76
|
-
@unmapped_hosts.each do |host|
|
77
|
-
asset = @td_api.create_asset(host)
|
78
|
-
host.teamdynamix_asset_id = asset['ID']
|
79
|
-
@errors << "failed to update host ##{host.id} for asset ID ##{asset_id}" unless host.save
|
80
|
-
end
|
81
|
-
rescue StandardError => e
|
82
|
-
@errors << "component: creating_new_assets, host: #{host.id}, hostname: #{host.name}, Error: #{e.message}"
|
83
|
-
end
|
84
|
-
|
85
|
-
def print_summary
|
86
|
-
puts "\n Summary:"
|
87
|
-
puts "\t Total Assets in TD: #{@teamdynamix_assets.count}"
|
88
|
-
puts "\t Hosts with matching asset: #{@hosts_synced.uniq.count}"
|
89
|
-
puts "\t Hosts with no assets: #{@unmapped_hosts}" if @unmapped_hosts.present?
|
90
|
-
return if @errors.blank?
|
91
|
-
puts "\n Errors: #{@errors.count}"
|
92
|
-
@errors.each do |error|
|
93
|
-
puts "\t#{error}"
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|