Project

General

Profile

Download (5.36 KB) Statistics
| Branch: | Tag: | Revision:

hammer-cli-csv / lib / hammer_cli_csv / domains.rb @ 88ccfdbe

1
module HammerCLICsv
2
  class CsvCommand
3
    class DomainsCommand < BaseCommand
4
      command_name 'domains'
5
      desc         'import or export domains'
6

    
7
      ORGANIZATIONS = 'Organizations'
8
      LOCATIONS = 'Locations'
9
      DESCRIPTION = 'Description'
10
      SMART_PROXY = 'DNS Smart Proxy'
11
      PARAMETERS = 'Parameters'
12

    
13
      SEPARATOR = ' = '
14

    
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_column(domain, 'parameters') do |parameter|
29
            "#{parameter['name']}#{SEPARATOR}#{parameter['value']}"
30
          end
31
          csv << [name, organizations, locations, description, capsule, parameters]
32
        end
33
      end
34

    
35
      def import
36
        @existing = {}
37
        @api.resource(:domains).call(:index, {:per_page => 999999})['results'].each do |domain|
38
          @existing[domain['name']] = domain['id'] if domain
39
        end
40

    
41
        thread_import do |line|
42
          create_domains_from_csv(line)
43
        end
44
      end
45

    
46
      def create_domains_from_csv(line)
47
        dns_id = foreman_smart_proxy(:name => line[SMART_PROXY])
48
        count(line[COUNT]).times do |number|
49
          name = namify(line[NAME], number)
50
          description = namify(line[DESCRIPTION], number)
51
          params = {
52
            'domain' => {
53
              'name' => name,
54
              'fullname' => description,
55
              'dns_id' => dns_id
56
            }
57
          }
58
          if !@existing.include? name
59
            print _("Creating domain '%{name}'...") % {:name => name} if option_verbose?
60
            domain = @api.resource(:domains).call(:create, params)
61
          else
62
            print _("Updating domain '%{name}'...") % {:name => name} if option_verbose?
63
            params['id'] = @existing[name]
64
            domain = @api.resource(:domains).call(:update, params)
65
          end
66

    
67
          update_organizations(line, domain)
68
          update_locations(line, domain)
69
          import_parameters(domain['id'], line[PARAMETERS])
70

    
71
          puts _("done") if option_verbose?
72
        end
73
      end
74

    
75
      def update_organizations(line, domain)
76
        domains ||= {}
77
        CSV.parse_line(line[ORGANIZATIONS]).each do |organization|
78
          organization_id = foreman_organization(:name => organization)
79
          if domains[organization].nil?
80
            domains[organization] = @api.resource(:organizations).call(:show, {'id' => organization_id})['domains'].collect do |existing_domain|
81
              existing_domain['id']
82
            end
83
          end
84
          domains[organization] += [domain['id']] if !domains[organization].include? domain['id']
85

    
86
          @api.resource(:organizations).call(:update, {
87
                                               'id' => organization_id,
88
                                               'organization' => {
89
                                                 'domain_ids' => domains[organization]
90
                                               }
91
                                             })
92
        end
93
      end
94

    
95
      def update_locations(line, domain)
96
        return if line[LOCATIONS].nil? || line[LOCATIONS].empty?
97
        domains ||= {}
98
        CSV.parse_line(line[LOCATIONS]).each do |location|
99
          location_id = foreman_location(:name => location)
100
          if domains[location].nil?
101
            domains[location] = @api.resource(:locations).call(:show, {'id' => location_id})['domains'].collect do |existing_domain|
102
              existing_domain['id']
103
            end
104
          end
105
          domains[location] += [domain['id']] if !domains[location].include? domain['id']
106

    
107
          @api.resource(:locations).call(:update, {
108
                                           'id' => location_id,
109
                                           'location' => {
110
                                             'domain_ids' => domains[location]
111
                                           }
112
                                         })
113
        end
114
      end
115

    
116
      def import_parameters(domain_id, parameters)
117
        collect_column(parameters) do |parameter|
118
          (parameter_name, parameter_value) = parameter.split(SEPARATOR)
119

    
120
          results = @api.resource(:parameters).call(:index, { :domain_id => domain_id, :search => "name=\"#{parameter_name}\"" })['results']
121
          params = {
122
            'domain_id' => domain_id,
123
            'parameter' => {
124
              'name' => parameter_name,
125
              'value' => parameter_value
126
            }
127
          }
128
          if results.empty?
129
            @api.resource(:parameters).call(:create, params)
130
          else
131
            params['id'] = results[0]['id']
132
            @api.resource(:parameters).call(:update, params)
133
          end
134
        end
135
      end
136
    end
137
  end
138
end