def save(self, *args, **kwargs): if settings.CHECK_IP_HOSTNAME_ON_SAVE: if not self.address and self.hostname: self.address = network_tools.hostname(self.hostname, reverse=True) if not self.hostname and self.address: self.hostname = network_tools.hostname(self.address) if self.number and not self.address: self.address = ipaddress.ip_address(int(self.number)) else: self.number = int(ipaddress.ip_address(self.address or 0)) self._assign_parent() self.is_public = not self.ip.is_private # TODO: if not reserved, check for ethernet super(IPAddress, self).save(*args, **kwargs)
def _process_openstack_instances(self): for site in self._get_instances_from_settings(): logger.info('Processing {} ({})'.format(site['auth_url'], site['tag'])) nt = self._get_novaclient_connection(site) self._update_projects(site) def _add_flavor(flavor): flavor_id = flavor['id'] new_flavor = { 'name': flavor['name'], 'cores': flavor['vcpus'], 'memory': flavor['ram'], 'disk': flavor['disk'] * 1024, 'tag': site['tag'], } self.openstack_flavors[flavor_id] = new_flavor for flavor in self._get_flavors_list(nt, site): _add_flavor(flavor) for server in self._get_servers_list(nt, site): project_id = server['tenant_id'] host_id = server['id'] image_name = self._get_image_name( nt, server['image']['id']) if server['image'] else None flavor_id = server['flavor']['id'] new_server = { 'hostname': None, 'id': server['id'], 'flavor_id': flavor_id, 'tag': site['tag'], 'ips': {}, 'created': server['created'], 'hypervisor': server['OS-EXT-SRV-ATTR:hypervisor_hostname'], 'image': image_name, } for zone in server['addresses']: if ('network_regex' in site and not re.match(site['network_regex'], zone)): continue for ip in server['addresses'][zone]: addr = ip['addr'] # fetch FQDN from DNS by IP address hostname = network.hostname(addr) logger.debug('Get IP {} ({}) for {}'.format( addr, hostname, server['id'])) new_server['ips'][addr] = hostname if not new_server['hostname']: new_server['hostname'] = hostname # fallback to default behavior if FQDN could not be fetched # from DNS new_server['hostname'] = (new_server['hostname'] or server['name']) try: self.openstack_projects[project_id]['servers'][host_id] = ( new_server) except KeyError: logger.warning('Project %s not found for server %s', project_id, host_id) if flavor_id not in self.openstack_flavors: logger.warning( 'Flavor %s (found in host %s) not in flavors list.' ' Fetching it', flavor_id, host_id) _add_flavor(nt.flavors.get(flavor_id).__dict__)
def get_openstack_instances_data( self, openstack_projects, openstack_flavors, search_opts=None ): """ Take openstack_projects dictionary and populate it with instances (servers). If any flavor is missing, add it to the openstack_flavors dictionary. :param openstack_flavors: dictionary of openstack flavors :param openstack_projects: dictionary of openstack projects :return: updated openstack_projects and openstack_flavors :param search_opts: dictionary of search options """ default_search_opts = {'all_tenants': True} if not search_opts: search_opts = {} search_opts.update(default_search_opts) for client in self.clients: logger.info('Processing {} ({})'.format( client.site['auth_url'], client.site['tag'] )) for server in client.get_servers_list(search_opts=search_opts): project_id = server['tenant_id'] host_id = server['id'] image_name = client.get_image_name( server['image']['id'] ) if server['image'] else None flavor_id = server['flavor']['id'] new_server = { 'hostname': None, 'id': server['id'], 'flavor_id': flavor_id, 'tag': client.site['tag'], 'ips': {}, 'created': server['created'], 'hypervisor': server['OS-EXT-SRV-ATTR:hypervisor_hostname'], # noqa: E501 'image': image_name, 'status': server['status'] } for zone in server['addresses']: if ( 'network_regex' in client.site and not re.match(client.site['network_regex'], zone) ): continue for ip in server['addresses'][zone]: addr = ip['addr'] # fetch FQDN from DNS by IP address hostname = network.hostname(addr) logger.debug('Get IP {} ({}) for {}'.format( addr, hostname, server['id'] )) new_server['ips'][addr] = hostname if not new_server['hostname']: new_server['hostname'] = hostname # fallback to default behavior if FQDN could not be fetched # from DNS new_server['hostname'] = ( new_server['hostname'] or server['name'] ) try: openstack_projects[project_id]['servers'][host_id] = ( new_server ) except KeyError: logger.warning( 'Project %s not found for server %s', project_id, host_id ) if flavor_id not in openstack_flavors: logger.warning( 'Flavor %s (found in host %s) not in flavors list.' ' Fetching it', flavor_id, host_id) flavor = client.nova_client.flavors.get(flavor_id).__dict__ openstack_flavors[flavor['id']] = self._get_flavor_data( client, flavor, ) return openstack_projects, openstack_flavors