def _validate_same_netpartition(self, context, trunk_port, trunk_subports): parent_netpart = db.get_subnet_l2dom_by_port_id( context.session, trunk_port['id']).get('net_partition_id') bad_subport = next( (port for port in trunk_subports if db.get_subnet_l2dom_by_port_id(context.session, port.id).get( 'net_partition_id') != parent_netpart), None) if bad_subport: raise nuage_exc.SubPortNetpartitionConflict(subport=bad_subport.id)
def post_port_create(self, resource, event, plugin, **kwargs): port = kwargs.get('port') request_port = kwargs.get('request_port') vport = kwargs.get('vport') context = kwargs.get('context') try: nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id']) self.create_allowed_address_pairs(context, port, request_port, vport) except SubnetMappingNotFound: pass
def get_port_available_nuage_policy_groups(self, context, filters=None): port_id = filters.pop('for_port')[0] vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id( context.session, port_id) vsd_filters = self.osfilters_to_vsdfilters(filters) return self._get_available_nuage_policy_groups(vsd_mapping, vsd_filters)
def _unset_sub_ports(self, trunk_id, subports): _vsdclient = self.plugin_driver.vsdclient ctx = n_ctx.get_admin_context() updated_ports = [] for port in subports: LOG.debug('unset port id : %(id)s', {'id': port.port_id}) try: updated_port = self.core_plugin.update_port( ctx, port.port_id, { 'port': { portbindings.HOST_ID: None, portbindings.PROFILE: None, 'device_owner': '', 'device_id': '' } }) vif_type = updated_port.get(portbindings.VIF_TYPE) if vif_type != portbindings.VIF_TYPE_UNBOUND: raise t_exc.SubPortBindingError(port_id=port.port_id, trunk_id=trunk_id) updated_ports.append(updated_port) subnet_mapping = db.get_subnet_l2dom_by_port_id( ctx.session, port.port_id) _vsdclient.remove_subport(updated_port, subnet_mapping) except t_exc.SubPortBindingError as e: LOG.error("Failed to clear binding for subport: %s", e) self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS) except Exception as e: LOG.error("Failed to clear binding for subport: %s", e) if len(subports) != len(updated_ports): self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS)
def post_port_create_addresspair(self, resource, event, plugin, **kwargs): port = kwargs.get('port') vport = kwargs.get('vport') context = kwargs.get('context') configure_vips = (port.get(constants.VIPS_FOR_PORT_IPS) or port.get("allowed_address_pairs")) if not self.is_port_supported(port) or not configure_vips: # If there are no allowed_address_pair in the request # port_security_enabled False and allowed address pairs are # mutually exclusive in Neutron return try: nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id']) self.create_allowed_address_pairs(context, port, vport) except SubnetMappingNotFound: pass
def _get_port_nuage_policy_groups(self, context, port_id, vsd_filters): vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session, port_id) vport = self.nuageclient.get_nuage_vport_by_neutron_id( { "neutron_port_id": port_id, "l2dom_id": vsd_mapping["nuage_subnet_id"], "l3dom_id": vsd_mapping["nuage_subnet_id"], } ) return self.nuageclient.get_nuage_vport_policy_groups(vport["ID"], externalID=None, **vsd_filters)
def _get_port_nuage_policy_groups(self, context, port_id, vsd_filters): vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session, port_id) vport = self.nuageclient.get_nuage_vport_by_id( {'neutron_port_id': port_id, 'l2dom_id': vsd_mapping['nuage_subnet_id'], 'l3dom_id': vsd_mapping['nuage_subnet_id']}) return self.nuageclient.get_nuage_vport_policy_groups( vport['nuage_vport_id'], externalID=None, **vsd_filters)
def _set_sub_ports(self, trunk_id, subports): _vsdclient = self.plugin_driver.vsdclient ctx = n_ctx.get_admin_context() for port in subports: LOG.debug('setting port id %(id)s vlan %(vlan)s', {'id': port.port_id, 'vlan': port.segmentation_id}) os_port = self.core_plugin.get_port(ctx, port.port_id) subnet_mapping = db.get_subnet_l2dom_by_port_id(ctx.session, port.port_id) fixed_ips = os_port['fixed_ips'] subnets = {4: {}, 6: {}} ips = {4: None, 6: None} for fixed_ip in fixed_ips: subnet = self.core_plugin.get_subnet(ctx, fixed_ip['subnet_id']) subnets[subnet['ip_version']] = subnet ips[subnet['ip_version']] = fixed_ip['ip_address'] network_details = self.core_plugin.get_network( ctx, os_port['network_id']) if network_details['shared']: _vsdclient.create_usergroup( os_port['tenant_id'], subnet_mapping['net_partition_id']) np_name = db.get_net_partition_by_id( ctx.session, subnet_mapping['net_partition_id'])['name'] data = { 'id': os_port['id'], 'mac': os_port['mac_address'], 'ipv4': ips[4], 'ipv6': ips[6], 'net_partition_id': subnet_mapping['net_partition_id'], 'net_partition_name': np_name, 'nuage_subnet_id': subnet_mapping.get('nuage_subnet_id') } try: _vsdclient.add_subport(trunk_id, port, data) except Exception as ex: LOG.error("Failed to create subport: %s", ex) self.set_trunk_status(ctx, trunk_id, t_consts.TRUNK_DEGRADED_STATUS) updated_ports = self._update_subport_bindings(ctx, trunk_id, subports) if len(subports) != len(updated_ports[trunk_id]): LOG.error("Updated: %(up)s, subports: %(sub)s", {'up': len(updated_ports[trunk_id]), 'sub': len(subports)}) self.set_trunk_status(ctx, trunk_id, t_consts.TRUNK_DEGRADED_STATUS)
def _create_port_dhcp_opts(self, resource, event, trigger, **kwargs): request_port = kwargs.get('request_port') port = kwargs.get('port') vport = kwargs.get('vport') context = kwargs.get('context') if not request_port or \ not lib_validators.is_attr_set( request_port.get('extra_dhcp_opts')): return try: nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id']) except SubnetMappingNotFound: msg = ("Cannot create a port with DHCP options on a subnet that " "does not have mapping to a L2Domain (OR) " "a L3 Subnet on Nuage.") raise nuage_exc.NuageBadRequest(msg=msg) dhcp_options = copy.deepcopy(request_port['extra_dhcp_opts']) for dhcp_opt in dhcp_options: self._translate_dhcp_option(dhcp_opt) self._create_update_extra_dhcp_options(dhcp_options, vport, port['id'])
def _unset_trunk(self, trunk): _vsdclient = self.plugin_driver.vsdclient ctx = n_ctx.get_admin_context() try: subnet_mapping = db.get_subnet_l2dom_by_port_id( ctx.session, trunk.port_id) _vsdclient.delete_trunk(trunk, subnet_mapping) except Exception as ex: LOG.error("Failed to delete trunk: %s", ex) trunk.update(status=t_consts.TRUNK_ERROR_STATUS) raise t_exc.TrunkInErrorState(trunk_id=trunk.id)
def _create_port_dhcp_opts(self, resource, event, trigger, **kwargs): request_port = kwargs.get('request_port') port = kwargs.get('port') vport = kwargs.get('vport') context = kwargs.get('context') if not request_port or \ not is_attr_set(request_port.get('extra_dhcp_opts')): return try: nuagedb.get_subnet_l2dom_by_port_id(context.session, port['id']) except SubnetMappingNotFound: msg = ("Cannot create a port with DHCP options on a subnet that " "does not have mapping to a L2Domain (OR) " "a L3 Subnet on Nuage.") raise nuage_exc.NuageBadRequest(msg=msg) dhcp_options = copy.deepcopy(request_port['extra_dhcp_opts']) for dhcp_opt in dhcp_options: self._translate_dhcp_option(dhcp_opt) self._create_update_extra_dhcp_options( dhcp_options, vport, port['id'])
def get_nuage_redirect_targets_by_port(self, port_id, context): port_params = {'neutron_port_id': port_id} vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id( context.session, port_id) if vsd_mapping['nuage_l2dom_tmplt_id']: port_params['l2dom_id'] = vsd_mapping['nuage_subnet_id'] else: port_params['l3dom_id'] = vsd_mapping['nuage_subnet_id'] vport = self.vsdclient.get_nuage_vport_by_neutron_id(port_params, required=True) return self.vsdclient.get_nuage_vport_redirect_targets( vport_id=vport['ID'], required=False) or []
def get_nuage_floatingip_assigned_to_port(self, context, filters=None): port_id = filters['ports'][0] vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id( context.session, port_id) if vsd_mapping['nuage_l2dom_tmplt_id']: return [] vports = self.vsdclient.get_vports( constants.L3SUBNET, vsd_mapping['nuage_subnet_id'], externalID=get_vsd_external_id(port_id)) fip_id = vports[0]['associatedFloatingIPID'] if vports else None return (self.vsdclient.get_nuage_floatingips(required=True, ID=fip_id) if fip_id else [])
def _get_port_nuage_policy_groups(self, context, port_id, vsd_filters): port_params = {'neutron_port_id': port_id} vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id( context.session, port_id) if vsd_mapping['nuage_l2dom_tmplt_id']: port_params['l2dom_id'] = vsd_mapping['nuage_subnet_id'] else: port_params['l3dom_id'] = vsd_mapping['nuage_subnet_id'] vport = self.vsdclient.get_nuage_vport_by_neutron_id(port_params) return self.vsdclient.get_nuage_vport_policy_groups(vport['ID'], externalID=None, **vsd_filters)
def _get_port_nuage_policy_groups(self, port_id, vport=None, context=None, vsd_filters=None): if not vport: port_params = {'neutron_port_id': port_id} vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id( context.session, port_id) if vsd_mapping['nuage_l2dom_tmplt_id']: port_params['l2dom_id'] = vsd_mapping['nuage_subnet_id'] else: port_params['l3dom_id'] = vsd_mapping['nuage_subnet_id'] vport = self.vsdclient.get_nuage_vport_by_neutron_id(port_params) vsd_filters = vsd_filters or {} return self.vsdclient.get_policygroups(parent_type=constants.VPORT, parent_id=vport['ID'], externalID=None, **vsd_filters)
def get_port_available_nuage_floatingips(self, context, filters=None): port_id = filters.pop('for_port')[0] vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session, port_id) return self._get_available_nuage_floatingips(vsd_mapping, filters)
def _set_sub_ports(self, trunk_id, subports): _vsdclient = self.plugin_driver.vsdclient ctx = n_ctx.get_admin_context() for port in subports: LOG.debug('setting port id %(id)s vlan %(vlan)s', { 'id': port.port_id, 'vlan': port.segmentation_id }) os_port = self.core_plugin.get_port(ctx, port.port_id) subnet_mapping = db.get_subnet_l2dom_by_port_id( ctx.session, port.port_id) fixed_ips = os_port['fixed_ips'] subnets = {4: {}, 6: {}} ips = {4: None, 6: None} for fixed_ip in fixed_ips: subnet = self.core_plugin.get_subnet(ctx, fixed_ip['subnet_id']) subnets[subnet['ip_version']] = subnet ips[subnet['ip_version']] = fixed_ip['ip_address'] network_details = self.core_plugin.get_network( ctx, os_port['network_id']) if network_details['shared']: _vsdclient.create_usergroup(os_port['tenant_id'], subnet_mapping['net_partition_id']) np_name = _vsdclient.get_net_partition_name_by_id( subnet_mapping['net_partition_id']) data = { 'id': os_port['id'], 'mac': os_port['mac_address'], 'ipv4': ips[4], 'ipv6': ips[6], 'net_partition_id': subnet_mapping['net_partition_id'], 'net_partition_name': np_name, 'nuage_subnet_id': subnet_mapping.get('nuage_subnet_id') } nuage_subnet, _ = self.plugin_driver._get_nuage_subnet( subnet_mapping, subnet_mapping['nuage_subnet_id']) # TODO(gridinv): should we handle shared network resources if nuage_subnet['type'] == p_consts.L2DOMAIN: shared_resource_id = nuage_subnet.get( 'associatedSharedNetworkResourceID') if not subnets[4].get('enable_dhcp'): data['ipv4'] = None data['ipv6'] = None elif ((not nuage_subnet['DHCPManaged']) and (not shared_resource_id)): data['ipv4'] = None data['ipv6'] = None try: _vsdclient.add_subport(trunk_id, port, data) except Exception as ex: LOG.error("Failed to create subport: %s", ex) self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS) updated_ports = self._update_subport_bindings(ctx, trunk_id, subports) if len(subports) != len(updated_ports[trunk_id]): LOG.error("Updated: %(up)s, subports: %(sub)s", { 'up': len(updated_ports[trunk_id]), 'sub': len(subports) }) self.set_trunk_status(ctx, trunk_id, t_consts.DEGRADED_STATUS)
def get_port_available_nuage_floatingips(self, context, filters=None): port_id = filters.pop('for_port')[0] vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id( context.session, port_id) return self._get_available_nuage_floatingips(vsd_mapping, filters)
def get_port_available_nuage_policy_groups(self, context, filters=None): port_id = filters.pop("for_port")[0] vsd_mapping = nuagedb.get_subnet_l2dom_by_port_id(context.session, port_id) vsd_filters = self.osfilters_to_vsdfilters(filters) return self._get_available_nuage_policy_groups(vsd_mapping, vsd_filters)