hammer_cli_csv 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/config/cli_config.yml +30 -0
- data/config/csv.yml +2 -0
- data/lib/hammer_cli_csv.rb +5 -0
- data/lib/hammer_cli_csv/activation_keys.rb +36 -33
- data/lib/hammer_cli_csv/base.rb +82 -17
- data/lib/hammer_cli_csv/content_hosts.rb +100 -98
- data/lib/hammer_cli_csv/content_view_filters.rb +6 -0
- data/lib/hammer_cli_csv/content_views.rb +58 -37
- data/lib/hammer_cli_csv/export.rb +1 -1
- data/lib/hammer_cli_csv/host_collections.rb +21 -31
- data/lib/hammer_cli_csv/import.rb +13 -10
- data/lib/hammer_cli_csv/lifecycle_environments.rb +9 -3
- data/lib/hammer_cli_csv/products.rb +44 -23
- data/lib/hammer_cli_csv/provisioning_templates.rb +61 -29
- data/lib/hammer_cli_csv/roles.rb +8 -8
- data/lib/hammer_cli_csv/splice.rb +376 -0
- data/lib/hammer_cli_csv/subscriptions.rb +6 -16
- data/lib/hammer_cli_csv/sync_plans.rb +122 -0
- data/lib/hammer_cli_csv/users.rb +6 -2
- data/lib/hammer_cli_csv/version.rb +1 -1
- data/test/data/content-hosts.csv +3 -3
- data/test/data/content-view-filters.csv +1 -1
- data/test/data/organizations.csv +0 -1
- data/test/data/roles.csv +0 -1
- data/test/data/subscriptions.csv +0 -2
- metadata +6 -2
@@ -18,6 +18,8 @@ module HammerCLICsv
|
|
18
18
|
command_name 'content-view-filters'
|
19
19
|
desc 'import or export content-view-filters'
|
20
20
|
|
21
|
+
option %w(--organization), 'ORGANIZATION', 'Only process organization matching this name'
|
22
|
+
|
21
23
|
CONTENTVIEW = 'Content View'
|
22
24
|
ORGANIZATION = 'Organization'
|
23
25
|
DESCRIPTION = 'Description'
|
@@ -31,6 +33,8 @@ module HammerCLICsv
|
|
31
33
|
@api.resource(:organizations).call(:index, {
|
32
34
|
:per_page => 999999
|
33
35
|
})['results'].each do |organization|
|
36
|
+
next if option_organization && organization['name'] != option_organization
|
37
|
+
|
34
38
|
composite_contentviews = []
|
35
39
|
@api.resource(:content_views).call(:index, {
|
36
40
|
'per_page' => 999999,
|
@@ -84,6 +88,8 @@ module HammerCLICsv
|
|
84
88
|
end
|
85
89
|
|
86
90
|
def create_filters_from_csv(line)
|
91
|
+
return if option_organization && line[ORGANIZATION] != option_organization
|
92
|
+
|
87
93
|
@existing_filters[line[ORGANIZATION]] ||= {}
|
88
94
|
if !@existing_filters[line[ORGANIZATION]][line[CONTENTVIEW]]
|
89
95
|
@existing_filters[line[ORGANIZATION]][line[CONTENTVIEW]] ||= {}
|
@@ -9,54 +9,47 @@
|
|
9
9
|
# have received a copy of GPLv2 along with this software; if not, see
|
10
10
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
11
11
|
|
12
|
+
require 'hammer_cli_foreman'
|
13
|
+
require 'hammer_cli_foreman_tasks'
|
14
|
+
|
12
15
|
module HammerCLICsv
|
13
16
|
class CsvCommand
|
14
17
|
class ContentViewsCommand < BaseCommand
|
18
|
+
include ::HammerCLIForemanTasks::Helper
|
19
|
+
|
15
20
|
command_name 'content-views'
|
16
21
|
desc 'import or export content-views'
|
17
22
|
|
23
|
+
option %w(--organization), 'ORGANIZATION', 'Only process organization matching this name'
|
24
|
+
|
18
25
|
LABEL = 'Label'
|
19
26
|
ORGANIZATION = 'Organization'
|
20
27
|
DESCRIPTION = 'Description'
|
21
28
|
COMPOSITE = 'Composite'
|
22
29
|
REPOSITORIES = 'Repositories or Composites'
|
23
|
-
|
30
|
+
ENVIRONMENTS = "Lifecycle Environments"
|
24
31
|
|
25
32
|
def export
|
26
33
|
CSV.open(option_csv_file || '/dev/stdout', 'wb', {:force_quotes => false}) do |csv|
|
27
|
-
csv << [NAME, COUNT, LABEL, ORGANIZATION, COMPOSITE, REPOSITORIES,
|
34
|
+
csv << [NAME, COUNT, LABEL, ORGANIZATION, COMPOSITE, REPOSITORIES, ENVIRONMENTS]
|
28
35
|
@api.resource(:organizations).call(:index, {
|
29
36
|
:per_page => 999999
|
30
37
|
})['results'].each do |organization|
|
38
|
+
next if option_organization && organization['name'] != option_organization
|
39
|
+
|
31
40
|
composite_contentviews = []
|
32
41
|
@api.resource(:content_views).call(:index, {
|
33
42
|
'per_page' => 999999,
|
34
43
|
'organization_id' => organization['id'],
|
35
44
|
'nondefault' => true
|
36
45
|
})['results'].each do |contentview|
|
37
|
-
|
38
|
-
filters = CSV.generate do |column|
|
39
|
-
column << @api.resource(:content_view_filters).call(:index, {
|
40
|
-
'content_view_id' => contentview['id']
|
41
|
-
})['results'].collect do |filter|
|
42
|
-
rules = filter['rules'].collect do |rule|
|
43
|
-
rule['name']
|
44
|
-
end
|
45
|
-
in_or_out = filter['inclusion'] == true ? 'Include' : 'Exclude'
|
46
|
-
if filter['type'] == 'rpm'
|
47
|
-
"#{ in_or_out }|#{ filter['type'] }|#{ rules.join(',')}"
|
48
|
-
elsif filter['type'] == 'erratum'
|
49
|
-
"#{ in_or_out }|#{ filter['type'] }|#{ rules['types'].join(',')}"
|
50
|
-
else
|
51
|
-
"???? #{filter['type']}"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
filters.delete!("\n")
|
56
|
-
|
57
46
|
name = contentview['name']
|
58
47
|
label = contentview['label']
|
59
48
|
orgname = organization['name']
|
49
|
+
environments = CSV.generate do |column|
|
50
|
+
column << environment_names(contentview)
|
51
|
+
end
|
52
|
+
environments.delete!("\n")
|
60
53
|
composite = contentview['composite'] == true ? 'Yes' : 'No'
|
61
54
|
if composite == 'Yes'
|
62
55
|
contentviews = CSV.generate do |column|
|
@@ -65,10 +58,10 @@ module HammerCLICsv
|
|
65
58
|
end
|
66
59
|
end
|
67
60
|
contentviews.delete!("\n")
|
68
|
-
composite_contentviews << [name, 1, label, orgname, composite, contentviews,
|
61
|
+
composite_contentviews << [name, 1, label, orgname, composite, contentviews, environments]
|
69
62
|
else
|
70
63
|
repositories = export_column(contentview, 'repositories', 'name')
|
71
|
-
csv << [name, 1, label, orgname, composite, repositories,
|
64
|
+
csv << [name, 1, label, orgname, composite, repositories, environments]
|
72
65
|
end
|
73
66
|
end
|
74
67
|
composite_contentviews.each do |contentview|
|
@@ -87,6 +80,8 @@ module HammerCLICsv
|
|
87
80
|
end
|
88
81
|
|
89
82
|
def create_contentviews_from_csv(line)
|
83
|
+
return if option_organization && line[ORGANIZATION] != option_organization
|
84
|
+
|
90
85
|
if !@existing_contentviews[line[ORGANIZATION]]
|
91
86
|
@existing_contentviews[line[ORGANIZATION]] ||= {}
|
92
87
|
@api.resource(:content_views).call(:index, {
|
@@ -103,7 +98,7 @@ module HammerCLICsv
|
|
103
98
|
if is_composite
|
104
99
|
composite_ids = collect_column(line[REPOSITORIES]) do |composite|
|
105
100
|
# TODO: export version and use it here
|
106
|
-
katello_contentviewversion(line[ORGANIZATION], composite
|
101
|
+
katello_contentviewversion(line[ORGANIZATION], composite)
|
107
102
|
end
|
108
103
|
else
|
109
104
|
repository_ids = collect_column(line[REPOSITORIES]) do |repository|
|
@@ -116,7 +111,7 @@ module HammerCLICsv
|
|
116
111
|
|
117
112
|
contentview_id = @existing_contentviews[line[ORGANIZATION]][name]
|
118
113
|
if !contentview_id
|
119
|
-
print "Creating content view '
|
114
|
+
print _("Creating content view '%{name}'...") % {:name => name} if option_verbose?
|
120
115
|
options = {
|
121
116
|
'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
|
122
117
|
'name' => name,
|
@@ -133,7 +128,7 @@ module HammerCLICsv
|
|
133
128
|
@existing_contentviews[line[ORGANIZATION]][name] = contentview_id
|
134
129
|
publish = true
|
135
130
|
else
|
136
|
-
print "Updating content view '
|
131
|
+
print _("Updating content view '%{name}'...") % {:name => name} if option_verbose?
|
137
132
|
options = {
|
138
133
|
'id' => contentview_id,
|
139
134
|
'description' => line[DESCRIPTION]
|
@@ -144,26 +139,52 @@ module HammerCLICsv
|
|
144
139
|
options['repository_ids'] = repository_ids
|
145
140
|
end
|
146
141
|
contentview = @api.resource(:content_views).call(:update, options)
|
142
|
+
contentview_id = contentview['id']
|
147
143
|
publish = contentview['versions'].empty?
|
148
144
|
end
|
149
145
|
|
150
146
|
# Content views cannot be used in composites unless a publish has occurred
|
151
|
-
|
152
|
-
|
153
|
-
args = %W{
|
154
|
-
--server #{ @server } --username #{ @username } --password #{ @server }
|
155
|
-
content-view publish --id #{ contentview_id }
|
156
|
-
--organization-id #{ foreman_organization(:name => line[ORGANIZATION]) }
|
157
|
-
}
|
158
|
-
hammer.run(args)
|
159
|
-
end
|
147
|
+
publish_content_view(contentview_id, line) if publish
|
148
|
+
promote_content_view(contentview_id, line)
|
160
149
|
|
161
|
-
puts 'done' if option_verbose?
|
150
|
+
puts _('done') if option_verbose?
|
162
151
|
end
|
163
152
|
|
164
153
|
rescue RuntimeError => e
|
165
154
|
raise "#{e}\n #{line}"
|
166
155
|
end
|
156
|
+
|
157
|
+
def environment_names(contentview)
|
158
|
+
names = []
|
159
|
+
contentview['versions'].each do |version|
|
160
|
+
version['environment_ids'].each do |environment_id|
|
161
|
+
names << lifecycle_environment(contentview['organization']['name'], :id => environment_id)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
names.uniq
|
165
|
+
end
|
166
|
+
|
167
|
+
def publish_content_view(contentview_id, line)
|
168
|
+
task_progress(@api.resource(:content_views).call(:publish, {
|
169
|
+
'id' => contentview_id
|
170
|
+
}))
|
171
|
+
end
|
172
|
+
|
173
|
+
def promote_content_view(contentview_id, line)
|
174
|
+
contentview = @api.resource(:content_views).call(:show, {'id' => contentview_id})
|
175
|
+
existing_names = environment_names(contentview)
|
176
|
+
|
177
|
+
CSV.parse_line(line[ENVIRONMENTS]).each do |environment_name|
|
178
|
+
next if environment_name == 'Library' || existing_names.include?(environment_name)
|
179
|
+
|
180
|
+
version = contentview['versions'][-1]
|
181
|
+
task_progress(@api.resource(:content_view_versions).call(:promote, {
|
182
|
+
'id' => version['id'],
|
183
|
+
'environment_id' => lifecycle_environment(line[ORGANIZATION], :name => environment_name),
|
184
|
+
'force' => true
|
185
|
+
}))
|
186
|
+
end
|
187
|
+
end
|
167
188
|
end
|
168
189
|
end
|
169
190
|
end
|
@@ -57,7 +57,7 @@ module HammerCLICsv
|
|
57
57
|
domains architectures partition_tables lifecycle_environments
|
58
58
|
provisioning_templates
|
59
59
|
hosts reports )
|
60
|
-
skipped_resources += %w( subscriptions
|
60
|
+
skipped_resources += %w( subscriptions roles users ) # TODO: not implemented yet
|
61
61
|
else
|
62
62
|
@api = ApipieBindings::API.new({
|
63
63
|
:uri => @server,
|
@@ -9,20 +9,6 @@
|
|
9
9
|
# have received a copy of GPLv2 along with this software; if not, see
|
10
10
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
11
11
|
|
12
|
-
#
|
13
|
-
# -= System Groups CSV =-
|
14
|
-
#
|
15
|
-
# Columns
|
16
|
-
# Name
|
17
|
-
# - System group name
|
18
|
-
# - May contain '%d' which will be replaced with current iteration number of Count
|
19
|
-
# - eg. "group%d" -> "group1"
|
20
|
-
# Count
|
21
|
-
# - Number of times to iterate on this line of the CSV file
|
22
|
-
# Org Label
|
23
|
-
# Limit
|
24
|
-
# Description
|
25
|
-
#
|
26
12
|
|
27
13
|
require 'hammer_cli'
|
28
14
|
require 'json'
|
@@ -34,6 +20,8 @@ module HammerCLICsv
|
|
34
20
|
command_name 'host-collections'
|
35
21
|
desc 'import or export host collections'
|
36
22
|
|
23
|
+
option %w(--organization), 'ORGANIZATION', 'Only process organization matching this name'
|
24
|
+
|
37
25
|
ORGANIZATION = 'Organization'
|
38
26
|
LIMIT = 'Limit'
|
39
27
|
DESCRIPTION = 'Description'
|
@@ -43,6 +31,7 @@ module HammerCLICsv
|
|
43
31
|
csv << [NAME, COUNT, ORGANIZATION, LIMIT, DESCRIPTION]
|
44
32
|
if @server_status['release'] == 'Headpin'
|
45
33
|
@headpin.get(:organizations).each do |organization|
|
34
|
+
next if option_organization && organization['name'] != option_organization
|
46
35
|
@headpin.get("organizations/#{organization['label']}/system_groups").each do |systemgroup|
|
47
36
|
csv << [systemgroup['name'], 1, organization['name'],
|
48
37
|
systemgroup['max_systems'].to_i < 0 ? 'Unlimited' : systemgroup['max_systems'],
|
@@ -51,11 +40,13 @@ module HammerCLICsv
|
|
51
40
|
end
|
52
41
|
else
|
53
42
|
@api.resource(:organizations).call(:index, {'per_page' => 999999})['results'].each do |organization|
|
43
|
+
next if option_organization && organization['name'] != option_organization
|
54
44
|
@api.resource(:host_collections).call(:index, {
|
55
45
|
'organization_id' => organization['id']
|
56
46
|
})['results'].each do |hostcollection|
|
57
|
-
|
58
|
-
|
47
|
+
limit = hostcollection['unlimited_content_hosts'] ? 'Unlimited' : hostcollection['max_content_hosts']
|
48
|
+
csv << [hostcollection['name'], 1, organization['name'],
|
49
|
+
limit,
|
59
50
|
hostcollection['description']]
|
60
51
|
end
|
61
52
|
end
|
@@ -72,6 +63,8 @@ module HammerCLICsv
|
|
72
63
|
end
|
73
64
|
|
74
65
|
def create_hostcollections_from_csv(line)
|
66
|
+
return if option_organization && line[ORGANIZATION] != option_organization
|
67
|
+
|
75
68
|
if !@existing[line[ORGANIZATION]]
|
76
69
|
@existing[line[ORGANIZATION]] = {}
|
77
70
|
@api.resource(:host_collections).call(:index, {
|
@@ -84,23 +77,20 @@ module HammerCLICsv
|
|
84
77
|
|
85
78
|
line[COUNT].to_i.times do |number|
|
86
79
|
name = namify(line[NAME], number)
|
80
|
+
params = {
|
81
|
+
'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
|
82
|
+
'name' => name,
|
83
|
+
'unlimited_content_hosts' => (line[LIMIT] == 'Unlimited') ? true : false,
|
84
|
+
'max_content_hosts' => (line[LIMIT] == 'Unlimited') ? nil : line[LIMIT].to_i,
|
85
|
+
'description' => line[DESCRIPTION]
|
86
|
+
}
|
87
87
|
if !@existing[line[ORGANIZATION]].include? name
|
88
|
-
print "Creating
|
89
|
-
@api.resource(:host_collections).call(:create,
|
90
|
-
'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
|
91
|
-
'name' => name,
|
92
|
-
'max_systems' => (line[LIMIT] == 'Unlimited') ? -1 : line[LIMIT],
|
93
|
-
'description' => line[DESCRIPTION]
|
94
|
-
})
|
88
|
+
print "Creating host collection '#{name}'..." if option_verbose?
|
89
|
+
@api.resource(:host_collections).call(:create, params)
|
95
90
|
else
|
96
|
-
print "Updating
|
97
|
-
@
|
98
|
-
|
99
|
-
'id' => @existing[line[ORGANIZATION]][name],
|
100
|
-
'name' => name,
|
101
|
-
'max_systems' => (line[LIMIT] == 'Unlimited') ? -1 : line[LIMIT],
|
102
|
-
'description' => line[DESCRIPTION]
|
103
|
-
})
|
91
|
+
print "Updating host collection '#{name}'..." if option_verbose?
|
92
|
+
params['id'] = @existing[line[ORGANIZATION]][name]
|
93
|
+
@api.resource(:host_collections).call(:update, params)
|
104
94
|
end
|
105
95
|
print "done\n" if option_verbose?
|
106
96
|
end
|
@@ -18,27 +18,21 @@ module HammerCLICsv
|
|
18
18
|
|
19
19
|
option %w(-v --verbose), :flag, 'be verbose'
|
20
20
|
option %w(--threads), 'THREAD_COUNT', 'Number of threads to hammer with', :default => 1
|
21
|
-
option %w(--server), 'SERVER', 'Server URL'
|
22
|
-
option %w(-u --username), 'USERNAME', 'Username to access server'
|
23
|
-
option %w(-p --password), 'PASSWORD', 'Password to access server'
|
24
21
|
option '--dir', 'DIRECTORY', 'directory to import from'
|
25
22
|
|
26
23
|
RESOURCES = %w( organizations locations puppet_environments operating_systems
|
27
24
|
domains architectures partition_tables lifecycle_environments host_collections
|
28
25
|
provisioning_templates
|
29
|
-
subscriptions
|
26
|
+
subscriptions products content_views content_view_filters activation_keys
|
27
|
+
hosts content_hosts reports roles users )
|
30
28
|
RESOURCES.each do |resource|
|
31
29
|
dashed = resource.sub('_', '-')
|
32
30
|
option "--#{dashed}", 'FILE', "csv file for #{dashed}"
|
33
31
|
end
|
34
32
|
|
35
33
|
def execute
|
36
|
-
@api = ApipieBindings::API.new({
|
37
|
-
|
38
|
-
:username => option_username || HammerCLI::Settings.get(:csv, :username),
|
39
|
-
:password => option_password || HammerCLI::Settings.get(:csv, :password),
|
40
|
-
:api_version => 2
|
41
|
-
})
|
34
|
+
@api = ApipieBindings::API.new({:uri => get_option(:host), :username => get_option(:username),
|
35
|
+
:password => get_option(:password), :api_version => 2})
|
42
36
|
|
43
37
|
# Swing the hammers
|
44
38
|
RESOURCES.each do |resource|
|
@@ -71,6 +65,15 @@ module HammerCLICsv
|
|
71
65
|
args += %W( --threads #{option_threads} )
|
72
66
|
hammer.run(args)
|
73
67
|
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def get_option(name)
|
72
|
+
HammerCLI::Settings.settings[:_params][name] ||
|
73
|
+
HammerCLI::Settings.get(:csv, name) ||
|
74
|
+
HammerCLI::Settings.get(:katello, name) ||
|
75
|
+
HammerCLI::Settings.get(:foreman, name)
|
76
|
+
end
|
74
77
|
end
|
75
78
|
end
|
76
79
|
end
|
@@ -31,6 +31,8 @@ module HammerCLICsv
|
|
31
31
|
command_name 'lifecycle-environments'
|
32
32
|
desc 'import or export lifecycle environments'
|
33
33
|
|
34
|
+
option %w(--organization), 'ORGANIZATION', 'Only process organization matching this name'
|
35
|
+
|
34
36
|
ORGANIZATION = 'Organization'
|
35
37
|
PRIORENVIRONMENT = 'Prior Environment'
|
36
38
|
DESCRIPTION = 'Description'
|
@@ -41,14 +43,16 @@ module HammerCLICsv
|
|
41
43
|
@api.resource(:organizations).call(:index, {
|
42
44
|
'per_page' => 999999
|
43
45
|
})['results'].each do |organization|
|
46
|
+
next if option_organization && organization['name'] != option_organization
|
47
|
+
|
44
48
|
@api.resource(:lifecycle_environments).call(:index, {
|
45
49
|
'per_page' => 999999,
|
46
50
|
'organization_id' => organization['id']
|
47
|
-
})['results'].each do |environment|
|
51
|
+
})['results'].sort { |a, b| a['created_at'] <=> b['created_at'] }.each do |environment|
|
48
52
|
if environment['name'] != 'Library'
|
49
53
|
name = environment['name']
|
50
54
|
count = 1
|
51
|
-
prior = environment['prior']
|
55
|
+
prior = environment['prior']['name']
|
52
56
|
description = environment['description']
|
53
57
|
csv << [name, count, organization['name'], prior, description]
|
54
58
|
end
|
@@ -77,6 +81,8 @@ module HammerCLICsv
|
|
77
81
|
end
|
78
82
|
|
79
83
|
def create_environments_from_csv(line)
|
84
|
+
return if option_organization && line[ORGANIZATION] != option_organization
|
85
|
+
|
80
86
|
line[COUNT].to_i.times do |number|
|
81
87
|
name = namify(line[NAME], number)
|
82
88
|
prior = namify(line[PRIORENVIRONMENT], number)
|
@@ -87,6 +93,7 @@ module HammerCLICsv
|
|
87
93
|
'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
|
88
94
|
'name' => name,
|
89
95
|
'prior' => lifecycle_environment(line[ORGANIZATION], :name => prior),
|
96
|
+
'prior_id' => lifecycle_environment(line[ORGANIZATION], :name => prior),
|
90
97
|
'description' => line[DESCRIPTION]
|
91
98
|
})
|
92
99
|
else
|
@@ -96,7 +103,6 @@ module HammerCLICsv
|
|
96
103
|
'name' => name,
|
97
104
|
'new_name' => name,
|
98
105
|
'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
|
99
|
-
'prior' => prior,
|
100
106
|
'description' => line[DESCRIPTION]
|
101
107
|
})
|
102
108
|
end
|
@@ -13,7 +13,10 @@ module HammerCLICsv
|
|
13
13
|
class CsvCommand
|
14
14
|
class ProductsCommand < BaseCommand
|
15
15
|
command_name 'products'
|
16
|
-
desc 'import or export products'
|
16
|
+
desc _('import or export products')
|
17
|
+
|
18
|
+
option %w(--organization), 'ORGANIZATION', _('Only process organization matching this name')
|
19
|
+
option %w(--sync), 'true|false', _('Sync product repositories (default true)')
|
17
20
|
|
18
21
|
LABEL = 'Label'
|
19
22
|
ORGANIZATION = 'Organization'
|
@@ -28,18 +31,20 @@ module HammerCLICsv
|
|
28
31
|
@api.resource(:organizations).call(:index, {
|
29
32
|
:per_page => 999999
|
30
33
|
})['results'].each do |organization|
|
34
|
+
next if option_organization && organization['name'] != option_organization
|
31
35
|
@api.resource(:products).call(:index, {
|
32
36
|
'per_page' => 999999,
|
33
37
|
'enabled' => true,
|
34
38
|
'organization_id' => organization['id']
|
35
39
|
})['results'].each do |product|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
@api.resource(:repositories).call(:index, {
|
41
|
+
'product_id' => product['id'],
|
42
|
+
'organization_id' => organization['id']
|
43
|
+
})['results'].each do |repository|
|
44
|
+
repository_type = repository['product_type'] == 'custom' ? 'Custom' : 'Red Hat'
|
45
|
+
repository_type += " #{repository['content_type'].capitalize}"
|
46
|
+
csv << [product['name'], 1, product['label'], organization['name'],
|
47
|
+
repository['name'], repository_type, repository['url']]
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
@@ -55,7 +60,11 @@ module HammerCLICsv
|
|
55
60
|
end
|
56
61
|
end
|
57
62
|
|
63
|
+
# FIXME: TODO remove this rubocop
|
64
|
+
# rubocop:disable CyclomaticComplexity
|
58
65
|
def create_products_from_csv(line)
|
66
|
+
return if option_organization && line[ORGANIZATION] != option_organization
|
67
|
+
|
59
68
|
if !@existing_products[line[ORGANIZATION]]
|
60
69
|
@existing_products[line[ORGANIZATION]] = {}
|
61
70
|
@api.resource(:products).call(:index, {
|
@@ -82,9 +91,10 @@ module HammerCLICsv
|
|
82
91
|
name = namify(line[NAME], number)
|
83
92
|
product_id = @existing_products[line[ORGANIZATION]][name]
|
84
93
|
if product_id.nil?
|
85
|
-
print "Creating product '
|
94
|
+
print _("Creating product '%{name}'...") % {:name => name} if option_verbose?
|
86
95
|
if line[REPOSITORY_TYPE] =~ /Red Hat/
|
87
|
-
raise "Red Hat product '
|
96
|
+
raise _("Red Hat product '%{name}' does not exist in '%{organization}'") %
|
97
|
+
{:name => name, :organization => line[ORGANIZATION]}
|
88
98
|
end
|
89
99
|
|
90
100
|
product_id = @api.resource(:products).call(:create, {
|
@@ -94,10 +104,9 @@ module HammerCLICsv
|
|
94
104
|
@existing_products[line[ORGANIZATION]][name] = product_id
|
95
105
|
else
|
96
106
|
# Nothing to update for products
|
97
|
-
print "Updating product '
|
107
|
+
print _("Updating product '%{name}'...") % {:name => name} if option_verbose?
|
98
108
|
end
|
99
109
|
@existing_repositories[line[ORGANIZATION] + name] = {}
|
100
|
-
print "done\n" if option_verbose?
|
101
110
|
|
102
111
|
repository_name = namify(line[REPOSITORY], number)
|
103
112
|
|
@@ -116,7 +125,10 @@ module HammerCLICsv
|
|
116
125
|
if !repository
|
117
126
|
raise "Red Hat product '#{name}' does not have repository '#{repository_name}'" if line[REPOSITORY_TYPE] =~ /Red Hat/
|
118
127
|
|
119
|
-
|
128
|
+
if option_verbose?
|
129
|
+
print _("Creating repository '%{repository_name}' in product '%{name}'...") %
|
130
|
+
{:repository_name => repository_name, :name => name}
|
131
|
+
end
|
120
132
|
repository = @api.resource(:repositories).call(:create, {
|
121
133
|
'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
|
122
134
|
'name' => repository_name,
|
@@ -126,16 +138,10 @@ module HammerCLICsv
|
|
126
138
|
'content_type' => content_type(line[REPOSITORY_TYPE])
|
127
139
|
})
|
128
140
|
@existing_repositories[line[ORGANIZATION] + name][line[LABEL]] = repository
|
129
|
-
puts 'done' if option_verbose?
|
130
141
|
end
|
131
142
|
|
132
|
-
|
133
|
-
|
134
|
-
puts 'already done' if option_verbose?
|
135
|
-
else
|
136
|
-
sync_repository(line, repository)
|
137
|
-
print "done\n" if option_verbose?
|
138
|
-
end
|
143
|
+
sync_repository(line, repository)
|
144
|
+
puts _('done') if option_verbose?
|
139
145
|
end
|
140
146
|
|
141
147
|
rescue RuntimeError => e
|
@@ -156,8 +162,23 @@ module HammerCLICsv
|
|
156
162
|
end
|
157
163
|
|
158
164
|
def sync_repository(line, repository)
|
159
|
-
|
160
|
-
|
165
|
+
if option_sync =~ (/A(true|1|yes)$/i) || HammerCLI::Settings.get(:csv, :products_sync) ||
|
166
|
+
(option_sync.nil? && HammerCLI::Settings.get(:csv, :products_sync).nil?)
|
167
|
+
if option_verbose?
|
168
|
+
print _("syncing repository '%{repository_name}' in product '%{name}'...") %
|
169
|
+
{:repository_name => repository_name, :name => name}
|
170
|
+
end
|
171
|
+
if repository['sync_state'] == 'finished'
|
172
|
+
print _("previously synced, skipping...") if option_verbose?
|
173
|
+
else
|
174
|
+
exec_sync_repository(line, repository)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def exec_sync_repository(line, repository)
|
180
|
+
args = %W{ --server #{ @server } --username #{ @username } --password #{ @password }
|
181
|
+
repository synchronize
|
161
182
|
--id #{ repository['id'] }
|
162
183
|
--organization-id #{ foreman_organization(:name => line[ORGANIZATION]) } }
|
163
184
|
hammer.run(args)
|