Class: Gogetit::GogetMAAS

Inherits:
Object
  • Object
show all
Defined in:
lib/gogetit/maas.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(conf, logger) ⇒ GogetMAAS

Returns a new instance of GogetMAAS.



8
9
10
11
12
13
14
15
# File 'lib/gogetit/maas.rb', line 8

def initialize(conf, logger)
  @config = conf
  @conn = Maas::Client::MaasClient.new(
      config[:maas][:key],
      config[:maas][:url]
    )
  @logger = logger
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



6
7
8
# File 'lib/gogetit/maas.rb', line 6

def config
  @config
end

#connObject (readonly)

Returns the value of attribute conn.



6
7
8
# File 'lib/gogetit/maas.rb', line 6

def conn
  @conn
end

#domainObject (readonly)

Returns the value of attribute domain.



6
7
8
# File 'lib/gogetit/maas.rb', line 6

def domain
  @domain
end

#loggerObject (readonly)

Returns the value of attribute logger.



6
7
8
# File 'lib/gogetit/maas.rb', line 6

def logger
  @logger
end

Instance Method Details

#change_hostname(system_id, hostname) ⇒ Object



223
224
225
226
# File 'lib/gogetit/maas.rb', line 223

def change_hostname(system_id, hostname)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:put, ['machines', system_id], { 'hostname' => hostname })
end

#delete_dns_record(name) ⇒ Object



181
182
183
184
185
186
187
188
189
# File 'lib/gogetit/maas.rb', line 181

def delete_dns_record(name)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['dnsresources']).each do |item|
    if item['fqdn'] == name + '.' + get_domain
      logger.info("#{item['fqdn']} is being deleted..")
      conn.request(:delete, ['dnsresources', item['id']])
    end
  end
end

#dnsresource_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
44
45
# File 'lib/gogetit/maas.rb', line 39

def dnsresource_exists?(name)
  logger.info("Calling <#{__method__.to_s}> for #{name}")
  conn.request(:get, ['dnsresources']).each do |item|
    return true if item['fqdn'] == name + '.' + get_domain
  end
  false
end

#domain_name_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
50
# File 'lib/gogetit/maas.rb', line 47

def domain_name_exists?(name)
  logger.info("Calling <#{__method__.to_s}> for #{name}")
  return true if dnsresource_exists?(name) or machine_exists?(name)
end

#get_distro_name(system_id) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/gogetit/maas.rb', line 31

def get_distro_name(system_id)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['machines']).each do |m|
    return m['osystem'] if m['system_id'] == system_id
  end
  false
end

#get_domainObject



17
18
19
20
21
# File 'lib/gogetit/maas.rb', line 17

def get_domain
  return @domain if @domain
  logger.info("Calling <#{__method__.to_s}>")
  @domain = conn.request(:get, ['domains'])[0]['name']
end

#get_machine_state(system_id) ⇒ Object



215
216
217
218
219
220
221
# File 'lib/gogetit/maas.rb', line 215

def get_machine_state(system_id)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['machines']).each do |m|
    return m['status_name'] if m['system_id'] == system_id
  end
  false
end

#get_package_reposObject



233
234
235
236
# File 'lib/gogetit/maas.rb', line 233

def get_package_repos
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['package-repositories'])
end

#get_sshkeysObject



228
229
230
231
# File 'lib/gogetit/maas.rb', line 228

def get_sshkeys
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['account', 'prefs', 'sshkeys'])
end

#get_subnetsObject



52
53
54
55
# File 'lib/gogetit/maas.rb', line 52

def get_subnets
  logger.info("Calling <#{__method__.to_s}>")
  return conn.request(:get, ['subnets'])
end

#get_system_id(name) ⇒ Object



199
200
201
202
203
204
205
# File 'lib/gogetit/maas.rb', line 199

def get_system_id(name)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['machines']).each do |m|
    return m['system_id'] if m['hostname'] == name
  end
  nil
end

#interfaces(url = [], params = {}) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/gogetit/maas.rb', line 159

def interfaces(url = [], params = {})
  logger.info("Calling <#{__method__.to_s}>")

  url.insert(0, 'nodes')
  url.insert(2, 'interfaces')
  # ['nodes', system_id, 'interfaces']

  case params['op']
  when nil
    conn.request(:get, url)
  when 'create_vlan'
    logger.info("Creating a vlan interface for id: #{params['vlan']}..")
    conn.request(:post, url, params)
  when 'link_subnet'
    logger.info("Linking a subnet for id: #{url[3]}..")
    conn.request(:post, url, params)
  when 'unlink_subnet'
    logger.info("Linking a subnet for id: #{url[3]}..")
    conn.request(:post, url, params)
  end
end

#ip_reserved?(addresses) ⇒ Boolean

Returns:

  • (Boolean)


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/gogetit/maas.rb', line 57

def ip_reserved?(addresses)
  logger.info("Calling <#{__method__.to_s}>")
  ips = Set.new
  addresses.each do |ip|
    ips.add(IPAddr.new(ip))
  end

  reserved_ips = Set.new
  conn.request(:get, ['ipaddresses']).each do |ip|
    reserved_ips.add(IPAddr.new(ip['ip']))
  end

  rackcontroller_ips = Set.new
  conn.request(:get, ['rackcontrollers']).each do |rctrl|
    rctrl['ip_addresses'].each do |ip|
      rackcontroller_ips.add(IPAddr.new(ip))
    end
  end

  # reserved_ips | rackcontroller_ips
  # Returns a new array by joining ary with other_ary, 
  # excluding any duplicates and preserving the order from the original array.
  if ips.disjoint? reserved_ips | rackcontroller_ips
    subnets = conn.request(:get, ['subnets'])
    ipranges = conn.request(:get, ['ipranges'])

    ifaces = []

    ips.each do |ip|
      available = false
      subnets.each do |subnet|
        if IPAddr.new(subnet['cidr']).include?(ip)
          ipranges.each do |range|
            if range['subnet']['id'] == subnet['id']
              first = IPAddr.new(range['start_ip']).to_i
              last = IPAddr.new(range['end_ip']).to_i
              if (first..last) === ip.to_i
                logger.info("#{ip} is available.")
                available = true
                subnets.delete(subnet)
                subnet['ip'] = ip.to_s
                ifaces << subnet
                break
              end
            end
          end
        end
        break if available
      end

      if not available
        logger.info("#{ip.to_s} does not belong to any subnet pre-defined.")
        return false
      end
    end

  else
    logger.info("#{(ips & (reserved_ips | rackcontroller_ips)).to_a.join(', ')}\
                is already reserved.")
    return false
  end

  return ifaces
end

#ipaddresses(op = nil, params = nil) ⇒ Object



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/gogetit/maas.rb', line 133

def ipaddresses(op = nil, params = nil)
  logger.info("Calling <#{__method__.to_s}>")
  case op
  when nil
    conn.request(:get, ['ipaddresses'])
  when 'reserve'
    # params = {
    #   'subnet' => '10.1.2.0/24',
    #   'ip' => '10.1.2.8',
    #   'hostname' => 'hostname',
    #   'mac' => 'blahblah'
    # }
    default_param = { 'op' => op }
    logger.info("#{params['ip']} is being reserved..")
    conn.request(:post, ['ipaddresses'], default_param.merge!(params))
  when 'release'
    # Gogetit.maas.ipaddresses('release', {'ip' => '10.1.2.8'})
    # params = {
    #   'ip' => '10.1.2.8',
    # }
    default_param = { 'op' => op }
    logger.info("#{params['ip']} is being released..")
    conn.request(:post, ['ipaddresses'], default_param.merge!(params))
  end
end

#ipaddresses_reserved?(ip) ⇒ Boolean

Returns:

  • (Boolean)


122
123
124
125
126
127
128
129
130
131
# File 'lib/gogetit/maas.rb', line 122

def ipaddresses_reserved?(ip)
  logger.info("Calling <#{__method__.to_s}>")
  conn.request(:get, ['ipaddresses']).each do |address|
    if address['ip'] == ip
      logger.info("#{ip} is reserved.")
      return true
    end
  end
  return false
end

#machine_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
26
27
28
29
# File 'lib/gogetit/maas.rb', line 23

def machine_exists?(name)
  logger.info("Calling <#{__method__.to_s}> for #{name}")
  conn.request(:get, ['machines']).each do |m|
    return true if m['hostname'] == name
  end
  false
end

#refresh_podsObject



191
192
193
194
195
196
197
# File 'lib/gogetit/maas.rb', line 191

def refresh_pods
  logger.info("Calling <#{__method__.to_s}>")
  pod_id = conn.request(:get, ['pods'])
  pod_id.each do |pod|
    conn.request(:post, ['pods', pod['id']], { 'op' => 'refresh' } )
  end
end

#wait_until_state(system_id, state) ⇒ Object



207
208
209
210
211
212
213
# File 'lib/gogetit/maas.rb', line 207

def wait_until_state(system_id, state)
  logger.info("Calling <#{__method__.to_s}> for being #{state}")
  until conn.request(:get, ['machines', system_id])['status_name'] == state
    sleep 3
  end
  logger.info("The status has become '#{state}'.")
end