コード例 #1
0
ファイル: create_router.py プロジェクト: opnfv/snaps
    def create(self):
        """
        Responsible for creating the router.
        :return: the Router domain object
        """
        self.initialize()

        if not self.__router:
            self.__router = neutron_utils.create_router(
                self._neutron, self._os_creds, self.router_settings)

            for sub_config in self.router_settings.internal_subnets:
                internal_subnet = self.__get_internal_subnet(sub_config)
                if internal_subnet:
                    self.__internal_subnets.append(internal_subnet)
                    if internal_subnet:
                        logger.debug('Adding router to subnet...')
                        router_intf = neutron_utils.add_interface_router(
                            self._neutron,
                            self.__router,
                            subnet=internal_subnet)
                        self.__internal_router_interface = router_intf
                else:
                    raise RouterCreationError(
                        'Subnet not found with name {}'.format(sub_config))

            for port_setting in self.router_settings.port_settings:
                port = neutron_utils.get_port(
                    self._neutron,
                    self._keystone,
                    port_settings=port_setting,
                    project_name=self._os_creds.project_name)
                logger.info('Retrieved port %s for router - %s',
                            port_setting.name, self.router_settings.name)
                if port:
                    self.__ports.append(port)

                if not port:
                    port = neutron_utils.create_port(self._neutron,
                                                     self._os_creds,
                                                     port_setting)
                    if port:
                        logger.info('Created port %s for router - %s',
                                    port_setting.name,
                                    self.router_settings.name)
                        self.__ports.append(port)
                        neutron_utils.add_interface_router(self._neutron,
                                                           self.__router,
                                                           port=port)
                    else:
                        raise RouterCreationError(
                            'Error creating port with name - ' +
                            port_setting.name)

        self.__router = neutron_utils.get_router_by_id(self._neutron,
                                                       self.__router.id)
        return self.__router
コード例 #2
0
ファイル: settings_utils.py プロジェクト: opnfv/snaps
def __create_floatingip_config(neutron, keystone, port_settings, project_name):
    """
    Returns a list of FloatingIpConfig objects as they pertain to an
    existing deployed server instance
    :param neutron: the neutron client
    :param keystone: the keystone client
    :param port_settings: list of SNAPS-OO PortConfig objects
    :return: a list of FloatingIpConfig objects or an empty list if no
             floating IPs have been created
    """
    base_fip_name = 'fip-'
    fip_ctr = 1
    out = list()

    fip_ports = list()
    for port_setting in port_settings:
        setting_port = neutron_utils.get_port(neutron,
                                              keystone,
                                              port_setting,
                                              project_name=project_name)
        if setting_port:
            network = neutron_utils.get_network(
                neutron, keystone, network_name=port_setting.network_name)
            network_ports = neutron_utils.get_ports(neutron, network)
            if network_ports:
                for setting_port in network_ports:
                    if port_setting.mac_address == setting_port.mac_address:
                        fip_ports.append((port_setting.name, setting_port))
                        break

    floating_ips = neutron_utils.get_port_floating_ips(neutron, fip_ports)

    for port_id, floating_ip in floating_ips:
        router = neutron_utils.get_router_by_id(neutron, floating_ip.router_id)
        setting_port = neutron_utils.get_port_by_id(neutron,
                                                    floating_ip.port_id)
        kwargs = dict()
        kwargs['name'] = base_fip_name + str(fip_ctr)
        kwargs['port_name'] = setting_port.name
        kwargs['port_id'] = setting_port.id
        kwargs['router_name'] = router.name

        if setting_port:
            for ip_dict in setting_port.ips:
                if ('ip_address' in ip_dict and 'subnet_id' in ip_dict and
                        ip_dict['ip_address'] == floating_ip.fixed_ip_address):
                    subnet = neutron_utils.get_subnet_by_id(
                        neutron, ip_dict['subnet_id'])
                    if subnet:
                        kwargs['subnet_name'] = subnet.name

        out.append(FloatingIpConfig(**kwargs))

        fip_ctr += 1

    return out
コード例 #3
0
    def __query_ports(self, port_settings):
        """
        Returns the previously configured ports or an empty list if none
        exist
        :param port_settings: A list of PortSetting objects
        :return: a list of OpenStack port tuples where the first member is the
                 port name and the second is the port object
        """
        ports = list()

        for port_setting in port_settings:
            port = neutron_utils.get_port(
                self.__neutron,
                self.__keystone,
                port_settings=port_setting,
                project_name=self._os_creds.project_name)
            if port:
                ports.append((port_setting.name, port))

        return ports
コード例 #4
0
ファイル: create_router.py プロジェクト: opnfv/snaps
    def initialize(self):
        """
        Loads the existing router.
        :return: the Router domain object
        """
        super(self.__class__, self).initialize()

        try:
            self.__router = neutron_utils.get_router(
                self._neutron,
                self._keystone,
                router_settings=self.router_settings,
                project_name=self._os_creds.project_name)
        except Unauthorized as e:
            logger.warn('Unable to lookup router with name %s - %s',
                        self.router_settings.name, e)

        if self.__router:
            for sub_config in self.router_settings.internal_subnets:
                internal_subnet = self.__get_internal_subnet(sub_config)
                if internal_subnet:
                    self.__internal_subnets.append(internal_subnet)
                else:
                    raise RouterCreationError('Subnet not found with name ' +
                                              internal_subnet.name)

            for port_setting in self.router_settings.port_settings:
                port = neutron_utils.get_port(
                    self._neutron,
                    self._keystone,
                    port_settings=port_setting,
                    project_name=self._os_creds.project_name)
                if port:
                    self.__ports.append(port)

        return self.__router
コード例 #5
0
def create_server(nova,
                  keystone,
                  neutron,
                  glance,
                  instance_config,
                  image_config,
                  project_name,
                  keypair_config=None):
    """
    Creates a VM instance
    :param nova: the nova client (required)
    :param keystone: the keystone client for retrieving projects (required)
    :param neutron: the neutron client for retrieving ports (required)
    :param glance: the glance client (required)
    :param instance_config: the VMInstConfig object (required)
    :param image_config: the VM's ImageConfig object (required)
    :param project_name: the associated project name (required)
    :param keypair_config: the VM's KeypairConfig object (optional)
    :return: a snaps.domain.VmInst object
    """

    ports = list()

    for port_setting in instance_config.port_settings:
        port = neutron_utils.get_port(neutron,
                                      keystone,
                                      port_settings=port_setting,
                                      project_name=project_name)
        if port:
            ports.append(port)
        else:
            raise Exception('Cannot find port named - ' + port_setting.name)
    nics = []
    for port in ports:
        kv = dict()
        kv['port-id'] = port.id
        nics.append(kv)

    logger.info('Creating VM with name - ' + instance_config.name)
    keypair_name = None
    if keypair_config:
        keypair_name = keypair_config.name

    flavor = get_flavor_by_name(nova, instance_config.flavor)
    if not flavor:
        raise NovaException('Flavor not found with name - %s',
                            instance_config.flavor)

    image = glance_utils.get_image(glance, image_settings=image_config)
    if image:
        userdata = None
        if instance_config.userdata:
            if isinstance(instance_config.userdata, str):
                userdata = instance_config.userdata + '\n'
            elif (isinstance(instance_config.userdata, dict)
                  and 'script_file' in instance_config.userdata):
                try:
                    userdata = file_utils.read_file(
                        instance_config.userdata['script_file'])
                except Exception as e:
                    logger.warn('error reading userdata file %s - %s',
                                instance_config.userdata, e)
        args = {
            'name': instance_config.name,
            'flavor': flavor,
            'image': image,
            'nics': nics,
            'key_name': keypair_name,
            'security_groups': instance_config.security_group_names,
            'userdata': userdata
        }

        if instance_config.availability_zone:
            args['availability_zone'] = instance_config.availability_zone

        server = nova.servers.create(**args)

        return __map_os_server_obj_to_vm_inst(neutron, keystone, server,
                                              project_name)
    else:
        raise NovaException(
            'Cannot create instance, image cannot be located with name %s',
            image_config.name)