From cbd9af45e80c9e1922cb2046bd9b5737d4d51abb Mon Sep 17 00:00:00 2001 From: spisarski Date: Mon, 19 Mar 2018 11:54:34 -0600 Subject: Added ability to set several quota settings upon project creation. JIRA: SNAPS-275 Change-Id: Ibab81e835dddcb666fb3c829857b1c4676b57ed1 Signed-off-by: spisarski --- docs/how-to-use/APITests.rst | 3 +++ snaps/config/project.py | 3 +++ snaps/config/tests/project_tests.py | 32 +++++++++++++++++++++++++-- snaps/openstack/create_project.py | 23 +++++++++++++++++++ snaps/openstack/tests/create_project_tests.py | 32 +++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) diff --git a/docs/how-to-use/APITests.rst b/docs/how-to-use/APITests.rst index 6239a08..9f46839 100644 --- a/docs/how-to-use/APITests.rst +++ b/docs/how-to-use/APITests.rst @@ -104,6 +104,9 @@ create_project_tests.py - CreateProjectSuccessTests | test_create_project | 2 & 3 | Tests the creation of a project via the OpenStackProject | | | | class | +----------------------------------+---------------+-----------------------------------------------------------+ +| test_create_project_quota | 2 & 3 | Tests the creation of a project via the OpenStackProject | +| _override | | class with overriding the default quota values | ++----------------------------------+---------------+-----------------------------------------------------------+ | test_create_project_2x | 2 & 3 | Tests the creation of a project a second time via the | | | | OpenStackProject class to ensure it is only created once | +----------------------------------+---------------+-----------------------------------------------------------+ diff --git a/snaps/config/project.py b/snaps/config/project.py index 6790609..79c316b 100644 --- a/snaps/config/project.py +++ b/snaps/config/project.py @@ -32,6 +32,7 @@ class ProjectConfig(object): :param users: list of users to associate project to (optional) :param enabled: denotes whether or not the project is enabled (default True) + :param quotas: quota values to override (optional) """ self.name = kwargs.get('name') @@ -46,6 +47,8 @@ class ProjectConfig(object): self.users = kwargs.get('users', list()) + self.quotas = kwargs.get('quotas') + if not self.name: raise ProjectConfigError( "The attribute name is required for ProjectConfig") diff --git a/snaps/config/tests/project_tests.py b/snaps/config/tests/project_tests.py index 0470d83..99de4a9 100644 --- a/snaps/config/tests/project_tests.py +++ b/snaps/config/tests/project_tests.py @@ -37,6 +37,7 @@ class ProjectConfigUnitTests(unittest.TestCase): self.assertIsNone(settings.description) self.assertTrue(settings.enabled) self.assertEqual(list(), settings.users) + self.assertIsNone(settings.quotas) def test_config_with_name_only(self): settings = ProjectConfig(**{'name': 'foo'}) @@ -45,25 +46,52 @@ class ProjectConfigUnitTests(unittest.TestCase): self.assertIsNone(settings.description) self.assertTrue(settings.enabled) self.assertEqual(list(), settings.users) + self.assertIsNone(settings.quotas) def test_all(self): users = ['test1', 'test2'] + quotas = { + 'cores': 4, 'instances': 5, 'injected_files': 6, + 'injected_file_content_bytes': 60000, 'ram': 70000, 'fixed_ips': 7, + 'key_pairs': 8} settings = ProjectConfig( name='foo', domain='bar', description='foobar', enabled=False, - users=users) + users=users, quotas=quotas) self.assertEqual('foo', settings.name) self.assertEqual('bar', settings.domain_name) self.assertEqual('foobar', settings.description) self.assertFalse(settings.enabled) self.assertEqual(users, settings.users) + self.assertIsNotNone(settings.quotas) + self.assertEquals(4, settings.quotas.get('cores')) + self.assertEquals(5, settings.quotas.get('instances')) + self.assertEquals(6, settings.quotas.get('injected_files')) + self.assertEquals( + 60000, settings.quotas.get('injected_file_content_bytes')) + self.assertEquals(70000, settings.quotas.get('ram')) + self.assertEquals(7, settings.quotas.get('fixed_ips')) + self.assertEquals(8, settings.quotas.get('key_pairs')) def test_config_all(self): users = ['test1', 'test2'] settings = ProjectConfig( **{'name': 'foo', 'domain': 'bar', 'description': 'foobar', - 'enabled': False, 'users': users}) + 'enabled': False, 'users': users, + 'quotas': { + 'cores': 4, 'instances': 5, 'injected_files': 6, + 'injected_file_content_bytes': 60000, 'ram': 70000, + 'fixed_ips': 7, 'key_pairs': 8}}) self.assertEqual('foo', settings.name) self.assertEqual('bar', settings.domain_name) self.assertEqual('foobar', settings.description) self.assertFalse(settings.enabled) self.assertEqual(users, settings.users) + self.assertIsNotNone(settings.quotas) + self.assertEquals(4, settings.quotas.get('cores')) + self.assertEquals(5, settings.quotas.get('instances')) + self.assertEquals(6, settings.quotas.get('injected_files')) + self.assertEquals( + 60000, settings.quotas.get('injected_file_content_bytes')) + self.assertEquals(70000, settings.quotas.get('ram')) + self.assertEquals(7, settings.quotas.get('fixed_ips')) + self.assertEquals(8, settings.quotas.get('key_pairs')) diff --git a/snaps/openstack/create_project.py b/snaps/openstack/create_project.py index c20fe5e..ed7e9cd 100644 --- a/snaps/openstack/create_project.py +++ b/snaps/openstack/create_project.py @@ -74,6 +74,29 @@ class OpenStackProject(OpenStackIdentityObject): logger.warn('Unable to associate user %s due to %s', user.name, e) + if self.project_settings.quotas: + quota_dict = self.project_settings.quotas + nova = nova_utils.nova_client(self._os_creds, self._os_session) + quotas = nova_utils.get_compute_quotas(nova, self.__project.id) + if quotas: + if 'cores' in quota_dict: + quotas.cores = quota_dict['cores'] + if 'instances' in quota_dict: + quotas.instances = quota_dict['instances'] + if 'injected_files' in quota_dict: + quotas.injected_files = quota_dict['injected_files'] + if 'injected_file_content_bytes' in quota_dict: + quotas.injected_file_content_bytes = \ + quota_dict['injected_file_content_bytes'] + if 'ram' in quota_dict: + quotas.ram = quota_dict['ram'] + if 'fixed_ips' in quota_dict: + quotas.fixed_ips = quota_dict['fixed_ips'] + if 'key_pairs' in quota_dict: + quotas.key_pairs = quota_dict['key_pairs'] + + nova_utils.update_quotas(nova, self.__project.id, quotas) + return self.__project def clean(self): diff --git a/snaps/openstack/tests/create_project_tests.py b/snaps/openstack/tests/create_project_tests.py index 41e58fc..1e3a972 100644 --- a/snaps/openstack/tests/create_project_tests.py +++ b/snaps/openstack/tests/create_project_tests.py @@ -143,6 +143,38 @@ class CreateProjectSuccessTests(OSComponentTestCase): self.assertTrue(validate_project(self.keystone, self.project_settings, created_project)) + def test_create_project_quota_override(self): + """ + Tests the creation of an OpenStack project with new quotas. + """ + quotas = { + 'cores': 4, 'instances': 5, 'injected_files': 6, + 'injected_file_content_bytes': 60000, 'ram': 70000, 'fixed_ips': 7, + 'key_pairs': 8} + self.project_settings.quotas = quotas + self.project_creator = OpenStackProject(self.os_creds, + self.project_settings) + created_project = self.project_creator.create() + self.assertIsNotNone(created_project) + + retrieved_project = keystone_utils.get_project( + keystone=self.keystone, project_settings=self.project_settings) + self.assertIsNotNone(retrieved_project) + self.assertEqual(created_project, retrieved_project) + self.assertTrue(validate_project(self.keystone, self.project_settings, + created_project)) + + nova = nova_utils.nova_client(self.os_creds, self.os_session) + new_quotas = nova_utils.get_compute_quotas(nova, created_project.id) + + self.assertEqual(4, new_quotas.cores) + self.assertEqual(5, new_quotas.instances) + self.assertEqual(6, new_quotas.injected_files) + self.assertEqual(60000, new_quotas.injected_file_content_bytes) + self.assertEqual(70000, new_quotas.ram) + self.assertEqual(7, new_quotas.fixed_ips) + self.assertEqual(8, new_quotas.key_pairs) + def test_create_project_2x(self): """ Tests the creation of an OpenStack project twice to ensure it only -- cgit 1.2.3-korg