fixing bugs
diff --git a/start_vms.py b/start_vms.py
index 93162a3..62e4ca5 100644
--- a/start_vms.py
+++ b/start_vms.py
@@ -6,7 +6,7 @@
from concurrent.futures import ThreadPoolExecutor
-# from novaclient.exceptions import NotFound
+from novaclient.exceptions import NotFound
from novaclient.client import Client as n_client
from cinderclient.v1.client import Client as c_client
@@ -45,7 +45,7 @@
NOVA_CONNECTION = None
-def prepare_os(name=None, passwd=None, tenant=None, auth_url=None):
+def prepare_os_subpr(name=None, passwd=None, tenant=None, auth_url=None):
if name is None:
name, passwd, tenant, auth_url = ostack_get_creds()
@@ -58,24 +58,46 @@
params_s = " ".join("{}={}".format(k, v) for k, v in params.items())
- cmd = "env {params} bash scripts/prepare.sh".format(params_s)
+ cmd_templ = "env {params} bash scripts/prepare.sh >/dev/null"
+ cmd = cmd_templ.format(params=params_s)
subprocess.call(cmd, shell=True)
- return NOVA_CONNECTION
+
+def prepare_os(nova, params):
+ allow_ssh(nova, params['security_group'])
+
+ shed_ids = []
+ for shed_group in params['schedulers_groups']:
+ shed_ids.append(get_or_create_aa_group(nova, shed_group))
+
+ create_keypair(nova,
+ params['keypair_name'],
+ params['pub_key_path'],
+ params['priv_key_path'])
+
+ create_image(nova, params['image']['name'],
+ params['image']['url'])
+
+ create_flavor(nova, **params['flavor'])
-# def get_or_create_aa_group(nova, name):
-# try:
-# group = conn.server_groups.find(name=name)
-# except NotFound:
-# group = None
+def get_or_create_aa_group(nova, name):
+ try:
+ group = nova.server_groups.find(name=name)
+ except NotFound:
+ group = nova.server_groups.create({'name': name,
+ 'policies': ['anti-affinity']})
-# if group is None:
-# conn.server_groups.create
+ return group.id
-def allow_ssh(nova):
- secgroup = nova.security_groups.find(name="default")
+def allow_ssh(nova, group_name):
+ try:
+ secgroup = nova.security_groups.find(name=group_name)
+ except NotFound:
+ secgroup = nova.security_groups.create(group_name,
+ "allow ssh/ping to node")
+
nova.security_group_rules.create(secgroup.id,
ip_protocol="tcp",
from_port="22",
@@ -87,11 +109,32 @@
from_port=-1,
cidr="0.0.0.0/0",
to_port=-1)
+ return secgroup.id
-def create_keypair(nova, name, key_path):
- with open(key_path) as key:
- return nova.keypairs.create(name, key.read())
+def create_image(nova, name, url):
+ pass
+
+
+def create_flavor(nova, name, **params):
+ pass
+
+
+def create_keypair(nova, name, pub_key_path, priv_key_path):
+ try:
+ nova.keypairs.find(name=name)
+ except NotFound:
+ if os.path.exists(pub_key_path):
+ with open(pub_key_path) as pub_key_fd:
+ return nova.keypairs.create(name, pub_key_fd.read())
+ else:
+ key = nova.keypairs.create(name)
+
+ with open(priv_key_path, "w") as priv_key_fd:
+ priv_key_fd.write(key.private_key)
+
+ with open(pub_key_path, "w") as pub_key_fd:
+ pub_key_fd.write(key.public_key)
def create_volume(size, name):
@@ -156,19 +199,30 @@
srv_count = len([srv for srv in lst if srv.status == 'enabled'])
count = srv_count * int(count[1:])
- srv_params = "img: {img_name}, flavor: {flavor_name}".format(**params)
+ srv_params = "img: {image[name]}, flavor: {flavor[name]}".format(**params)
msg_templ = "Will start {0} servers with next params: {1}"
logger.info(msg_templ.format(count, srv_params))
vm_creds = params.pop('creds')
+ params = params.copy()
+
+ params['img_name'] = params['image']['name']
+ params['flavor_name'] = params['flavor']['name']
+
+ del params['image']
+ del params['flavor']
+ del params['scheduler_group_name']
+ private_key_path = params.pop('private_key_path')
+
for ip, os_node in create_vms_mt(NOVA_CONNECTION, count, **params):
- yield Node(vm_creds.format(ip), []), os_node.id
+ conn_uri = vm_creds.format(ip=ip, private_key_path=private_key_path)
+ yield Node(conn_uri, []), os_node.id
def create_vms_mt(nova, amount, keypair_name, img_name,
flavor_name, vol_sz=None, network_zone_name=None,
flt_ip_pool=None, name_templ='ceph-test-{0}',
- scheduler_hints=None):
+ scheduler_hints=None, security_group=None):
with ThreadPoolExecutor(max_workers=16) as executor:
if network_zone_name is not None:
@@ -208,7 +262,7 @@
for name, flt_ip in zip(names, ips):
params = (nova, name, keypair_name, img, fl,
nics, vol_sz, flt_ip, scheduler_hints,
- flt_ip_pool)
+ flt_ip_pool, [security_group])
futures.append(executor.submit(create_vm, *params))
res = [future.result() for future in futures]
@@ -220,12 +274,16 @@
fl, nics, vol_sz=None,
flt_ip=False,
scheduler_hints=None,
- pool=None):
+ pool=None,
+ security_groups=None):
for i in range(3):
srv = nova.servers.create(name,
- flavor=fl, image=img, nics=nics,
+ flavor=fl,
+ image=img,
+ nics=nics,
key_name=keypair_name,
- scheduler_hints=scheduler_hints)
+ scheduler_hints=scheduler_hints,
+ security_groups=security_groups)
if not wait_for_server_active(nova, srv):
msg = "Server {0} fails to start. Kill it and try again"
@@ -276,13 +334,16 @@
nova.servers.delete(srv)
deleted_srvs.add(srv.id)
- while deleted_srvs != set():
- logger.debug("Waiting till all servers are actually deleted")
+ count = 0
+ while True:
+ if count % 60 == 0:
+ logger.debug("Waiting till all servers are actually deleted")
all_id = set(srv.id for srv in nova.servers.list())
- if all_id.intersection(deleted_srvs) == set():
- logger.debug("Done, deleting volumes")
+ if len(all_id.intersection(deleted_srvs)) == 0:
break
+ count += 1
time.sleep(1)
+ logger.debug("Done, deleting volumes")
# wait till vm actually deleted