diff --git a/doc/api_samples/os-server-groups/server-groups-get-resp.json b/doc/api_samples/os-server-groups/server-groups-get-resp.json index 53c923f7dbb..f26cc8824e1 100644 --- a/doc/api_samples/os-server-groups/server-groups-get-resp.json +++ b/doc/api_samples/os-server-groups/server-groups-get-resp.json @@ -2,7 +2,7 @@ "server_group": { "id": "5bbcc3c4-1da2-4437-a48a-66f15b1b13f9", "name": "test", - "policies": ["test_policy"], + "policies": ["anti-affinity"], "members": [], "metadata": {} } diff --git a/doc/api_samples/os-server-groups/server-groups-get-resp.xml b/doc/api_samples/os-server-groups/server-groups-get-resp.xml index db8b7712b27..65d7ba23e05 100644 --- a/doc/api_samples/os-server-groups/server-groups-get-resp.xml +++ b/doc/api_samples/os-server-groups/server-groups-get-resp.xml @@ -1,7 +1,7 @@ - test_policy + anti-affinity diff --git a/doc/api_samples/os-server-groups/server-groups-list-resp.json b/doc/api_samples/os-server-groups/server-groups-list-resp.json index 4707b60edcc..6b6c28317da 100644 --- a/doc/api_samples/os-server-groups/server-groups-list-resp.json +++ b/doc/api_samples/os-server-groups/server-groups-list-resp.json @@ -3,7 +3,7 @@ { "id": "616fb98f-46ca-475e-917e-2563e5a8cd19", "name": "test", - "policies": ["test_policy"], + "policies": ["anti-affinity"], "members": [], "metadata": {} } diff --git a/doc/api_samples/os-server-groups/server-groups-list-resp.xml b/doc/api_samples/os-server-groups/server-groups-list-resp.xml index f6fc4870093..0123bb0782b 100644 --- a/doc/api_samples/os-server-groups/server-groups-list-resp.xml +++ b/doc/api_samples/os-server-groups/server-groups-list-resp.xml @@ -2,7 +2,7 @@ - test_policy + anti-affinity diff --git a/doc/api_samples/os-server-groups/server-groups-post-req.json b/doc/api_samples/os-server-groups/server-groups-post-req.json index 211c2a7c0e0..83b3b8e5d70 100644 --- a/doc/api_samples/os-server-groups/server-groups-post-req.json +++ b/doc/api_samples/os-server-groups/server-groups-post-req.json @@ -1,6 +1,6 @@ { "server_group": { "name": "test", - "policies": ["test_policy"] + "policies": ["anti-affinity"] } } diff --git a/doc/api_samples/os-server-groups/server-groups-post-req.xml b/doc/api_samples/os-server-groups/server-groups-post-req.xml index 628585973f7..abe8459549d 100644 --- a/doc/api_samples/os-server-groups/server-groups-post-req.xml +++ b/doc/api_samples/os-server-groups/server-groups-post-req.xml @@ -1,5 +1,5 @@ - test_policy + anti-affinity diff --git a/doc/api_samples/os-server-groups/server-groups-post-resp.json b/doc/api_samples/os-server-groups/server-groups-post-resp.json index 53c923f7dbb..f26cc8824e1 100644 --- a/doc/api_samples/os-server-groups/server-groups-post-resp.json +++ b/doc/api_samples/os-server-groups/server-groups-post-resp.json @@ -2,7 +2,7 @@ "server_group": { "id": "5bbcc3c4-1da2-4437-a48a-66f15b1b13f9", "name": "test", - "policies": ["test_policy"], + "policies": ["anti-affinity"], "members": [], "metadata": {} } diff --git a/doc/api_samples/os-server-groups/server-groups-post-resp.xml b/doc/api_samples/os-server-groups/server-groups-post-resp.xml index db8b7712b27..65d7ba23e05 100644 --- a/doc/api_samples/os-server-groups/server-groups-post-resp.xml +++ b/doc/api_samples/os-server-groups/server-groups-post-resp.xml @@ -1,7 +1,7 @@ - test_policy + anti-affinity diff --git a/nova/api/openstack/compute/contrib/server_groups.py b/nova/api/openstack/compute/contrib/server_groups.py index 2c3d86d3917..8784d8a7796 100644 --- a/nova/api/openstack/compute/contrib/server_groups.py +++ b/nova/api/openstack/compute/contrib/server_groups.py @@ -29,6 +29,7 @@ from nova import utils LOG = logging.getLogger(__name__) +SUPPORTED_POLICIES = ['anti-affinity', 'affinity'] authorize = extensions.extension_authorizer('compute', 'server_groups') @@ -153,6 +154,28 @@ def _format_server_group(self, context, group): server_group['metadata'] = group.metadetails or {} return server_group + def _validate_policies(self, policies): + """Validate the policies. + + Validates that there are no contradicting policies, for example + 'anti-affinity' and 'affinity' in the same group. + :param policies: the given policies of the server_group + """ + if not policies: + return + if ('anti-affinity' in policies and + 'affinity' in policies): + msg = _("Conflicting policies configured!") + raise nova.exception.InvalidInput(reason=msg) + not_supported = [] + for policy in policies: + if policy not in SUPPORTED_POLICIES: + not_supported.append(policy) + + if not_supported: + msg = _("Invalid policies: %s") % ', '.join(not_supported) + raise nova.exception.InvalidInput(reason=msg) + def _validate_input_body(self, body, entity_name): if not self.is_valid_body(body, entity_name): msg = _("the body is invalid.") @@ -160,6 +183,10 @@ def _validate_input_body(self, body, entity_name): subbody = dict(body[entity_name]) + policies = subbody.get('policies') + # Validate that the policies do not contradict one another + self._validate_policies(policies) + expected_fields = ['name', 'policies'] for field in expected_fields: value = subbody.pop(field, None) diff --git a/nova/tests/api/openstack/compute/contrib/test_server_groups.py b/nova/tests/api/openstack/compute/contrib/test_server_groups.py index 1dee4682d91..47290823d6b 100644 --- a/nova/tests/api/openstack/compute/contrib/test_server_groups.py +++ b/nova/tests/api/openstack/compute/contrib/test_server_groups.py @@ -96,7 +96,7 @@ def test_create_server_group_with_no_policies(self): def test_create_server_group_normal(self): req = fakes.HTTPRequest.blank('/v2/fake/os-server-groups') sgroup = server_group_template() - policies = ['test_policy'] + policies = ['anti-affinity'] sgroup['policies'] = policies res_dict = self.controller.create(req, {'server_group': sgroup}) self.assertEqual(res_dict['server_group']['name'], 'test') @@ -122,6 +122,22 @@ def test_create_server_group_with_illegal_name(self): self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create, req, {'server_group': sgroup}) + def test_create_server_group_conflicting_policies(self): + sgroup = server_group_template() + policies = ['anti-affinity', 'affinity'] + sgroup['policies'] = policies + req = fakes.HTTPRequest.blank('/v2/fake/os-server-groups') + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create, + req, {'server_group': sgroup}) + + def test_create_server_group_not_supported(self): + sgroup = server_group_template() + policies = ['storage-affinity', 'anti-affinity', 'rack-affinity'] + sgroup['policies'] = policies + req = fakes.HTTPRequest.blank('/v2/fake/os-server-groups') + self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create, + req, {'server_group': sgroup}) + def test_create_server_group_with_no_body(self): req = fakes.HTTPRequest.blank('/v2/fake/os-server-groups') self.assertRaises(webob.exc.HTTPBadRequest, @@ -135,7 +151,7 @@ def test_create_server_group_with_no_server_group(self): def test_list_server_group_by_tenant(self): groups = [] - policies = ['test_policy'] + policies = ['anti-affinity'] members = ['1', '2'] metadata = {'key1': 'value1'} names = ['default-x', 'test'] @@ -165,7 +181,7 @@ def return_server_groups(context, project_id): def test_list_server_group_all(self): all_groups = [] tenant_groups = [] - policies = ['test_policy'] + policies = ['anti-affinity'] members = ['1', '2'] metadata = {'key1': 'value1'} names = ['default-x', 'test'] diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.json.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.json.tpl index 213464121ce..ba72643b6d8 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.json.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.json.tpl @@ -2,7 +2,7 @@ "server_group": { "id": "%(id)s", "name": "%(name)s", - "policies": ["test_policy"], + "policies": ["anti-affinity"], "members": [], "metadata": {} } diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.xml.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.xml.tpl index 7283e9d0030..dc4651aab7c 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.xml.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-get-resp.xml.tpl @@ -1,7 +1,7 @@ - test_policy + anti-affinity diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.json.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.json.tpl index d55d8c6fa03..f01d451dd24 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.json.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.json.tpl @@ -3,7 +3,7 @@ { "id": "%(id)s", "name": "test", - "policies": ["test_policy"], + "policies": ["anti-affinity"], "members": [], "metadata": {} } diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.xml.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.xml.tpl index ca512db7846..bda75621186 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.xml.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-list-resp.xml.tpl @@ -2,7 +2,7 @@ - test_policy + anti-affinity diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.json.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.json.tpl index 894511e11c9..1cc23283204 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.json.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.json.tpl @@ -1,6 +1,6 @@ { "server_group": { "name": "%(name)s", - "policies": ["test_policy"] + "policies": ["anti-affinity"] } } diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.xml.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.xml.tpl index 628585973f7..abe8459549d 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.xml.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-req.xml.tpl @@ -1,5 +1,5 @@ - test_policy + anti-affinity diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.json.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.json.tpl index a642e9166df..ee9c37e82c1 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.json.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.json.tpl @@ -2,7 +2,7 @@ "server_group": { "id": "%(id)s", "name": "%(name)s", - "policies": ["test_policy"], + "policies": ["anti-affinity"], "members": [], "metadata": {} } diff --git a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.xml.tpl b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.xml.tpl index 7283e9d0030..dc4651aab7c 100644 --- a/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.xml.tpl +++ b/nova/tests/integrated/api_samples/os-server-groups/server-groups-post-resp.xml.tpl @@ -1,7 +1,7 @@ - test_policy + anti-affinity