diff --git a/README.md b/README.md index 4070bcf..ebb2968 100644 --- a/README.md +++ b/README.md @@ -167,6 +167,13 @@ Creating organization 'abcMega Corporation'... done | Name | Name of the operating systems to update or create | x | x | x | x | | | Count | Number of times to iterate this CSV row, incrementing value for substitution | | x | x | x | | | Family | Operating system family | | x | x | x | | +| Description | Operating system description | | x | x | x | | +| Password Hash | MD5, SHA256, SHA512, or Base64 | | x | x | x | | +| Partition Tables | List of partition table names | | x | x | x | | +| Architectures | List of architectures names | | x | x | x | | +| Media | List of media names | | x | x | x | | +| Provisioning Templates | List of provisioning template names | | x | x | x | | +| Parameters | List of parameters | | x | x | x | | ## Domains diff --git a/lib/hammer_cli_csv/base.rb b/lib/hammer_cli_csv/base.rb index e5f9a82..9436c39 100644 --- a/lib/hammer_cli_csv/base.rb +++ b/lib/hammer_cli_csv/base.rb @@ -546,6 +546,37 @@ def foreman_hostgroup(options = {}) result end + def foreman_provisioning_template(options = {}) + @query_config_templates ||= {} + + if options[:name] + return nil if options[:name].nil? || options[:name].empty? + options[:id] = @query_config_templates[options[:name]] + if !options[:id] + config_template = @api.resource(:config_templates).call(:index, { + :per_page => 999999, + 'search' => "name=\"#{options[:name]}\"" + })['results'] + raise "Provisioning template '#{options[:name]}' not found" if !config_template || config_template.empty? + options[:id] = config_template[0]['id'] + @query_config_templates[options[:name]] = options[:id] + end + result = options[:id] + else + return nil if options[:id].nil? + options[:name] = @query_config_templates.key(options[:id]) + if !options[:name] + config_template = @api.resource(:config_templates).call(:show, {'id' => options[:id]}) + raise "Provisioning template 'id=#{options[:id]}' not found" if !config_template || config_template.empty? + options[:name] = config_template['name'] + @query_config_templates[options[:name]] = options[:id] + end + result = options[:name] + end + + result + end + def foreman_smart_proxy(options = {}) @query_smart_proxies ||= {} @@ -864,11 +895,11 @@ def split_os_name(name) [name, major || '', minor || ''] end - def export_column(object, name, field) + def export_column(object, name, field=nil) return '' unless object[name] values = CSV.generate do |column| column << object[name].collect do |fields| - fields[field] + field.nil? ? yield(fields) : fields[field] end end values.delete!("\n") diff --git a/lib/hammer_cli_csv/content_view_filters.rb b/lib/hammer_cli_csv/content_view_filters.rb index a1a9158..83e8037 100644 --- a/lib/hammer_cli_csv/content_view_filters.rb +++ b/lib/hammer_cli_csv/content_view_filters.rb @@ -96,7 +96,7 @@ def create_filters_from_csv(line) 'inclusion' => filter_inclusion?(line[TYPE]), 'repository_ids' => repository_ids })['id'] - @existing_filters[line[ORGANIZATION]][filter_name] = filter_id + @existing_filters[line[ORGANIZATION]][line[CONTENTVIEW]][filter_name] = filter_id else print "Updating filter '#{filter_name}' for content view filter '#{line[CONTENTVIEW]}'..." if option_verbose? @api.resource(:content_view_filters).call(:update, { @@ -173,7 +173,7 @@ def import_filter_type(type) end def export_filter_type(type) - case type.split[1] + case type when /rpm/i 'Packages' when /package_group/i diff --git a/lib/hammer_cli_csv/hosts.rb b/lib/hammer_cli_csv/hosts.rb index 028f1e7..855fc86 100644 --- a/lib/hammer_cli_csv/hosts.rb +++ b/lib/hammer_cli_csv/hosts.rb @@ -24,6 +24,7 @@ def export name = host['name'] organization = foreman_organization(:id => host['organization_id']) + location = foreman_location(:id => host['location_id']) environment = foreman_environment(:id => host['environment_id']) operatingsystem = foreman_operatingsystem(:id => host['operatingsystem_id']) architecture = foreman_architecture(:id => host['architecture_id']) @@ -31,7 +32,7 @@ def export domain = foreman_domain(:id => host['domain_id']) ptable = foreman_partitiontable(:id => host['ptable_id']) - csv << [name, organization, environment, operatingsystem, architecture, mac, domain, ptable] + csv << [name, organization, location, environment, operatingsystem, architecture, mac, domain, ptable] end end end diff --git a/lib/hammer_cli_csv/import.rb b/lib/hammer_cli_csv/import.rb index 11a822c..b03ff26 100644 --- a/lib/hammer_cli_csv/import.rb +++ b/lib/hammer_cli_csv/import.rb @@ -42,9 +42,14 @@ def execute @api = ApipieBindings::API.new({:uri => @server, :username => @username, :password => @password, :api_version => 2}) - # Swing the hammers + resources_specified = RESOURCES.collect do |resource| + resource if self.send("option_#{resource}") || ARGV.include?('--' + resource.gsub('_', '-')) + end + resources_specified.compact! RESOURCES.each do |resource| - hammer_resource(resource) + if resources_specified.include?(resource) || (resources_specified == [] && option_dir) + hammer_resource(resource) + end end HammerCLI::EX_OK @@ -62,7 +67,7 @@ def hammer(context = nil) def hammer_resource(resource) return if !self.send("option_#{resource}") && !option_dir - options_file = self.send("option_#{resource}") || "#{option_dir}/#{resource.gsub('_', '-')}.csv" + options_file = "#{option_dir}/#{resource.gsub('_', '-')}.csv" || self.send("option_#{resource}") unless options_file_exists? options_file if option_dir puts _("Skipping #{resource} because '#{options_file}' does not exist") if option_verbose? diff --git a/lib/hammer_cli_csv/job_templates.rb b/lib/hammer_cli_csv/job_templates.rb index 79d8827..6171e46 100644 --- a/lib/hammer_cli_csv/job_templates.rb +++ b/lib/hammer_cli_csv/job_templates.rb @@ -10,10 +10,11 @@ class JobTemplatesCommand < BaseCommand PROVIDER = 'Provider' SNIPPET = 'Snippet' TEMPLATE = 'Template' + INPUT_NAME = 'Input Name' def export CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => true}) do |csv| - csv << [NAME, ORGANIZATIONS, LOCATIONS, JOB, PROVIDER, SNIPPET, TEMPLATE] + csv << [NAME, ORGANIZATIONS, LOCATIONS, JOB, PROVIDER, SNIPPET, TEMPLATE, INPUT_NAME] @api.resource(:job_templates).call(:index, { :per_page => 999999 })['results'].each do |template_id| @@ -27,6 +28,11 @@ def export organizations = export_column(template, 'organizations', 'name') locations = export_column(template, 'locations', 'name') csv << [name, organizations, locations, job, provider, snippet, template['template']] + + template['template_inputs'].each do |input_id| + input = @api.resource(:templates).call(:template_inputs, {:template_id => template['id'], :id => input_id['id']}) + x = input + end end end end diff --git a/lib/hammer_cli_csv/operating_systems.rb b/lib/hammer_cli_csv/operating_systems.rb index be0323b..bb22709 100644 --- a/lib/hammer_cli_csv/operating_systems.rb +++ b/lib/hammer_cli_csv/operating_systems.rb @@ -6,15 +6,32 @@ class OperatingSystemsCommand < BaseCommand FAMILY = 'Family' DESCRIPTION = 'Description' + PASSWORD_HASH = 'Password Hash' + PARTITION_TABLES = 'Partition Tables' + ARCHITECTURES = 'Architectures' + MEDIA = 'Media' + PROVISIONING_TEMPLATES = 'Provisioning Templates' + PARAMETERS = 'Parameters' def export CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => true}) do |csv| - csv << [NAME, DESCRIPTION, FAMILY] - @api.resource(:operatingsystems).call(:index, {:per_page => 999999})['results'].each do |operatingsystem| + csv << [NAME, DESCRIPTION, FAMILY, PASSWORD_HASH, PARTITION_TABLES, ARCHITECTURES, MEDIA, + PROVISIONING_TEMPLATES, PARAMETERS] + @api.resource(:operatingsystems).call(:index, {:per_page => 999999})['results'].each do |operatingsystem_id| + operatingsystem = @api.resource(:operatingsystems).call(:show, {:id => operatingsystem_id['id']}) name = build_os_name(operatingsystem['name'], operatingsystem['major'], operatingsystem['minor']) description = operatingsystem['description'] family = operatingsystem['family'] - csv << [name, description, family] + password_hash = operatingsystem['password_hash'] + partition_tables = export_column(operatingsystem, 'ptables', 'name') + architectures = export_column(operatingsystem, 'architectures', 'name') + media = export_column(operatingsystem, 'media', 'name') + partition_tables = export_column(operatingsystem, 'ptables', 'name') + parameters = export_column(operatingsystem, 'parameters') do |parameter| + "#{parameter['name']}|#{parameter['value']}" + end + csv << [name, description, family, password_hash, partition_tables, architectures, + media, partition_tables, parameters] end end end @@ -34,9 +51,21 @@ def create_operatingsystems_from_csv(line) params = { 'operatingsystem' => { 'family' => line[FAMILY], - 'description' => line[DESCRIPTION] + 'description' => line[DESCRIPTION], + 'password_hash' => line[PASSWORD_HASH] } } + params['operatingsystem']['architecture_ids'] = collect_column(line[ARCHITECTURES]) do |name| + foreman_architecture(:name => name) + end + # TODO: http://projects.theforeman.org/issues/12919 + #params['operatingsystem']['provisioning_template_ids'] = collect_column(line[PROVISIONING_TEMPLATES]) do |name| + # foreman_provisioning_template(:name => name) + #end + # TODO: http://projects.theforeman.org/issues/12920 + #params['operatingsystem']['os_parameters?'] = collect_column(line[PARAMETERS]) do |name_value| + # ???? + #end count(line[COUNT]).times do |number| name = namify(line[NAME], number) (osname, major, minor) = split_os_name(name) diff --git a/lib/hammer_cli_csv/provisioning_templates.rb b/lib/hammer_cli_csv/provisioning_templates.rb index f6cf478..e45452b 100644 --- a/lib/hammer_cli_csv/provisioning_templates.rb +++ b/lib/hammer_cli_csv/provisioning_templates.rb @@ -4,6 +4,9 @@ class ProvisioningTemplatesCommand < BaseCommand command_name 'provisioning-templates' desc 'import or export provisioning templates' + option %w(--include-locked), :flag, 'Include locked templates (will fail if re-imported)', + :attribute_name => :option_include_locked + ORGANIZATIONS = 'Organizations' LOCATIONS = 'Locations' OPERATINGSYSTEMS = 'Operating Systems' @@ -14,12 +17,13 @@ class ProvisioningTemplatesCommand < BaseCommand def export CSV.open(option_file || '/dev/stdout', 'wb', {:force_quotes => true}) do |csv| csv << [NAME, ORGANIZATIONS, LOCATIONS, OPERATINGSYSTEMS, ASSOCIATIONS, KIND, TEMPLATE] - @api.resource(:config_templates).call(:index, { + params = { :per_page => 999999 - })['results'].each do |template_id| + } + params['search'] = "organization = \"#{option_organization}\"" if option_organization + @api.resource(:config_templates).call(:index, params)['results'].each do |template_id| template = @api.resource(:config_templates).call(:show, {:id => template_id['id']}) - next if template['locked'] - next unless option_organization.nil? || template['organizations'].detect { |org| org['name'] == option_organization } + next if template['locked'] && !option_include_locked? name = template['name'] kind = template['snippet'] ? 'snippet' : template['template_kind_name'] organizations = export_column(template, 'organizations', 'name') diff --git a/lib/hammer_cli_csv/subscriptions.rb b/lib/hammer_cli_csv/subscriptions.rb index 4bcf55b..dd83fce 100644 --- a/lib/hammer_cli_csv/subscriptions.rb +++ b/lib/hammer_cli_csv/subscriptions.rb @@ -108,6 +108,7 @@ def enable_products_from_csv(line) end def import_manifest_from_csv(line) + return if option_organization && line[ORGANIZATION] != option_organization args = %W{ --server #{ @server } --username #{ @username } --password #{ @password } subscription upload --file #{ line[MANIFEST] } diff --git a/test/data/products.csv b/test/data/products.csv index fe20e23..94268bc 100644 --- a/test/data/products.csv +++ b/test/data/products.csv @@ -1,19 +1,20 @@ Name,Count,Label,Organization,Repository,Repository Type,Repository Url -katello-client-1.4,1,katello-client-1_4,Mega Corporation,katello-1.4-client,Custom Yum,http://fedorapeople.org/groups/katello/releases/yum/1.4-client/RHEL/6Server/x86_64/ -katello-1.4,1,katello-1_4,Mega Corporation,katello-1.4,Custom Yum,http://fedorapeople.org/groups/katello/releases/yum/1.4/RHEL/6Server/x86_64/ -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.1,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.1/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.2,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.2/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.3,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.3/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.4,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.4/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.5,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.5/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6Server/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.1,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.1/x86_64/os -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.2,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.2/x86_64/os -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.3,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.3/x86_64/os -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.4,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.4/x86_64/os -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.5,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.5/x86_64/os -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6Server/x86_64/os -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server Kickstart x86_64 7.0,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7.0/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server Kickstart) x86_64 7Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7Server/x86_64/kickstart -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server RPMs x86_64 7.0,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7.0/x86_64/os -Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server RPMs x86_64 7Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7Server/x86_64/os \ No newline at end of file +Puppet Labs,1,puppetlabs,Mega Corporation,puppet-forge,Custom Puppet,https://forge.puppetlabs.com/ +# katello-client-1.4,1,katello-client-1_4,Mega Corporation,katello-1.4-client,Custom Yum,http://fedorapeople.org/groups/katello/releases/yum/1.4-client/RHEL/6Server/x86_64/ +# katello-1.4,1,katello-1_4,Mega Corporation,katello-1.4,Custom Yum,http://fedorapeople.org/groups/katello/releases/yum/1.4/RHEL/6Server/x86_64/ +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.1,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.1/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.2,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.2/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.3,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.3/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.4,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.4/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6.5,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.5/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server Kickstart x86_64 6Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6Server/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.1,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.1/x86_64/os +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.2,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.2/x86_64/os +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.3,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.3/x86_64/os +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.4,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.4/x86_64/os +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6.5,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6.5/x86_64/os +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 6 Server RPMs x86_64 6Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/6/6Server/x86_64/os +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server Kickstart x86_64 7.0,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7.0/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server Kickstart) x86_64 7Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7Server/x86_64/kickstart +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server RPMs x86_64 7.0,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7.0/x86_64/os +# Red Hat Enterprise Linux Server,1,Red_Hat_Enterprise_Linux_Server,Mega Corporation,Red Hat Enterprise Linux 7 Server RPMs x86_64 7Server,Red Hat Yum,https://cdn.redhat.com/content/dist/rhel/server/7/7Server/x86_64/os \ No newline at end of file