Assign static IP to VM for standalone context
[yardstick.git] / yardstick / benchmark / contexts / standalone / sriov.py
index 95472fd..f1b67a2 100644 (file)
@@ -18,20 +18,21 @@ import logging
 import collections
 
 from yardstick import ssh
-from yardstick.network_services.utils import get_nsb_option
-from yardstick.benchmark.contexts.base import Context
+from yardstick.benchmark import contexts
+from yardstick.benchmark.contexts import base
 from yardstick.benchmark.contexts.standalone import model
+from yardstick.network_services.utils import get_nsb_option
 from yardstick.network_services.utils import PciAddress
 
 LOG = logging.getLogger(__name__)
 
 
-class SriovContext(Context):
+class SriovContext(base.Context):
     """ This class handles SRIOV standalone nodes - VM running on Non-Managed NFVi
     Configuration: sr-iov
     """
 
-    __context_type__ = "StandaloneSriov"
+    __context_type__ = contexts.CONTEXT_STANDALONESRIOV
 
     def __init__(self):
         self.file_path = None
@@ -106,13 +107,29 @@ class SriovContext(Context):
             build_vfs = "echo 0 > /sys/bus/pci/devices/{0}/sriov_numvfs"
             self.connection.execute(build_vfs.format(ports.get('phy_port')))
 
+    def _get_physical_nodes(self):
+        return self.nfvi_host
+
+    def _get_physical_node_for_server(self, server_name):
+
+        # self.nfvi_host always contain only one host.
+        node_name, ctx_name = self.split_host_name(server_name)
+        if ctx_name is None or self.name != ctx_name:
+            return None
+
+        matching_nodes = [s for s in self.servers if s == node_name]
+        if len(matching_nodes) == 0:
+            return None
+
+        return "{}.{}".format(self.nfvi_host[0]["name"], self._name)
+
     def _get_server(self, attr_name):
         """lookup server info by name from context
 
         Keyword arguments:
         attr_name -- A name for a server listed in nodes config file
         """
-        node_name, name = self.split_name(attr_name)
+        node_name, name = self.split_host_name(attr_name)
         if name is None or self.name != name:
             return None
 
@@ -194,10 +211,10 @@ class SriovContext(Context):
         slot = index + idx + 10
         vf['vpci'] = \
             "{}:{}:{:02x}.{}".format(vpci.domain, vpci.bus, slot, vpci.function)
-        model.Libvirt.add_sriov_interfaces(
-            vf['vpci'], vf['vf_pci']['vf_pci'], vf['mac'], str(cfg))
         self.connection.execute("ifconfig %s up" % vf['interface'])
         self.connection.execute(vf_spoofchk.format(vf['interface']))
+        return model.Libvirt.add_sriov_interfaces(
+            vf['vpci'], vf['vf_pci']['vf_pci'], vf['mac'], str(cfg))
 
     def setup_sriov_context(self):
         nodes = []
@@ -208,35 +225,46 @@ class SriovContext(Context):
         for index, (key, vnf) in enumerate(collections.OrderedDict(
                 self.servers).items()):
             cfg = '/tmp/vm_sriov_%s.xml' % str(index)
-            vm_name = "vm_%s" % str(index)
+            vm_name = "vm-%s" % str(index)
+            cdrom_img = "/var/lib/libvirt/images/cdrom-%d.img" % index
 
             # 1. Check and delete VM if already exists
             model.Libvirt.check_if_vm_exists_and_delete(vm_name,
                                                         self.connection)
             xml_str, mac = model.Libvirt.build_vm_xml(
-                self.connection, self.vm_flavor, vm_name, index)
+                self.connection, self.vm_flavor, vm_name, index, cdrom_img)
 
             # 2: Cleanup already available VMs
             network_ports = collections.OrderedDict(
                 {k: v for k, v in vnf["network_ports"].items() if k != 'mgmt'})
             for idx, vfs in enumerate(network_ports.values()):
-                self._enable_interfaces(index, idx, vfs, cfg)
+                xml_str = self._enable_interfaces(index, idx, vfs, xml_str)
 
             # copy xml to target...
             model.Libvirt.write_file(cfg, xml_str)
             self.connection.put(cfg, cfg)
 
+            node = self.vnf_node.generate_vnf_instance(self.vm_flavor,
+                                                       self.networks,
+                                                       self.host_mgmt.get('ip'),
+                                                       key, vnf, mac)
+            # Generate public/private keys if password or private key file is not provided
+            node = model.StandaloneContextHelper.check_update_key(self.connection,
+                                                                  node,
+                                                                  vm_name,
+                                                                  self.name,
+                                                                  cdrom_img,
+                                                                  mac)
+
+            # store vnf node details
+            nodes.append(node)
+
             # NOTE: launch through libvirt
             LOG.info("virsh create ...")
             model.Libvirt.virsh_create_vm(self.connection, cfg)
 
             self.vm_names.append(vm_name)
 
-            # build vnf node details
-            nodes.append(self.vnf_node.generate_vnf_instance(
-                self.vm_flavor, self.networks, self.host_mgmt.get('ip'),
-                key, vnf, mac))
-
         return nodes
 
     def _get_vf_data(self, value, vfmac, pfif):