Added VM2VM test between different routers in 2 projects

Added the test:
 VM to VM test in different projects, different networks,
 different routers, measure by Floating IPs (common floating net):

 * a separate project is created, admin user is added to it
 * VMs are in separate projects (admin and newly created),
   separate networks, each project has its own router.
   VMs have access to each other only by the common floating net.
 * VMs are created on the same and different compute nodes.
 * Verification is done via Floating IPs in 1 and multiple threads.

Other enhancements:
* renamed "tenant" variables and values to "project"
* more detailed logging (e.g. in which project resource is created)
* some refactoring
* fixed picking existing spt flavor if any
* check the project is empty before deleting it
* added stderr, stdout in case Internet is absent at VM and iperf
  was not installed

Related-PROD: PROD-36943
Change-Id: I165ed41259336e586ad16ed9eb27ea59619db4c8
diff --git a/fixtures/base.py b/fixtures/base.py
index 721d772..d1434dd 100644
--- a/fixtures/base.py
+++ b/fixtures/base.py
@@ -16,11 +16,11 @@
     return os_client.OfficialClientManager(
         username=os.environ['OS_USERNAME'],
         password=os.environ['OS_PASSWORD'],
-        tenant_name=os.environ['OS_PROJECT_NAME'],
+        project_name=os.environ['OS_PROJECT_NAME'],
         auth_url=os.environ['OS_AUTH_URL'],
         cert=False,
         domain=os.environ['OS_PROJECT_DOMAIN_NAME'],
-        )
+    )
 
 
 nodes = utils.get_pairs()
@@ -34,6 +34,7 @@
 
 @pytest.fixture(scope='session')
 def os_resources(openstack_clients):
+    logger.info("Setting up resources in admin project...")
     os_actions = os_client.OSCliActions(openstack_clients)
     os_resource = {}
     config = utils.get_configuration()
@@ -50,19 +51,16 @@
     if os_images_list.__len__() == 0:
         pytest.skip("No images with name {}. This name can be redefined "
                     "with 'image_name' env var ".format(image_name))
-
     os_resource['image_id'] = str(os_images_list[0])
-
-    os_resource['flavor_id'] = [flavor.id for flavor in
-                                openstack_clients.compute.flavors.list()
-                                if flavor.name == flavor_name]
-    flavor_is_created = False
-    if not os_resource['flavor_id']:
+    flavor_id = os_actions.get_flavor_id_by_name(flavor_name)
+    if flavor_id is None:
+        flavor_is_created = True
         os_resource['flavor_id'] = os_actions.create_flavor(
             flavor_name, flavor_ram, flavor_vcpus, flavor_disk).id
-        flavor_is_created = True
     else:
-        os_resource['flavor_id'] = str(os_resource['flavor_id'][0])
+        flavor_is_created = False
+        logger.info("Flavor {} already exists".format(flavor_name))
+        os_resource['flavor_id'] = flavor_id
 
     os_resource['sec_group'] = os_actions.create_sec_group()
     os_resource['keypair'] = openstack_clients.compute.keypairs.create(
@@ -70,12 +68,12 @@
     )
     os_resource['net1'] = os_actions.create_network_resources()
     os_resource['ext_net'] = os_actions.get_external_network()
-    adm_tenant = os_actions.get_admin_tenant()
+    adm_project = os_actions.get_project_by_name("admin")
     os_resource['router'] = os_actions.create_router(
-        os_resource['ext_net'], adm_tenant.id)
-    os_resource['net2'] = os_actions.create_network(adm_tenant.id)
+        os_resource['ext_net'], adm_project.id)
+    os_resource['net2'] = os_actions.create_network(adm_project.id)
     os_resource['subnet2'] = os_actions.create_subnet(
-        os_resource['net2'], adm_tenant.id, '10.2.7.0/24')
+        os_resource['net2'], adm_project.id, '10.2.7.0/24')
     for subnet in openstack_clients.network.list_subnets()['subnets']:
         if subnet['network_id'] == os_resource['net1']['id']:
             os_resource['subnet1'] = subnet['id']
@@ -88,7 +86,8 @@
     yield os_resource
 
     # cleanup created resources
-    logger.info("Deleting routers, networks, SG, key pair, flavor...")
+    logger.info("Deleting routers, networks, SG, key pair, flavor in {}..."
+                "".format(adm_project.name))
     openstack_clients.network.remove_interface_router(
         os_resource['router']['id'], {'subnet_id': os_resource['subnet1']})
     openstack_clients.network.remove_interface_router(
@@ -109,3 +108,104 @@
         openstack_clients.compute.flavors.delete(os_resource['flavor_id'])
     if os_actions.create_fake_ext_net:
         openstack_clients.network.delete_network(os_resource['ext_net']['id'])
+
+
+@pytest.fixture(scope='session')
+def openstack_alt_clients(openstack_clients):
+    # create alt project with regular admin user
+    tmp_os_actions = os_client.OSCliActions(openstack_clients)
+    alt_project = tmp_os_actions.create_project()
+    tmp_os_actions.add_roles_to_user_in_project(alt_project.id)
+
+    # create a client using alt project with admin user in it
+    return os_client.OfficialClientManager(
+        username=os.environ['OS_USERNAME'],
+        password=os.environ['OS_PASSWORD'],
+        project_name=alt_project.name,
+        auth_url=os.environ['OS_AUTH_URL'],
+        cert=False,
+        domain=os.environ['OS_PROJECT_DOMAIN_NAME'],
+    )
+
+
+@pytest.fixture(scope='session')
+def os_resources_alt_project(openstack_alt_clients):
+    logger.info("Setting up resources in the project {}..."
+                "".format(openstack_alt_clients.project_name))
+    alt_os_actions = os_client.OSCliActions(openstack_alt_clients)
+    os_resource_alt_project = {}
+    config = utils.get_configuration()
+    image_name = config.get('image_name', 'Ubuntu-18.04')
+    flavor_name = config.get('flavor_name', 'spt-test')
+    flavor_ram = config.get('flavor_ram', 1536)
+    flavor_vcpus = config.get('flavor_vcpus', 1)
+    flavor_disk = config.get('flavor_disk', 3)
+    os_images_list = [image.id for image in
+                      openstack_alt_clients.image.images.list(
+                          filters={'name': image_name})]
+
+    if os_images_list.__len__() == 0:
+        pytest.skip("No images with name {}. This name can be redefined "
+                    "with 'image_name' env var ".format(image_name))
+    os_resource_alt_project['image_id'] = str(os_images_list[0])
+
+    flavor_id = alt_os_actions.get_flavor_id_by_name(flavor_name)
+    if flavor_id is None:
+        flavor_is_created = True
+        os_resource_alt_project['flavor_id'] = alt_os_actions.create_flavor(
+            flavor_name, flavor_ram, flavor_vcpus, flavor_disk).id
+    else:
+        flavor_is_created = False
+        logger.info("Flavor {} already exists".format(flavor_name))
+        os_resource_alt_project['flavor_id'] = flavor_id
+
+    os_resource_alt_project['sec_group'] = alt_os_actions.create_sec_group()
+
+    alt_project = alt_os_actions.get_project_by_name(
+        openstack_alt_clients.project_name)
+    os_resource_alt_project['net1'] = alt_os_actions.create_network_resources(
+        project=alt_project.name, cidr='10.3.7.0/24')
+    os_resource_alt_project['ext_net'] = alt_os_actions.get_external_network()
+
+    os_resource_alt_project['router'] = alt_os_actions.create_router(
+        os_resource_alt_project['ext_net'], alt_project.id)
+
+    os_resource_alt_project['subnet1'] = \
+        openstack_alt_clients.network.show_network(
+            os_resource_alt_project['net1']['id'])['network']['subnets'][0]
+    openstack_alt_clients.network.add_interface_router(
+        os_resource_alt_project['router']['id'],
+        {'subnet_id': os_resource_alt_project['subnet1']})
+    yield os_resource_alt_project
+
+    # cleanup created resources
+    logger.info("Deleting routers, networks, SG, flavor in {} "
+                "project...".format(alt_project.name))
+
+    openstack_alt_clients.network.remove_interface_router(
+        os_resource_alt_project['router']['id'],
+        {'subnet_id': os_resource_alt_project['subnet1']})
+    openstack_alt_clients.network.remove_gateway_router(
+        os_resource_alt_project['router']['id'])
+    time.sleep(5)
+    openstack_alt_clients.network.delete_router(
+        os_resource_alt_project['router']['id'])
+    time.sleep(5)
+    openstack_alt_clients.network.delete_network(
+        os_resource_alt_project['net1']['id'])
+
+    openstack_alt_clients.network.delete_security_group(
+        os_resource_alt_project['sec_group']['id'])
+    if flavor_is_created:
+        openstack_alt_clients.compute.flavors.delete(
+            os_resource_alt_project['flavor_id'])
+    if alt_os_actions.create_fake_ext_net:
+        openstack_alt_clients.network.delete_network(
+            os_resource_alt_project['ext_net']['id'])
+
+    if alt_os_actions.is_project_empty(alt_project.id):
+        openstack_alt_clients.auth.projects.delete(alt_project.id)
+        logger.info("Deleted project {}".format(alt_project.name))
+    else:
+        logger.info("Project {} is not empty, skip deleting".format(
+            alt_project.name))