Crteated domain class for projects. 65/37265/3
authorspisarski <s.pisarski@cablelabs.com>
Wed, 12 Jul 2017 14:34:14 +0000 (08:34 -0600)
committerspisarski <s.pisarski@cablelabs.com>
Thu, 13 Jul 2017 13:31:05 +0000 (07:31 -0600)
Created Project domain class so keystone_utils.py functions returning
project objects will not be leaking out implementation details as each
API version can change these data structures and this should all be
handled by the SNAPS keystone utility.

JIRA: SNAPS-114

Change-Id: Id7bce929604278c8228622161eba1838ecd5e067
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
snaps/domain/project.py [new file with mode: 0644]
snaps/domain/test/project_tests.py [new file with mode: 0644]
snaps/openstack/utils/keystone_utils.py
snaps/test_suite_builder.py

diff --git a/snaps/domain/project.py b/snaps/domain/project.py
new file mode 100644 (file)
index 0000000..818645b
--- /dev/null
@@ -0,0 +1,32 @@
+# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
+#                    and others.  All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+class Project:
+    """
+    SNAPS domain object for Projects. Should contain attributes that
+    are shared amongst cloud providers
+    """
+    def __init__(self, name, project_id):
+        """
+        Constructor
+        :param name: the project's name
+        :param project_id: the project's id
+        """
+        self.name = name
+        self.id = project_id
+
+    def __eq__(self, other):
+        return self.name == other.name and self.id == other.id
diff --git a/snaps/domain/test/project_tests.py b/snaps/domain/test/project_tests.py
new file mode 100644 (file)
index 0000000..4056bba
--- /dev/null
@@ -0,0 +1,33 @@
+# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
+#                    and others.  All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+from snaps.domain.project import Project
+
+
+class ProjectDomainObjectTests(unittest.TestCase):
+    """
+    Tests the construction of the snaps.domain.test.Project class
+    """
+
+    def test_construction_positional(self):
+        project = Project('foo', '123-456')
+        self.assertEqual('foo', project.name)
+        self.assertEqual('123-456', project.id)
+
+    def test_construction_named(self):
+        project = Project(project_id='123-456', name='foo')
+        self.assertEqual('foo', project.name)
+        self.assertEqual('123-456', project.id)
index 0a850d3..6812828 100644 (file)
@@ -19,6 +19,7 @@ from keystoneauth1.identity import v3, v2
 from keystoneauth1 import session
 import requests
 
+from snaps.domain.project import Project
 from snaps.domain.user import User
 
 logger = logging.getLogger('keystone_utils')
@@ -119,7 +120,7 @@ def get_project(keystone=None, os_creds=None, project_name=None):
 
     for project in projects:
         if project.name == project_name:
-            return project
+            return Project(name=project.name, project_id=project.id)
 
     return None
 
@@ -129,7 +130,7 @@ def create_project(keystone, project_settings):
     Creates a project
     :param keystone: the Keystone client
     :param project_settings: the project configuration
-    :return:
+    :return: SNAPS-OO Project domain object
     """
     if keystone.version == V2_VERSION:
         return keystone.tenants.create(
@@ -146,12 +147,12 @@ def delete_project(keystone, project):
     """
     Deletes a project
     :param keystone: the Keystone clien
-    :param project: the OpenStack project object
+    :param project: the SNAPS-OO Project domain object
     """
     if keystone.version == V2_VERSION:
-        keystone.tenants.delete(project)
+        keystone.tenants.delete(project.id)
     else:
-        keystone.projects.delete(project)
+        keystone.projects.delete(project.id)
 
 
 def get_os_user(keystone, user):
index 1ab96c1..5c366ab 100644 (file)
@@ -21,6 +21,7 @@ from snaps.domain.test.image_tests import ImageDomainObjectTests
 from snaps.domain.test.keypair_tests import KeypairDomainObjectTests
 from snaps.domain.test.network_tests import (
     SecurityGroupDomainObjectTests,  SecurityGroupRuleDomainObjectTests)
+from snaps.domain.test.project_tests import ProjectDomainObjectTests
 from snaps.domain.test.stack_tests import StackDomainObjectTests
 from snaps.domain.test.user_tests import UserDomainObjectTests
 from snaps.domain.test.vm_inst_tests import (
@@ -115,6 +116,8 @@ def add_unit_tests(suite):
         UserDomainObjectTests))
     suite.addTest(unittest.TestLoader().loadTestsFromTestCase(
         ProjectSettingsUnitTests))
+    suite.addTest(unittest.TestLoader().loadTestsFromTestCase(
+        ProjectDomainObjectTests))
     suite.addTest(unittest.TestLoader().loadTestsFromTestCase(
         NetworkSettingsUnitTests))
     suite.addTest(unittest.TestLoader().loadTestsFromTestCase(