Esempio n. 1
0
    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
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
 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)
Esempio n. 5
0
 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'])
Esempio n. 6
0
    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')
Esempio n. 7
0
 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))
Esempio n. 8
0
    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
Esempio n. 9
0
    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