Increase Cloudify create_server_timeout
[functest.git] / functest / core / tenantnetwork.py
index bf14f41..b118893 100644 (file)
@@ -28,7 +28,6 @@ from xtesting.core import testcase
 
 from functest.utils import config
 from functest.utils import env
-from functest.utils import functest_utils
 
 
 class NewProject(object):
@@ -46,6 +45,9 @@ class NewProject(object):
         self.user = None
         self.password = None
         self.domain = None
+        self.role = None
+        self.role_name = None
+        self.default_member = env.get('NEW_USER_ROLE')
 
     def create(self):
         """Create projects/users"""
@@ -66,12 +68,26 @@ class NewProject(object):
             password=self.password,
             domain_id=self.domain.id)
         self.__logger.debug("user: %s", self.user)
+        try:
+            if self.orig_cloud.get_role(self.default_member):
+                self.role_name = self.default_member
+            elif self.orig_cloud.get_role(self.default_member.lower()):
+                self.role_name = self.default_member.lower()
+            else:
+                raise Exception("Cannot detect {}".format(self.default_member))
+        except Exception:  # pylint: disable=broad-except
+            self.__logger.info("Creating default role %s", self.default_member)
+            self.role = self.orig_cloud.create_role(self.default_member)
+            self.role_name = self.role.name
+            self.__logger.debug("role: %s", self.role)
         self.orig_cloud.grant_role(
-            "Member", user=self.user.id, project=self.project.id,
+            self.role_name, user=self.user.id, project=self.project.id,
             domain=self.domain.id)
         osconfig = os_client_config.config.OpenStackConfig()
         osconfig.cloud_config[
             'clouds']['envvars']['project_name'] = self.project.name
+        osconfig.cloud_config[
+            'clouds']['envvars']['project_id'] = self.project.id
         osconfig.cloud_config['clouds']['envvars']['username'] = self.user.name
         osconfig.cloud_config['clouds']['envvars']['password'] = self.password
         self.__logger.debug("cloud_config %s", osconfig.cloud_config)
@@ -83,10 +99,12 @@ class NewProject(object):
         """Remove projects/users"""
         try:
             assert self.orig_cloud
-            assert self.user.id
-            assert self.project.id
-            self.orig_cloud.delete_user(self.user.id)
-            self.orig_cloud.delete_project(self.project.id)
+            if self.user:
+                self.orig_cloud.delete_user(self.user.id)
+            if self.project:
+                self.orig_cloud.delete_project(self.project.id)
+            if self.role:
+                self.orig_cloud.delete_role(self.role.id)
         except Exception:  # pylint: disable=broad-except
             self.__logger.exception("Cannot clean all ressources")
 
@@ -104,7 +122,8 @@ class TenantNetwork1(testcase.TestCase):
     """
 
     __logger = logging.getLogger(__name__)
-    cidr = '192.168.0.0/24'
+    cidr = '192.168.120.0/24'
+    shared_network = False
 
     def __init__(self, **kwargs):
         if "case_name" not in kwargs:
@@ -120,7 +139,7 @@ class TenantNetwork1(testcase.TestCase):
             self.ext_net = None
             self.__logger.exception("Cannot connect to Cloud")
         try:
-            self.ext_net = functest_utils.get_external_network(self.cloud)
+            self.ext_net = self.get_external_network(self.cloud)
         except Exception:  # pylint: disable=broad-except
             self.__logger.exception("Cannot get the external network")
         self.guid = str(uuid.uuid4())
@@ -128,6 +147,43 @@ class TenantNetwork1(testcase.TestCase):
         self.subnet = None
         self.router = None
 
+    @staticmethod
+    def get_external_network(cloud):
+        """
+        Return the configured external network name or
+        the first retrieved external network name
+        """
+        assert cloud
+        if env.get("EXTERNAL_NETWORK"):
+            network = cloud.get_network(
+                env.get("EXTERNAL_NETWORK"), {"router:external": True})
+            if network:
+                return network
+        networks = cloud.list_networks({"router:external": True})
+        if networks:
+            return networks[0]
+        return None
+
+    @staticmethod
+    def get_default_role(cloud, member="Member"):
+        """Get the default role
+
+        It also tests the role in lowercase to avoid possible conflicts.
+        """
+        role = cloud.get_role(member)
+        if not role:
+            role = cloud.get_role(member.lower())
+        return role
+
+    @staticmethod
+    def get_public_auth_url(cloud):
+        """Get Keystone public endpoint"""
+        keystone_id = cloud.search_services('keystone')[0].id
+        endpoint = cloud.search_endpoints(
+            filters={'interface': 'public',
+                     'service_id': keystone_id})[0].url
+        return endpoint
+
     def _create_network_ressources(self):
         assert self.cloud
         assert self.ext_net
@@ -143,7 +199,8 @@ class TenantNetwork1(testcase.TestCase):
                 config.CONF, '{}_segmentation_id'.format(self.case_name))
         self.network = self.cloud.create_network(
             '{}-net_{}'.format(self.case_name, self.guid),
-            provider=provider)
+            provider=provider,
+            shared=self.shared_network)
         self.__logger.debug("network: %s", self.network)
 
         self.subnet = self.cloud.create_subnet(
@@ -179,10 +236,15 @@ class TenantNetwork1(testcase.TestCase):
     def clean(self):
         try:
             assert self.cloud
-            self.cloud.remove_router_interface(self.router, self.subnet.id)
-            self.cloud.delete_router(self.router.id)
-            self.cloud.delete_subnet(self.subnet.id)
-            self.cloud.delete_network(self.network.id)
+            if self.router:
+                if self.subnet:
+                    self.cloud.remove_router_interface(
+                        self.router, self.subnet.id)
+                self.cloud.delete_router(self.router.id)
+            if self.subnet:
+                self.cloud.delete_subnet(self.subnet.id)
+            if self.network:
+                self.cloud.delete_network(self.network.id)
         except Exception:  # pylint: disable=broad-except
             self.__logger.exception("cannot clean all ressources")