hammer_cli_csv 1.0.0 → 1.0.1
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 +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)
|