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)
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
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