Added ability to set several quota settings upon project creation. 33/54133/1
authorspisarski <s.pisarski@cablelabs.com>
Mon, 19 Mar 2018 17:54:34 +0000 (11:54 -0600)
committerspisarski <s.pisarski@cablelabs.com>
Mon, 19 Mar 2018 17:54:34 +0000 (11:54 -0600)
JIRA: SNAPS-275

Change-Id: Ibab81e835dddcb666fb3c829857b1c4676b57ed1
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
docs/how-to-use/APITests.rst
snaps/config/project.py
snaps/config/tests/project_tests.py
snaps/openstack/create_project.py
snaps/openstack/tests/create_project_tests.py

index 6239a08..9f46839 100644 (file)
@@ -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  |
 +----------------------------------+---------------+-----------------------------------------------------------+
index 6790609..79c316b 100644 (file)
@@ -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")
index 0470d83..99de4a9 100644 (file)
@@ -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'))
index c20fe5e..ed7e9cd 100644 (file)
@@ -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):
index 41e58fc..1e3a972 100644 (file)
@@ -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