blob: ed3d8eaf6ea1e8f2ed80450cbde4becb7e20599d [file] [log] [blame]
Yulia Portnova0e64ea22015-03-20 17:27:22 +02001import logging
Yulia Portnova21289b22015-03-18 15:21:43 +02002import node
Yulia Portnova0e64ea22015-03-20 17:27:22 +02003from starts_vms import create_vms_mt
Yulia Portnova21289b22015-03-18 15:21:43 +02004from novaclient.client import Client
5
6
Yulia Portnova0e64ea22015-03-20 17:27:22 +02007logger = logging.getLogger("io-perf-tool")
8
9
Yulia Portnova21289b22015-03-18 15:21:43 +020010def get_floating_ip(vm):
11 addrs = vm.addresses
12 for net_name, ifaces in addrs.items():
13 for iface in ifaces:
14 if iface.get('OS-EXT-IPS:type') == "floating":
15 return iface['addr']
Yulia Portnova21289b22015-03-18 15:21:43 +020016
17
Yulia Portnova0e64ea22015-03-20 17:27:22 +020018def discover_vms(client, search_opts):
19 auth = search_opts.pop('auth', {})
20 user = auth.get('user')
21 password = auth.get('password')
22 key = auth.get('key_file')
23 servers = client.servers.list(search_opts=search_opts)
24 logger.debug("Found %s openstack vms" % len(servers))
25 return [node.Node(get_floating_ip(server), ["test_vm"], username=user,
26 password=password, key_path=key)
27 for server in servers if get_floating_ip(server)]
28
29
30def discover_services(client, opts):
31 auth = opts.pop('auth', {})
32 user = auth.get('user')
33 password = auth.get('password')
34 key = auth.get('key_file')
35 services = []
36 if opts['service'] == "all":
37 services = client.services.list()
38 else:
39 if isinstance(opts['service'], basestring):
40 opts['service'] = [opts['service']]
41
42 for s in opts['service']:
43 services.extend(client.services.list(binary=s))
44
45 host_services_mapping = {}
46 for service in services:
47 if host_services_mapping.get(service.host):
48 host_services_mapping[service.host].append(service.binary)
49 else:
50 host_services_mapping[service.host] = [service.binary]
51 logger.debug("Found %s openstack service nodes" %
52 len(host_services_mapping))
53 return [node.Node(host, services, username=user,
54 password=password, key_path=key) for host, services in
55 host_services_mapping.items()]
56
57
58def discover_openstack_nodes(conn_details, conf):
Yulia Portnova21289b22015-03-18 15:21:43 +020059 """Discover vms running in openstack
60 :param conn_details - dict with openstack connection details -
61 auth_url, api_key (password), username
62 """
63 client = Client(version='1.1', **conn_details)
Yulia Portnova0e64ea22015-03-20 17:27:22 +020064 nodes = []
65 if conf.get('discover'):
66 vms_to_discover = conf['discover'].get('vm')
67 if vms_to_discover:
68 nodes.extend(discover_vms(client, vms_to_discover))
69 services_to_discover = conf['discover'].get('nodes')
70 if services_to_discover:
71 nodes.extend(discover_services(client, services_to_discover))
72 if conf.get('start'):
73 vms = start_test_vms(client, conf['start'])
74 nodes.extend(vms)
75
76 return nodes
Yulia Portnova3556a062015-03-17 16:30:11 +020077
78
Yulia Portnova0e64ea22015-03-20 17:27:22 +020079def start_test_vms(client, opts):
80
81 user = opts.pop("user", None)
82 key_file = opts.pop("key_file", None)
83 aff_group = opts.pop("aff_group", None)
84 raw_count = opts.pop('count')
85
86 if raw_count.startswith("x"):
87 logger.debug("Getting amount of compute services")
88 count = len(client.services.list(binary="nova-compute"))
89 count *= int(raw_count[1:])
90 else:
91 count = int(raw_count)
92
93 if aff_group is not None:
94 scheduler_hints = {'group': aff_group}
95 else:
96 scheduler_hints = None
97
98 opts['scheduler_hints'] = scheduler_hints
99
100 logger.debug("Will start {0} vms".format(count))
101
102 nodes = create_vms_mt(client, count, **opts)
103 return [node.Node(get_floating_ip(server), ["test_vm"], username=user,
104 key_path=key_file) for server in nodes]