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