Spliting Machines and Assigning IPs
diff --git a/_modules/maas.py b/_modules/maas.py
index 4b127d8..bc7e83c 100644
--- a/_modules/maas.py
+++ b/_modules/maas.py
@@ -77,55 +77,70 @@
if self._update:
return self._maas.put(self._update_url.format(data[self._update_key]), **data).read()
if isinstance(self._create_url, tuple):
- return self._maas.post(*self._create_url, **data).read()
- return self._maas.post(self._create_url, None, **data).read()
+ return self._maas.post(self._create_url[0].format(**data),
+ *self._create_url[1:], **data).read()
+ return self._maas.post(self._create_url.format(**data), None, **data).read()
def process(self):
- config = __salt__['config.get']('maas')
- for part in self._config_path.split('.'):
- config = config.get(part, {})
- extra = {}
- for name, url_call in self._extra_data_urls.iteritems():
- key = 'id'
- if isinstance(url_call, tuple):
- url_call, key = url_call[:]
- extra[name] = {v['name']: v[key] for v in
- json.loads(self._maas.get(url_call).read())}
- if self._all_elements_url:
- all_elements = {}
- elements = self._maas.get(self._all_elements_url).read()
- res_json = json.loads(elements)
- for element in res_json:
- if isinstance(element, (str, unicode)):
- all_elements[element] = {}
- else:
- all_elements[element[self._element_key]] = element
- else:
- all_elements = {}
- ret = {
- 'success': [],
- 'errors': {},
- 'updated': [],
- }
- for name, config_data in config.iteritems():
- self._update = False
- try:
- data = self.fill_data(name, config_data, **extra)
- if name in all_elements:
- self._update = True
- data = self.update(data, all_elements[name])
- self.send(data)
- ret['updated'].append(name)
- else:
- self.send(data)
- ret['success'].append(name)
- except urllib2.HTTPError as e:
- etxt = e.read()
- LOG.exception('Failed for object %s reason %s', name, etxt)
- ret['errors'][name] = str(etxt)
- except Exception as e:
- LOG.exception('Failed for object %s reason %s', name, e)
- ret['errors'][name] = str(e)
+ try:
+ config = __salt__['config.get']('maas')
+ for part in self._config_path.split('.'):
+ config = config.get(part, {})
+ extra = {}
+ for name, url_call in self._extra_data_urls.iteritems():
+ key = 'id'
+ key_name = 'name'
+ if isinstance(url_call, tuple):
+ if len(url_call) == 2:
+ url_call, key = url_call[:]
+ else:
+ url_call, key, key_name = url_call[:]
+ if key:
+ extra[name] = {v[key_name]: v[key] for v in
+ json.loads(self._maas.get(url_call).read())}
+ else:
+ extra[name] = {v[key_name]: v for v in
+ json.loads(self._maas.get(url_call).read())}
+ if self._all_elements_url:
+ all_elements = {}
+ elements = self._maas.get(self._all_elements_url).read()
+ res_json = json.loads(elements)
+ for element in res_json:
+ if isinstance(element, (str, unicode)):
+ all_elements[element] = {}
+ else:
+ all_elements[element[self._element_key]] = element
+ else:
+ all_elements = {}
+ ret = {
+ 'success': [],
+ 'errors': {},
+ 'updated': [],
+ }
+ for name, config_data in config.iteritems():
+ self._update = False
+ try:
+ data = self.fill_data(name, config_data, **extra)
+ if data is None:
+ ret['updated'].append(name)
+ continue
+ if name in all_elements:
+ self._update = True
+ data = self.update(data, all_elements[name])
+ self.send(data)
+ ret['updated'].append(name)
+ else:
+ self.send(data)
+ ret['success'].append(name)
+ except urllib2.HTTPError as e:
+ etxt = e.read()
+ LOG.exception('Failed for object %s reason %s', name, etxt)
+ ret['errors'][name] = str(etxt)
+ except Exception as e:
+ LOG.exception('Failed for object %s reason %s', name, e)
+ ret['errors'][name] = str(e)
+ except Exception:
+ LOG.exception('WTF')
if ret['errors']:
raise Exception(ret)
return ret
@@ -318,12 +333,11 @@
self._update_key = 'system_id'
def fill_data(self, name, machine_data):
- self._interface = machine_data['interface']
power_data = machine_data['power_parameters']
data = {
'hostname': name,
'architecture': machine_data.get('architecture', 'amd64/generic'),
- 'mac_addresses': self._interface['mac'],
+ 'mac_addresses': machine_data['interface']['mac'],
'power_type': machine_data.get('power_type', 'ipmi'),
'power_parameters_power_address': power_data['power_address'],
}
@@ -344,31 +358,34 @@
new[self._update_key] = str(old[self._update_key])
return new
- def _link_interface(self, system_id, interface_id):
- if 'ip' not in self._interface:
+
+class AssignMachinesIP(MaasObject):
+ def __init__(self):
+ super(AssignMachinesIP, self).__init__()
+ self._all_elements_url = None
+ self._create_url = (u'/api/2.0/nodes/{system_id}/interfaces/{interface_id}/', 'link_subnet')
+ self._config_path = 'region.machines'
+ self._element_key = 'hostname'
+ self._update_key = 'system_id'
+ self._extra_data_urls = {'machines' : (u'api/2.0/machines/', None, 'hostname')}
+
+ def fill_data(self, name, data, machines):
+ interface = data['interface']
+ machine = machines[name]
+ if 'ip' not in interface:
return
data = {
'mode': 'STATIC',
- 'subnet': self._interface.get('subnet'),
- 'ip_address': self._interface.get('ip'),
+ 'subnet': str(interface.get('subnet')),
+ 'ip_address': str(interface.get('ip')),
}
- if 'default_gateway' in self._interface:
- data['default_gateway'] = self._interface.get('gateway')
+ if 'default_gateway' in interface:
+ data['default_gateway'] = interface.get('gateway')
if self._update:
data['force'] = '1'
- LOG.info('interfaces link_subnet %s %s %s', system_id, interface_id,
- _format_data(data))
- self._maas.post(u'/api/2.0/nodes/{0}/interfaces/{1}/'
- .format(system_id, interface_id), 'link_subnet',
- **data)
-
- def send(self, data):
- response = super(Machine, self).send(data)
- resp_json = json.loads(response)
- system_id = resp_json['system_id']
- iface_id = resp_json['interface_set'][0]['id']
- self._link_interface(system_id, iface_id)
- return response
+ data['system_id'] = str(machine['system_id'])
+ data['interface_id'] = str(machine['interface_set'][0]['id'])
+ return data
class BootResource(MaasObject):
@@ -590,3 +607,6 @@
def process_sshprefs():
return SSHPrefs().process()
+
+def process_assign_machines_ip():
+ return AssignMachinesIP().process()