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.
Files changed (87) hide show
  1. checksums.yaml +5 -13
  2. data/config/cli_config.yml +9 -24
  3. data/lib/hammer_cli_csv/activation_keys.rb +220 -95
  4. data/lib/hammer_cli_csv/architectures.rb +7 -11
  5. data/lib/hammer_cli_csv/base.rb +67 -41
  6. data/lib/hammer_cli_csv/compute_profiles.rb +11 -15
  7. data/lib/hammer_cli_csv/compute_resources.rb +11 -15
  8. data/lib/hammer_cli_csv/containers.rb +10 -12
  9. data/lib/hammer_cli_csv/content_hosts.rb +285 -203
  10. data/lib/hammer_cli_csv/content_view_filters.rb +32 -36
  11. data/lib/hammer_cli_csv/content_views.rb +33 -37
  12. data/lib/hammer_cli_csv/csv.rb +17 -1
  13. data/lib/hammer_cli_csv/domains.rb +15 -19
  14. data/lib/hammer_cli_csv/export.rb +13 -5
  15. data/lib/hammer_cli_csv/host_collections.rb +20 -22
  16. data/lib/hammer_cli_csv/host_groups.rb +73 -65
  17. data/lib/hammer_cli_csv/hosts.rb +30 -34
  18. data/lib/hammer_cli_csv/import.rb +24 -10
  19. data/lib/hammer_cli_csv/installation_media.rb +74 -0
  20. data/lib/hammer_cli_csv/job_templates.rb +37 -41
  21. data/lib/hammer_cli_csv/lifecycle_environments.rb +15 -19
  22. data/lib/hammer_cli_csv/locations.rb +4 -6
  23. data/lib/hammer_cli_csv/operating_systems.rb +17 -21
  24. data/lib/hammer_cli_csv/organizations.rb +11 -13
  25. data/lib/hammer_cli_csv/partition_tables.rb +17 -21
  26. data/lib/hammer_cli_csv/products.rb +200 -92
  27. data/lib/hammer_cli_csv/provisioning_templates.rb +19 -23
  28. data/lib/hammer_cli_csv/puppet_environments.rb +8 -12
  29. data/lib/hammer_cli_csv/puppet_facts.rb +20 -24
  30. data/lib/hammer_cli_csv/puppet_reports.rb +47 -51
  31. data/lib/hammer_cli_csv/reports.rb +6 -10
  32. data/lib/hammer_cli_csv/roles.rb +12 -16
  33. data/lib/hammer_cli_csv/settings.rb +8 -6
  34. data/lib/hammer_cli_csv/smart_proxies.rb +9 -13
  35. data/lib/hammer_cli_csv/splice.rb +1 -3
  36. data/lib/hammer_cli_csv/subnets.rb +24 -28
  37. data/lib/hammer_cli_csv/subscriptions.rb +39 -91
  38. data/lib/hammer_cli_csv/sync_plans.rb +20 -24
  39. data/lib/hammer_cli_csv/users.rb +25 -29
  40. data/lib/hammer_cli_csv/utils/subscriptions.rb +130 -0
  41. data/lib/hammer_cli_csv/version.rb +1 -1
  42. data/lib/hammer_cli_csv.rb +2 -2
  43. data/test/csv_test.rb +32 -0
  44. data/test/csv_test_helper.rb +17 -2
  45. data/test/data/content-hosts.csv +3 -2
  46. data/test/data/hosts.csv +0 -11
  47. data/test/data/settings.csv +1 -0
  48. data/test/data/setup/content-hosts.csv +1 -0
  49. data/test/data/setup/content-views.csv +2 -0
  50. data/test/data/setup/lifecycle-environments.csv +5 -0
  51. data/test/data/setup/locations.csv +6 -0
  52. data/test/data/setup/organizations.csv +2 -0
  53. data/test/data/setup/subscriptions.csv +5 -0
  54. data/test/data/subscriptions.csv +15 -17
  55. data/test/export_test.rb +27 -0
  56. data/test/fixtures/vcr_cassettes/apipie.yml +18528 -0
  57. data/test/fixtures/vcr_cassettes/resources/activation_keys_import/create_and_update.yml +38033 -0
  58. data/test/fixtures/vcr_cassettes/resources/content_hosts_export/export.yml +18846 -0
  59. data/test/fixtures/vcr_cassettes/resources/content_hosts_export/export_subscriptions.yml +323 -0
  60. data/test/fixtures/vcr_cassettes/resources/content_hosts_import/create_and_update.yml +41884 -0
  61. data/test/fixtures/vcr_cassettes/resources/content_hosts_import/import_single_line.yml +38248 -0
  62. data/test/fixtures/vcr_cassettes/resources/settings_import/update_settings.yml +18832 -0
  63. data/test/fixtures/vcr_cassettes/resources/settings_import/update_settings_continue.yml +316 -0
  64. data/test/fixtures/vcr_cassettes/resources/subscriptions_import/manifest_does_not_exist.yml +18785 -0
  65. data/test/fixtures/vcr_cassettes/setup/setup_content_views/setup.yml +19090 -0
  66. data/test/fixtures/vcr_cassettes/setup/setup_lifecycle_environments/setup.yml +924 -0
  67. data/test/fixtures/vcr_cassettes/setup/setup_locations/setup.yml +21102 -0
  68. data/test/fixtures/vcr_cassettes/setup/setup_organizations/setup.yml +19278 -0
  69. data/test/fixtures/vcr_cassettes/setup/setup_subscriptions/setup.yml +419 -0
  70. data/test/import_test.rb +20 -25
  71. data/test/resources/activation_keys_test.rb +72 -0
  72. data/test/resources/content_hosts_test.rb +132 -0
  73. data/test/resources/settings_test.rb +81 -0
  74. data/test/resources/subscriptions_test.rb +56 -0
  75. data/test/setup/setup_content_views.rb +17 -0
  76. data/test/setup/setup_lifecycle_environments.rb +17 -0
  77. data/test/setup/setup_locations.rb +17 -0
  78. data/test/setup/setup_organizations.rb +17 -0
  79. data/test/setup/setup_subscriptions.rb +20 -0
  80. data/test/setup/setup_test.rb +10 -0
  81. data/test/test_runner.rb +175 -0
  82. data/test/vcr_setup.rb +54 -0
  83. metadata +77 -13
  84. data/lib/hammer_cli_csv/exception_handler.rb +0 -42
  85. data/lib/hammer_cli_csv/installation_medias.rb +0 -77
  86. data/test/content_hosts_test.rb +0 -61
  87. data/test/settings_test.rb +0 -30
@@ -14,41 +14,39 @@ module HammerCLICsv
14
14
  REPOSITORIES = 'Repositories'
15
15
  RULES = 'Rules'
16
16
 
17
- def export
18
- CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => false}) do |csv|
19
- csv << [NAME, CONTENTVIEW, ORGANIZATION, TYPE, DESCRIPTION, REPOSITORIES, RULES]
20
- @api.resource(:organizations).call(:index, {
21
- :per_page => 999999
22
- })['results'].each do |organization|
23
- next if option_organization && organization['name'] != option_organization
24
-
25
- @api.resource(:content_views).call(:index, {
26
- 'per_page' => 999999,
27
- 'organization_id' => organization['id'],
28
- 'nondefault' => true
29
- })['results'].each do |contentview|
30
- @api.resource(:content_view_filters).call(:index, {
31
- 'content_view_id' => contentview['id']
32
- })['results'].collect do |filter|
33
- filter_type = "#{filter['inclusion'] == true ? 'Include' : 'Exclude'} #{export_filter_type(filter['type'])}"
34
-
35
- rules = nil
36
- case filter['type']
37
- when /rpm/
38
- rules = export_rpm_rules(filter)
39
- when /erratum/
40
- rules = export_erratum_rules(filter)
41
- when /package_group/
42
- rules = export_package_group_rules(filter)
43
- else
44
- raise "Unknown filter rule type '#{filter['type']}'"
45
- end
46
-
47
- name = filter['name']
48
- repositories = export_column(filter, 'repositories', 'name')
49
- csv << [name, contentview['name'], organization['name'], filter_type, filter['description'],
50
- repositories, rules]
17
+ def export(csv)
18
+ csv << [NAME, CONTENTVIEW, ORGANIZATION, TYPE, DESCRIPTION, REPOSITORIES, RULES]
19
+ @api.resource(:organizations).call(:index, {
20
+ :per_page => 999999
21
+ })['results'].each do |organization|
22
+ next if option_organization && organization['name'] != option_organization
23
+
24
+ @api.resource(:content_views).call(:index, {
25
+ 'per_page' => 999999,
26
+ 'organization_id' => organization['id'],
27
+ 'nondefault' => true
28
+ })['results'].each do |contentview|
29
+ @api.resource(:content_view_filters).call(:index, {
30
+ 'content_view_id' => contentview['id']
31
+ })['results'].collect do |filter|
32
+ filter_type = "#{filter['inclusion'] == true ? 'Include' : 'Exclude'} #{export_filter_type(filter['type'])}"
33
+
34
+ rules = nil
35
+ case filter['type']
36
+ when /rpm/
37
+ rules = export_rpm_rules(filter)
38
+ when /erratum/
39
+ rules = export_erratum_rules(filter)
40
+ when /package_group/
41
+ rules = export_package_group_rules(filter)
42
+ else
43
+ raise "Unknown filter rule type '#{filter['type']}'"
51
44
  end
45
+
46
+ name = filter['name']
47
+ repositories = export_column(filter, 'repositories', 'name')
48
+ csv << [name, contentview['name'], organization['name'], filter_type, filter['description'],
49
+ repositories, rules]
52
50
  end
53
51
  end
54
52
  end
@@ -155,8 +153,6 @@ module HammerCLICsv
155
153
  puts 'done' if option_verbose?
156
154
  end
157
155
 
158
- rescue RuntimeError => e
159
- raise "#{e}\n #{line}"
160
156
  end
161
157
 
162
158
  private
@@ -16,44 +16,42 @@ module HammerCLICsv
16
16
  REPOSITORIES = 'Repositories or Composites'
17
17
  ENVIRONMENTS = "Lifecycle Environments"
18
18
 
19
- def export
20
- CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => false}) do |csv|
21
- csv << [NAME, LABEL, ORGANIZATION, COMPOSITE, REPOSITORIES, ENVIRONMENTS]
22
- @api.resource(:organizations).call(:index, {
23
- :per_page => 999999
24
- })['results'].each do |organization|
25
- next if option_organization && organization['name'] != option_organization
26
-
27
- composite_contentviews = []
28
- @api.resource(:content_views).call(:index, {
29
- 'per_page' => 999999,
30
- 'organization_id' => organization['id'],
31
- 'nondefault' => true
32
- })['results'].each do |contentview|
33
- name = contentview['name']
34
- label = contentview['label']
35
- orgname = organization['name']
36
- environments = CSV.generate do |column|
37
- column << environment_names(contentview)
38
- end
39
- environments.delete!("\n")
40
- composite = contentview['composite'] == true ? 'Yes' : 'No'
41
- if composite == 'Yes'
42
- contentviews = CSV.generate do |column|
43
- column << contentview['components'].collect do |component|
44
- component['content_view']['name']
45
- end
19
+ def export(csv)
20
+ csv << [NAME, LABEL, ORGANIZATION, COMPOSITE, REPOSITORIES, ENVIRONMENTS]
21
+ @api.resource(:organizations).call(:index, {
22
+ :per_page => 999999
23
+ })['results'].each do |organization|
24
+ next if option_organization && organization['name'] != option_organization
25
+
26
+ composite_contentviews = []
27
+ @api.resource(:content_views).call(:index, {
28
+ 'per_page' => 999999,
29
+ 'organization_id' => organization['id'],
30
+ 'nondefault' => true
31
+ })['results'].each do |contentview|
32
+ name = contentview['name']
33
+ label = contentview['label']
34
+ orgname = organization['name']
35
+ environments = CSV.generate do |column|
36
+ column << environment_names(contentview)
37
+ end
38
+ environments.delete!("\n")
39
+ composite = contentview['composite'] == true ? 'Yes' : 'No'
40
+ if composite == 'Yes'
41
+ contentviews = CSV.generate do |column|
42
+ column << contentview['components'].collect do |component|
43
+ component['content_view']['name']
46
44
  end
47
- contentviews.delete!("\n")
48
- composite_contentviews << [name, 1, label, orgname, composite, contentviews, environments]
49
- else
50
- repositories = export_column(contentview, 'repositories', 'name')
51
- csv << [name, label, orgname, composite, repositories, environments]
52
45
  end
46
+ contentviews.delete!("\n")
47
+ composite_contentviews << [name, 1, label, orgname, composite, contentviews, environments]
48
+ else
49
+ repositories = export_column(contentview, 'repositories', 'name')
50
+ csv << [name, label, orgname, composite, repositories, environments]
53
51
  end
54
- composite_contentviews.each do |contentview|
55
- csv << contentview
56
- end
52
+ end
53
+ composite_contentviews.each do |contentview|
54
+ csv << contentview
57
55
  end
58
56
  end
59
57
  end
@@ -131,8 +129,6 @@ module HammerCLICsv
131
129
  puts _('done') if option_verbose?
132
130
  end
133
131
 
134
- rescue RuntimeError => e
135
- raise "#{e}\n #{line}"
136
132
  end
137
133
 
138
134
  def environment_names(contentview)
@@ -3,9 +3,25 @@ require 'hammer_cli/exit_codes'
3
3
 
4
4
  module HammerCLICsv
5
5
  class CsvCommand < HammerCLI::AbstractCommand
6
+ def help
7
+ self.class.help(invocation_path, CsvSortedBuilder.new)
8
+ end
9
+
10
+ class CsvSortedBuilder < SortedBuilder
11
+ def add_list(heading, items)
12
+ items.delete_if do |item|
13
+ if item.class == Clamp::Subcommand::Definition
14
+ !item.subcommand_class.supported?
15
+ else
16
+ false
17
+ end
18
+ end
19
+ super(heading, items)
20
+ end
21
+ end
6
22
  end
7
23
 
8
24
  HammerCLI::MainCommand.subcommand('csv',
9
- _('import to, or export from a running foretello server'),
25
+ _('import to or export from a running foreman server'),
10
26
  HammerCLICsv::CsvCommand)
11
27
  end
@@ -12,23 +12,21 @@ module HammerCLICsv
12
12
 
13
13
  SEPARATOR = ' = '
14
14
 
15
- def export
16
- CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => true}) do |csv|
17
- csv << [NAME, ORGANIZATIONS, LOCATIONS, DESCRIPTION, SMART_PROXY, PARAMETERS]
18
- search_options = {:per_page => 999999}
19
- search_options['search'] = "organization=\"#{option_organization}\"" if option_organization
20
- @api.resource(:domains).call(:index, search_options)['results'].each do |domain|
21
- domain = @api.resource(:domains).call(:show, {'id' => domain['id']})
22
- raise "Domain 'id=#{domain['id']}' not found" if !domain || domain.empty?
23
-
24
- name = domain['name']
25
- organizations = option_organization ? option_organization : export_column(domain, 'organizations', 'name')
26
- locations = export_column(domain, 'locations', 'name')
27
- description = domain['fullname']
28
- capsule = foreman_smart_proxy(:id => domain['dns_id'])
29
- parameters = export_parameters(domain['parameters'])
30
- csv << [name, organizations, locations, description, capsule, parameters]
31
- end
15
+ def export(csv)
16
+ csv << [NAME, ORGANIZATIONS, LOCATIONS, DESCRIPTION, SMART_PROXY, PARAMETERS]
17
+ search_options = {:per_page => 999999}
18
+ search_options['search'] = "organization=\"#{option_organization}\"" if option_organization
19
+ @api.resource(:domains).call(:index, search_options)['results'].each do |domain|
20
+ domain = @api.resource(:domains).call(:show, {'id' => domain['id']})
21
+ raise "Domain 'id=#{domain['id']}' not found" if !domain || domain.empty?
22
+
23
+ name = domain['name']
24
+ organizations = option_organization ? option_organization : export_column(domain, 'organizations', 'name')
25
+ locations = export_column(domain, 'locations', 'name')
26
+ description = domain['fullname']
27
+ capsule = foreman_smart_proxy(:id => domain['dns_id'])
28
+ parameters = export_parameters(domain['parameters'])
29
+ csv << [name, organizations, locations, description, capsule, parameters]
32
30
  end
33
31
  end
34
32
 
@@ -92,8 +90,6 @@ module HammerCLICsv
92
90
 
93
91
  print "done\n" if option_verbose?
94
92
  end
95
- rescue RuntimeError => e
96
- raise "#{e}\n #{line}"
97
93
  end
98
94
 
99
95
  private
@@ -4,21 +4,29 @@ module HammerCLICsv
4
4
  command_name 'export'
5
5
  desc 'export into directory'
6
6
 
7
+ def self.supported?
8
+ true
9
+ end
10
+
7
11
  option %w(-v --verbose), :flag, _('be verbose')
8
12
  option %w(--threads), 'THREAD_COUNT', _('Number of threads to hammer with'),
9
13
  :default => 1, :hidden => true
10
- option '--dir', 'DIRECTORY', _('directory to import from')
14
+ option '--dir', 'DIRECTORY', _('directory to export to')
11
15
  option %w(--organization), 'ORGANIZATION', _('Only process organization matching this name')
12
16
 
13
17
  RESOURCES = %w(
14
- organizations locations puppet_environments operating_systems
18
+ settings organizations locations puppet_environments operating_systems
15
19
  domains architectures partition_tables lifecycle_environments host_collections
16
20
  provisioning_templates
17
21
  subscriptions activation_keys hosts content_hosts reports roles users
18
22
  )
23
+ SUPPORTED_RESOURCES = %w(
24
+ settings
25
+ )
19
26
  RESOURCES.each do |resource|
20
27
  dashed = resource.sub('_', '-')
21
- option "--#{dashed}", 'FILE', "csv file for #{dashed}"
28
+ option "--#{dashed}", 'FILE', "csv file for #{dashed}",
29
+ :hidden => !SUPPORTED_RESOURCES.include?(resource)
22
30
  end
23
31
 
24
32
  def execute
@@ -46,7 +54,7 @@ module HammerCLICsv
46
54
  :username => @username,
47
55
  :password => @password
48
56
  })
49
- skipped_resources = %w( locations puppet_environments operating_systems
57
+ skipped_resources = %w( settings locations puppet_environments operating_systems
50
58
  domains architectures partition_tables lifecycle_environments
51
59
  provisioning_templates
52
60
  hosts reports )
@@ -58,7 +66,7 @@ module HammerCLICsv
58
66
  :password => @password,
59
67
  :api_version => 2
60
68
  })
61
- skipped_resources = []
69
+ skipped_resources = (RESOURCES - SUPPORTED_RESOURCES)
62
70
  end
63
71
 
64
72
  # Swing the hammers
@@ -8,29 +8,27 @@ module HammerCLICsv
8
8
  LIMIT = 'Limit'
9
9
  DESCRIPTION = 'Description'
10
10
 
11
- def export
12
- CSV.open(option_file || '/dev/stdout', 'wb') do |csv|
13
- csv << [NAME, ORGANIZATION, LIMIT, DESCRIPTION]
14
- if @server_status['release'] == 'Headpin'
15
- @headpin.get(:organizations).each do |organization|
16
- next if option_organization && organization['name'] != option_organization
17
- @headpin.get("organizations/#{organization['label']}/system_groups").each do |systemgroup|
18
- csv << [systemgroup['name'], organization['name'],
19
- systemgroup['max_systems'].to_i < 0 ? 'Unlimited' : systemgroup['max_systems'],
20
- systemgroup['description']]
21
- end
11
+ def export(csv)
12
+ csv << [NAME, ORGANIZATION, LIMIT, DESCRIPTION]
13
+ if @server_status['release'] == 'Headpin'
14
+ @headpin.get(:organizations).each do |organization|
15
+ next if option_organization && organization['name'] != option_organization
16
+ @headpin.get("organizations/#{organization['label']}/system_groups").each do |systemgroup|
17
+ csv << [systemgroup['name'], organization['name'],
18
+ systemgroup['max_systems'].to_i < 0 ? 'Unlimited' : systemgroup['max_systems'],
19
+ systemgroup['description']]
22
20
  end
23
- else
24
- @api.resource(:organizations).call(:index, {'per_page' => 999999})['results'].each do |organization|
25
- next if option_organization && organization['name'] != option_organization
26
- @api.resource(:host_collections).call(:index, {
27
- 'organization_id' => organization['id']
28
- })['results'].each do |hostcollection|
29
- limit = hostcollection['unlimited_content_hosts'] ? 'Unlimited' : hostcollection['max_content_hosts']
30
- csv << [hostcollection['name'], organization['name'],
31
- limit,
32
- hostcollection['description']]
33
- end
21
+ end
22
+ else
23
+ @api.resource(:organizations).call(:index, {'per_page' => 999999})['results'].each do |organization|
24
+ next if option_organization && organization['name'] != option_organization
25
+ @api.resource(:host_collections).call(:index, {
26
+ 'organization_id' => organization['id']
27
+ })['results'].each do |hostcollection|
28
+ limit = hostcollection['unlimited_content_hosts'] ? 'Unlimited' : hostcollection['max_content_hosts']
29
+ csv << [hostcollection['name'], organization['name'],
30
+ limit,
31
+ hostcollection['description']]
34
32
  end
35
33
  end
36
34
  end
@@ -19,96 +19,104 @@ module HammerCLICsv
19
19
  PUPPET_PROXY = 'Puppet Proxy'
20
20
  PUPPET_CA_PROXY = 'Puppet CA Proxy'
21
21
  CONTENT_SOURCE = 'Content Source'
22
+ PASSWORD = 'Password'
23
+ PUPPET_CLASSES = 'Puppet Classes'
22
24
 
23
- def export
24
- CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => true}) do |csv|
25
- csv << [NAME, PARENT, ORGANIZATIONS, LOCATIONS, SUBNET, DOMAIN, OPERATING_SYSTEM,
26
- ENVIRONMENT, COMPUTE_PROFILE, PARTITION_TABLE, MEDIUM, ARCHITECTURE, REALM,
27
- PUPPET_PROXY, PUPPET_CA_PROXY, CONTENT_SOURCE]
28
- search_options = {:per_page => 999999}
29
- search_options['search'] = "organization=\"#{option_organization}\"" if option_organization
30
- @api.resource(:hostgroups).call(:index, search_options)['results'].each do |hostgroup|
31
- hostgroup = @api.resource(:hostgroups).call(:show, {'id' => hostgroup['id']})
32
- raise "Host Group 'id=#{hostgroup['id']}' not found" if !hostgroup || hostgroup.empty?
25
+ def export(csv)
26
+ csv << [NAME, PARENT, ORGANIZATIONS, LOCATIONS, SUBNET, DOMAIN, OPERATING_SYSTEM,
27
+ ENVIRONMENT, COMPUTE_PROFILE, PARTITION_TABLE, MEDIUM, ARCHITECTURE, REALM,
28
+ PUPPET_PROXY, PUPPET_CA_PROXY, CONTENT_SOURCE, PASSWORD, PUPPET_CLASSES]
29
+ search_options = {:per_page => 999999}
30
+ search_options['search'] = "organization=\"#{option_organization}\"" if option_organization
31
+ @api.resource(:hostgroups).call(:index, search_options)['results'].each do |hostgroup|
32
+ hostgroup = @api.resource(:hostgroups).call(:show, {'id' => hostgroup['id']})
33
+ raise "Host Group 'id=#{hostgroup['id']}' not found" if !hostgroup || hostgroup.empty?
33
34
 
34
- name = hostgroup['name']
35
- organizations = export_column(hostgroup, 'organizations', 'name')
36
- locations = export_column(hostgroup, 'locations', 'name')
37
- subnet = hostgroup['subnet_name']
38
- operating_system = hostgroup['operatingsystem_name']
39
- domain = hostgroup['domain_name']
40
- puppet_environment = hostgroup['environment_name']
41
- compute_profile = hostgroup['compute_profile_name']
42
- partition_table = hostgroup['ptable_name']
43
- medium = hostgroup['medium_name']
44
- architecture = hostgroup['architecture_name']
45
- realm = hostgroup['realm_name']
46
- puppet_proxy = hostgroup['puppet_proxy_id'] ? foreman_host(:id => hostgroup['puppet_proxy_id']) : nil
47
- puppet_ca_proxy = hostgroup['puppet_ca_proxy_id'] ? foreman_host(:id => hostgroup['puppet_ca_proxy_id']) : nil
48
- # TODO: http://projects.theforeman.org/issues/7597
49
- # content_source = hostgroup['content_source_id'] ? foreman_host(:id => hostgroup['content_source_id']) : nil
50
- content_source = nil
51
- parent = hostgroup['ancestry'] ? foreman_hostgroup(:id => hostgroup['ancestry']) : nil
52
-
53
- csv << [name, parent, organizations, locations, subnet, domain, operating_system,
54
- puppet_environment, compute_profile, partition_table, medium, architecture,
55
- realm, puppet_proxy, puppet_ca_proxy, content_source]
35
+ name = hostgroup['name']
36
+ organizations = export_column(hostgroup, 'organizations', 'name')
37
+ locations = export_column(hostgroup, 'locations', 'name')
38
+ subnet = hostgroup['subnet_name']
39
+ operating_system = hostgroup['operatingsystem_name']
40
+ domain = hostgroup['domain_name']
41
+ puppet_environment = hostgroup['environment_name']
42
+ compute_profile = hostgroup['compute_profile_name']
43
+ partition_table = hostgroup['ptable_name']
44
+ medium = hostgroup['medium_name']
45
+ architecture = hostgroup['architecture_name']
46
+ realm = hostgroup['realm_name']
47
+ puppet_proxy = hostgroup['puppet_proxy_id'] ? foreman_host(:id => hostgroup['puppet_proxy_id']) : nil
48
+ puppet_ca_proxy = hostgroup['puppet_ca_proxy_id'] ? foreman_host(:id => hostgroup['puppet_ca_proxy_id']) : nil
49
+ content_source = hostgroup['content_source_id'] ? foreman_host(:id => hostgroup['content_source_id']) : nil
50
+ parent = hostgroup['ancestry'] ? foreman_hostgroup(:id => hostgroup['ancestry']) : nil
51
+ password = nil
52
+ puppet_classes = export_column(hostgroup, 'puppetclasses') do |puppet_class|
53
+ "#{puppet_class['module_name']}/#{puppet_class['name']}"
56
54
  end
55
+
56
+ # TODO: http://projects.theforeman.org/issues/6273
57
+ # API call to get the smart class variable override values
58
+
59
+ csv << [name, parent, organizations, locations, subnet, domain, operating_system,
60
+ puppet_environment, compute_profile, partition_table, medium, architecture,
61
+ realm, puppet_proxy, puppet_ca_proxy, content_source, password, puppet_classes]
57
62
  end
58
63
  end
59
64
 
60
65
  def import
61
66
  @existing = {}
62
- @api.resource(:hostgroups).call(:index, {:per_page => 999999})['results'].each do |host|
63
- @existing[host['name']] = host['id'] if host
67
+ @api.resource(:hostgroups).call(:index, {:per_page => 999999})['results'].each do |host_group|
68
+ @existing[host_group['name']] = host_group['id'] if host_group
64
69
  end
65
70
 
66
71
  thread_import do |line|
67
- create_hosts_from_csv(line)
72
+ create_from_csv(line)
68
73
  end
69
74
  end
70
75
 
71
- def create_hosts_from_csv(line)
76
+ def create_from_csv(line)
72
77
  return if option_organization && !CSV.parse_line(line[ORGANIZATIONS], {:skip_blanks => true}).include?(option_organization)
73
78
 
79
+ params = {
80
+ 'hostgroup' => {
81
+ 'architecture_id' => foreman_architecture(:name => line[ARCHITECTURE]),
82
+ 'operatingsystem_id' => foreman_operatingsystem(:name => line[OPERATING_SYSTEM]),
83
+ 'medium_id' => foreman_medium(:name => line[MEDIUM]),
84
+ 'ptable_id' => foreman_partitiontable(:name => line[PARTITION_TABLE]),
85
+ 'root_pass' => line[PASSWORD],
86
+ 'organization_ids' => collect_column(line[ORGANIZATIONS]) do |organization|
87
+ foreman_organization(:name => organization)
88
+ end,
89
+ 'location_ids' => collect_column(line[LOCATIONS]) do |location|
90
+ foreman_location(:name => location)
91
+ end
92
+ }
93
+ }
94
+
74
95
  count(line[COUNT]).times do |number|
75
96
  name = namify(line[NAME], number)
97
+ params['hostgroup']['name'] = name
98
+
76
99
  if !@existing.include? name
77
100
  print "Creating host group '#{name}'..." if option_verbose?
78
- # @api.resource(:hosts).call(:create, {
79
- # 'host' => {
80
- # 'name' => name,
81
- # 'root_pass' => 'changeme',
82
- # 'mac' => namify(line[MACADDRESS], number),
83
- # 'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
84
- # 'location_id' => foreman_location(:name => line[LOCATION]),
85
- # 'environment_id' => foreman_environment(:name => line[ENVIRONMENT]),
86
- # 'operatingsystem_id' => foreman_operatingsystem(:name => line[OPERATINGSYSTEM]),
87
- # 'architecture_id' => foreman_architecture(:name => line[ARCHITECTURE]),
88
- # 'domain_id' => foreman_domain(:name => line[DOMAIN]),
89
- # 'ptable_id' => foreman_partitiontable(:name => line[PARTITIONTABLE])
90
- # }
91
- # })
101
+ hostgroup = @api.resource(:hostgroups).call(:create, params)
102
+ @existing[name] = hostgroup['id']
92
103
  else
93
104
  print "Updating host '#{name}'..." if option_verbose?
94
- # @api.resource(:hosts).call(:update, {
95
- # 'id' => @existing[name],
96
- # 'host' => {
97
- # 'name' => name,
98
- # 'mac' => namify(line[MACADDRESS], number),
99
- # 'organization_id' => foreman_organization(:name => line[ORGANIZATION]),
100
- # 'environment_id' => foreman_environment(:name => line[ENVIRONMENT]),
101
- # 'operatingsystem_id' => foreman_operatingsystem(:name => line[OPERATINGSYSTEM]),
102
- # 'architecture_id' => foreman_architecture(:name => line[ARCHITECTURE]),
103
- # 'domain_id' => foreman_domain(:name => line[DOMAIN]),
104
- # 'ptable_id' => foreman_partitiontable(:name => line[PARTITIONTABLE])
105
- # }
106
- # })
105
+ params['id'] = @existing[name]
106
+ hostgroup = @api.resource(:hostgroups).call(:update, params)
107
+ end
108
+
109
+ # TODO: puppet classes
110
+ puppetclass_ids = collect_column(line[PUPPET_CLASSES]) do |puppet_class|
111
+ module_name, name = puppet_class.split('/')
112
+ foreman_puppet_class(:name => name)
107
113
  end
114
+ existing_ids = hostgroup['puppet_classes'].collect { |puppet_class| puppet_class['id'] }
115
+ # DELETE existing_ids - puppetclass_ids
116
+ # POST puppetclass_ids - existing_ids
117
+
108
118
  print "done\n" if option_verbose?
109
119
  end
110
- rescue RuntimeError => e
111
- raise "#{e}\n #{line}"
112
120
  end
113
121
  end
114
122
  end
@@ -22,41 +22,39 @@ module HammerCLICsv
22
22
  ENABLED = 'Enabled'
23
23
  MANAGED = 'Managed'
24
24
 
25
- def export
26
- CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => true}) do |csv|
27
- csv << [NAME, ORGANIZATION, LOCATION, ENVIRONMENT, OPERATINGSYSTEM, ARCHITECTURE,
28
- MACADDRESS, DOMAIN, PARTITIONTABLE, SUBNET, REALM, MEDIUM, HOSTGROUP,
29
- COMPUTERESOURCE, COMPUTEPROFILE, IMAGE, ENABLED, MANAGED]
30
- search_options = {:per_page => 999999}
31
- search_options['search'] = "organization=\"#{option_organization}\"" if option_organization
32
- @api.resource(:hosts).call(:index, search_options)['results'].each do |host|
33
- host = @api.resource(:hosts).call(:show, {'id' => host['id']})
34
- raise "Host 'id=#{host['id']}' not found" if !host || host.empty?
25
+ def export(csv)
26
+ csv << [NAME, ORGANIZATION, LOCATION, ENVIRONMENT, OPERATINGSYSTEM, ARCHITECTURE,
27
+ MACADDRESS, DOMAIN, PARTITIONTABLE, SUBNET, REALM, MEDIUM, HOSTGROUP,
28
+ COMPUTERESOURCE, COMPUTEPROFILE, IMAGE, ENABLED, MANAGED]
29
+ search_options = {:per_page => 999999}
30
+ search_options['search'] = "organization=\"#{option_organization}\"" if option_organization
31
+ @api.resource(:hosts).call(:index, search_options)['results'].each do |host|
32
+ host = @api.resource(:hosts).call(:show, {'id' => host['id']})
33
+ raise "Host 'id=#{host['id']}' not found" if !host || host.empty?
35
34
 
36
- name = host['name']
37
- organization = host['organization_name']
38
- location = host['location_name']
39
- environment = host['environment_name']
40
- operatingsystem = host['operatingsystem_name']
41
- architecture = host['architecture_name']
42
- mac = host['mac']
43
- domain = host['domain_name']
44
- ptable = host['ptable_name']
45
- subnet = host['subnet_name']
46
- realm = host['realm_name']
47
- medium = host['medium_name']
48
- hostgroup = host['hostgroup_name']
49
- compute_resource = host['compute_resource_name']
50
- compute_profile = host['compute_profile_name']
51
- image = host['image_name']
35
+ name = host['name']
36
+ organization = host['organization_name']
37
+ location = host['location_name']
38
+ environment = host['environment_name']
39
+ operatingsystem = host['operatingsystem_name']
40
+ architecture = host['architecture_name']
41
+ mac = host['mac']
42
+ domain = host['domain_name']
43
+ ptable = host['ptable_name']
44
+ subnet = host['subnet_name']
45
+ realm = host['realm_name']
46
+ medium = host['medium_name']
47
+ hostgroup = host['hostgroup_name']
48
+ compute_resource = host['compute_resource_name']
49
+ compute_profile = host['compute_profile_name']
50
+ image = host['image_name']
52
51
 
53
- enabled = host['enabled'] ? 'Yes' : 'No'
54
- managed = host['managed'] ? 'Yes' : 'No'
52
+ enabled = host['enabled'] ? 'Yes' : 'No'
53
+ managed = host['managed'] ? 'Yes' : 'No'
55
54
 
56
- csv << [name, organization, location, environment, operatingsystem, architecture,
57
- mac, domain, ptable, subnet, realm, medium, hostgroup, compute_resource,
58
- compute_profile, image, enabled, managed]
59
- end
55
+ csv << [name, organization, location, environment, operatingsystem, architecture,
56
+ mac, domain, ptable, subnet, realm, medium, hostgroup, compute_resource,
57
+ compute_profile, image, enabled, managed]
60
58
  end
61
59
  end
62
60
 
@@ -110,8 +108,6 @@ module HammerCLICsv
110
108
  end
111
109
  print "done\n" if option_verbose?
112
110
  end
113
- rescue RuntimeError => e
114
- raise "#{e}\n #{line}"
115
111
  end
116
112
  end
117
113
  end