Restrict server type only to vm/bm
Currently server type can be set to any String, but it should be restricted to only allowed types: vm/bm. vm: virtual machine bm: baremetal With this patch it is restricted only to allowed types. Change-Id: Ifbeff8621b26702e54ad088195fddcb7c35424b2 Closes-Bug: #1622432
This commit is contained in:
parent
888e615bd7
commit
745188b5ef
|
@ -120,8 +120,7 @@ class BayModel(base.APIBase):
|
||||||
public = wsme.wsattr(types.boolean, default=False)
|
public = wsme.wsattr(types.boolean, default=False)
|
||||||
"""Indicates whether the Baymodel is public or not."""
|
"""Indicates whether the Baymodel is public or not."""
|
||||||
|
|
||||||
server_type = wsme.wsattr(wtypes.StringType(min_length=1,
|
server_type = wsme.wsattr(wtypes.Enum(str, *fields.ServerType.ALL),
|
||||||
max_length=255),
|
|
||||||
default='vm')
|
default='vm')
|
||||||
"""Server type for this bay model"""
|
"""Server type for this bay model"""
|
||||||
|
|
||||||
|
@ -319,6 +318,7 @@ class BayModelsController(base.Controller):
|
||||||
return BayModel.convert_with_links(baymodel)
|
return BayModel.convert_with_links(baymodel)
|
||||||
|
|
||||||
@expose.expose(BayModel, body=BayModel, status_code=201)
|
@expose.expose(BayModel, body=BayModel, status_code=201)
|
||||||
|
@validation.enforce_server_type()
|
||||||
@validation.enforce_network_driver_types_create()
|
@validation.enforce_network_driver_types_create()
|
||||||
@validation.enforce_volume_driver_types_create()
|
@validation.enforce_volume_driver_types_create()
|
||||||
@validation.enforce_volume_storage_size_create()
|
@validation.enforce_volume_storage_size_create()
|
||||||
|
|
|
@ -121,8 +121,7 @@ class ClusterTemplate(base.APIBase):
|
||||||
public = wsme.wsattr(types.boolean, default=False)
|
public = wsme.wsattr(types.boolean, default=False)
|
||||||
"""Indicates whether the ClusterTemplate is public or not."""
|
"""Indicates whether the ClusterTemplate is public or not."""
|
||||||
|
|
||||||
server_type = wsme.wsattr(wtypes.StringType(min_length=1,
|
server_type = wsme.wsattr(wtypes.Enum(str, *fields.ServerType.ALL),
|
||||||
max_length=255),
|
|
||||||
default='vm')
|
default='vm')
|
||||||
"""Server type for this ClusterTemplate """
|
"""Server type for this ClusterTemplate """
|
||||||
|
|
||||||
|
@ -327,6 +326,7 @@ class ClusterTemplatesController(base.Controller):
|
||||||
return ClusterTemplate.convert_with_links(cluster_template)
|
return ClusterTemplate.convert_with_links(cluster_template)
|
||||||
|
|
||||||
@expose.expose(ClusterTemplate, body=ClusterTemplate, status_code=201)
|
@expose.expose(ClusterTemplate, body=ClusterTemplate, status_code=201)
|
||||||
|
@validation.enforce_server_type()
|
||||||
@validation.enforce_network_driver_types_create()
|
@validation.enforce_network_driver_types_create()
|
||||||
@validation.enforce_volume_driver_types_create()
|
@validation.enforce_volume_driver_types_create()
|
||||||
@validation.enforce_volume_storage_size_create()
|
@validation.enforce_volume_storage_size_create()
|
||||||
|
|
|
@ -137,6 +137,21 @@ def _enforce_network_driver_types(cluster_template):
|
||||||
validator.validate_network_driver(cluster_template.network_driver)
|
validator.validate_network_driver(cluster_template.network_driver)
|
||||||
|
|
||||||
|
|
||||||
|
def enforce_server_type():
|
||||||
|
@decorator.decorator
|
||||||
|
def wrapper(func, *args, **kwargs):
|
||||||
|
cluster_template = args[1]
|
||||||
|
_enforce_server_type(cluster_template)
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
def _enforce_server_type(cluster_template):
|
||||||
|
validator = Validator.get_coe_validator(cluster_template.coe)
|
||||||
|
validator.validate_server_type(cluster_template.server_type)
|
||||||
|
|
||||||
|
|
||||||
def enforce_volume_driver_types_create():
|
def enforce_volume_driver_types_create():
|
||||||
@decorator.decorator
|
@decorator.decorator
|
||||||
def wrapper(func, *args, **kwargs):
|
def wrapper(func, *args, **kwargs):
|
||||||
|
@ -261,10 +276,26 @@ class Validator(object):
|
||||||
'supported_volume_driver': '/'.join(
|
'supported_volume_driver': '/'.join(
|
||||||
cls.supported_volume_driver + ['unspecified'])})
|
cls.supported_volume_driver + ['unspecified'])})
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def validate_server_type(cls, server_type):
|
||||||
|
cls._validate_server_type(server_type)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _validate_server_type(cls, server_type):
|
||||||
|
"""Confirm that server type is supported by Magnum for this COE."""
|
||||||
|
if server_type not in cls.supported_server_types:
|
||||||
|
raise exception.InvalidParameterValue(_(
|
||||||
|
'Server type %(server_type)s is not supported, '
|
||||||
|
'expecting a %(supported_server_types)s server type.') % {
|
||||||
|
'server_type': server_type,
|
||||||
|
'supported_server_types': '/'.join(
|
||||||
|
cls.supported_server_types + ['unspecified'])})
|
||||||
|
|
||||||
|
|
||||||
class K8sValidator(Validator):
|
class K8sValidator(Validator):
|
||||||
|
|
||||||
supported_network_drivers = ['flannel']
|
supported_network_drivers = ['flannel']
|
||||||
|
supported_server_types = ['vm', 'bm']
|
||||||
allowed_network_drivers = (
|
allowed_network_drivers = (
|
||||||
cfg.CONF.cluster_template.kubernetes_allowed_network_drivers)
|
cfg.CONF.cluster_template.kubernetes_allowed_network_drivers)
|
||||||
default_network_driver = (
|
default_network_driver = (
|
||||||
|
@ -276,6 +307,7 @@ class K8sValidator(Validator):
|
||||||
class SwarmValidator(Validator):
|
class SwarmValidator(Validator):
|
||||||
|
|
||||||
supported_network_drivers = ['docker', 'flannel']
|
supported_network_drivers = ['docker', 'flannel']
|
||||||
|
supported_server_types = ['vm', 'bm']
|
||||||
allowed_network_drivers = (cfg.CONF.cluster_template.
|
allowed_network_drivers = (cfg.CONF.cluster_template.
|
||||||
swarm_allowed_network_drivers)
|
swarm_allowed_network_drivers)
|
||||||
default_network_driver = (cfg.CONF.cluster_template.
|
default_network_driver = (cfg.CONF.cluster_template.
|
||||||
|
@ -287,6 +319,7 @@ class SwarmValidator(Validator):
|
||||||
class MesosValidator(Validator):
|
class MesosValidator(Validator):
|
||||||
|
|
||||||
supported_network_drivers = ['docker']
|
supported_network_drivers = ['docker']
|
||||||
|
supported_server_types = ['vm', 'bm']
|
||||||
allowed_network_drivers = (cfg.CONF.cluster_template.
|
allowed_network_drivers = (cfg.CONF.cluster_template.
|
||||||
mesos_allowed_network_drivers)
|
mesos_allowed_network_drivers)
|
||||||
default_network_driver = (cfg.CONF.cluster_template.
|
default_network_driver = (cfg.CONF.cluster_template.
|
||||||
|
|
|
@ -83,6 +83,18 @@ class DockerStorageDriver(fields.Enum):
|
||||||
valid_values=DockerStorageDriver.ALL)
|
valid_values=DockerStorageDriver.ALL)
|
||||||
|
|
||||||
|
|
||||||
|
class ServerType(fields.Enum):
|
||||||
|
ALL = (
|
||||||
|
VM, BM,
|
||||||
|
) = (
|
||||||
|
'vm', 'bm',
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(ServerType, self).__init__(
|
||||||
|
valid_values=ServerType.ALL)
|
||||||
|
|
||||||
|
|
||||||
class MagnumServiceState(fields.Enum):
|
class MagnumServiceState(fields.Enum):
|
||||||
ALL = (
|
ALL = (
|
||||||
up, down
|
up, down
|
||||||
|
@ -133,3 +145,7 @@ class ClusterTypeField(fields.BaseEnumField):
|
||||||
|
|
||||||
class DockerStorageDriverField(fields.BaseEnumField):
|
class DockerStorageDriverField(fields.BaseEnumField):
|
||||||
AUTO_TYPE = DockerStorageDriver()
|
AUTO_TYPE = DockerStorageDriver()
|
||||||
|
|
||||||
|
|
||||||
|
class ServerTypeField(fields.BaseEnumField):
|
||||||
|
AUTO_TYPE = ServerType()
|
||||||
|
|
|
@ -350,6 +350,39 @@ class TestValidation(base.BaseTestCase):
|
||||||
volume_driver_type='type',
|
volume_driver_type='type',
|
||||||
assert_raised=True)
|
assert_raised=True)
|
||||||
|
|
||||||
|
def _test_enforce_server_type(
|
||||||
|
self,
|
||||||
|
server_type,
|
||||||
|
coe='kubernetes',
|
||||||
|
assert_raised=False):
|
||||||
|
|
||||||
|
@v.enforce_server_type()
|
||||||
|
def test(self, cluster_template):
|
||||||
|
pass
|
||||||
|
|
||||||
|
cluster_template = obj_utils.get_test_cluster_template(
|
||||||
|
{}, name='test_cluster_template', coe=coe,
|
||||||
|
server_type=server_type)
|
||||||
|
|
||||||
|
if assert_raised:
|
||||||
|
self.assertRaises(exception.InvalidParameterValue,
|
||||||
|
test, self, cluster_template)
|
||||||
|
else:
|
||||||
|
test(self, cluster_template)
|
||||||
|
|
||||||
|
def test_enforce_server_type_valid_vm(self):
|
||||||
|
self._test_enforce_server_type(
|
||||||
|
server_type='vm')
|
||||||
|
|
||||||
|
def test_enforce_server_type_valid_bm(self):
|
||||||
|
self._test_enforce_server_type(
|
||||||
|
server_type='bm')
|
||||||
|
|
||||||
|
def test_enforce_server_type_invalid(self):
|
||||||
|
self._test_enforce_server_type(
|
||||||
|
server_type='invalid',
|
||||||
|
assert_raised=True)
|
||||||
|
|
||||||
@mock.patch('pecan.request')
|
@mock.patch('pecan.request')
|
||||||
@mock.patch('magnum.api.utils.get_resource')
|
@mock.patch('magnum.api.utils.get_resource')
|
||||||
def _test_enforce_volume_driver_types_update(
|
def _test_enforce_volume_driver_types_update(
|
||||||
|
|
|
@ -107,3 +107,22 @@ class TestMagnumServiceBinary(test_fields.TestField):
|
||||||
|
|
||||||
def test_stringify_invalid(self):
|
def test_stringify_invalid(self):
|
||||||
self.assertRaises(ValueError, self.field.stringify, 'invalid')
|
self.assertRaises(ValueError, self.field.stringify, 'invalid')
|
||||||
|
|
||||||
|
|
||||||
|
class TestServerType(test_fields.TestField):
|
||||||
|
def setUp(self):
|
||||||
|
super(TestServerType, self).setUp()
|
||||||
|
self.field = fields.ServerTypeField()
|
||||||
|
self.coerce_good_values = [('vm', 'vm'),
|
||||||
|
('bm', 'bm'), ]
|
||||||
|
self.coerce_bad_values = ['invalid']
|
||||||
|
|
||||||
|
self.to_primitive_values = self.coerce_good_values[0:1]
|
||||||
|
self.from_primitive_values = self.coerce_good_values[0:1]
|
||||||
|
|
||||||
|
def test_stringify(self):
|
||||||
|
self.assertEqual("'vm'",
|
||||||
|
self.field.stringify('vm'))
|
||||||
|
|
||||||
|
def test_stringify_invalid(self):
|
||||||
|
self.assertRaises(ValueError, self.field.stringify, 'invalid')
|
||||||
|
|
Loading…
Reference in New Issue