示例#1
0
    def unplug_vif_from_vpn(self, **params):

        instance_type = self._check_instance_type(params)

        vpn_instance_class = VPNManager.type2class[instance_type]
        vpn_instance_class.validate_convert_detach_params(params)

        external_instance_id = params.get('external_instance_id')
        mac_address = params.get('mac_address')
        localport = params.get('localport')
        ip_address_prefix = params.get('ip_address_prefix')

        # Retrieve VPN instance or raise exception if does not exist
        try:
            vpn_instance = self.vpn_instances[external_instance_id]
        except KeyError:
            LOG.error("Try to unplug VIF from non existing VPN instance %s",
                      external_instance_id)
            raise exc.VPNNotFound(external_instance_id)

        # Unplug VIF from VPN instance
        vpn_instance.vif_unplugged(mac_address, ip_address_prefix)

        if vpn_instance.type == constants.IPVPN and 'evpn' in localport:
            self._detach_evpn_2_ipvpn(vpn_instance)

        if vpn_instance.stop_if_empty():
            self.unregister_vpn_instance(vpn_instance)
示例#2
0
    def _get_vpn_instance(self,
                          external_instance_id,
                          instance_type,
                          import_rts,
                          export_rts,
                          gateway_ip,
                          mask,
                          readvertise,
                          attract_traffic,
                          fallback=None,
                          **kwargs):
        # Get an vpn_instance with this external_instance_id,
        # if one already exists, check matching instance_type
        # else create one with provided parameters and start it
        #   (unless create_if_none is False --> raise exc.VPNNotFound)
        # returns True if an already started instance was found
        # False if a new instance was created without starting it

        LOG.info("Finding %s for external vpn_instance identifier %s",
                 instance_type, external_instance_id)

        vpn_instance = self.vpn_instances.get(external_instance_id)

        if vpn_instance:
            if vpn_instance.type != instance_type:
                raise Exception(
                    "Found an existing vpn_instance with "
                    "external id %s but a different type "
                    "(asked %s vs. already having %s)" %
                    (external_instance_id, instance_type, vpn_instance.type))
            return vpn_instance, True

        if not kwargs.pop('create_if_none', True):
            raise exc.VPNNotFound(external_instance_id)

        # if a vni is specified, check that no VPN instance with same VNI
        # already exists...
        if 'vni' in kwargs and kwargs['vni'] in self.vpn_instance_by_vni:
            raise exc.APIAlreadyUsedVNI(kwargs['vni'])

        vpn_instance_class = VPNManager.type2class[instance_type]
        dataplane_driver = self.dataplane_drivers[instance_type]

        # unique internal vpn instance id
        instance_id = self.next_vpn_instance_id
        if instance_id > INSTANCE_ID_MAX:
            raise MaxInstanceIDReached()

        self.next_vpn_instance_id += 1

        vpn_instance = vpn_instance_class(self, dataplane_driver,
                                          external_instance_id, instance_id,
                                          import_rts, export_rts, gateway_ip,
                                          mask, readvertise, attract_traffic,
                                          fallback, **kwargs)

        self.register_vpn_instance(vpn_instance)

        return vpn_instance, False
示例#3
0
    def _get_vpn_instance(self,
                          external_instance_id,
                          instance_type,
                          import_rts,
                          export_rts,
                          gateway_ip,
                          mask,
                          readvertise,
                          attract_traffic,
                          fallback=None,
                          **kwargs):
        # Get an vpn_instance with this external_instance_id,
        # if one already exists, check matching instance_type
        # else create one with provided parameters and start it
        #   (unless create_if_none is False --> raise exc.VPNNotFound)

        LOG.info("Finding %s for external vpn_instance identifier %s",
                 instance_type, external_instance_id)

        vpn_instance = self.vpn_instances.get(external_instance_id)

        if vpn_instance:
            if vpn_instance.type != instance_type:
                raise Exception(
                    "Found an existing vpn_instance with "
                    "external id %s but a different type "
                    "(asked %s vs. already having %s)" %
                    (external_instance_id, instance_type, vpn_instance.type))
            return vpn_instance

        if not kwargs.pop('create_if_none', True):
            raise exc.VPNNotFound(external_instance_id)

        vpn_instance_class = VPNManager.type2class[instance_type]
        dataplane_driver = self.dataplane_drivers[instance_type]

        # unique internal vpn instance id
        instance_id = len(self.vpn_instances) + 1

        vpn_instance = vpn_instance_class(self, dataplane_driver,
                                          external_instance_id, instance_id,
                                          import_rts, export_rts, gateway_ip,
                                          mask, readvertise, attract_traffic,
                                          fallback, **kwargs)

        self.vpn_instances[external_instance_id] = vpn_instance

        vpn_instance.start()

        return vpn_instance