diff --git a/blazar/db/migration/alembic_migrations/versions/9593f3656974_no_affinity_instance_reservation.py b/blazar/db/migration/alembic_migrations/versions/9593f3656974_no_affinity_instance_reservation.py new file mode 100755 index 00000000..32156b9e --- /dev/null +++ b/blazar/db/migration/alembic_migrations/versions/9593f3656974_no_affinity_instance_reservation.py @@ -0,0 +1,44 @@ +# Copyright 2018 OpenStack Foundation. +# +# 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. + +"""no affinity instance reservation + +Revision ID: 9593f3656974 +Revises: 35b314cd39ee +Create Date: 2018-12-26 15:55:29.950250 + +""" + +# revision identifiers, used by Alembic. +revision = '9593f3656974' +down_revision = '35b314cd39ee' + +from alembic import op +from sqlalchemy.dialects import mysql + + +def upgrade(): + op.alter_column('instance_reservations', 'affinity', + existing_type=mysql.TINYINT(display_width=1), + nullable=True) + + +def downgrade(): + # TODO(tetsuro): Since the Kilo release, OpenStack doesn't support + # database downgrades, we should delete this, update the related + # Blazar documents, and issue a reno in a followup. + op.alter_column('instance_reservations', 'affinity', + existing_type=mysql.TINYINT(display_width=1), + nullable=False) diff --git a/blazar/plugins/instances/instance_plugin.py b/blazar/plugins/instances/instance_plugin.py index 62e073ec..1092307e 100644 --- a/blazar/plugins/instances/instance_plugin.py +++ b/blazar/plugins/instances/instance_plugin.py @@ -61,15 +61,6 @@ class VirtualInstancePlugin(base.BasePlugin, nova.NovaClientWrapper): self.monitor.register_healing_handler(self.heal_reservations) self.placement_client = placement.BlazarPlacementClient() - # TODO(tetsuro) Remove this with a release note when all the support - # for True/None affinity is ready - def _check_affinity(self, affinity): - # TODO(masahito) the instance reservation plugin only supports - # anti-affinity rule in short-term goal. - if bool_from_string(affinity): - raise mgr_exceptions.MalformedParameter( - param='affinity (only affinity = False is supported)') - def filter_hosts_by_reservation(self, hosts, start_date, end_date, excludes): free = [] @@ -401,8 +392,6 @@ class VirtualInstancePlugin(base.BasePlugin, nova.NovaClientWrapper): def reserve_resource(self, reservation_id, values): self.validate_reservation_param(values) - self._check_affinity(values['affinity']) - hosts = self.pickup_hosts(reservation_id, values) instance_reservation_val = { @@ -468,8 +457,6 @@ class VirtualInstancePlugin(base.BasePlugin, nova.NovaClientWrapper): - If an instance reservation has already started - only amount is increasable. """ - affinity = new_values.get('affinity', None) - self._check_affinity(affinity) reservation = db_api.reservation_get(reservation_id) lease = db_api.lease_get(reservation['lease_id']) diff --git a/blazar/tests/plugins/instances/test_instance_plugin.py b/blazar/tests/plugins/instances/test_instance_plugin.py index 563a5cc6..68edae2f 100644 --- a/blazar/tests/plugins/instances/test_instance_plugin.py +++ b/blazar/tests/plugins/instances/test_instance_plugin.py @@ -139,16 +139,6 @@ class TestVirtualInstancePlugin(tests.TestCase): 'server_group_id': 2, 'aggregate_id': 3}) - def test_error_with_affinity(self): - plugin = instance_plugin.VirtualInstancePlugin() - inputs = self.get_input_values(2, 4018, 10, 1, True, - '2030-01-01 08:00', '2030-01-01 08:00', - 'lease-1', '') - self.assertRaises(mgr_exceptions.MalformedParameter, - plugin.reserve_resource, 'reservation_id', inputs) - self.assertRaises(mgr_exceptions.MalformedParameter, - plugin.update_reservation, 'reservation_id', inputs) - def test_filter_hosts_by_reservation_with_exclude(self): def fake_get_reservation_by_host(host_id, start, end): if host_id == 'host-1': diff --git a/doc/source/cli/instance-reservation.rst b/doc/source/cli/instance-reservation.rst index cbb99477..f002c7d7 100644 --- a/doc/source/cli/instance-reservation.rst +++ b/doc/source/cli/instance-reservation.rst @@ -13,9 +13,6 @@ The following packages should be installed: The following four scheduler filters should be configured in nova.conf: -* AggregateInstanceExtraSpecsFilter -* AggregateMultiTenancyIsolation -* ServerGroupAffinityFilter * BlazarFilter 1. Add hosts into the freepool @@ -56,7 +53,7 @@ Result: .. sourcecode:: console - blazar lease-create --reservation resource_type=virtual:instance,vcpus=1,memory_mb=1024,disk_gb=20,amount=1,affinity=False --start-date "2020-07-24 20:00" --end-date "2020-08-09 21:00" lease-1 + blazar lease-create --reservation resource_type=virtual:instance,vcpus=1,memory_mb=1024,disk_gb=20,amount=1 --start-date "2020-07-24 20:00" --end-date "2020-08-09 21:00" lease-1 .. @@ -84,7 +81,7 @@ Result: | project_id | 6f6f9b596d47441294eb40f565063833 | | reservations | {"status": "pending", "memory_mb": 1024, "lease_id": "becf2f3b-0177-4c0f-a7e7-0123370849a3", "disk_gb": 20, | | | "resource_id": "061198b0-53e4-4545-9d85-405ca93a7bdf", "created_at": "2017-07-31 07:55:59", "updated_at": "2017-07-31 | - | | 07:55:59", "aggregate_id": 3, "server_group_id": "ba03ebb4-e55c-4da4-9d39-87e13354f3b7", "amount": 1, "affinity": false, | + | | 07:55:59", "aggregate_id": 3, "server_group_id": "ba03ebb4-e55c-4da4-9d39-87e13354f3b7", "amount": 1, "affinity": null, | | | "flavor_id": "db83d6fd-c69c-4259-92cf-012db2e55a58", "id": "db83d6fd-c69c-4259-92cf-012db2e55a58", "vcpus": 1, | | | "resource_type": "virtual:instance"} | | start_date | 2020-07-24T20:00:00.000000 | @@ -150,10 +147,10 @@ Result: .. -1. Create a server: Please specify the flavor of the reservation and group_id as a scheduler hint. +1. Create a server: Please specify the flavor of the reservation. .. sourcecode:: console - openstack server create --flavor db83d6fd-c69c-4259-92cf-012db2e55a58 --image --network --hint group=ba03ebb4-e55c-4da4-9d39-87e13354f3b7 + openstack server create --flavor db83d6fd-c69c-4259-92cf-012db2e55a58 --image --network .. diff --git a/releasenotes/notes/no-affinity-instance-reservation-d356e33088772ea3.yaml b/releasenotes/notes/no-affinity-instance-reservation-d356e33088772ea3.yaml new file mode 100644 index 00000000..85b3866a --- /dev/null +++ b/releasenotes/notes/no-affinity-instance-reservation-d356e33088772ea3.yaml @@ -0,0 +1,24 @@ +features: + - | + For instance reservation, the reservation parameter ``affinity`` now + supports ``True`` and ``None`` and defaults to ``None`` + + - ``affinity = True`` + + * Blazar picks up the same host for the instances for the reservation. + Using the reservation flavor, users don't need to set additional + specs such as "server_group" to schedule the instances to the host. + + - ``affinity = False`` + + * Blazar picks up different hosts for the instances for the + reservation. Using the reservation flavor, users don't need to set + additional specs such as "server_group" to schedule to the hosts. + + - ``affinity = None`` (default) + + * The picked up hosts can be different or same. + + ``AggregateInstanceExtraSpecsFilter``, ``AggregateMultiTenancyIsolation``, + or ``ServerGroupAffinityFilte`` is not needed any more for blazar's + instance reservation.