Beispiel #1
0
    def handle_create(self):
        tenant_id = self.stack.context.tenant_id
        project_obj = self.vnc_lib().project_read(id=str(uuid.UUID(tenant_id)))
        vmi_obj = vnc_api.VirtualMachineInterface(
            name=self.properties[self.NAME], parent_obj=project_obj)
        vmi_obj.set_virtual_machine_interface_mac_addresses(
            vnc_api.MacAddressesType(
                self.properties[self.VIRTUAL_MACHINE_INTEFRACE_MAC_ADDRESSES]))
        for network in self.properties[self.VIRTUAL_NETWORKS]:
            try:
                vn_obj = self.vnc_lib().virtual_network_read(id=network)
            except vnc_api.NoIdError:
                vn_obj = self.vnc_lib().virtual_network_read(
                    fq_name_str=network)
            vmi_obj.add_virtual_network(vn_obj)

        for port_tuple in self.properties[self.PORT_TUPLES]:
            try:
                pt_obj = self.vnc_lib().port_tuple_read(id=port_tuple)
            except vnc_api.NoIdError:
                pt_obj = self.vnc_lib().port_tuple_read(fq_name_str=port_tuple)
            vmi_obj.add_port_tuple(pt_obj)
        vmi_props = vnc_api.VirtualMachineInterfacePropertiesType()
        vmi_props.set_service_interface_type(
            self.properties[self.SERVICE_INTERFACE_TYPE])
        vmi_obj.set_virtual_machine_interface_properties(vmi_props)
        vmi_uuid = super(HeatVirtualMachineInterface,
                         self).resource_create(vmi_obj)

        iip_obj = self._allocate_iip_for_family(vn_obj, pt_obj, vmi_obj, 'v4')
        iip_obj.add_virtual_machine_interface(vmi_obj)
        self.vnc_lib().instance_ip_update(iip_obj)

        self.resource_id_set(vmi_uuid)
Beispiel #2
0
    def _neutron_port_to_vmi(self, port_q, vmi_obj=None, update=False):
        if 'name' in port_q and port_q['name']:
            vmi_obj.display_name = port_q['name']

        device_owner = port_q.get('device_owner')

        if (device_owner not in [constants.DEVICE_OWNER_ROUTER_INTF,
                                 constants.DEVICE_OWNER_ROUTER_GW]
                and 'device_id' in port_q):
            self._set_vm_instance_for_vmi(vmi_obj, port_q.get('device_id'))

        if device_owner is not None:
            vmi_obj.set_virtual_machine_interface_device_owner(device_owner)

        if ('mac_address' in port_q and port_q['mac_address']):
            mac_addrs_obj = vnc_api.MacAddressesType()
            mac_addrs_obj.set_mac_address([port_q['mac_address']])
            vmi_obj.set_virtual_machine_interface_mac_addresses(mac_addrs_obj)

        if 'security_groups' in port_q:
            self._set_vmi_security_groups(vmi_obj,
                                          port_q.get('security_groups'))

        if 'admin_state_up' in port_q:
            id_perms = vmi_obj.get_id_perms()
            id_perms.enable = port_q['admin_state_up']
            vmi_obj.set_id_perms(id_perms)

        if 'extra_dhcp_opts' in port_q:
            self._set_vmi_extra_dhcp_options(vmi_obj,
                                             port_q.get('extra_dhcp_opts'))

        if ('allowed_address_pairs' in port_q):
            self._set_vmi_allowed_addr_pairs(
                vmi_obj, port_q.get('allowed_address_pairs'))

        if 'fixed_ips' in port_q:
            net_id = (port_q.get('network_id') or
                      vmi_obj.get_virtual_network_refs()[0]['uuid'])
            self._check_vmi_fixed_ips(vmi_obj, port_q.get('fixed_ips'), net_id)

        # pick binding keys from neutron repr and persist as kvp elements.
        # it is assumed allowing/denying oper*key is done at neutron-server.
        if not update:
            vmi_binding_kvps = dict((k.replace('binding:',''), v)
                for k,v in port_q.items() if k.startswith('binding:'))
            vmi_obj.set_virtual_machine_interface_bindings(
                vnc_api.KeyValuePairs([vnc_api.KeyValuePair(k,v)
                              for k,v in vmi_binding_kvps.items()]))
        else:
            vmi_binding_kvps = dict((k.replace('binding:',''), v)
                for k,v in port_q.items() if k.startswith('binding:'))
            for k,v in vmi_binding_kvps.items():
                vmi_obj.add_virtual_machine_interface_bindings(
                    vnc_api.KeyValuePair(key=k, value=v))

        return vmi_obj
Beispiel #3
0
 def handle_create(self):
     tenant_id = self.stack.context.tenant_id
     project_obj = self.vnc_lib().project_read(id=str(uuid.UUID(tenant_id)))
     vmi_obj = vnc_api.VirtualMachineInterface(
         name=self.properties[self.NAME], parent_obj=project_obj)
     vmi_obj.set_virtual_machine_interface_mac_addresses(
         vnc_api.MacAddressesType(
             self.properties[self.VIRTUAL_MACHINE_INTEFRACE_MAC_ADDRESSES]))
     for network in self.properties[self.VIRTUAL_NETWORKS]:
         vn_obj = self.vnc_lib().virtual_network_read(id=network)
         vmi_obj.add_virtual_network(vn_obj)
     vmi_uuid = self.vnc_lib().virtual_machine_interface_create(vmi_obj)
     self.resource_id_set(vmi_uuid)
Beispiel #4
0
    def _neutron_port_to_vmi(self, port_q, vmi_obj=None, update=False):
        if 'name' in port_q and port_q['name']:
            vmi_obj.display_name = port_q['name']

        device_owner = port_q.get('device_owner')

        if (device_owner not in [
                n_constants.DEVICE_OWNER_ROUTER_INTF,
                n_constants.DEVICE_OWNER_ROUTER_GW
        ] and 'device_id' in port_q):
            self._set_vm_instance_for_vmi(vmi_obj, port_q.get('device_id'))

        if device_owner is not None:
            vmi_obj.set_virtual_machine_interface_device_owner(device_owner)

        if ('mac_address' in port_q and port_q['mac_address']):
            mac_addrs_obj = vnc_api.MacAddressesType()
            mac_addrs_obj.set_mac_address([port_q['mac_address']])
            vmi_obj.set_virtual_machine_interface_mac_addresses(mac_addrs_obj)

        if 'security_groups' in port_q:
            self._set_vmi_security_groups(vmi_obj,
                                          port_q.get('security_groups'),
                                          update)

        if 'admin_state_up' in port_q:
            id_perms = vmi_obj.get_id_perms()
            id_perms.enable = port_q['admin_state_up']
            vmi_obj.set_id_perms(id_perms)

        if 'extra_dhcp_opts' in port_q:
            self._set_vmi_extra_dhcp_options(vmi_obj,
                                             port_q.get('extra_dhcp_opts'))

        if ('allowed_address_pairs' in port_q):
            self._set_vmi_allowed_addr_pairs(
                vmi_obj, port_q.get('allowed_address_pairs'))

        if 'fixed_ips' in port_q:
            net_id = (port_q.get('network_id')
                      or vmi_obj.get_virtual_network_refs()[0]['uuid'])
            self._check_vmi_fixed_ips(vmi_obj, port_q.get('fixed_ips'), net_id)

        return vmi_obj
Beispiel #5
0
        def __call__(self, obj):
            if not obj:
                raise ValueError("Create called with null object")
            uuid = getattr(obj, 'uuid', None)
            obj._server_conn = self._server_conn
            if not uuid:
                uuid = obj.uuid = str(UUID.uuid4())
            else:
                if self._check_if_uuid_in_use(uuid):
                    raise vnc_exc.RefsExistError('')
            if hasattr(obj, 'parent_type'):
                if obj.parent_type == 'project':
                    parent = self._server_conn.project_read(
                        fq_name=obj.fq_name[:-1])
                else:
                    rc = MockVnc.ReadCallables(
                        obj.parent_type,
                        self._resource_collection[obj.parent_type.replace(
                            "-", "_")], self._resource_collection,
                        self._server_conn)
                    parent = rc(fq_name=obj.fq_name[:-1])
                obj.parent_uuid = parent.uuid

            fq_name_str = getattr(obj, 'fq_name_str', None)
            if not fq_name_str:
                fq_name_str = ":".join(obj.get_fq_name())

            self._resource[uuid] = obj

            for field in obj._pending_field_updates:
                if field.endswith("_refs"):
                    for r in getattr(obj, field):
                        setattr(obj, "processed_" + field,
                                list(getattr(obj, field)))
                        self.update_back_ref(field, getattr(obj, field),
                                             self._resource_type, obj)

            self._pending_ref_updates = self._pending_field_updates = set([])

            if fq_name_str and fq_name_str != uuid:
                if fq_name_str in self._resource:
                    fq_name_str += ("-" + uuid)
                    obj.get_fq_name()[-1] += ('-' + uuid)

                self._resource[fq_name_str] = obj

            if self._resource_type == 'virtual-machine-interface':
                # generate a dummy mac address
                def random_mac():
                    import random
                    mac = [0x00, 0x00, 0x00]
                    for i in range(3, 6):
                        mac.append(random.randint(0x00, 0x7f))

                    return ":".join(map(lambda x: "%02x" % x, mac))

                if not obj.get_virtual_machine_interface_mac_addresses():
                    obj.set_virtual_machine_interface_mac_addresses(
                        vnc_api.MacAddressesType([random_mac()]))
            elif self._resource_type == "instance-ip":
                vn = obj.get_virtual_network_refs()[0]['uuid']
                vn_obj = self._resource_collection['virtual_network'][vn]
                if not obj.get_instance_ip_address():
                    subnet = None
                    if not obj.subnet_uuid:
                        subnet = vn_obj.get_network_ipam_refs(
                        )[0]['attr'].get_ipam_subnets()[0]
                        obj.subnet_uuid = subnet.subnet_uuid
                    else:
                        for ipams in vn_obj.get_network_ipam_refs():
                            for subnet in ipams['attr'].get_ipam_subnets():
                                if subnet.subnet_uuid == obj.subnet_uuid:
                                    break

                    if subnet:
                        subnet_cidr = '%s/%s' % (subnet.subnet.ip_prefix,
                                                 subnet.subnet.ip_prefix_len)

                        cidr_obj = netaddr.IPNetwork(subnet_cidr)
                        if not hasattr(subnet.subnet, 'ip_prefixed'):
                            setattr(subnet.subnet, "ip_prefixed", 0)
                        if (netaddr.IPAddress(
                                subnet.default_gateway).words[-1] == (
                                    subnet.subnet.ip_prefixed + 1)):
                            subnet.subnet.ip_prefixed += 2
                        else:
                            subnet.subnet.ip_prefixed += 1
                        ip_address = str(
                            netaddr.IPAddress(subnet.subnet.ip_prefix) +
                            subnet.subnet.ip_prefixed)
                        if ip_address not in cidr_obj:
                            rc = MockVnc.DeleteCallables(
                                self._resource_type, self._resource,
                                self._resource_collection, self._server_conn)
                            rc(id=uuid)
                            raise vnc_exc.HttpError(status_code=409,
                                                    content='')
                        obj.set_instance_ip_address(ip_address)
                else:
                    for ipams in vn_obj.get_network_ipam_refs():
                        for subnet in ipams['attr'].get_ipam_subnets():
                            if subnet.subnet_uuid == obj.subnet_uuid:
                                break
                    subnet_cidr = '%s/%s' % (subnet.subnet.ip_prefix,
                                             subnet.subnet.ip_prefix_len)
                    if (netaddr.IPAddress(obj.get_instance_ip_address())
                            not in netaddr.IPNetwork(subnet_cidr)):
                        rc = MockVnc.DeleteCallables(self._resource_type,
                                                     self._resource,
                                                     self._resource_collection,
                                                     self._server_conn)
                        rc(id=uuid)
                        raise vnc_exc.HttpError(status_code=400, content="")
            elif self._resource_type == 'security-group':
                if not obj.get_id_perms():
                    obj.set_id_perms(vnc_api.IdPermsType(enable=True))
                proj_obj = self._resource_collection['project'][
                    obj.parent_uuid]
                sgs = getattr(proj_obj, 'security_groups', None)
                sg_ref = {'to': obj.get_fq_name(), 'uuid': obj.uuid}
                if not sgs:
                    setattr(proj_obj, 'security_groups', [sg_ref])
                else:
                    sgs.append(sg_ref)

            elif self._resource_type == 'virtual-network':
                self._mock_add_network_ipam(obj)

            return uuid