Fix "os.path" mock problems during tests
[yardstick.git] / yardstick / benchmark / contexts / heat.py
index 4407889..0964b7b 100644 (file)
@@ -7,9 +7,6 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-from __future__ import absolute_import
-from __future__ import print_function
-
 import collections
 import logging
 import os
@@ -134,16 +131,6 @@ class HeatContext(Context):
 
         self.attrs = attrs
 
-        self.key_filename = ''.join(
-            [consts.YARDSTICK_ROOT_PATH,
-             'yardstick/resources/files/yardstick_key-',
-              self.name])
-        # Permissions may have changed since creation; this can be fixed. If we
-        # overwrite the file, we lose future access to VMs using this key.
-        # As long as the file exists, even if it is unreadable, keep it intact
-        if not os.path.exists(self.key_filename):
-            SSH.gen_keys(self.key_filename)
-
     def check_environment(self):
         try:
             os.environ['OS_AUTH_URL']
@@ -185,6 +172,9 @@ class HeatContext(Context):
         template.add_security_group(self.secgroup_name)
 
         for network in self.networks.values():
+            # Using existing network
+            if network.is_existing():
+                continue
             template.add_network(network.stack_name,
                                  network.physical_network,
                                  network.provider,
@@ -308,7 +298,7 @@ class HeatContext(Context):
                                          timeout=self.heat_timeout)
          except KeyboardInterrupt:
              raise y_exc.StackCreationInterrupt
-         except:
+         except Exception:
              LOG.exception("stack failed")
              # let the other failures happen, we want stack trace
              raise
@@ -325,6 +315,16 @@ class HeatContext(Context):
         """deploys template into a stack using cloud"""
         LOG.info("Deploying context '%s' START", self.name)
 
+        self.key_filename = ''.join(
+            [consts.YARDSTICK_ROOT_PATH,
+             'yardstick/resources/files/yardstick_key-',
+             self.name])
+        # Permissions may have changed since creation; this can be fixed. If we
+        # overwrite the file, we lose future access to VMs using this key.
+        # As long as the file exists, even if it is unreadable, keep it intact
+        if not os.path.exists(self.key_filename):
+            SSH.gen_keys(self.key_filename)
+
         heat_template = HeatTemplate(self.name, self.template_file,
                                      self.heat_parameters)
 
@@ -354,18 +354,35 @@ class HeatContext(Context):
 
         LOG.info("Deploying context '%s' DONE", self.name)
 
+    @staticmethod
+    def _port_net_is_existing(port_info):
+        net_flags = port_info.get('net_flags', {})
+        return net_flags.get(consts.IS_EXISTING)
+
+    @staticmethod
+    def _port_net_is_public(port_info):
+        net_flags = port_info.get('net_flags', {})
+        return net_flags.get(consts.IS_PUBLIC)
+
     def add_server_port(self, server):
-        # use private ip from first port in first network
-        try:
-            private_port = next(iter(server.ports.values()))[0]
-        except IndexError:
-            LOG.exception("Unable to find first private port in %s", server.ports)
-            raise
-        server.private_ip = self.stack.outputs[private_port["stack_name"]]
+        server_ports = server.ports.values()
+        for server_port in server_ports:
+            port_info = server_port[0]
+            port_ip = self.stack.outputs[port_info["stack_name"]]
+            port_net_is_existing = self._port_net_is_existing(port_info)
+            port_net_is_public = self._port_net_is_public(port_info)
+            if port_net_is_existing and (port_net_is_public or
+                                         len(server_ports) == 1):
+                server.public_ip = port_ip
+            if not server.private_ip or len(server_ports) == 1:
+                server.private_ip = port_ip
+
         server.interfaces = {}
         for network_name, ports in server.ports.items():
             for port in ports:
                 # port['port'] is either port name from mapping or default network_name
+                if self._port_net_is_existing(port):
+                    continue
                 server.interfaces[port['port']] = self.make_interface_dict(network_name,
                                                                            port['port'],
                                                                            port['stack_name'],