diff options
-rw-r--r-- | .zuul.yaml | 4 | ||||
-rw-r--r-- | nova/compute/manager.py | 3 | ||||
-rw-r--r-- | nova/network/neutron.py | 21 | ||||
-rw-r--r-- | nova/pci/request.py | 4 | ||||
-rw-r--r-- | nova/pci/stats.py | 2 | ||||
-rw-r--r-- | nova/pci/whitelist.py | 2 | ||||
-rw-r--r-- | nova/scheduler/client/report.py | 2 | ||||
-rw-r--r-- | nova/tests/functional/libvirt/test_pci_sriov_servers.py | 25 | ||||
-rw-r--r-- | nova/tests/functional/libvirt/test_power_manage.py | 6 | ||||
-rw-r--r-- | nova/tests/functional/test_servers.py | 38 | ||||
-rw-r--r-- | nova/tests/unit/compute/test_shelve.py | 6 | ||||
-rw-r--r-- | nova/virt/libvirt/cpu/__init__.py | 22 | ||||
-rw-r--r-- | nova/virt/libvirt/driver.py | 6 | ||||
-rw-r--r-- | nova/virt/libvirt/event.py | 7 | ||||
-rw-r--r-- | nova/virt/libvirt/utils.py | 6 | ||||
-rw-r--r-- | releasenotes/notes/port-binding-removed-shelved-offloaded-f1772a64be007b24.yaml | 6 | ||||
-rw-r--r-- | releasenotes/source/2023.1.rst | 6 | ||||
-rw-r--r-- | releasenotes/source/index.rst | 1 | ||||
-rw-r--r-- | releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po | 89 |
19 files changed, 175 insertions, 81 deletions
diff --git a/.zuul.yaml b/.zuul.yaml index 8cad924e1f..abe4d2fa4a 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -757,7 +757,7 @@ irrelevant-files: *policies-irrelevant-files - tempest-integrated-compute-enforce-scope-new-defaults: irrelevant-files: *policies-irrelevant-files - - grenade-skip-level: + - grenade-skip-level-always: irrelevant-files: *policies-irrelevant-files - nova-grenade-multinode: irrelevant-files: *policies-irrelevant-files @@ -794,6 +794,8 @@ irrelevant-files: *policies-irrelevant-files - tempest-integrated-compute-enforce-scope-new-defaults: irrelevant-files: *policies-irrelevant-files + - grenade-skip-level-always: + irrelevant-files: *policies-irrelevant-files - nova-grenade-multinode: irrelevant-files: *policies-irrelevant-files - tempest-ipv6-only: diff --git a/nova/compute/manager.py b/nova/compute/manager.py index efcdece81a..5ea71827fc 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -6874,6 +6874,9 @@ class ComputeManager(manager.Manager): current_power_state = self._get_power_state(instance) network_info = self.network_api.get_instance_nw_info(context, instance) + ports_id = [vif['id'] for vif in network_info] + self.network_api.unbind_ports(context, ports_id, detach=False) + block_device_info = self._get_instance_block_device_info(context, instance, bdms=bdms) diff --git a/nova/network/neutron.py b/nova/network/neutron.py index 27e7d06455..6c9f19f010 100644 --- a/nova/network/neutron.py +++ b/nova/network/neutron.py @@ -612,10 +612,22 @@ class API: raise exception.ExternalNetworkAttachForbidden( network_uuid=net['id']) + def unbind_ports(self, context, ports, detach=True): + """Unbind and detach the given ports by clearing their + device_owner and dns_name. + The device_id will also be cleaned if detach=True. + + :param context: The request context. + :param ports: list of port IDs. + """ + neutron = get_client(context) + self._unbind_ports(context, ports, neutron, detach=detach) + def _unbind_ports(self, context, ports, - neutron, port_client=None): - """Unbind the given ports by clearing their device_id, + neutron, port_client=None, detach=True): + """Unbind and detach the given ports by clearing their device_owner and dns_name. + The device_id will also be cleaned if detach=True. :param context: The request context. :param ports: list of port IDs. @@ -638,11 +650,12 @@ class API: port_req_body: ty.Dict[str, ty.Any] = { 'port': { - 'device_id': '', - 'device_owner': '', constants.BINDING_HOST_ID: None, } } + if detach: + port_req_body['port']['device_id'] = '' + port_req_body['port']['device_owner'] = '' try: port = self._show_port( context, port_id, neutron_client=neutron, diff --git a/nova/pci/request.py b/nova/pci/request.py index 27ada6c045..8ae2385549 100644 --- a/nova/pci/request.py +++ b/nova/pci/request.py @@ -168,7 +168,7 @@ def _get_alias_from_config() -> Alias: def _translate_alias_to_requests( - alias_spec: str, affinity_policy: str = None, + alias_spec: str, affinity_policy: ty.Optional[str] = None, ) -> ty.List['objects.InstancePCIRequest']: """Generate complete pci requests from pci aliases in extra_spec.""" pci_aliases = _get_alias_from_config() @@ -255,7 +255,7 @@ def get_instance_pci_request_from_vif( def get_pci_requests_from_flavor( - flavor: 'objects.Flavor', affinity_policy: str = None, + flavor: 'objects.Flavor', affinity_policy: ty.Optional[str] = None, ) -> 'objects.InstancePCIRequests': """Validate and return PCI requests. diff --git a/nova/pci/stats.py b/nova/pci/stats.py index 5c5f7c669c..c6e4844b34 100644 --- a/nova/pci/stats.py +++ b/nova/pci/stats.py @@ -82,7 +82,7 @@ class PciDeviceStats(object): self, numa_topology: 'objects.NUMATopology', stats: 'objects.PCIDevicePoolList' = None, - dev_filter: whitelist.Whitelist = None, + dev_filter: ty.Optional[whitelist.Whitelist] = None, ) -> None: self.numa_topology = numa_topology self.pools = ( diff --git a/nova/pci/whitelist.py b/nova/pci/whitelist.py index 8862a0ef4f..152cc29ca6 100644 --- a/nova/pci/whitelist.py +++ b/nova/pci/whitelist.py @@ -33,7 +33,7 @@ class Whitelist(object): assignable. """ - def __init__(self, whitelist_spec: str = None) -> None: + def __init__(self, whitelist_spec: ty.Optional[str] = None) -> None: """White list constructor For example, the following json string specifies that devices whose diff --git a/nova/scheduler/client/report.py b/nova/scheduler/client/report.py index 1242752be1..7c14f3d7ef 100644 --- a/nova/scheduler/client/report.py +++ b/nova/scheduler/client/report.py @@ -1047,7 +1047,7 @@ class SchedulerReportClient(object): context: nova_context.RequestContext, rp_uuid: str, traits: ty.Iterable[str], - generation: int = None + generation: ty.Optional[int] = None ): """Replace a provider's traits with those specified. diff --git a/nova/tests/functional/libvirt/test_pci_sriov_servers.py b/nova/tests/functional/libvirt/test_pci_sriov_servers.py index a2e9b4a804..098a0e857b 100644 --- a/nova/tests/functional/libvirt/test_pci_sriov_servers.py +++ b/nova/tests/functional/libvirt/test_pci_sriov_servers.py @@ -1620,10 +1620,7 @@ class VDPAServersTest(_PCIServersWithMigrationTestBase): # to any host but should still be owned by the vm port = self.neutron.show_port(vdpa_port['id'])['port'] self.assertEqual(server['id'], port['device_id']) - # FIXME(sean-k-mooney): we should be unbinding the port from - # the host when we shelve offload but we don't today. - # This is unrelated to vdpa port and is a general issue. - self.assertEqual(hostname, port['binding:host_id']) + self.assertIsNone(port['binding:host_id']) self.assertIn('binding:profile', port) self.assertIsNone(server['OS-EXT-SRV-ATTR:hypervisor_hostname']) self.assertIsNone(server['OS-EXT-SRV-ATTR:host']) @@ -1645,9 +1642,7 @@ class VDPAServersTest(_PCIServersWithMigrationTestBase): self.assertPCIDeviceCounts(hostname, total=num_pci, free=num_pci) self.assertIsNone(server['OS-EXT-SRV-ATTR:hypervisor_hostname']) port = self.neutron.show_port(vdpa_port['id'])['port'] - # FIXME(sean-k-mooney): shelve offload should unbind the port - # self.assertEqual('', port['binding:host_id']) - self.assertEqual(hostname, port['binding:host_id']) + self.assertIsNone(port['binding:host_id']) server = self._unshelve_server(server) self.assertPCIDeviceCounts(hostname, total=num_pci, free=num_pci - 2) @@ -1678,9 +1673,7 @@ class VDPAServersTest(_PCIServersWithMigrationTestBase): self.assertPCIDeviceCounts(source, total=num_pci, free=num_pci) self.assertIsNone(server['OS-EXT-SRV-ATTR:hypervisor_hostname']) port = self.neutron.show_port(vdpa_port['id'])['port'] - # FIXME(sean-k-mooney): shelve should unbind the port - # self.assertEqual('', port['binding:host_id']) - self.assertEqual(source, port['binding:host_id']) + self.assertIsNone(port['binding:host_id']) # force the unshelve to the other host self.api.put_service( @@ -3942,17 +3935,7 @@ class RemoteManagedServersTest(_PCIServersWithMigrationTestBase): port = self.neutron.show_port(uuids.dpu_tunnel_port)['port'] self.assertIn('binding:profile', port) - self.assertEqual( - { - 'pci_vendor_info': '15b3:101e', - 'pci_slot': '0000:82:00.4', - 'physical_network': None, - 'pf_mac_address': '52:54:00:1e:59:02', - 'vf_num': 3, - 'card_serial_number': 'MT0000X00002', - }, - port['binding:profile'], - ) + self.assertEqual({}, port['binding:profile']) def test_suspend(self): self.start_compute() diff --git a/nova/tests/functional/libvirt/test_power_manage.py b/nova/tests/functional/libvirt/test_power_manage.py index fb1ac7d0cd..9f80446bd6 100644 --- a/nova/tests/functional/libvirt/test_power_manage.py +++ b/nova/tests/functional/libvirt/test_power_manage.py @@ -21,7 +21,7 @@ from nova.tests import fixtures as nova_fixtures from nova.tests.fixtures import libvirt as fakelibvirt from nova.tests.functional.libvirt import base from nova.virt import hardware -from nova.virt.libvirt import cpu +from nova.virt.libvirt.cpu import api as cpu_api class PowerManagementTestsBase(base.ServersTestBase): @@ -73,7 +73,7 @@ class PowerManagementTestsBase(base.ServersTestBase): def _assert_cpu_set_state(self, cpu_set, expected='online'): for i in cpu_set: - core = cpu.Core(i) + core = cpu_api.Core(i) if expected == 'online': self.assertTrue(core.online, f'{i} is not online') elif expected == 'offline': @@ -212,7 +212,7 @@ class PowerManagementTestsGovernor(PowerManagementTestsBase): def test_changing_strategy_fails(self): # Arbitratly set a core governor strategy to be performance - cpu.Core(1).set_high_governor() + cpu_api.Core(1).set_high_governor() # and then forget about it while changing the strategy. self.flags(cpu_power_management_strategy='cpu_state', group='libvirt') # This time, this wouldn't be acceptable as some core would have a diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py index 43208aa812..5887c99081 100644 --- a/nova/tests/functional/test_servers.py +++ b/nova/tests/functional/test_servers.py @@ -6526,3 +6526,41 @@ class PortAndFlavorAccelsServerCreateTest(AcceleratorServerBase): binding_profile = neutronapi.get_binding_profile(updated_port) self.assertNotIn('arq_uuid', binding_profile) self.assertNotIn('pci_slot', binding_profile) + + +class PortBindingShelvedServerTest(integrated_helpers._IntegratedTestBase): + """Tests for servers with ports.""" + + compute_driver = 'fake.SmallFakeDriver' + + def setUp(self): + super(PortBindingShelvedServerTest, self).setUp() + self.flavor_id = self._create_flavor( + disk=10, ephemeral=20, swap=5 * 1024) + + def test_shelve_offload_with_port(self): + # Do not wait before offloading + self.flags(shelved_offload_time=0) + + server = self._create_server( + flavor_id=self.flavor_id, + networks=[{'port': self.neutron.port_1['id']}]) + + port = self.neutron.show_port(self.neutron.port_1['id'])['port'] + + # Assert that the port is actually associated to the instance + self.assertEqual(port['device_id'], server['id']) + self.assertEqual(port['binding:host_id'], 'compute') + self.assertEqual(port['binding:status'], 'ACTIVE') + + # Do shelve + server = self._shelve_server(server, 'SHELVED_OFFLOADED') + + # Retrieve the updated port + port = self.neutron.show_port(self.neutron.port_1['id'])['port'] + + # Assert that the port is still associated to the instance + # but the binding is not on the compute anymore + self.assertEqual(port['device_id'], server['id']) + self.assertIsNone(port['binding:host_id']) + self.assertNotIn('binding:status', port) diff --git a/nova/tests/unit/compute/test_shelve.py b/nova/tests/unit/compute/test_shelve.py index f95a722ced..0a1e3f54fc 100644 --- a/nova/tests/unit/compute/test_shelve.py +++ b/nova/tests/unit/compute/test_shelve.py @@ -209,6 +209,7 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): instance = self._shelve_offload(clean_shutdown=False) mock_power_off.assert_called_once_with(instance, 0, 0) + @mock.patch.object(neutron_api.API, 'unbind_ports') @mock.patch.object(compute_utils, 'EventReporter') @mock.patch.object(objects.BlockDeviceMappingList, 'get_by_instance_uuid') @mock.patch.object(nova.compute.manager.ComputeManager, @@ -225,7 +226,7 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): def _shelve_offload(self, mock_notify, mock_notify_instance_usage, mock_get_power_state, mock_update_resource_tracker, mock_delete_alloc, mock_terminate, mock_get_bdms, - mock_event, clean_shutdown=True): + mock_event, mock_unbind_ports, clean_shutdown=True): host = 'fake-mini' instance = self._create_fake_instance_obj(params={'host': host}) instance.task_state = task_states.SHELVING @@ -278,6 +279,9 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): instance.uuid, graceful_exit=False) + mock_unbind_ports.assert_called_once_with( + self.context, mock.ANY, detach=False) + return instance @mock.patch('nova.compute.utils.' diff --git a/nova/virt/libvirt/cpu/__init__.py b/nova/virt/libvirt/cpu/__init__.py index 4410a4e579..e69de29bb2 100644 --- a/nova/virt/libvirt/cpu/__init__.py +++ b/nova/virt/libvirt/cpu/__init__.py @@ -1,22 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from nova.virt.libvirt.cpu import api - - -Core = api.Core - - -power_up = api.power_up -power_down = api.power_down -validate_all_dedicated_cpus = api.validate_all_dedicated_cpus -power_down_all_dedicated_cpus = api.power_down_all_dedicated_cpus diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 510dfdf38f..fe48960296 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -114,7 +114,7 @@ from nova.virt.image import model as imgmodel from nova.virt import images from nova.virt.libvirt import blockinfo from nova.virt.libvirt import config as vconfig -from nova.virt.libvirt import cpu as libvirt_cpu +from nova.virt.libvirt.cpu import api as libvirt_cpu from nova.virt.libvirt import designer from nova.virt.libvirt import event as libvirtevent from nova.virt.libvirt import guest as libvirt_guest @@ -7636,7 +7636,7 @@ class LibvirtDriver(driver.ComputeDriver): instance: 'objects.Instance', power_on: bool = True, pause: bool = False, - post_xml_callback: ty.Callable = None, + post_xml_callback: ty.Optional[ty.Callable] = None, ) -> libvirt_guest.Guest: """Create a Guest from XML. @@ -7697,7 +7697,7 @@ class LibvirtDriver(driver.ComputeDriver): block_device_info: ty.Optional[ty.Dict[str, ty.Any]], power_on: bool = True, vifs_already_plugged: bool = False, - post_xml_callback: ty.Callable = None, + post_xml_callback: ty.Optional[ty.Callable] = None, external_events: ty.Optional[ty.List[ty.Tuple[str, str]]] = None, cleanup_instance_dir: bool = False, cleanup_instance_disks: bool = False, diff --git a/nova/virt/libvirt/event.py b/nova/virt/libvirt/event.py index a7d2a3624f..56951dc11c 100644 --- a/nova/virt/libvirt/event.py +++ b/nova/virt/libvirt/event.py @@ -9,6 +9,8 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. +import typing as ty + from nova.virt import event @@ -22,7 +24,10 @@ class LibvirtEvent(event.InstanceEvent): class DeviceEvent(LibvirtEvent): """Base class for device related libvirt events""" - def __init__(self, uuid: str, dev: str, timestamp: float = None): + def __init__(self, + uuid: str, + dev: str, + timestamp: ty.Optional[float] = None): super().__init__(uuid, timestamp) self.dev = dev diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py index adb2ec45a1..e1298ee5c8 100644 --- a/nova/virt/libvirt/utils.py +++ b/nova/virt/libvirt/utils.py @@ -261,8 +261,8 @@ def copy_image( dest: str, host: ty.Optional[str] = None, receive: bool = False, - on_execute: ty.Callable = None, - on_completion: ty.Callable = None, + on_execute: ty.Optional[ty.Callable] = None, + on_completion: ty.Optional[ty.Callable] = None, compression: bool = True, ) -> None: """Copy a disk image to an existing directory @@ -639,7 +639,7 @@ def mdev_name2uuid(mdev_name: str) -> str: return str(uuid.UUID(mdev_uuid)) -def mdev_uuid2name(mdev_uuid: str, parent: str = None) -> str: +def mdev_uuid2name(mdev_uuid: str, parent: ty.Optional[str] = None) -> str: """Convert an mdev uuid (of the form 8-4-4-4-12) and optionally its parent device to a name (of the form mdev_<uuid_with_underscores>[_<pciid>]). diff --git a/releasenotes/notes/port-binding-removed-shelved-offloaded-f1772a64be007b24.yaml b/releasenotes/notes/port-binding-removed-shelved-offloaded-f1772a64be007b24.yaml new file mode 100644 index 0000000000..7e2dccbbf4 --- /dev/null +++ b/releasenotes/notes/port-binding-removed-shelved-offloaded-f1772a64be007b24.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + [`bug 1983471 <https://bugs.launchpad.net/nova/+bug/1983471>`_] + When offloading a shelved instance, the compute will now remove the + binding so instance ports will appear as "unbound" in neutron. diff --git a/releasenotes/source/2023.1.rst b/releasenotes/source/2023.1.rst new file mode 100644 index 0000000000..d1238479ba --- /dev/null +++ b/releasenotes/source/2023.1.rst @@ -0,0 +1,6 @@ +=========================== +2023.1 Series Release Notes +=========================== + +.. release-notes:: + :branch: stable/2023.1 diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst index 6bff00e25a..ed6f8c2d07 100644 --- a/releasenotes/source/index.rst +++ b/releasenotes/source/index.rst @@ -6,6 +6,7 @@ Nova Release Notes :maxdepth: 1 unreleased + 2023.1 zed yoga xena diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po index d90391af7c..c0bd8bc9a8 100644 --- a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po +++ b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po @@ -2,15 +2,16 @@ # Andi Chandler <andi@gowling.com>, 2018. #zanata # Andi Chandler <andi@gowling.com>, 2020. #zanata # Andi Chandler <andi@gowling.com>, 2022. #zanata +# Andi Chandler <andi@gowling.com>, 2023. #zanata msgid "" msgstr "" "Project-Id-Version: nova\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-09-16 12:59+0000\n" +"POT-Creation-Date: 2023-03-06 19:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2022-09-15 09:04+0000\n" +"PO-Revision-Date: 2023-01-26 10:17+0000\n" "Last-Translator: Andi Chandler <andi@gowling.com>\n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" @@ -382,9 +383,6 @@ msgstr "20.5.0" msgid "20.6.1" msgstr "20.6.1" -msgid "20.6.1-29" -msgstr "20.6.1-29" - msgid "204 NoContent on success" msgstr "204 NoContent on success" @@ -409,9 +407,6 @@ msgstr "21.2.2" msgid "21.2.3" msgstr "21.2.3" -msgid "21.2.4-12" -msgstr "21.2.4-12" - msgid "22.0.0" msgstr "22.0.0" @@ -433,9 +428,6 @@ msgstr "22.3.0" msgid "22.4.0" msgstr "22.4.0" -msgid "22.4.0-6" -msgstr "22.4.0-6" - msgid "23.0.0" msgstr "23.0.0" @@ -451,8 +443,8 @@ msgstr "23.2.0" msgid "23.2.1" msgstr "23.2.1" -msgid "23.2.1-13" -msgstr "23.2.1-13" +msgid "23.2.2" +msgstr "23.2.2" msgid "24.0.0" msgstr "24.0.0" @@ -463,8 +455,8 @@ msgstr "24.1.0" msgid "24.1.1" msgstr "24.1.1" -msgid "24.1.1-7" -msgstr "24.1.1-7" +msgid "24.2.0" +msgstr "24.2.0" msgid "25.0.0" msgstr "25.0.0" @@ -472,8 +464,14 @@ msgstr "25.0.0" msgid "25.0.1" msgstr "25.0.1" -msgid "25.0.1-5" -msgstr "25.0.1-5" +msgid "25.1.0" +msgstr "25.1.0" + +msgid "26.0.0" +msgstr "26.0.0" + +msgid "26.1.0" +msgstr "26.1.0" msgid "400 for unknown param for query param and for request body." msgstr "400 for unknown param for query param and for request body." @@ -488,6 +486,24 @@ msgid "409 Conflict if inventory in use or if some other request concurrently" msgstr "409 Conflict if inventory in use or if some other request concurrently" msgid "" +"A ``--dry-run`` option has been added to the ``nova-manage placement " +"heal_allocations`` CLI which allows running the command to get output " +"without committing any changes to placement." +msgstr "" +"A ``--dry-run`` option has been added to the ``nova-manage placement " +"heal_allocations`` CLI which allows running the command to get output " +"without committing any changes to placement." + +msgid "" +"A ``--force`` flag is provided to skip the above checks but caution should " +"be taken as this could easily lead to the underlying ABI of the instance " +"changing when moving between machine types." +msgstr "" +"A ``--force`` flag is provided to skip the above checks but caution should " +"be taken as this could easily lead to the underlying ABI of the instance " +"changing when moving between machine types." + +msgid "" "A ``default_floating_pool`` configuration option has been added in the " "``[neutron]`` group. The existing ``default_floating_pool`` option in the " "``[DEFAULT]`` group is retained and should be used by nova-network users. " @@ -571,6 +587,24 @@ msgid "Stein Series Release Notes" msgstr "Stein Series Release Notes" msgid "" +"The XenServer configuration option 'iqn_prefix' has been removed. It was not " +"used anywhere and has no effect on any code, so there should be no impact." +msgstr "" +"The XenServer configuration option 'iqn_prefix' has been removed. It was not " +"used anywhere and has no effect on any code, so there should be no impact." + +msgid "" +"The ``api_rate_limit`` configuration option has been removed. The option was " +"disabled by default back in the Havana release since it's effectively broken " +"for more than one API worker. It has been removed because the legacy v2 API " +"code that was using it has also been removed." +msgstr "" +"The ``api_rate_limit`` configuration option has been removed. The option was " +"disabled by default back in the Havana release since it's effectively broken " +"for more than one API worker. It has been removed because the legacy v2 API " +"code that was using it has also been removed." + +msgid "" "The ``nova-manage vm list`` command is deprecated and will be removed in the " "15.0.0 Ocata release. Use the ``nova list`` command from python-novaclient " "instead." @@ -580,6 +614,24 @@ msgstr "" "instead." msgid "" +"The default flavors that nova has previously had are no longer created as " +"part of the first database migration. New deployments will need to create " +"appropriate flavors before first use." +msgstr "" +"The default flavours that Nova previously had are no longer created as part " +"of the first database migration. New deployments will need to create " +"appropriate flavours before first use." + +msgid "" +"The network configuration option 'fake_call' has been removed. It hasn't " +"been used for several cycles, and has no effect on any code, so there should " +"be no impact." +msgstr "" +"The network configuration option 'fake_call' has been removed. It hasn't " +"been used for several cycles, and has no effect on any code, so there should " +"be no impact." + +msgid "" "These commands only work with nova-network which is itself deprecated in " "favor of Neutron." msgstr "" @@ -611,6 +663,9 @@ msgstr "Xena Series Release Notes" msgid "Yoga Series Release Notes" msgstr "Yoga Series Release Notes" +msgid "Zed Series Release Notes" +msgstr "Zed Series Release Notes" + msgid "kernels 3.x: 8" msgstr "kernels 3.x: 8" |