1 |
a1aa846b
|
Tom McKay
|
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
|
|
10 |
|
|
|
11 |
|
|
|
12 |
|
|
|
13 |
|
|
|
14 |
|
|
|
15 |
|
|
|
16 |
|
|
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
|
20 |
|
|
|
21 |
|
|
|
22 |
|
|
|
23 |
|
|
|
24 |
|
|
|
25 |
|
|
|
26 |
|
|
|
27 |
|
|
|
28 |
|
|
|
29 |
|
|
|
30 |
|
|
|
31 |
|
|
|
32 |
|
|
|
33 |
|
|
|
34 |
|
|
|
35 |
|
|
|
36 |
|
|
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
|
40 |
|
|
|
41 |
|
|
require 'hammer_cli'
|
42 |
|
|
require 'katello_api'
|
43 |
|
|
require 'foreman_api'
|
44 |
|
|
require 'json'
|
45 |
|
|
require 'csv'
|
46 |
|
|
require 'uri'
|
47 |
|
|
|
48 |
|
|
module HammerCLICsv
|
49 |
|
|
class SystemsCommand < BaseCommand
|
50 |
|
|
|
51 |
|
|
ORGANIZATION = 'Organization'
|
52 |
|
|
ENVIRONMENT = 'Environment'
|
53 |
|
|
CONTENTVIEW = 'Content View'
|
54 |
5880960b
|
Tom McKay
|
VIRTUAL = 'Virtual'
|
55 |
|
|
HOST = 'Host'
|
56 |
|
|
OPERATINGSYSTEM = 'OS'
|
57 |
|
|
ARCHITECTURE = 'Arch'
|
58 |
|
|
SOCKETS = 'Sockets'
|
59 |
|
|
RAM = 'RAM'
|
60 |
|
|
CORES = 'Cores'
|
61 |
|
|
SLA = 'SLA'
|
62 |
|
|
PRODUCTS = 'Products'
|
63 |
|
|
SUBSCRIPTIONS = 'Subscriptions'
|
64 |
a1aa846b
|
Tom McKay
|
|
65 |
|
|
def export
|
66 |
2193a080
|
Tom McKay
|
|
67 |
a1aa846b
|
Tom McKay
|
end
|
68 |
|
|
|
69 |
|
|
def import
|
70 |
|
|
@existing = {}
|
71 |
|
|
|
72 |
|
|
thread_import do |line|
|
73 |
|
|
create_systems_from_csv(line)
|
74 |
|
|
end
|
75 |
|
|
end
|
76 |
|
|
|
77 |
|
|
def create_systems_from_csv(line)
|
78 |
9d9e4494
|
Tom McKay
|
if !@existing[line[ORGANIZATION]]
|
79 |
|
|
@existing[line[ORGANIZATION]] = {}
|
80 |
|
|
@k_system_api.index({'organization_id' => line[ORGANIZATION], 'page_size' => 999999, 'paged' => true})[0]['results'].each do |system|
|
81 |
|
|
@existing[line[ORGANIZATION]][system['name']] = system['uuid'] if system
|
82 |
|
|
end
|
83 |
a1aa846b
|
Tom McKay
|
end
|
84 |
|
|
|
85 |
|
|
line[COUNT].to_i.times do |number|
|
86 |
|
|
name = namify(line[NAME], number)
|
87 |
9d9e4494
|
Tom McKay
|
|
88 |
|
|
subscriptions(line).each do |subscription|
|
89 |
|
|
puts subscription
|
90 |
|
|
katello_subscription(line[ORGANIZATION], :name => subscription[:number])
|
91 |
|
|
end
|
92 |
|
|
|
93 |
|
|
if !@existing[line[ORGANIZATION]].include? name
|
94 |
5880960b
|
Tom McKay
|
print "Creating system '#{name}'..." if verbose?
|
95 |
|
|
@k_system_api.create({
|
96 |
612bf01e
|
Tom McKay
|
'name' => name,
|
97 |
9d9e4494
|
Tom McKay
|
'organization_id' => line[ORGANIZATION],
|
98 |
|
|
'environment_id' => katello_environment(line[ORGANIZATION], :name => line[ENVIRONMENT]),
|
99 |
|
|
'content_view_id' => 2,
|
100 |
|
|
'facts' => facts(line),
|
101 |
|
|
'installedProducts' => products(line),
|
102 |
|
|
'type' => 'system'
|
103 |
|
|
})
|
104 |
a1aa846b
|
Tom McKay
|
else
|
105 |
|
|
print "Updating host '#{name}'..." if verbose?
|
106 |
612bf01e
|
Tom McKay
|
@k_system_api.update({
|
107 |
9d9e4494
|
Tom McKay
|
'id' => @existing[line[ORGANIZATION]][name],
|
108 |
a1aa846b
|
Tom McKay
|
'name' => name,
|
109 |
9d9e4494
|
Tom McKay
|
'organization_id' => line[ORGANIZATION],
|
110 |
|
|
'environment_id' => katello_environment(line[ORGANIZATION], :name => line[ENVIRONMENT]),
|
111 |
|
|
'content_view_id' => 2,
|
112 |
|
|
'facts' => facts(line),
|
113 |
|
|
'installedProducts' => products(line)
|
114 |
|
|
})
|
115 |
a1aa846b
|
Tom McKay
|
end
|
116 |
9d9e4494
|
Tom McKay
|
print "done\n" if verbose?
|
117 |
a1aa846b
|
Tom McKay
|
end
|
118 |
|
|
rescue RuntimeError => e
|
119 |
|
|
raise RuntimeError.new("#{e}\n #{line}")
|
120 |
|
|
end
|
121 |
9d9e4494
|
Tom McKay
|
|
122 |
|
|
private
|
123 |
|
|
|
124 |
|
|
def facts(line)
|
125 |
|
|
facts = {}
|
126 |
|
|
facts['cpu.core(s)_per_socket'] = line[CORES]
|
127 |
|
|
facts['cpu.cpu_socket(s)'] = line[SOCKETS]
|
128 |
|
|
facts['memory.memtotal'] = line[RAM]
|
129 |
|
|
facts['uname.machine'] = line[ARCHITECTURE]
|
130 |
|
|
if line[OPERATINGSYSTEM].index(' ')
|
131 |
|
|
(facts['distribution.name'], facts['distribution.version']) = line[OPERATINGSYSTEM].split(' ')
|
132 |
|
|
else
|
133 |
|
|
(facts['distribution.name'], facts['distribution.version']) = ['RHEL', line[OPERATINGSYSTEM]]
|
134 |
|
|
end
|
135 |
|
|
facts
|
136 |
|
|
end
|
137 |
|
|
|
138 |
|
|
def products(line)
|
139 |
|
|
products = CSV.parse_line(line[PRODUCTS]).collect do |product_details|
|
140 |
|
|
product = {}
|
141 |
|
|
(product[:product_id], product[:productName]) = product_details.split('|')
|
142 |
|
|
product
|
143 |
|
|
end
|
144 |
|
|
products
|
145 |
|
|
end
|
146 |
|
|
|
147 |
|
|
def subscriptions(line)
|
148 |
|
|
subscriptions = CSV.parse_line(line[SUBSCRIPTIONS]).collect do |subscription_details|
|
149 |
|
|
subscription = {}
|
150 |
|
|
(subscription[:number], subscription[:name]) = subscription_details.split('|')
|
151 |
|
|
subscription
|
152 |
|
|
end
|
153 |
|
|
subscriptions
|
154 |
|
|
end
|
155 |
|
|
|
156 |
a1aa846b
|
Tom McKay
|
end
|
157 |
|
|
|
158 |
|
|
HammerCLI::MainCommand.subcommand("csv:systems", "import/export systems", HammerCLICsv::SystemsCommand)
|
159 |
|
|
end |