discovering
diff --git a/nodes/openstack.py b/nodes/openstack.py
index 7444e46..ed3d8ea 100644
--- a/nodes/openstack.py
+++ b/nodes/openstack.py
@@ -1,33 +1,104 @@
+import logging
import node
-
+from starts_vms import create_vms_mt
from novaclient.client import Client
+logger = logging.getLogger("io-perf-tool")
+
+
def get_floating_ip(vm):
addrs = vm.addresses
for net_name, ifaces in addrs.items():
for iface in ifaces:
if iface.get('OS-EXT-IPS:type') == "floating":
return iface['addr']
- raise Exception("No floating ip found for VM %s" % repr(vm))
-def discover_openstack_vms(conn_details):
+def discover_vms(client, search_opts):
+ auth = search_opts.pop('auth', {})
+ user = auth.get('user')
+ password = auth.get('password')
+ key = auth.get('key_file')
+ servers = client.servers.list(search_opts=search_opts)
+ logger.debug("Found %s openstack vms" % len(servers))
+ return [node.Node(get_floating_ip(server), ["test_vm"], username=user,
+ password=password, key_path=key)
+ for server in servers if get_floating_ip(server)]
+
+
+def discover_services(client, opts):
+ auth = opts.pop('auth', {})
+ user = auth.get('user')
+ password = auth.get('password')
+ key = auth.get('key_file')
+ services = []
+ if opts['service'] == "all":
+ services = client.services.list()
+ else:
+ if isinstance(opts['service'], basestring):
+ opts['service'] = [opts['service']]
+
+ for s in opts['service']:
+ services.extend(client.services.list(binary=s))
+
+ host_services_mapping = {}
+ for service in services:
+ if host_services_mapping.get(service.host):
+ host_services_mapping[service.host].append(service.binary)
+ else:
+ host_services_mapping[service.host] = [service.binary]
+ logger.debug("Found %s openstack service nodes" %
+ len(host_services_mapping))
+ return [node.Node(host, services, username=user,
+ password=password, key_path=key) for host, services in
+ host_services_mapping.items()]
+
+
+def discover_openstack_nodes(conn_details, conf):
"""Discover vms running in openstack
:param conn_details - dict with openstack connection details -
auth_url, api_key (password), username
"""
client = Client(version='1.1', **conn_details)
- servers = client.servers.list(search_opts={"all_tenant": True})
- return [node.Node(get_floating_ip(server), ["test_vm"])
- for server in servers]
+ nodes = []
+ if conf.get('discover'):
+ vms_to_discover = conf['discover'].get('vm')
+ if vms_to_discover:
+ nodes.extend(discover_vms(client, vms_to_discover))
+ services_to_discover = conf['discover'].get('nodes')
+ if services_to_discover:
+ nodes.extend(discover_services(client, services_to_discover))
+ if conf.get('start'):
+ vms = start_test_vms(client, conf['start'])
+ nodes.extend(vms)
+
+ return nodes
-def discover_openstack_nodes(conn_details):
- """Discover openstack nodes
- :param conn_details - dict with openstack connection details -
- auth_url, api_key (password), username
- """
- client = Client(version='1.1', **conn_details)
- services = client.services.list()
- return [node.Node(server.ip, ["test_vm"]) for server in services]
+def start_test_vms(client, opts):
+
+ user = opts.pop("user", None)
+ key_file = opts.pop("key_file", None)
+ aff_group = opts.pop("aff_group", None)
+ raw_count = opts.pop('count')
+
+ if raw_count.startswith("x"):
+ logger.debug("Getting amount of compute services")
+ count = len(client.services.list(binary="nova-compute"))
+ count *= int(raw_count[1:])
+ else:
+ count = int(raw_count)
+
+ if aff_group is not None:
+ scheduler_hints = {'group': aff_group}
+ else:
+ scheduler_hints = None
+
+ opts['scheduler_hints'] = scheduler_hints
+
+ logger.debug("Will start {0} vms".format(count))
+
+ nodes = create_vms_mt(client, count, **opts)
+ return [node.Node(get_floating_ip(server), ["test_vm"], username=user,
+ key_path=key_file) for server in nodes]