def _build_networks(self, context, server, requested_networks): # TODO(zhenguo): This seems not needed as our scheduler has already # guaranteed this. ports = self.manager.driver.get_ports_from_node(server.node_uuid) if len(requested_networks) > len(ports): raise exception.InterfacePlugException( _("Ironic node: %(id)s virtual to physical interface count" " mismatch" " (Vif count: %(vif_count)d, Pif count: %(pif_count)d)") % { 'id': server.node_uuid, 'vif_count': len(requested_networks), 'pif_count': len(ports) }) nics_obj = objects.ServerNics(context) for vif in requested_networks: try: if vif.get('net_id'): port = self.manager.network_api.create_port( context, vif['net_id'], server.uuid) port_dict = port['port'] elif vif.get('port_id'): port_dict = self.manager.network_api.show_port( context, vif.get('port_id')) nic_dict = { 'port_id': port_dict['id'], 'network_id': port_dict['network_id'], 'mac_address': port_dict['mac_address'], 'fixed_ips': port_dict['fixed_ips'], 'server_uuid': server.uuid } server_nic = objects.ServerNic(context, **nic_dict) nics_obj.objects.append(server_nic) self.manager.driver.plug_vif(server.node_uuid, port_dict['id']) # Get updated VIF info port_dict = self.manager.network_api.show_port( context, port_dict.get('id')) # Update the real physical mac address from ironic. server_nic.mac_address = port_dict['mac_address'] except Exception as e: # Set nics here, so we can clean up the # created networks during reverting. server.nics = nics_obj LOG.error( "Server %(server)s: create or get network " "failed. The reason is %(reason)s", { "server": server.uuid, "reason": e }) raise exception.NetworkError( _("Build network for server failed.")) return nics_obj
def test_delete(self): port_id = self.fake_db_server_nic['port_id'] with mock.patch.object(self.dbapi, 'server_nic_delete', autospec=True) as mock_server_nic_delete: server_nic = objects.ServerNic(self.context, **self.fake_db_server_nic) server_nic.delete(self.context) mock_server_nic_delete.assert_called_once_with( self.context, port_id)
def __init__(self, context=None, **kwargs): server_nics = kwargs.pop('nics', None) if server_nics and isinstance(server_nics, list): nics_obj = objects.ServerNics(context) for nic in server_nics: nic_obj = objects.ServerNic(context, server_uuid=kwargs['uuid'], **nic) nics_obj.objects.append(nic_obj) kwargs['nics'] = nics_obj super(Server, self).__init__(context=context, **kwargs)
def test_save(self): port_id = self.fake_db_server_nic['port_id'] with mock.patch.object(self.dbapi, 'server_nic_update_or_create', autospec=True) as mock_server_nic_update: server_nic = objects.ServerNic(self.context, **self.fake_db_server_nic) server_nic.server_uuid = '123' updates = server_nic.obj_get_changes() server_nic.save(self.context) mock_server_nic_update.return_value = self.fake_db_server_nic mock_server_nic_update.assert_called_once_with( self.context, port_id, updates)
def test_create(self): port_id = self.fake_db_server_nic['port_id'] with mock.patch.object(self.dbapi, 'server_nic_update_or_create', autospec=True) as mock_server_nic_create: mock_server_nic_create.return_value = self.fake_db_server_nic server_nic = objects.ServerNic(self.context, **self.fake_db_server_nic) values = server_nic.obj_get_changes() server_nic.create(self.context) mock_server_nic_create.assert_called_once_with( self.context, port_id, values) self.assertEqual(port_id, server_nic['port_id'])
def attach_interface(self, context, server, net_id, port_id): # prepare port to be attached if port_id: LOG.debug("Attaching port %(port_id)s to server %(server)s", { 'port_id': port_id, 'server': server }) try: vif_port = self.network_api.show_port(context, port_id) except Exception: raise exception.PortNotFound(port_id=port_id) try: self.network_api.check_port_availability(vif_port) self.network_api.bind_port(context, port_id, server) except Exception as e: raise exception.InterfaceAttachFailed(message=six.text_type(e)) preserve_on_delete = True else: LOG.debug( "Attaching network interface %(net_id)s to server " "%(server)s", { 'net_id': net_id, 'server': server }) vif_port = self.network_api.create_port(context, net_id, server.uuid) preserve_on_delete = False try: self.driver.plug_vif(server.node_uuid, vif_port['id']) nics_obj = objects.ServerNics(context) nic_dict = { 'port_id': vif_port['id'], 'network_id': vif_port['network_id'], 'mac_address': vif_port['mac_address'], 'fixed_ips': vif_port['fixed_ips'], 'preserve_on_delete': preserve_on_delete, 'server_uuid': server.uuid } nics_obj.objects.append(objects.ServerNic(context, **nic_dict)) server.nics = nics_obj server.save() except Exception as e: if port_id: self.network_api.unbind_port(context, vif_port) else: self.network_api.delete_port(context, vif_port['id'], server.uuid) raise exception.InterfaceAttachFailed(message=six.text_type(e)) LOG.info('Attaching interface successfully')
def attach_interface(self, context, server, net_id=None): try: vif = self.network_api.create_port(context, net_id, server.uuid) vif_port = vif['port'] self.driver.plug_vif(server.node_uuid, vif_port['id']) nics_obj = objects.ServerNics(context) nic_dict = {'port_id': vif_port['id'], 'network_id': vif_port['network_id'], 'mac_address': vif_port['mac_address'], 'fixed_ips': vif_port['fixed_ips'], 'server_uuid': server.uuid} nics_obj.objects.append(objects.ServerNic( context, **nic_dict)) server.nics = nics_obj server.save() except Exception as e: raise exception.InterfaceAttachFailed(message=six.text_type(e))
def _build_networks(self, context, server, requested_networks): ports = self.manager.driver.get_portgroups_and_ports(server.node_uuid) if len(requested_networks) > len(ports): raise exception.InterfacePlugException( _("Ironic node: %(id)s virtual to physical interface count" " mismatch" " (Vif count: %(vif_count)d, Pif count: %(pif_count)d)") % { 'id': server.node_uuid, 'vif_count': len(requested_networks), 'pif_count': len(ports) }) nics_obj = objects.ServerNics(context) for vif in requested_networks: try: if vif.get('net_id'): port = self.manager.network_api.create_port( context, vif['net_id'], server.uuid) preserve_on_delete = False elif vif.get('port_id'): port = self.manager.network_api.show_port( context, vif.get('port_id')) self.manager.network_api.check_port_availability(port) self.manager.network_api.bind_port(context, port['id'], server) preserve_on_delete = True nic_dict = { 'port_id': port['id'], 'network_id': port['network_id'], 'mac_address': port['mac_address'], 'fixed_ips': port['fixed_ips'], 'preserve_on_delete': preserve_on_delete, 'server_uuid': server.uuid } server_nic = objects.ServerNic(context, **nic_dict) nics_obj.objects.append(server_nic) self.manager.driver.plug_vif(server.node_uuid, port['id']) # Get updated VIF info port_dict = self.manager.network_api.show_port( context, port.get('id')) # Update the real physical mac address from ironic. server_nic.mac_address = port_dict['mac_address'] except Exception as e: # Set nics here, so we can clean up the # created networks during reverting. server.nics = nics_obj LOG.error( "Server %(server)s: create or get network " "failed. The reason is %(reason)s", { "server": server.uuid, "reason": e }) raise exception.NetworkError( _("Build network for server failed.")) return nics_obj
def _manage_server(self, context, server, node): # Create the rp resource_class = sched_utils.ensure_resource_class_name( node['resource_class']) inventory = self.driver.get_node_inventory(node) inventory_data = {resource_class: inventory} # TODO(liusheng) need to ensure the inventory being rollback if # putting allocations failed. self.scheduler_client.set_inventory_for_provider( node['uuid'], node['name'] or node['uuid'], inventory_data, resource_class) # Allocate the resource self.scheduler_client.reportclient.put_allocations( node['uuid'], server.uuid, {resource_class: 1}, server.project_id, server.user_id) LOG.info( "Starting to manage bare metal node %(node_uuid)s for " "server %(uuid)s", { "node_uuid": node['uuid'], "uuid": server.uuid }) nics_obj = objects.ServerNics(context) # Check networks all_ports = node['ports'] + node['portgroups'] for vif in all_ports: neutron_port_id = vif['neutron_port_id'] if neutron_port_id is not None: port_dict = self.network_api.show_port(context, neutron_port_id) nic_dict = { 'port_id': port_dict['id'], 'network_id': port_dict['network_id'], 'mac_address': port_dict['mac_address'], 'fixed_ips': port_dict['fixed_ips'], 'preserve_on_delete': False, 'server_uuid': server.uuid } # Check if the neutron port's mac address matches the port # address of bare metal nics. if nic_dict['mac_address'] != vif['address']: msg = (_("The address of neutron port %(port_id)s is " "%(address)s, but the nic address of bare metal " "node %(node_uuid)s is %(nic_address)s.") % { "port_id": nic_dict['port_id'], "address": nic_dict['mac_address'], "node_uuid": node['uuid'], "nic_address": vif['address'] }) raise exception.NetworkError(msg) self.network_api.bind_port(context, neutron_port_id, server) server_nic = objects.ServerNic(context, **nic_dict) nics_obj.objects.append(server_nic) # Manage the bare metal node self.driver.manage(server, node['uuid']) image_uuid = node.get('image_source') if not uuidutils.is_uuid_like(image_uuid): image_uuid = None # Set the server information server.image_uuid = image_uuid server.node_uuid = node['uuid'] server.node = node['name'] server.nics = nics_obj server.power_state = node['power_state'] server.launched_at = timeutils.utcnow() server.status = states.ACTIVE server.system_metadata = {"managed_server": "True"} if server.power_state == states.POWER_OFF: server.status = states.STOPPED