Also support the usual CMD field in images
[osm/vim-emu.git] / src / emuvim / api / openstack / compute.py
index 6fc4c1b..9d77a44 100755 (executable)
@@ -96,8 +96,6 @@ class OpenstackCompute(object):
         for image in self.dcli.images.list():
             if len(image.tags) > 0:
                 for t in image.tags:
-                    # only use short tag names for OSM compatibility
-                    t = t.replace(":latest", "")
                     if t not in self._images:
                         self._images[t] = Image(t)
         return self._images
@@ -490,20 +488,26 @@ class OpenstackCompute(object):
                             intf.setMAC(port.mac_address)
                         else:
                             port.mac_address = intf.MAC()
+                        port.assigned_container = c
 
         # Start the real emulator command now as specified in the dockerfile
-        # ENV SON_EMU_CMD
         config = c.dcinfo.get("Config", dict())
         env = config.get("Env", list())
+        legacy_command_execution = False
         for env_var in env:
-            if "SON_EMU_CMD=" in env_var:
-                cmd = str(env_var.split("=")[1])
-                server.son_emu_command = cmd
+            var, cmd = map(str.strip, map(str, env_var.split('=', 1)))
+            if var == "SON_EMU_CMD" or var == "VIM_EMU_CMD":
+                LOG.info("Executing script in '{}': {}={}"
+                         .format(server.name, var, cmd))
                 # execute command in new thread to ensure that GK is not
                 # blocked by VNF
                 t = threading.Thread(target=c.cmdPrint, args=(cmd,))
                 t.daemon = True
                 t.start()
+                legacy_command_execution = True
+                break  # only execute one command
+        if not legacy_command_execution:
+            c.start()
 
     def stop_compute(self, server):
         """
@@ -587,11 +591,10 @@ class OpenstackCompute(object):
         This function provides a shorter name if needed
         """
         if len(name) > char_limit:
-            LOG.info("Long server name: {}".format(name))
             # construct a short name
             h = hashlib.sha224(name).hexdigest()
             h = h[0:char_limit]
-            LOG.info("Short server name: {}".format(h))
+            LOG.debug("Shortened server name '%s' to '%s'" % (name, h))
         return name
 
     def delete_server(self, server):
@@ -688,12 +691,6 @@ class OpenstackCompute(object):
         :return: Returns the created port.
         :rtype: :class:`heat.resources.port`
         """
-        port = self.find_port_by_name_or_id(name)
-        if port is not None and not stack_operation:
-            LOG.warning(
-                "Creating port with name %s failed, as it already exists" % name)
-            raise Exception("Port with name %s already exists." % name)
-        LOG.debug("Creating port with name %s" % name)
         port = Port(name)
         if not stack_operation:
             self.ports[port.id] = port
@@ -709,12 +706,19 @@ class OpenstackCompute(object):
         :return: Returns the port reference if it was found or None
         :rtype: :class:`heat.resources.port`
         """
+        # find by id
         if name_or_id in self.ports:
             return self.ports[name_or_id]
-        for port in self.ports.values():
-            if port.name == name_or_id or port.template_name == name_or_id:
-                return port
-
+        # find by name
+        matching_ports = filter(
+            lambda port: port.name == name_or_id or port.template_name == name_or_id,
+            self.ports.values()
+        )
+        matching_ports_count = len(matching_ports)
+        if matching_ports_count == 1:
+            return matching_ports[0]
+        if matching_ports_count > 1:
+            raise RuntimeError("Ambiguous port name %s" % name_or_id)
         return None
 
     def delete_port(self, name_or_id):
@@ -732,8 +736,7 @@ class OpenstackCompute(object):
 
         my_links = self.dc.net.links
         for link in my_links:
-            if str(link.intf1) == port.intf_name and \
-                    str(link.intf1.ip) == port.ip_address.split('/')[0]:
+            if str(link.intf1) == port.intf_name:
                 self._remove_link(link.intf1.node.name, link)
                 break