hammer_cli_csv 2.0.0 → 2.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 +5 -13
- data/config/cli_config.yml +9 -24
- data/lib/hammer_cli_csv/activation_keys.rb +220 -95
- data/lib/hammer_cli_csv/architectures.rb +7 -11
- data/lib/hammer_cli_csv/base.rb +67 -41
- data/lib/hammer_cli_csv/compute_profiles.rb +11 -15
- data/lib/hammer_cli_csv/compute_resources.rb +11 -15
- data/lib/hammer_cli_csv/containers.rb +10 -12
- data/lib/hammer_cli_csv/content_hosts.rb +285 -203
- data/lib/hammer_cli_csv/content_view_filters.rb +32 -36
- data/lib/hammer_cli_csv/content_views.rb +33 -37
- data/lib/hammer_cli_csv/csv.rb +17 -1
- data/lib/hammer_cli_csv/domains.rb +15 -19
- data/lib/hammer_cli_csv/export.rb +13 -5
- data/lib/hammer_cli_csv/host_collections.rb +20 -22
- data/lib/hammer_cli_csv/host_groups.rb +73 -65
- data/lib/hammer_cli_csv/hosts.rb +30 -34
- data/lib/hammer_cli_csv/import.rb +24 -10
- data/lib/hammer_cli_csv/installation_media.rb +74 -0
- data/lib/hammer_cli_csv/job_templates.rb +37 -41
- data/lib/hammer_cli_csv/lifecycle_environments.rb +15 -19
- data/lib/hammer_cli_csv/locations.rb +4 -6
- data/lib/hammer_cli_csv/operating_systems.rb +17 -21
- data/lib/hammer_cli_csv/organizations.rb +11 -13
- data/lib/hammer_cli_csv/partition_tables.rb +17 -21
- data/lib/hammer_cli_csv/products.rb +200 -92
- data/lib/hammer_cli_csv/provisioning_templates.rb +19 -23
- data/lib/hammer_cli_csv/puppet_environments.rb +8 -12
- data/lib/hammer_cli_csv/puppet_facts.rb +20 -24
- data/lib/hammer_cli_csv/puppet_reports.rb +47 -51
- data/lib/hammer_cli_csv/reports.rb +6 -10
- data/lib/hammer_cli_csv/roles.rb +12 -16
- data/lib/hammer_cli_csv/settings.rb +8 -6
- data/lib/hammer_cli_csv/smart_proxies.rb +9 -13
- data/lib/hammer_cli_csv/splice.rb +1 -3
- data/lib/hammer_cli_csv/subnets.rb +24 -28
- data/lib/hammer_cli_csv/subscriptions.rb +39 -91
- data/lib/hammer_cli_csv/sync_plans.rb +20 -24
- data/lib/hammer_cli_csv/users.rb +25 -29
- data/lib/hammer_cli_csv/utils/subscriptions.rb +130 -0
- data/lib/hammer_cli_csv/version.rb +1 -1
- data/lib/hammer_cli_csv.rb +2 -2
- data/test/csv_test.rb +32 -0
- data/test/csv_test_helper.rb +17 -2
- data/test/data/content-hosts.csv +3 -2
- data/test/data/hosts.csv +0 -11
- data/test/data/settings.csv +1 -0
- data/test/data/setup/content-hosts.csv +1 -0
- data/test/data/setup/content-views.csv +2 -0
- data/test/data/setup/lifecycle-environments.csv +5 -0
- data/test/data/setup/locations.csv +6 -0
- data/test/data/setup/organizations.csv +2 -0
- data/test/data/setup/subscriptions.csv +5 -0
- data/test/data/subscriptions.csv +15 -17
- data/test/export_test.rb +27 -0
- data/test/fixtures/vcr_cassettes/apipie.yml +18528 -0
- data/test/fixtures/vcr_cassettes/resources/activation_keys_import/create_and_update.yml +38033 -0
- data/test/fixtures/vcr_cassettes/resources/content_hosts_export/export.yml +18846 -0
- data/test/fixtures/vcr_cassettes/resources/content_hosts_export/export_subscriptions.yml +323 -0
- data/test/fixtures/vcr_cassettes/resources/content_hosts_import/create_and_update.yml +41884 -0
- data/test/fixtures/vcr_cassettes/resources/content_hosts_import/import_single_line.yml +38248 -0
- data/test/fixtures/vcr_cassettes/resources/settings_import/update_settings.yml +18832 -0
- data/test/fixtures/vcr_cassettes/resources/settings_import/update_settings_continue.yml +316 -0
- data/test/fixtures/vcr_cassettes/resources/subscriptions_import/manifest_does_not_exist.yml +18785 -0
- data/test/fixtures/vcr_cassettes/setup/setup_content_views/setup.yml +19090 -0
- data/test/fixtures/vcr_cassettes/setup/setup_lifecycle_environments/setup.yml +924 -0
- data/test/fixtures/vcr_cassettes/setup/setup_locations/setup.yml +21102 -0
- data/test/fixtures/vcr_cassettes/setup/setup_organizations/setup.yml +19278 -0
- data/test/fixtures/vcr_cassettes/setup/setup_subscriptions/setup.yml +419 -0
- data/test/import_test.rb +20 -25
- data/test/resources/activation_keys_test.rb +72 -0
- data/test/resources/content_hosts_test.rb +132 -0
- data/test/resources/settings_test.rb +81 -0
- data/test/resources/subscriptions_test.rb +56 -0
- data/test/setup/setup_content_views.rb +17 -0
- data/test/setup/setup_lifecycle_environments.rb +17 -0
- data/test/setup/setup_locations.rb +17 -0
- data/test/setup/setup_organizations.rb +17 -0
- data/test/setup/setup_subscriptions.rb +20 -0
- data/test/setup/setup_test.rb +10 -0
- data/test/test_runner.rb +175 -0
- data/test/vcr_setup.rb +54 -0
- metadata +77 -13
- data/lib/hammer_cli_csv/exception_handler.rb +0 -42
- data/lib/hammer_cli_csv/installation_medias.rb +0 -77
- data/test/content_hosts_test.rb +0 -61
- data/test/settings_test.rb +0 -30
|
@@ -13,17 +13,13 @@ module HammerCLICsv
|
|
|
13
13
|
PENDING = 'Pending'
|
|
14
14
|
METRICS = 'Metrics'
|
|
15
15
|
|
|
16
|
-
def export
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
csv << [report['host_name'], report['metrics'].to_json]
|
|
23
|
-
end
|
|
16
|
+
def export(csv)
|
|
17
|
+
csv << [NAME]
|
|
18
|
+
@api.resource(:reports).call(:index, {
|
|
19
|
+
'per_page' => 999999
|
|
20
|
+
})['results'].each do |report|
|
|
21
|
+
csv << [report['host_name'], report['metrics'].to_json]
|
|
24
22
|
end
|
|
25
|
-
|
|
26
|
-
HammerCLI::EX_OK
|
|
27
23
|
end
|
|
28
24
|
|
|
29
25
|
def import
|
data/lib/hammer_cli_csv/roles.rb
CHANGED
|
@@ -10,25 +10,21 @@ module HammerCLICsv
|
|
|
10
10
|
ORGANIZATIONS = 'Organizations'
|
|
11
11
|
LOCATIONS = 'Locations'
|
|
12
12
|
|
|
13
|
-
def export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@api.resource(:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
filter = @api.resource(:filters).call(:show, 'id' => filter['id'])
|
|
13
|
+
def export(csv)
|
|
14
|
+
csv << [NAME, RESOURCE, SEARCH, PERMISSIONS, ORGANIZATIONS, LOCATIONS]
|
|
15
|
+
@api.resource(:roles).call(:index, {'per_page' => 999999})['results'].each do |role|
|
|
16
|
+
@api.resource(:filters).call(:index, {
|
|
17
|
+
'per_page' => 999999,
|
|
18
|
+
'search' => "role=\"#{role['name']}\""
|
|
19
|
+
})['results'].each do |filter|
|
|
20
|
+
filter = @api.resource(:filters).call(:show, 'id' => filter['id'])
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
end
|
|
22
|
+
permissions = export_column(filter, 'permissions', 'name')
|
|
23
|
+
organizations = export_column(filter, 'organizations', 'name')
|
|
24
|
+
locations = export_column(filter, 'locations', 'name')
|
|
25
|
+
csv << [role['name'], filter['resource_type'], filter['search'] || '', permissions, organizations, locations]
|
|
28
26
|
end
|
|
29
27
|
end
|
|
30
|
-
|
|
31
|
-
HammerCLI::EX_OK
|
|
32
28
|
end
|
|
33
29
|
|
|
34
30
|
def import
|
|
@@ -6,12 +6,14 @@ module HammerCLICsv
|
|
|
6
6
|
|
|
7
7
|
VALUE = 'Value'
|
|
8
8
|
|
|
9
|
-
def
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
def self.supported?
|
|
10
|
+
true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def export(csv)
|
|
14
|
+
csv << [NAME, VALUE]
|
|
15
|
+
@api.resource(:settings).call(:index, {'per_page' => 999999})['results'].each do |setting|
|
|
16
|
+
csv << [setting['name'], setting['value']]
|
|
15
17
|
end
|
|
16
18
|
end
|
|
17
19
|
|
|
@@ -9,17 +9,15 @@ module HammerCLICsv
|
|
|
9
9
|
URL = 'URL'
|
|
10
10
|
LIFECYCLE_ENVIRONMENTS = 'Lifecycle Environments'
|
|
11
11
|
|
|
12
|
-
def export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@api.resource(:smart_proxies).call(:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
csv << [name, organizations, locations, url]
|
|
22
|
-
end
|
|
12
|
+
def export(csv)
|
|
13
|
+
csv << [NAME, ORGANIZATIONS, LOCATIONS, URL, LIFECYCLE_ENVIRONMENTS]
|
|
14
|
+
@api.resource(:smart_proxies).call(:index, {:per_page => 999999})['results'].each do |smart_proxy|
|
|
15
|
+
smart_proxy = @api.resource(:smart_proxies).call(:show, {'id' => smart_proxy['id']})
|
|
16
|
+
name = smart_proxy['name']
|
|
17
|
+
organizations = export_column(smart_proxy, 'organizations', 'name')
|
|
18
|
+
locations = export_column(smart_proxy, 'locations', 'name')
|
|
19
|
+
url = smart_proxy['url']
|
|
20
|
+
csv << [name, organizations, locations, url]
|
|
23
21
|
end
|
|
24
22
|
end
|
|
25
23
|
|
|
@@ -63,8 +61,6 @@ module HammerCLICsv
|
|
|
63
61
|
|
|
64
62
|
print "done\n" if option_verbose?
|
|
65
63
|
end
|
|
66
|
-
rescue RuntimeError => e
|
|
67
|
-
raise "#{e}\n #{line}"
|
|
68
64
|
end
|
|
69
65
|
end
|
|
70
66
|
end
|
|
@@ -130,8 +130,6 @@ module HammerCLICsv
|
|
|
130
130
|
update_host_collections(host_id, line)
|
|
131
131
|
|
|
132
132
|
puts _('done') if option_verbose?
|
|
133
|
-
rescue RuntimeError => e
|
|
134
|
-
raise "#{e}\n #{line}"
|
|
135
133
|
end
|
|
136
134
|
|
|
137
135
|
private
|
|
@@ -266,7 +264,7 @@ module HammerCLICsv
|
|
|
266
264
|
subscriptions = CSV.parse_line(line[SUBSCRIPTIONS], {:skip_blanks => true}).collect do |details|
|
|
267
265
|
(amount, sku, name) = details.split('|')
|
|
268
266
|
{
|
|
269
|
-
:id =>
|
|
267
|
+
:id => get_subscription(line[ORGANIZATION], :name => name),
|
|
270
268
|
:quantity => (amount.nil? || amount.empty? || amount == 'Automatic') ? 0 : amount.to_i
|
|
271
269
|
}
|
|
272
270
|
end
|
|
@@ -19,33 +19,31 @@ module HammerCLICsv
|
|
|
19
19
|
DNS_SECONDARY = 'DNS Secondary'
|
|
20
20
|
VLAN_ID = 'VLAN ID'
|
|
21
21
|
|
|
22
|
-
def export
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@api.resource(:subnets).call(:
|
|
28
|
-
subnet = @api.resource(:subnets).call(:show, {'id' => subnet['id']})
|
|
22
|
+
def export(csv)
|
|
23
|
+
csv << [NAME, ORGANIZATIONS, LOCATIONS, NETWORK, NETWORK_MASK,
|
|
24
|
+
NETWORK_FROM, NETWORK_TO, DOMAINS, GATEWAY, DHCP_PROXY, TFTP_PROXY, DNS_PROXY,
|
|
25
|
+
DNS_PRIMARY, DNS_SECONDARY, VLAN_ID]
|
|
26
|
+
@api.resource(:subnets).call(:index, {:per_page => 999999})['results'].each do |subnet|
|
|
27
|
+
subnet = @api.resource(:subnets).call(:show, {'id' => subnet['id']})
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
end
|
|
29
|
+
name = subnet['name']
|
|
30
|
+
organizations = export_column(subnet, 'organizations', 'name')
|
|
31
|
+
locations = export_column(subnet, 'locations', 'name')
|
|
32
|
+
network = subnet['network']
|
|
33
|
+
network_mask = subnet['mask']
|
|
34
|
+
network_from = subnet['from']
|
|
35
|
+
network_to = subnet['to']
|
|
36
|
+
domains = export_column(subnet, 'domains', 'name')
|
|
37
|
+
gateway = subnet['gateway']
|
|
38
|
+
dhcp_proxy = (subnet['dhcp'] && subnet['dhcp'].key?('name')) ? subnet['dhcp']['name'] : ''
|
|
39
|
+
tftp_proxy = (subnet['tftp'] && subnet['tftp'].key?('name')) ? subnet['tftp']['name'] : ''
|
|
40
|
+
dns_proxy = (subnet['dns'] && subnet['dns'].key?('name')) ? subnet['dns']['name'] : ''
|
|
41
|
+
dns_primary = subnet['dns_primary']
|
|
42
|
+
dns_secondary = subnet['dns_secondary']
|
|
43
|
+
vlan_id = subnet['vlanid']
|
|
44
|
+
csv << [name, organizations, locations, network, network_mask,
|
|
45
|
+
network_from, network_to, domains, gateway, dhcp_proxy, tftp_proxy, dns_proxy,
|
|
46
|
+
dns_primary, dns_secondary, vlan_id]
|
|
49
47
|
end
|
|
50
48
|
end
|
|
51
49
|
|
|
@@ -100,8 +98,6 @@ module HammerCLICsv
|
|
|
100
98
|
|
|
101
99
|
print "done\n" if option_verbose?
|
|
102
100
|
end
|
|
103
|
-
rescue RuntimeError => e
|
|
104
|
-
raise "#{e}\n #{line}"
|
|
105
101
|
end
|
|
106
102
|
end
|
|
107
103
|
end
|
|
@@ -4,110 +4,60 @@ module HammerCLICsv
|
|
|
4
4
|
command_name 'subscriptions'
|
|
5
5
|
desc 'import or export subscriptions'
|
|
6
6
|
|
|
7
|
+
def self.supported?
|
|
8
|
+
true
|
|
9
|
+
end
|
|
10
|
+
|
|
7
11
|
ORGANIZATION = 'Organization'
|
|
8
12
|
MANIFEST = 'Manifest File'
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
SUBSCRIPTION = 'Subscription Name'
|
|
14
|
+
QUANTITY = 'Quantity'
|
|
15
|
+
SKU = 'Product SKU'
|
|
16
|
+
CONTRACT = 'Contract Number'
|
|
17
|
+
ACCOUNT = 'Account Number'
|
|
12
18
|
|
|
13
|
-
def export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
'organization_id' => organization['id'],
|
|
21
|
-
'enabled' => true
|
|
22
|
-
})['results'].each do |product|
|
|
23
|
-
if product['redhat']
|
|
24
|
-
name = product['name']
|
|
25
|
-
@api.resource(:repository_sets).call(:index, {
|
|
26
|
-
'per_page' => 999999,
|
|
27
|
-
'organization_id' => organization['id'],
|
|
28
|
-
'product_id' => product['id']
|
|
29
|
-
})['results'].each do |repository_set|
|
|
30
|
-
content_set = repository_set['name']
|
|
31
|
-
repository_set['repositories'].each do |repository|
|
|
32
|
-
name_split = repository['name'].split(' ')
|
|
33
|
-
arch = name_split[-2]
|
|
34
|
-
release = name_split[-1]
|
|
35
|
-
csv << [name, organization['name'], nil, content_set, arch, release]
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
19
|
+
def export(csv)
|
|
20
|
+
csv << [NAME, ORGANIZATION, MANIFEST, SUBSCRIPTION, QUANTITY, SKU, CONTRACT, ACCOUNT]
|
|
21
|
+
@api.resource(:organizations).call(:index, {:per_page => 999999})['results'].each do |organization|
|
|
22
|
+
next if option_organization && organization['name'] != option_organization
|
|
23
|
+
organization = @api.resource(:organizations).call(:show, {'id' => organization['id']})
|
|
24
|
+
export_manifest(csv, organization)
|
|
25
|
+
export_subscriptions(csv, organization)
|
|
41
26
|
end
|
|
42
27
|
end
|
|
43
28
|
|
|
44
|
-
def
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
import_manifest_from_csv(line)
|
|
48
|
-
else
|
|
49
|
-
enable_products_from_csv(line)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# FIXME: TODO remove this rubocop
|
|
55
|
-
# rubocop:disable CyclomaticComplexity
|
|
56
|
-
def enable_products_from_csv(line)
|
|
57
|
-
organization = line[ORGANIZATION] || option_organization
|
|
58
|
-
raise "Organization is required in either input CSV or by option --organization" if organization.nil? || organization.empty?
|
|
59
|
-
line[ORGANIZATION] = organization
|
|
60
|
-
return if option_organization && line[ORGANIZATION] != option_organization
|
|
29
|
+
def export_manifest(csv, organization)
|
|
30
|
+
info = organization['owner_details']['upstreamConsumer']
|
|
31
|
+
return if info.nil?
|
|
61
32
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
'name' => line[NAME]
|
|
66
|
-
})['results']
|
|
67
|
-
raise "No match for product '#{line[NAME]}'" if results.length == 0
|
|
68
|
-
raise "Multiple matches for product '#{line[NAME]}'" if results.length != 1
|
|
69
|
-
product = @api.resource(:products).call(:show, {'id' => results[0]['id']})
|
|
33
|
+
csv << ["# Manifest Name", organization['name'], info['name']]
|
|
34
|
+
csv << ["# Manifest URL", organization['name'], "https://#{info['webUrl']}#{info['uuid']}"]
|
|
35
|
+
end
|
|
70
36
|
|
|
71
|
-
|
|
37
|
+
def export_subscriptions(csv, organization)
|
|
38
|
+
@api.resource(:subscriptions).call(:index, {
|
|
72
39
|
'per_page' => 999999,
|
|
73
|
-
'organization_id' =>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if line[RELEASE].nil? || line[RELEASE].empty?
|
|
83
|
-
repo['name'].end_with?("#{line[ARCH]}")
|
|
84
|
-
else
|
|
85
|
-
repo['name'].end_with?("#{line[ARCH]} #{line[RELEASE]}")
|
|
86
|
-
end
|
|
40
|
+
'organization_id' => organization['id']
|
|
41
|
+
})['results'].each do |subscription|
|
|
42
|
+
next if subscription['product_id'].to_i != 0 # Red Hat subs do not have number SKU
|
|
43
|
+
name = subscription['host'].nil? ? "# Subscription" : "# Guest Subscription for Host '#{subscription['host']['name']}'"
|
|
44
|
+
quantity = subscription['quantity'] < 0 ? "Unlimited" : subscription['quantity']
|
|
45
|
+
csv << [name, organization['name'], nil, subscription['name'],
|
|
46
|
+
quantity, subscription['product_id'], subscription['contract_number'],
|
|
47
|
+
subscription['account_number'],
|
|
48
|
+
subscription['start_date'], subscription['end_date']]
|
|
87
49
|
end
|
|
50
|
+
end
|
|
88
51
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
52
|
+
def import
|
|
53
|
+
thread_import do |line|
|
|
54
|
+
if line[MANIFEST] && !line[MANIFEST].empty?
|
|
55
|
+
import_manifest(line)
|
|
93
56
|
end
|
|
94
|
-
raise "No match for content set '#{line[CONTENT_SET]}'" if !product_content
|
|
95
|
-
|
|
96
|
-
params = {
|
|
97
|
-
'id' => product_content['content']['id'],
|
|
98
|
-
'product_id' => product['id'],
|
|
99
|
-
'basearch' => line[ARCH]
|
|
100
|
-
}
|
|
101
|
-
params['releasever'] = line[RELEASE] unless line[RELEASE].nil? || line[RELEASE].empty?
|
|
102
|
-
|
|
103
|
-
@api.resource(:repository_sets).call(:enable, params)
|
|
104
|
-
puts 'done' if option_verbose?
|
|
105
|
-
else
|
|
106
|
-
puts "Repository #{repository['name']} already enabled" if option_verbose?
|
|
107
57
|
end
|
|
108
58
|
end
|
|
109
59
|
|
|
110
|
-
def
|
|
60
|
+
def import_manifest(line)
|
|
111
61
|
return if option_organization && line[ORGANIZATION] != option_organization
|
|
112
62
|
args = %W{
|
|
113
63
|
--server #{ @server } --username #{ @username } --password #{ @password }
|
|
@@ -116,8 +66,6 @@ module HammerCLICsv
|
|
|
116
66
|
}
|
|
117
67
|
hammer.run(args)
|
|
118
68
|
|
|
119
|
-
rescue RuntimeError => e
|
|
120
|
-
raise "#{e}\n #{line}"
|
|
121
69
|
end
|
|
122
70
|
end
|
|
123
71
|
end
|
|
@@ -11,32 +11,30 @@ module HammerCLICsv
|
|
|
11
11
|
INTERVAL = 'Interval'
|
|
12
12
|
PRODUCTS = 'Products'
|
|
13
13
|
|
|
14
|
-
def export
|
|
15
|
-
|
|
16
|
-
csv << [NAME, ORGANIZATION, DESCRIPTION, ENABLED, STARTDATE, INTERVAL, PRODUCTS]
|
|
14
|
+
def export(csv)
|
|
15
|
+
csv << [NAME, ORGANIZATION, DESCRIPTION, ENABLED, STARTDATE, INTERVAL, PRODUCTS]
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
@api.resource(:organizations).call(:index, {:per_page => 999999})['results'].each do |organization|
|
|
18
|
+
next if option_organization && organization['name'] != option_organization
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
end
|
|
20
|
+
@api.resource(:sync_plans).call(:index, {
|
|
21
|
+
'per_page' => 999999,
|
|
22
|
+
'organization_id' => foreman_organization(:name => organization['name'])
|
|
23
|
+
})['results'].each do |sync_plan|
|
|
24
|
+
name = sync_plan['name']
|
|
25
|
+
organization_name = organization['name']
|
|
26
|
+
description = sync_plan['description']
|
|
27
|
+
enabled = sync_plan['enabled'] ? 'Yes' : 'No'
|
|
28
|
+
start_date = sync_plan['sync_date']
|
|
29
|
+
interval = sync_plan['interval']
|
|
30
|
+
products = CSV.generate do |column|
|
|
31
|
+
column << sync_plan['products'].collect do |product|
|
|
32
|
+
product['name']
|
|
35
33
|
end
|
|
36
|
-
products.delete!("\n")
|
|
37
|
-
csv << [name, organization_name, description, enabled, start_date, interval,
|
|
38
|
-
products]
|
|
39
34
|
end
|
|
35
|
+
products.delete!("\n")
|
|
36
|
+
csv << [name, organization_name, description, enabled, start_date, interval,
|
|
37
|
+
products]
|
|
40
38
|
end
|
|
41
39
|
end
|
|
42
40
|
end
|
|
@@ -89,8 +87,6 @@ module HammerCLICsv
|
|
|
89
87
|
puts "done" if option_verbose?
|
|
90
88
|
end
|
|
91
89
|
|
|
92
|
-
rescue RuntimeError => e
|
|
93
|
-
raise "#{e}\n #{line}"
|
|
94
90
|
end
|
|
95
91
|
|
|
96
92
|
private
|
data/lib/hammer_cli_csv/users.rb
CHANGED
|
@@ -12,39 +12,37 @@ module HammerCLICsv
|
|
|
12
12
|
ADMIN = 'Administrator'
|
|
13
13
|
ROLES = 'Roles'
|
|
14
14
|
|
|
15
|
-
def export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
organization['name']
|
|
23
|
-
end
|
|
15
|
+
def export(csv)
|
|
16
|
+
csv << [NAME, FIRSTNAME, LASTNAME, EMAIL, ORGANIZATIONS, LOCATIONS, ADMIN, ROLES]
|
|
17
|
+
@api.resource(:users).call(:index, {:per_page => 999999})['results'].each do |user|
|
|
18
|
+
if user['organizations']
|
|
19
|
+
organizations = CSV.generate do |column|
|
|
20
|
+
column << user['organizations'].collect do |organization|
|
|
21
|
+
organization['name']
|
|
24
22
|
end
|
|
25
|
-
organizations.delete!("\n")
|
|
26
23
|
end
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
organizations.delete!("\n")
|
|
25
|
+
end
|
|
26
|
+
if user['locations']
|
|
27
|
+
locations = CSV.generate do |column|
|
|
28
|
+
column << user['locations'].collect do |location|
|
|
29
|
+
location['name']
|
|
32
30
|
end
|
|
33
|
-
locations.delete!("\n")
|
|
34
31
|
end
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
locations.delete!("\n")
|
|
33
|
+
end
|
|
34
|
+
if user['roles']
|
|
35
|
+
roles = CSV.generate do |column|
|
|
36
|
+
column << user['roles'].collect do |role|
|
|
37
|
+
role['name']
|
|
40
38
|
end
|
|
41
|
-
roles.delete!("\n")
|
|
42
|
-
end
|
|
43
|
-
admin = user['admin'] ? 'Yes' : 'No'
|
|
44
|
-
if user['login'] != 'admin' && !user['login'].start_with?('hidden-')
|
|
45
|
-
csv << [user['login'], user['firstname'], user['lastname'], user['mail'],
|
|
46
|
-
organizations, locations, admin, roles]
|
|
47
39
|
end
|
|
40
|
+
roles.delete!("\n")
|
|
41
|
+
end
|
|
42
|
+
admin = user['admin'] ? 'Yes' : 'No'
|
|
43
|
+
if user['login'] != 'admin' && !user['login'].start_with?('hidden-')
|
|
44
|
+
csv << [user['login'], user['firstname'], user['lastname'], user['mail'],
|
|
45
|
+
organizations, locations, admin, roles]
|
|
48
46
|
end
|
|
49
47
|
end
|
|
50
48
|
end
|
|
@@ -81,8 +79,6 @@ module HammerCLICsv
|
|
|
81
79
|
end
|
|
82
80
|
print "done\n" if option_verbose?
|
|
83
81
|
end
|
|
84
|
-
rescue RuntimeError => e
|
|
85
|
-
raise "#{e}\n #{line}"
|
|
86
82
|
end
|
|
87
83
|
|
|
88
84
|
def create_user(line, name, roles, organizations, locations)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
module HammerCLICsv
|
|
2
|
+
module Utils
|
|
3
|
+
module Subscriptions
|
|
4
|
+
SUBSCRIPTIONS = 'Subscriptions'
|
|
5
|
+
SUBS_NAME = 'Subscription Name'
|
|
6
|
+
SUBS_TYPE = 'Subscription Type'
|
|
7
|
+
SUBS_QUANTITY = 'Subscription Quantity'
|
|
8
|
+
SUBS_SKU = 'Subscription SKU'
|
|
9
|
+
SUBS_CONTRACT = 'Subscription Contract'
|
|
10
|
+
SUBS_ACCOUNT = 'Subscription Account'
|
|
11
|
+
SUBS_START = 'Subscription Start'
|
|
12
|
+
SUBS_END = 'Subscription End'
|
|
13
|
+
|
|
14
|
+
def get_all_subscriptions(organization)
|
|
15
|
+
@api.resource(:subscriptions).call(:index, {
|
|
16
|
+
:per_page => 999999,
|
|
17
|
+
'organization_id' => foreman_organization(:name => organization)
|
|
18
|
+
})['results']
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def get_subscription(organization, options = {})
|
|
22
|
+
@subscriptions ||= {}
|
|
23
|
+
@subscriptions[organization] ||= {}
|
|
24
|
+
|
|
25
|
+
if options[:name]
|
|
26
|
+
return nil if options[:name].nil? || options[:name].empty?
|
|
27
|
+
options[:id] = @subscriptions[organization][options[:name]]
|
|
28
|
+
if !options[:id]
|
|
29
|
+
results = @api.resource(:subscriptions).call(:index, {
|
|
30
|
+
:per_page => 999999,
|
|
31
|
+
'organization_id' => foreman_organization(:name => organization),
|
|
32
|
+
'search' => "name = \"#{options[:name]}\""
|
|
33
|
+
})
|
|
34
|
+
raise "No subscriptions match '#{options[:name]}'" if results['subtotal'] == 0
|
|
35
|
+
raise "Too many subscriptions match '#{options[:name]}'" if results['subtotal'] > 1
|
|
36
|
+
subscription = results['results'][0]
|
|
37
|
+
@subscriptions[organization][options[:name]] = subscription['id']
|
|
38
|
+
options[:id] = @subscriptions[organization][options[:name]]
|
|
39
|
+
raise "Subscription '#{options[:name]}' not found" if !options[:id]
|
|
40
|
+
end
|
|
41
|
+
result = options[:id]
|
|
42
|
+
else
|
|
43
|
+
return nil if options[:id].nil?
|
|
44
|
+
options[:name] = @subscriptions.key(options[:id])
|
|
45
|
+
if !options[:name]
|
|
46
|
+
subscription = @api.resource(:subscriptions).call(:show, {'id' => options[:id]})
|
|
47
|
+
raise "Subscription '#{options[:name]}' not found" if !subscription || subscription.empty?
|
|
48
|
+
options[:name] = subscription['name']
|
|
49
|
+
@subscriptions[options[:name]] = options[:id]
|
|
50
|
+
end
|
|
51
|
+
result = options[:name]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
result
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def matches_by_sku_and_name(matches, line, subscriptions)
|
|
58
|
+
if line[SUBS_SKU]
|
|
59
|
+
matches = subscriptions.select do |subscription|
|
|
60
|
+
line[SUBS_SKU] == subscription['product_id']
|
|
61
|
+
end
|
|
62
|
+
raise _("No subscriptions match SKU '%{sku}'") % {:sku => line[SUBS_SKU]} if matches.empty?
|
|
63
|
+
elsif line[SUBS_NAME]
|
|
64
|
+
matches = subscriptions.select do |subscription|
|
|
65
|
+
line[SUBS_NAME] == subscription['name']
|
|
66
|
+
end
|
|
67
|
+
raise _("No subscriptions match name '%{name}'") % {:name => line[SUBS_NAME]} if matches.empty?
|
|
68
|
+
end
|
|
69
|
+
matches
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def matches_by_type(matches, line)
|
|
73
|
+
if line[SUBS_TYPE] == 'Red Hat' || line[SUBS_TYPE] == 'Custom'
|
|
74
|
+
matches = matches.select do |subscription|
|
|
75
|
+
subscription['type'] == 'NORMAL'
|
|
76
|
+
end
|
|
77
|
+
elsif line[SUBS_TYPE] == 'Red Hat Guest'
|
|
78
|
+
matches = matches.select do |subscription|
|
|
79
|
+
subscription['type'] == 'STACK_DERIVED'
|
|
80
|
+
end
|
|
81
|
+
elsif line[SUBS_TYPE] == 'Red Hat Temporary'
|
|
82
|
+
matches = matches.select do |subscription|
|
|
83
|
+
subscription['type'] == 'UNMAPPED_GUEST'
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
raise _("No subscriptions match type '%{type}'") % {:type => line[SUBS_TYPE]} if matches.empty?
|
|
87
|
+
matches
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def matches_by_account(matches, line)
|
|
91
|
+
if matches.length > 1 && line[SUBS_ACCOUNT]
|
|
92
|
+
refined = matches.select do |subscription|
|
|
93
|
+
line[SUBS_ACCOUNT] == subscription['account_number']
|
|
94
|
+
end
|
|
95
|
+
matches = refined unless refined.empty?
|
|
96
|
+
end
|
|
97
|
+
matches
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def matches_by_contract(matches, line)
|
|
101
|
+
if matches.length > 1 && line[SUBS_CONTRACT]
|
|
102
|
+
refined = matches.select do |subscription|
|
|
103
|
+
line[SUBS_CONTRACT] == subscription['contract_number']
|
|
104
|
+
end
|
|
105
|
+
matches = refined unless refined.empty?
|
|
106
|
+
end
|
|
107
|
+
matches
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def matches_by_quantity(matches, line)
|
|
111
|
+
if line[SUBS_QUANTITY] && line[SUBS_QUANTITY] != 'Automatic'
|
|
112
|
+
refined = matches.select do |subscription|
|
|
113
|
+
subscription['available'] == -1 || line[SUBS_QUANTITY].to_i <= subscription['available']
|
|
114
|
+
end
|
|
115
|
+
raise _("No '%{name}' subscription with quantity %{quantity} or more available") %
|
|
116
|
+
{:name => matches[0]['name'], :quantity => line[SUBS_QUANTITY]} if refined.empty?
|
|
117
|
+
matches = refined
|
|
118
|
+
end
|
|
119
|
+
matches
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Subscription amount, SKU, name, contract number, and account number separated by '|'
|
|
123
|
+
# or simply the subscription name.
|
|
124
|
+
def split_subscription_details(details)
|
|
125
|
+
details = details.split('|')
|
|
126
|
+
details.length == 1 ? ['Automatic', nil, details[0], nil, nil] : details
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|