Merge "Expose instance reservation affinity support"

This commit is contained in:
Zuul 2019-03-18 14:04:57 +00:00 committed by Gerrit Code Review
commit 8192ac8f06
5 changed files with 72 additions and 30 deletions

View File

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

View File

@ -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'])

View File

@ -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':

View File

@ -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 <image> --network <network> --hint group=ba03ebb4-e55c-4da4-9d39-87e13354f3b7 <server-name>
openstack server create --flavor db83d6fd-c69c-4259-92cf-012db2e55a58 --image <image> --network <network> <server-name>
..

View File

@ -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.