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
예제 #3
0
    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')
예제 #4
0
 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
예제 #6
0
    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")