Resource class set (v1.7)

Change-Id: I449ee4574091c9f5babe0b31d8a771a086d7bc1c
Partially-Implements: blueprint placement-osc-plugin-rocky
This commit is contained in:
Andrey Volkov 2017-10-23 12:53:53 +03:00 committed by Matt Riedemann
parent 7882ed33f3
commit d839cd9dc5
6 changed files with 69 additions and 3 deletions

View File

@ -67,6 +67,35 @@ class CreateResourceClass(command.Command):
http.request('POST', BASE_URL, json={'name': parsed_args.name})
class SetResourceClass(command.Command):
"""Create or validate the existence of single resource class.
Unlike "resource class create" also succeed if the resource class
already exists, which makes this an idempotent check or create command.
This command requires at least ``--os-placement-api-version 1.7``.
"""
def get_parser(self, prog_name):
parser = super(SetResourceClass, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar='<name>',
help='Name of the resource class'
)
return parser
@version.check(version.ge('1.7'))
def take_action(self, parsed_args):
http = self.app.client_manager.placement
url = BASE_URL + '/' + parsed_args.name
http.request('PUT', url)
class ShowResourceClass(command.ShowOne):
"""Return a representation of the resource class identified by {name}.

View File

@ -188,6 +188,9 @@ class BaseTestCase(base.BaseTestCase):
def resource_class_create(self, name):
return self.openstack('resource class create ' + name)
def resource_class_set(self, name):
return self.openstack('resource class set ' + name)
def resource_class_delete(self, name):
return self.openstack('resource class delete ' + name)

View File

@ -10,9 +10,15 @@
# License for the specific language governing permissions and limitations
# under the License.
import uuid
from osc_placement.tests.functional import base
CUSTOM_RC = 'CUSTOM_GPU_DEVICE_{}'.format(
str(uuid.uuid4()).replace('-', '').upper())
class TestResourceClass(base.BaseTestCase):
VERSION = '1.2'
@ -33,11 +39,11 @@ class TestResourceClass(base.BaseTestCase):
'CUSTOM_GPU.INTEL')
def test_create(self):
self.resource_class_create('CUSTOM_GPU_DEVICE')
self.resource_class_create(CUSTOM_RC)
rcs = self.resource_class_list()
names = [rc['name'] for rc in rcs]
self.assertIn('CUSTOM_GPU_DEVICE', names)
self.resource_class_delete('CUSTOM_GPU_DEVICE')
self.assertIn(CUSTOM_RC, names)
self.resource_class_delete(CUSTOM_RC)
def test_fail_show_if_unknown_class(self):
self.assertCommandFailed('No such resource class',
@ -54,3 +60,18 @@ class TestResourceClass(base.BaseTestCase):
def test_fail_delete_standard_class(self):
self.assertCommandFailed('Cannot delete standard resource class',
self.resource_class_delete, 'VCPU')
class TestResourceClass17(base.BaseTestCase):
VERSION = '1.7'
def test_set_resource_class(self):
self.resource_class_create(CUSTOM_RC)
self.resource_class_set(CUSTOM_RC)
self.resource_class_set(CUSTOM_RC + '1')
rcs = self.resource_class_list()
names = [rc['name'] for rc in rcs]
self.assertIn(CUSTOM_RC, names)
self.assertIn(CUSTOM_RC + '1', names)
self.resource_class_delete(CUSTOM_RC)
self.resource_class_delete(CUSTOM_RC + '1')

View File

@ -22,6 +22,7 @@ SUPPORTED_VERSIONS = [
'1.4',
'1.5',
'1.6',
'1.7',
]

View File

@ -0,0 +1,11 @@
---
features:
- |
The ``openstack resource class set {name}`` command has been added which
requires ``--os-placement-api-version 1.7``. This command is similar to
``openstack resource class create`` except it is idempotent if the resource
class already exists.
See the `command documentation`__ for more details.
.. __: https://docs.openstack.org/osc-placement/latest/cli/index.html#resource-class-set

View File

@ -45,6 +45,7 @@ openstack.placement.v1 =
resource_provider_aggregate_set = osc_placement.resources.aggregate:SetAggregate
resource_class_list = osc_placement.resources.resource_class:ListResourceClass
resource_class_create = osc_placement.resources.resource_class:CreateResourceClass
resource_class_set = osc_placement.resources.resource_class:SetResourceClass
resource_class_show = osc_placement.resources.resource_class:ShowResourceClass
resource_class_delete = osc_placement.resources.resource_class:DeleteResourceClass
trait_list = osc_placement.resources.trait:ListTrait