Пример #1
0
 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)
Пример #2
0
    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__)
Пример #3
0
    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