def _get_vmis_nets_ips(self, context, project_ids=None, device_ids=None, vmi_uuids=None, vn_ids=None): vn_list_handler = vn_handler.VNetworkGetHandler(self._vnc_lib) pool = eventlet.GreenPool() vn_objs_t = pool.spawn(vn_list_handler.get_vn_obj_list, parent_id=project_ids, detail=True) vmi_objs_t = None vmi_obj_uuids_t = None back_ref_id = [] if device_ids: back_ref_id = device_ids if vn_ids: back_ref_id.extend(vn_ids) if back_ref_id: vmi_objs_t = pool.spawn(self._resource_list, back_ref_id=back_ref_id, back_refs=True) if vmi_uuids: vmi_obj_uuids_t = pool.spawn(self._resource_list, obj_uuids=vmi_uuids, back_refs=True) elif not back_ref_id: vmi_objs_t = pool.spawn(self._resource_list, parent_id=project_ids, back_refs=True) # if admin no need to filter we can retrieve all the ips object # with only one call if context['is_admin']: iip_list_handler = res_handler.InstanceIpHandler(self._vnc_lib) iip_objs_t = pool.spawn(iip_list_handler.get_iip_obj_list, detail=True) pool.waitall() vn_objs = vn_objs_t._exit_event._result if context['is_admin']: iips_objs = iip_objs_t._exit_event._result else: vn_ids = [vn_obj.uuid for vn_obj in vn_objs] iip_list_handler = res_handler.InstanceIpHandler(self._vnc_lib) iips_objs = iip_list_handler.get_iip_obj_list(back_ref_id=vn_ids, detail=True) vmi_objs = [] if vmi_objs_t is not None: vmi_objs = vmi_objs_t._exit_event._result if vmi_obj_uuids_t is not None: vmi_objs.extend(vmi_obj_uuids_t._exit_event._result) return vmi_objs, vn_objs, iips_objs
def resource_delete(self, context, port_id): try: vmi_obj = self._resource_get(back_refs=True, id=port_id) except vnc_exc.NoIdError: raise self._raise_contrail_exception("PortNotFound", port_id=port_id, resource='port') if vmi_obj.parent_type == 'virtual-machine': instance_id = vmi_obj.parent_uuid else: vm_refs = vmi_obj.get_virtual_machine_refs() if vm_refs: instance_id = vm_refs[0]['uuid'] else: instance_id = None if vmi_obj.get_logical_router_back_refs(): self._raise_contrail_exception('PortInUse', port_id=port_id, net_id=self.get_vmi_net_id(vmi_obj), device_id=instance_id, resource='port') # release instance IP address iip_back_refs = list((getattr(vmi_obj, 'instance_ip_back_refs', []))) ip_handler = res_handler.InstanceIpHandler(self._vnc_lib) for iip_back_ref in iip_back_refs or []: # if name contains IP address then this is shared ip iip_obj = ip_handler.get_iip_obj(id=iip_back_ref['uuid']) # in case of shared ip only delete the link to the VMI iip_obj.del_virtual_machine_interface(vmi_obj) if not iip_obj.get_virtual_machine_interface_refs(): ip_handler._resource_delete(id=iip_back_ref['uuid']) else: ip_handler._resource_update(iip_obj) # disassociate any floating IP used by instance fip_back_refs = getattr(vmi_obj, 'floating_ip_back_refs', None) if fip_back_refs: fip_handler = fip_res_handler.FloatingIpHandler(self._vnc_lib) for fip_back_ref in fip_back_refs: fip_handler.resource_update(context, fip_back_ref['uuid'], {'port_id': None}) self._resource_delete(id=port_id) # delete any interface route table associatd with the port for rt_ref in vmi_obj.get_interface_route_table_refs() or []: try: self._vnc_lib.interface_route_table_delete(id=rt_ref['uuid']) except vnc_exc.NoIdError: pass # delete instance if this was the last port try: if instance_id: self._vnc_lib.virtual_machine_delete(id=instance_id) except vnc_exc.RefsExistError: pass
def _check_vmi_fixed_ips(self, vmi_obj, fixed_ips, net_id): vmi_obj_ips = self._get_vmi_ip_list(vmi_obj) ip_handler = res_handler.InstanceIpHandler(self._vnc_lib) for fixed_ip in fixed_ips or []: ip_addr = fixed_ip.get('ip_address') if not ip_addr or ip_addr in vmi_obj_ips: continue if ip_handler.is_ip_addr_in_net_id(ip_addr, net_id): self._raise_contrail_exception( 'IpAddressInUse', net_id=net_id, ip_address=ip_addr, resource='port')
def _get_vmi_ip_list(self, vmi_obj): ip_back_refs = getattr(vmi_obj, 'instance_ip_back_refs', None) vmi_obj_ips = [] if ip_back_refs: ip_handler = res_handler.InstanceIpHandler(self._vnc_lib) for ip_back_ref in ip_back_refs: try: ip_obj = ip_handler.get_iip_obj(id=ip_back_ref['uuid']) except vnc_exc.NoIdError: continue vmi_obj_ips.append(ip_obj.get_instance_ip_address()) return vmi_obj_ips
def _get_vmis_nets_ips(self, context, project_ids=None, device_ids=None, vmi_uuids=None, vn_ids=None): vn_list_handler = vn_handler.VNetworkGetHandler(self._vnc_lib) pool = eventlet.GreenPool() vn_objs_t = pool.spawn(vn_list_handler.get_vn_obj_list, parent_id=project_ids, detail=True) vmi_objs_t = None vmi_obj_uuids_t = None back_ref_id = [] if device_ids: back_ref_id = device_ids if vn_ids: back_ref_id.extend(vn_ids) if back_ref_id: vmi_objs_t = pool.spawn(self._resource_list, back_ref_id=back_ref_id, back_refs=True) if vmi_uuids: vmi_obj_uuids_t = pool.spawn(self._resource_list, obj_uuids=vmi_uuids, back_refs=True) elif not back_ref_id: vmi_objs_t = pool.spawn(self._resource_list, parent_id=project_ids, back_refs=True) pool.waitall() vn_objs = vn_objs_t._exit_event._result vmi_objs = [] if vmi_objs_t is not None: vmi_objs = vmi_objs_t._exit_event._result or [] if vmi_obj_uuids_t is not None: vmi_objs.extend(vmi_obj_uuids_t._exit_event._result or []) vmis_ids = [vmi.uuid for vmi in vmi_objs] iip_list_handler = res_handler.InstanceIpHandler(self._vnc_lib) iips_objs = iip_list_handler.get_iip_obj_list(back_ref_id=vmis_ids, detail=True) return vmi_objs, vn_objs, iips_objs
def _create_instance_ips(self, vn_obj, vmi_obj, fixed_ips, ip_family="v4"): if fixed_ips is None: return # 1. find existing ips on port # 2. add new ips on port from update body # 3. delete old/stale ips on port subnets = dict() ipam_refs = vn_obj.get_network_ipam_refs() for ipam_ref in ipam_refs or []: subnet_vncs = ipam_ref['attr'].get_ipam_subnets() for subnet_vnc in subnet_vncs: cidr = '%s/%s' % (subnet_vnc.subnet.get_ip_prefix(), subnet_vnc.subnet.get_ip_prefix_len()) subnets[subnet_vnc.subnet_uuid] = cidr stale_ip_ids = {} ip_handler = res_handler.InstanceIpHandler(self._vnc_lib) for iip in getattr(vmi_obj, 'instance_ip_back_refs', []): iip_obj = ip_handler.get_iip_obj(id=iip['uuid']) ip_addr = iip_obj.get_instance_ip_address() stale_ip_ids[ip_addr] = iip['uuid'] created_iip_ids = [] for fixed_ip in fixed_ips: try: ip_addr = fixed_ip.get('ip_address') if ip_addr is not None: try: # this ip survives to next gen del stale_ip_ids[ip_addr] continue except KeyError: pass if netaddr.IPAddress(ip_addr).version == 4: ip_family = "v4" elif netaddr.IPAddress(ip_addr).version == 6: ip_family = "v6" subnet_id = fixed_ip.get('subnet_id') if subnet_id and subnet_id not in subnets: for iip_id in created_iip_ids: ip_handler._resource_delete(id=iip_id) self._raise_contrail_exception( 'BadRequest', msg='Subnet invalid for network', resource='port') ip_family = fixed_ip.get('ip_family', ip_family) ip_id = ip_handler.create_instance_ip(vn_obj, vmi_obj, ip_addr, subnet_id, ip_family) created_iip_ids.append(ip_id) except vnc_exc.HttpError as e: # Resources are not available for iip_id in created_iip_ids: ip_handler._resource_delete(id=iip_id) if e.status_code == 400: if 'subnet_id' in fixed_ip: self._raise_contrail_exception( 'InvalidIpForSubnet', ip_address=fixed_ip.get('ip_address'), resource='port') else: self._raise_contrail_exception( 'InvalidIpForNetwork', ip_address=fixed_ip.get('ip_address'), resource='port') else: self._raise_contrail_exception( 'IpAddressGenerationFailure', net_id=vn_obj.get_uuid(), resource='port') except vnc_exc.PermissionDenied: self._raise_contrail_exception( 'IpAddressInUse', net_id=vn_obj.get_uuid(), ip_address=fixed_ip.get('ip_address'), resource='port') iips_total = list(created_iip_ids) for stale_ip, stale_id in stale_ip_ids.items(): ip_handler.delete_iip_obj(stale_id) if hasattr(cfg.CONF, 'max_fixed_ips_per_port'): if len(iips_total) > cfg.CONF.max_fixed_ips_per_port: for iip_id in iips_total: ip_handler.delete_iip_obj(iip_id) self._raise_contrail_exception( 'BadRequest', msg="IIPS exceeds max limit")