blob: 92f4891cc805ed75e86ba6731ca9d2e5153e57f3 [file] [log] [blame]
Jeremy Mordkoff6f07e6f2016-09-07 18:56:51 -04001#
2# Copyright 2016 RIFT.IO Inc
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16#
17
18import os,sys,platform
19import socket
20import time
21import re
22import logging
23
24from pprint import pprint
25import argparse
26
27from gi.repository import RwcalYang
28from gi.repository.RwTypes import RwStatus
29import rw_peas
30import rwlogger
31import time
32
33global nova
34nova = None
35
36def wait_till_active(driver, account, vm_id_list, timeout):
37 """
38 Wait until VM reaches ACTIVE state.
39 """
40 # Wait while VM goes to required state
41
42 start = time.time()
43 end = time.time() + timeout
44 done = False;
45
46 while ( time.time() < end ) and not done:
47 done = True
48 for vm_id in vm_id_list:
49 rc, rs = driver.get_vm(account, vm_id)
50 assert rc == RwStatus.SUCCESS
51 if rs.state != 'ACTIVE':
52 done = False
53 time.sleep(2)
54
55
56def get_image_name(node):
57 images = driver.list_images()
58 for i in images:
59 if i.id == node.extra['imageId']:
60 return i.name
61 return None
62
63def get_flavor_name(flavorid):
64 global nova
65 if nova is None:
66 nova = ra_nova_connect(project='admin')
67 for f in nova.flavors.list(True):
68 if f.id == flavorid:
69 return f.name
70 return None
71
72def hostname():
73 return socket.gethostname().split('.')[0]
74
75def vm_register(id, driver, account, cmdargs, header=True):
76 if testbed is None:
77 print("Cannot register VM without reservation system")
78 return False
79
80 if cmdargs.reserve_new_vms:
81 user=os.environ['USER']
82 else:
83 user=None
84 fmt="%-28s %-12s %-12s %-15s"
85 if header:
86 print('VM controller compute mgmt ip')
87 print('---------------------------- ------------ ------------ ---------------')
88 rc, nodes = driver.get_vm_list(account)
89 assert rc == RwStatus.SUCCESS
90 for node in nodes.vminfo_list:
91 if id == 'all' or node.vm_id == id:
92 flavor = driver.get_flavor(account, node.flavor_id)
93 assert rc == RwStatus.SUCCESS
94 ip = node.management_ip
95
96 huge = 'DISABLED'
97 if flavor.guest_epa.mempage_size == 'LARGE':
98 huge = flavor.guest_epa.mempage_size
99 #compute = utils.find_resource(nova.servers, node.id)
100 #compute_name = compute._info['OS-EXT-SRV-ATTR:hypervisor_hostname'].split('.')[0]
101 compute_name = hostname()
102 try:
103 testbed.add_resource(node.vm_name, hostname(), ip, flavor.vm_flavor.memory_mb, flavor.vm_flavor.vcpu_count, user, flavor.name, compute=compute_name, huge_pages=huge )
104 print(fmt % ( node.vm_name, hostname(), compute_name, ip ))
105 except Exception as e:
106 print("WARNING: Error \"%s\"adding resource to reservation system" % e)
107
108class OFromDict(object):
109 def __init__(self, d):
110 self.__dict__ = d
111
112
113def vm_create_subcommand(driver, account, cmdargs):
114 """Process the VM create subcommand."""
115 if cmdargs.name and cmdargs.count != 1:
116 sys.exit("Error: when VM name is specified, the count must be 1")
117
118 rc, sizes = driver.get_flavor_list(account)
119 assert rc == RwStatus.SUCCESS
120
121 try:
122 size = [s for s in sizes.flavorinfo_list if s.name == cmdargs.flavor][0]
123 except IndexError:
124 sys.exit("Error: Failed to create VM, couldn't find flavor %s" % \
125 cmdargs.flavor)
126 print(size)
127 rc, images = driver.get_image_list(account)
128 assert rc == RwStatus.SUCCESS
129 if images is None:
130 sys.exit("Error: No images found")
131 try:
132 image = [i for i in images.imageinfo_list if cmdargs.image in i.name][0]
133 except IndexError:
134 sys.exit("Error: Failed to create VM, couldn't find image %s" % \
135 cmdargs.image)
136 print(image)
137
138 # VM name is not specified, so determine a unique VM name
139 # VM name should have the following format:
140 # rwopenstack_<host>_vm<id>, e.g., rwopenstack_grunt16_vm1
141 # The following code gets the list of existing VMs and determines
142 # a unique id for the VM name construction.
143 rc, nodes = driver.get_vm_list(account)
144 assert rc == RwStatus.SUCCESS
145 prefix = 'rwopenstack_%s_vm' % hostname()
146 vmid = 0;
147 for n in nodes.vminfo_list:
148 if n.vm_name.startswith(prefix):
149 temp_str = n.vm_name[len(prefix):]
150 if temp_str == '':
151 temp = 1
152 else:
153 temp = int(n.vm_name[len(prefix):])
154
155 if (temp > vmid):
156 vmid = temp
157
158 nodelist = []
159 for i in range(0, cmdargs.count):
160 if cmdargs.name:
161 vm_name = cmdargs.name
162 else:
163 vm_name = '%s%d' % (prefix, vmid+i+1)
164
165 rc, netlist = driver.get_network_list(account)
166 assert rc == RwStatus.SUCCESS
167 for network in netlist.networkinfo_list:
168 print(network)
169
170 vm = RwcalYang.VMInfoItem()
171 vm.vm_name = vm_name
172 vm.flavor_id = size.id
173 vm.image_id = image.id
174 vm.cloud_init.userdata = ''
175
176 nets = dict()
177 for network in netlist.networkinfo_list:
178 if network.network_name != "public":
179 nwitem = RwcalYang.VMInfoItem_NetworkList()
180 nwitem.network_id = network.network_id
181 nets[network.network_name] = nwitem
182
183 logger.debug('creating VM using nets %s' % cmdargs.networks )
184 for net in cmdargs.networks.split(','):
185 if not net in nets:
186 print(("Invalid network name '%s'" % net))
187 print(('available nets are %s' % ','.join(list(nets.keys())) ))
188 sys.exit(1)
189 if net != cmdargs.mgmt_network:
190 vm.network_list.append(nets[net])
191
192 print(vm.network_list)
193 rc, node_id = driver.create_vm(account, vm)
194
195 # wait for 1 to be up before starting the rest
196 # this is an attempt to make sure the image is cached
197 nodelist.append(node_id)
198 if i == 0 or cmdargs.wait_after_create is True:
199 #wait_until_running([node], timeout=300)
200 wait_till_active(driver, account, nodelist, timeout=300)
201 print(node_id)
202 if cmdargs.reservation_server_url is not None:
203 if not cmdargs.wait_after_create:
204 print("Waiting for VMs to start")
205 wait_till_active(driver, account, nodelist, timeout=300)
206 print("VMs are up")
207 header=True
208 for node in nodelist:
209 vm_register(node, driver, account, cmdargs, header)
210 header=False
211
212
213def vm_destroy_subcommand(driver, account, cmdargs):
214 rc, nodes = driver.get_vm_list(account)
215 assert rc == RwStatus.SUCCESS
216 ct = len(nodes.vminfo_list)
217 if cmdargs.destroy_all or cmdargs.wait:
218 rc=0
219 for n in nodes.vminfo_list:
220 if testbed is not None:
221 try:
222 testbed.remove_resource(n.vm_name)
223 except:
224 print("WARNING: error deleting resource from reservation system")
225 if RwStatus.SUCCESS != driver.delete_vm(account, n.vm_id):
226 print('Error: failed to destroy node %s' % n.vm_name)
227 rc=1
228 if rc:
229 sys.exit(1)
230 if cmdargs.wait:
231 while ct > 0:
232 sys.stderr.write("waiting for %d VMs to exit...\n" % ct)
233 time.sleep(1)
234 try:
235 rc, nodesnw = driver.get_vm_list(account)
236 assert rc == RwStatus.SUCCESS
237 ct = len(nodesnw.vminfo_list )
238 except:
239 pass
240
241 else:
242 vm_re = re.compile('^%s$' % cmdargs.vm_name)
243 ct = 0
244 for n in nodes.vminfo_list:
245 if vm_re.match(n.vm_name):
246 ct += 1
247 if testbed is not None:
248 try:
249 testbed.remove_resource(n.vm_name)
250 except:
251 print("WARNING: error deleting resource from reservation system")
252 if RwStatus.SUCCESS != driver.delete_vm(account, n.vm_id):
253 print('Error: failed to destroy node %s' % n.vm_name)
254 return
255 print('destroyed %s' % n.vm_name)
256 if ct == 0:
257 print("No VMs matching \"%s\" found" % ( cmdargs.vm_name ))
258
259
260def vm_rebuild_subcommand(driver, account, cmdargs):
261 images = driver.list_images()
262 found=0
263 for i in images:
264 if i.name == cmdargs.image_name:
265 found=1
266 break
267 if found != 1:
268 print('Error: Rebuild failed - image %s not found' % cmdargs.image_name)
269 sys.exit(1)
270 image=i
271 nodes = driver.list_nodes()
272 if cmdargs.rebuild_all:
273 rc=0
274 for n in nodes:
275 if not driver.ex_rebuild(n,image):
276 print('Error: failed to rebuild node %s' % n.name)
277 rc=1
278 if rc:
279 sys.exit(1)
280 rebuilt=0
281 while rebuilt != 1:
282 time.sleep(10)
283 nw_nodes = driver.list_nodes()
284 for nw in nw_nodes:
285 if nw.name == n.name:
286 if nw.state == n.state:
287 rebuilt=1
288 break
289 else:
290 vm_re = re.compile('^%s$' % cmdargs.vm_name)
291 ct = 0
292 for n in nodes:
293 if vm_re.match(n.name):
294 ct += 1
295 if not driver.ex_rebuild(n,image):
296 print('Error: failed to rebuild node %s' % n.name)
297 return
298 print('Rebuilt %s' % n.name)
299 rebuilt=0
300 while rebuilt != 1:
301 time.sleep(10)
302 nw_nodes = driver.list_nodes()
303 for nw in nw_nodes:
304 if nw.name == n.name:
305 if nw.state == n.state:
306 rebuilt=1
307 break
308 if ct == 0:
309 print("No VMs matching \"%s\" found" % ( cmdargs.vm_name ))
310
311
312
313def vm_reboot_subcommand(driver, account, cmdargs):
314 rc, nodes = driver.get_vm_list(account)
315 assert rc == RwStatus.SUCCESS
316 if cmdargs.reboot_all:
317 for n in nodes.vminfo_list:
318 '''
319 if not n.reboot():
320 print 'Error: failed to reboot node %s' % n.name
321 else:
322 print "rebooted %s" % n.name
323 '''
324 time.sleep(cmdargs.sleep_time)
325 else:
326 for n in nodes.vminfo_list:
327 if n.vm_name == cmdargs.vm_name:
328 if RwStatus.SUCCESS != driver.reboot_vm(account,n.vm_id):
329 print('Error: failed to reboot node %s' % n.vm_name)
330 else:
331 print("rebooted %s" % n.vm_name)
332
333
334def vm_start_subcommand(driver, account, cmdargs):
335 rc, nodes = driver.get_vm_list(account)
336 assert rc == RwStatus.SUCCESS
337 if cmdargs.start_all:
338 for n in nodes.vminfo_list:
339 print(dir(n))
340 if RwStatus.SUCCESS != driver.start_vm(account, n.vm_id):
341 print('Error: failed to start node %s' % n.vm_name)
342 else:
343 print("started %s" % n.vm_name)
344 else:
345 for n in nodes.vminfo_list:
346 if n.vm_name == cmdargs.vm_name:
347 if RwStatus.SUCCESS != driver.start_vm(account, n.vm_id):
348 print('Error: failed to start node %s' % n.vm_name)
349 else:
350 print("started %s" % n.vm_name)
351
352def vm_subcommand(driver, account, cmdargs):
353 """Process the vm subcommand"""
354
355 if cmdargs.which == 'list':
356 rc, nodes = driver.get_vm_list(account)
357 assert rc == RwStatus.SUCCESS
358 for n in nodes.vminfo_list:
359 print(n)
360 if n.state == 4:
361 if not cmdargs.ipsonly:
362 print("%s is shutoff" % n.vm_name)
363 elif cmdargs.ipsonly:
364 i = n.management_ip
365 if i is not None:
366 print(i)
367 else:
368 if n.management_ip is not None:
369 if len(n.private_ip_list) > 0:
370 print("%s %s,%s" % (n.vm_name, n.management_ip, ",".join([i.get_ip_address() for i in n.private_ip_list])))
371 else:
372 print("%s %s" % (n.vm_name, n.management_ip))
373 else:
374 print("%s NO IP" % n.vm_name)
375
376 elif cmdargs.which == 'create':
377 vm_create_subcommand(driver, account, cmdargs)
378
379 elif cmdargs.which == 'reboot':
380 vm_reboot_subcommand(driver, account, cmdargs)
381 elif cmdargs.which == 'start':
382 vm_start_subcommand(driver, account, cmdargs)
383 elif cmdargs.which == 'destroy':
384 vm_destroy_subcommand(driver, account, cmdargs)
385 #elif cmdargs.which == 'rebuild':
386 # vm_rebuild_subcommand(driver, account, cmdargs)
387
388def image_delete_subcommand(driver, account, cmdargs):
389 rc,images = driver.get_image_list(account)
390 assert rc == RwStatus.SUCCESS
391 account.openstack.key = 'admin'
392 if cmdargs.delete_all:
393 for i in images.imageinfo_list:
394 if RwStatus.SUCCESS != driver.delete_image(account, i.id):
395 print('Error: failed to delete image %s' % i.name)
396 else:
397 for i in images.imageinfo_list:
398 if i.name == cmdargs.image_name:
399 if RwStatus.SUCCESS != driver.delete_image(account, i.id):
400 print('Error: failed to delete image %s' % i.name)
401
402def image_subcommand(driver, account, cmdargs):
403 """Process the image subcommand"""
404 if cmdargs.which == 'list':
405 rc, images = driver.get_image_list(account)
406 assert rc == RwStatus.SUCCESS
407
408 for i in images.imageinfo_list:
409 print(i)
410
411 elif cmdargs.which == 'delete':
412 image_delete_subcommand(driver, account, cmdargs)
413
414 elif cmdargs.which == 'create':
415 account.openstack.key = 'admin'
416 rc, images = driver.get_image_list(account)
417 assert rc == RwStatus.SUCCESS
418 for i in images.imageinfo_list:
419 if i.name == cmdargs.image_name:
420 print("FATAL: image \"%s\" already exists" % cmdargs.image_name)
421 return 1
422
423 print("creating image \"%s\" using %s ..." % \
424 (cmdargs.image_name, cmdargs.file_name))
425 img = RwcalYang.ImageInfoItem()
426 img.name = cmdargs.image_name
427 img.location = cmdargs.file_name
428 img.disk_format = "qcow2"
429 img.container_format = "bare"
430 rc, img_id = driver.create_image(account, img)
431 print("... done. image_id is %s" % img_id)
432 return img_id
433
434 elif cmdargs.which == 'getid':
435 rc, images = driver.get_image_list(account)
436 assert rc == RwStatus.SUCCESS
437 found=0
438 for i in images.imageinfo_list:
439 if i.name == cmdargs.image_name:
440 print(i.id)
441 found += 1
442 if found != 1:
443 sys.exit(1)
444
445def flavor_subcommand(driver, account, cmdargs):
446 """Process the flavor subcommand"""
447 if cmdargs.which == 'list':
448 rc, sizes = driver.get_flavor_list(account)
449 assert rc == RwStatus.SUCCESS
450 for f in sizes.flavorinfo_list:
451 rc, flv = driver.get_flavor(account, f.id)
452 print(flv)
453 elif cmdargs.which == 'create':
454 account.openstack.key = 'admin'
455 flavor = RwcalYang.FlavorInfoItem()
456 flavor.name = cmdargs.flavor_name
457 flavor.vm_flavor.memory_mb = cmdargs.memory_size
458 flavor.vm_flavor.vcpu_count = cmdargs.vcpu_count
459 flavor.vm_flavor.storage_gb = cmdargs.disc_size
460 if cmdargs.hugepages_kilo:
461 flavor.guest_epa.mempage_size = cmdargs.hugepages_kilo
462 if cmdargs.numa_nodes:
463 flavor.guest_epa.numa_node_policy.node_cnt = cmdargs.numa_nodes
464 if cmdargs.dedicated_cpu:
465 flavor.guest_epa.cpu_pinning_policy = 'DEDICATED'
466 if cmdargs.pci_count:
467 dev = flavor.guest_epa.pcie_device.add()
468 dev.device_id = 'PCI_%dG_ALIAS' % (cmdargs.pci_speed)
469 dev.count = cmdargs.pci_count
470 if cmdargs.colleto:
471 dev = flavor.guest_epa.pcie_device.add()
472 dev.device_id = 'COLETO_VF_ALIAS'
473 dev.count = cmdargs.colleto
474 if cmdargs.trusted_host:
475 flavor.guest_epa.trusted_execution = True
476
477 rc, flavor_id = driver.create_flavor(account, flavor)
478 assert rc == RwStatus.SUCCESS
479
480 print("created flavor %s id %s" % (cmdargs.flavor_name, flavor_id))
481
482 elif cmdargs.which == 'delete':
483 account.openstack.key = 'admin'
484 rc, sizes = driver.get_flavor_list(account)
485 assert rc == RwStatus.SUCCESS
486 for f in sizes.flavorinfo_list:
487 if f.name == cmdargs.flavor_name:
488 rc = driver.delete_flavor(account, f.id)
489 assert rc == RwStatus.SUCCESS
490
491def hostagg_subcommand(driver, account, cmdargs):
492 """Process the hostagg subcommand"""
493 if cmdargs.which == 'list':
494 nova = ra_nova_connect(project='admin')
495 for f in nova.aggregates.list():
496 print("%-12s %-12s" % \
497 (f.name, f.availability_zone))
498
499 elif cmdargs.which == 'create':
500 nova = ra_nova_connect(project='admin')
501 hostagg = nova.aggregates.create(cmdargs.hostagg_name,
502 cmdargs.avail_zone)
503 print("created hostagg %s in %s" % (hostagg.name, hostagg.availability_zone))
504
505 elif cmdargs.which == 'delete':
506 nova = ra_nova_connect(project='admin')
507 for f in nova.aggregates.list():
508 if f.name == cmdargs.hostagg_name:
509 if cmdargs.force_delete_hosts:
510 for h in f.hosts:
511 f.remove_host(h)
512
513 f.delete()
514
515 elif cmdargs.which == 'addhost':
516 nova = ra_nova_connect(project='admin')
517 for f in nova.aggregates.list():
518 if f.name == cmdargs.hostagg_name:
519 f.add_host(cmdargs.host_name)
520
521 elif cmdargs.which == 'delhost':
522 nova = ra_nova_connect(project='admin')
523 for f in nova.aggregates.list():
524 if f.name == cmdargs.hostagg_name:
525 f.remove_host(cmdargs.host_name)
526
527 elif cmdargs.which == 'setmetadata':
528 nova = ra_nova_connect(project='admin')
529 for f in nova.aggregates.list():
530 if f.name == cmdargs.hostagg_name:
531 d = dict([cmdargs.extra_specs.split("="),])
532 f.set_metadata(d)
533
534def quota_subcommand(driver, account, cmdargs):
535 """Process the quota subcommand"""
536 nova = ra_nova_connect(project='admin')
537 cfgfile = get_openstack_file(None, cmdargs.project)
538 kwargs = load_params(cfgfile)
539
540 keystone = keystone_client.Client(username=kwargs.get('OS_USERNAME'),
541 password=kwargs.get('OS_PASSWORD'),
542 tenant_name=kwargs.get('OS_TENANT_NAME'),
543 auth_url=kwargs.get('OS_AUTH_URL'))
544 if cmdargs.which == 'set':
545 nova.quotas.update(keystone.tenant_id,
546 ram=cmdargs.memory,
547 floating_ips=cmdargs.ips,
548 instances=cmdargs.vms,
549 cores=cmdargs.vcpus)
550 elif cmdargs.which == 'get':
551 print("get quotas for tenant %s %s" % \
552 (cmdargs.project, keystone.tenant_id))
553 q = nova.quotas.get(keystone.tenant_id)
554 for att in [ 'ram', 'floating_ips', 'instances', 'cores' ]:
555 print("%12s: %6d" % ( att, getattr(q, att) ))
556
557def rules_subcommand(driver, account, cmdargs):
558 nova = ra_nova_connect(project='demo')
559 group=nova.security_groups.find(name='default')
560 if cmdargs.which == 'set':
561 try:
562 nova.security_group_rules.create(group.id,ip_protocol='tcp', from_port=1, to_port=65535 )
563 except BadRequest:
564 pass
565 try:
566 nova.security_group_rules.create(group.id, ip_protocol='icmp',from_port=-1, to_port=-1 )
567 except BadRequest:
568 pass
569
570 elif cmdargs.which == 'list':
571 for r in group.rules:
572 if r['from_port'] == -1:
573 print("rule %d proto %s from IP %s" % ( r['id'], r['ip_protocol'], r['ip_range']['cidr'] ))
574 else:
575 print("rule %d proto %s from port %d to %d from IP %s" % ( r['id'], r['ip_protocol'], r['from_port'], r['to_port'], r['ip_range']['cidr'] ))
576
577
578def register_subcommand(driver, account, cmdargs):
579 cmdargs.reserve_new_vms = False
580 vm_register('all', driver, account, cmdargs)
581
582##
583# Command line argument specification
584##
585desc="""This tool is used to manage the VMs"""
586kilo=platform.dist()[1]=='21'
587parser = argparse.ArgumentParser(description=desc)
588subparsers = parser.add_subparsers()
589ipaddr = socket.gethostbyname(socket.getfqdn())
590reservation_server_url = os.environ.get('RESERVATION_SERVER', 'http://reservation.eng.riftio.com:80')
591# ipaddr = netifaces.ifaddresses('br0')[netifaces.AF_INET][0]['addr']
592#default_auth_url = 'http://%s:5000/v3/' % ipaddr
593default_auth_url = 'http://10.66.4.27:5000/v3/'
594
595parser.add_argument('-t', '--provider-type', dest='provider_type',
596 type=str, default='OPENSTACK',
597 help='Cloud provider type (default: %(default)s)')
598parser.add_argument('-u', '--user-name', dest='user',
599 type=str, default='demo',
600 help='User name (default: %(default)s)')
601parser.add_argument('-p', '--password', dest='passwd',
602 type=str, default='mypasswd',
603 help='Password (default: %(default)s)')
604parser.add_argument('-m', '--mgmt-nw', dest='mgmt_network',
605 type=str, default='private',
606 help='mgmt-network (default: %(default)s)')
607parser.add_argument('-a', '--auth-url', dest='auth_url',
608 type=str, default=default_auth_url,
609 help='Password (default: %(default)s)')
610parser.add_argument('-r', '--reservation_server_url', dest='reservation_server_url',
611 type=str, default=reservation_server_url,
612 help='reservation server url, use None to disable (default %(default)s)' )
613parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='raise the logging level')
614
615##
616# Subparser for VM
617##
618vm_parser = subparsers.add_parser('vm')
619vm_subparsers = vm_parser.add_subparsers()
620
621# Create VM subparser
622vm_create_parser = vm_subparsers.add_parser('create')
623vm_create_parser.add_argument('-c', '--count',
624 type=int, default=1,
625 help='The number of VMs to launch '
626 '(default: %(default)d)')
627vm_create_parser.add_argument('-i', '--image',
628 default='rwopenstack_vm',
629 help='Specify the image for the VM (default: %(default)s)')
630vm_create_parser.add_argument('-n', '--name',
631 help='Specify the name of the VM')
632vm_create_parser.add_argument('-f', '--flavor',
633 help='Specify the flavor for the VM')
634vm_create_parser.add_argument('-R', '--reserve', dest='reserve_new_vms',
635 action='store_true', help='reserve any newly created VMs')
636vm_create_parser.add_argument('-s', '--single', dest='wait_after_create',
637 action='store_true', help='wait for each VM to start before creating the next')
638vm_create_parser.add_argument('-N', '--networks', dest='networks', type=str,
639 default='private,private2,private3,private4',
640 help='comma separated list of networks to connect these VMs to (default: %(default)s)' )
641
642vm_create_parser.set_defaults(which='create')
643# Reboot VM subparser
644vm_reboot_parser = vm_subparsers.add_parser('reboot')
645group = vm_reboot_parser.add_mutually_exclusive_group()
646group.add_argument('-n', '--vm-name', dest='vm_name',
647 type=str,
648 help='Specify the name of the VM')
649group.add_argument('-a', '--reboot-all',
650 dest='reboot_all', action='store_true',
651 help='Reboot all VMs')
652vm_reboot_parser.add_argument('-s', '--sleep', dest='sleep_time', type=int, default=4, help='time in seconds to sleep between reboots')
653vm_reboot_parser.set_defaults(which='reboot')
654
655
656"""
657# start VM subparser
658vm_start_parser = vm_subparsers.add_parser('start')
659group = vm_start_parser.add_mutually_exclusive_group()
660group.add_argument('-n', '--vm-name', dest='vm_name',
661 type=str,
662 help='Specify the name of the VM')
663group.add_argument('-a', '--start-all',
664 dest='start_all', action='store_true',
665 help='Start all VMs')
666vm_start_parser.set_defaults(which='start')
667"""
668
669# Destroy VM subparser
670vm_destroy_parser = vm_subparsers.add_parser('destroy')
671group = vm_destroy_parser.add_mutually_exclusive_group()
672group.add_argument('-n', '--vm-name', dest='vm_name',
673 type=str,
674 help='Specify the name of the VM (accepts regular expressions)')
675group.add_argument('-a', '--destroy-all',
676 dest='destroy_all', action='store_true',
677 help='Delete all VMs')
678group.add_argument('-w', '--wait',
679 dest='wait', action='store_true',
680 help='destroy all and wait until all VMs have exited')
681vm_destroy_parser.set_defaults(which='destroy')
682
683# Rebuild VM subparser
684vm_rebuild_parser = vm_subparsers.add_parser('rebuild')
685group = vm_rebuild_parser.add_mutually_exclusive_group()
686group.add_argument('-n', '--vm-name', dest='vm_name',
687 type=str,
688 help='Specify the name of the VM (accepts regular expressions)')
689group.add_argument('-a', '--rebuild-all',
690 dest='rebuild_all', action='store_true',
691 help='Rebuild all VMs')
692vm_rebuild_parser.add_argument('-i', '--image-name', dest='image_name',
693 type=str,
694 help='Specify the name of the image')
695vm_rebuild_parser.set_defaults(which='rebuild')
696
697# List VM subparser
698vm_list_parser = vm_subparsers.add_parser('list')
699vm_list_parser.set_defaults(which='list')
700vm_list_parser.add_argument('-i', '--ips_only', dest='ipsonly',
701 action='store_true',
702 help='only list IP addresses')
703
704vm_parser.set_defaults(func=vm_subcommand)
705
706##
707# Subparser for image
708##
709image_parser = subparsers.add_parser('image')
710image_subparsers = image_parser.add_subparsers()
711
712# List image subparser
713image_list_parser = image_subparsers.add_parser('list')
714image_list_parser.set_defaults(which='list')
715
716# Delete image subparser
717image_destroy_parser = image_subparsers.add_parser('delete')
718group = image_destroy_parser.add_mutually_exclusive_group()
719group.add_argument('-n', '--image-name', dest='image_name',
720 type=str,
721 help='Specify the name of the image')
722group.add_argument('-a', '--delete-all',
723 dest='delete_all', action='store_true',
724 help='Delete all images')
725image_destroy_parser.set_defaults(which='delete')
726
727# create image
728image_create_parser = image_subparsers.add_parser('create')
729image_create_parser.set_defaults(which='create')
730image_create_parser.add_argument('-n', '--image-name', dest='image_name',
731 type=str,
732 default="rwopenstack_vm",
733 help='Specify the name of the image')
734image_create_parser.add_argument('-f', '--filename', dest='file_name',
735 type=str,
736 default='/net/sharedfiles/home1/common/vm/rift-root-current.qcow2',
737 help='name of the existing qcow2 image file')
738
739
740image_create_parser = image_subparsers.add_parser('getid')
741image_create_parser.set_defaults(which='getid')
742image_create_parser.add_argument('-n', '--image-name', dest='image_name',
743 type=str,
744 default="rwopenstack_vm",
745 help='Specify the name of the image')
746image_parser.set_defaults(func=image_subcommand)
747
748##
749# Subparser for flavor
750##
751flavor_parser = subparsers.add_parser('flavor')
752flavor_subparsers = flavor_parser.add_subparsers()
753
754# List flavor subparser
755flavor_list_parser = flavor_subparsers.add_parser('list')
756flavor_list_parser.set_defaults(which='list')
757
758# Create flavor subparser
759flavor_create_parser = flavor_subparsers.add_parser('create')
760flavor_create_parser.set_defaults(which='create')
761flavor_create_parser.add_argument('-n', '--flavor-name', dest='flavor_name',
762 type=str,
763 help='Specify the name of the flavor')
764flavor_create_parser.add_argument('-m', '--memory-size', dest='memory_size',
765 type=int, default=1024,
766 help='Specify the size of the memory in MB '
767 '(default: %(default)d)')
768flavor_create_parser.add_argument('-d', '--disc-size', dest='disc_size',
769 type=int, default=16,
770 help='Specify the size of the disc in GB '
771 '(default: %(default)d)')
772flavor_create_parser.add_argument('-v', '--vcpu-count', dest='vcpu_count',
773 type=int, default=1,
774 help='Specify the number of VCPUs '
775 '(default: %(default)d)')
776flavor_create_parser.add_argument('-p', '--pci-count', dest='pci_count',
777 type=int, default=0,
778 help='Specify the number of PCI devices '
779 '(default: %(default)d)')
780flavor_create_parser.add_argument('-s', '--pci-speed', dest='pci_speed',
781 type=int, default=10,
782 help='Specify the speed of the PCI devices in Gbps (default: %(default)d)')
783flavor_create_parser.add_argument('-e', '--hostagg-extra-specs', dest='extra_specs',
784 type=str,
785 help='Specify the extra spec ')
786flavor_create_parser.add_argument('-b', '--back-with-hugepages', dest='enable_hugepages',
787 action='store_true',
788 help='Enable memory backing with hugepages')
789flavor_create_parser.add_argument('-B', '--back-with-hugepages-kilo', dest='hugepages_kilo',
790 type=str,
791 help='Enable memory backing with hugepages for kilo')
792flavor_create_parser.add_argument('-D', '--dedicated_cpu', dest='dedicated_cpu',
793 action='store_true',
794 help='Dedicated CPU usage')
795flavor_create_parser.add_argument('-T', '--cpu_threads', dest='cpu_threads',
796 type=str,
797 help='CPU threads usage')
798flavor_create_parser.add_argument('-N', '--numa_nodes', dest='numa_nodes',
799 type=int,
800 help='Configure numa nodes')
801flavor_create_parser.add_argument('-t', '--trusted-host', dest='trusted_host', action='store_true', help='restrict instances to trusted hosts')
802flavor_create_parser.add_argument('-c', '--crypto-cards', dest='colleto', type=int, default=0, \
803 help='how many colleto creek VFs should be passed thru to the VM')
804
805# Delete flavor subparser
806flavor_delete_parser = flavor_subparsers.add_parser('delete')
807flavor_delete_parser.set_defaults(which='delete')
808flavor_delete_parser.add_argument('-n', '--flavor-name', dest='flavor_name',
809 type=str,
810 help='Specify the name of the flavor')
811
812flavor_parser.set_defaults(func=flavor_subcommand)
813
814##
815# Subparser for host-aggregate
816##
817hostagg_parser = subparsers.add_parser('hostagg')
818hostagg_subparsers = hostagg_parser.add_subparsers()
819
820# List host-aggregate subparser
821hostagg_list_parser = hostagg_subparsers.add_parser('list')
822hostagg_list_parser.set_defaults(which='list')
823
824# Create hostagg subparser
825hostagg_create_parser = hostagg_subparsers.add_parser('create')
826hostagg_create_parser.set_defaults(which='create')
827hostagg_create_parser.add_argument('-n', '--hostagg-name', dest='hostagg_name',
828 type=str,
829 help='Specify the name of the hostagg')
830hostagg_create_parser.add_argument('-a', '--avail-zone', dest='avail_zone',
831 type=str,
832 help='Specify the name of the availability zone')
833# Delete hostagg subparser
834hostagg_delete_parser = hostagg_subparsers.add_parser('delete')
835hostagg_delete_parser.set_defaults(which='delete')
836hostagg_delete_parser.add_argument('-n', '--hostagg-name', dest='hostagg_name',
837 type=str,
838 help='Specify the name of the hostagg')
839hostagg_delete_parser.add_argument('-f', '--force-delete-hosts', dest='force_delete_hosts',
840 action='store_true',
841 help='Delete the existing hosts')
842
843# Add host subparser
844hostagg_addhost_parser = hostagg_subparsers.add_parser('addhost')
845hostagg_addhost_parser.set_defaults(which='addhost')
846hostagg_addhost_parser.add_argument('-n', '--hostagg-name', dest='hostagg_name',
847 type=str,
848 help='Specify the name of the hostagg')
849hostagg_addhost_parser.add_argument('-c', '--compute-host-name', dest='host_name',
850 type=str,
851 help='Specify the name of the host to be added')
852
853# Remove host subparser
854hostagg_delhost_parser = hostagg_subparsers.add_parser('delhost')
855hostagg_delhost_parser.set_defaults(which='delhost')
856hostagg_delhost_parser.add_argument('-n', '--hostagg-name', dest='hostagg_name',
857 type=str,
858 help='Specify the name of the hostagg')
859hostagg_delhost_parser.add_argument('-c', '--compute-host-name', dest='host_name',
860 type=str,
861 help='Specify the name of the host to be removed')
862
863# Set meta-data subparser
864hostagg_setdata_parser = hostagg_subparsers.add_parser('setmetadata')
865hostagg_setdata_parser.set_defaults(which='setmetadata')
866hostagg_setdata_parser.add_argument('-n', '--hostagg-name', dest='hostagg_name',
867 type=str,
868 help='Specify the name of the hostagg')
869hostagg_setdata_parser.add_argument('-d', '--meta-data', dest='extra_specs',
870 type=str,
871 help='Specify the meta-data to be associated to this host aggregate')
872
873hostagg_parser.set_defaults(func=hostagg_subcommand)
874
875##
876# Subparser for quota
877##
878quota_parser = subparsers.add_parser('quota')
879quota_subparser = quota_parser.add_subparsers()
880quota_set_parser = quota_subparser.add_parser('set')
881
882# quota set subparser
883quota_set_parser.set_defaults(which='set')
884quota_set_parser.add_argument('-p', '--project', dest='project',
885 type=str, default='demo',
886 help='project name that you wish to set '
887 'the quotas for')
888quota_set_parser.add_argument('-c', '--vcpus', dest='vcpus',
889 type=int, default=48,
890 help='Maximum number of virtual CPUs that can '
891 'be assigned to all VMs in aggregate')
892quota_set_parser.add_argument('-v', '--vms', dest='vms',
893 type=int, default=24,
894 help='Maximum number of VMs that can be created '
895 'on this openstack instance '
896 '(which may be more than 1 machine)')
897quota_set_parser.add_argument('-i', '--ips', dest='ips',
898 type=int, default=250,
899 help='Maximum number of Floating IP Addresses '
900 'that can be assigned to all VMs '
901 'in aggregate')
902quota_set_parser.add_argument('-m', '--memory', dest='memory',
903 type=int, default=122880,
904 help='Maximum amount of RAM in MB that can be '
905 'assigned to all VMs in aggregate')
906
907# quota get subparser
908quota_get_parser = quota_subparser.add_parser('get')
909quota_get_parser.add_argument('-p', '--project', dest='project',
910 type=str, default='demo',
911 help='project name that you wish to get '
912 'the quotas for')
913quota_get_parser.set_defaults(which='get')
914quota_parser.set_defaults(func=quota_subcommand)
915
916##
917# rules subparser
918##
919rules_parser = subparsers.add_parser('rules')
920rules_parser.set_defaults(func=rules_subcommand)
921rules_subparser = rules_parser.add_subparsers()
922rules_set_parser = rules_subparser.add_parser('set')
923rules_set_parser.set_defaults(which='set')
924rules_list_parser = rules_subparser.add_parser('list')
925rules_list_parser.set_defaults(which='list')
926
927register_parser = subparsers.add_parser('register')
928register_parser.set_defaults(func=register_subcommand)
929
930cmdargs = parser.parse_args()
931
932
933if __name__ == "__main__":
934 logger=logging.getLogger(__name__)
935 if cmdargs.debug:
936 logging.basicConfig(format='%(asctime)-15s %(levelname)s %(message)s', level=logging.DEBUG)
937 else:
938 logging.basicConfig(format='%(asctime)-15s %(levelname)s %(message)s', level=logging.WARNING)
939
940 if cmdargs.provider_type == 'OPENSTACK':
941 #cls = get_driver(Provider.OPENSTACK)
942 pass
943 elif cmdargs.provider_type == 'VSPHERE':
944 cls = get_driver(Provider.VSPHERE)
945 else:
946 sys.exit("Cloud provider %s is NOT supported yet" % cmdargs.provider_type)
947
948 if cmdargs.reservation_server_url == "None" or cmdargs.reservation_server_url == "":
949 cmdargs.reservation_server_url = None
950 if cmdargs.reservation_server_url is not None:
951 sys.path.append('/usr/rift/lib')
952 try:
953 import ndl
954 except Exception as e:
955 logger.warning("Error loading Reservation library")
956 testbed=None
957 else:
958 testbed=ndl.Testbed()
959 testbed.set_server(cmdargs.reservation_server_url)
960
961
962
963 if cmdargs.provider_type == 'OPENSTACK':
964 account = RwcalYang.CloudAccount()
965 account.account_type = "openstack"
966 account.openstack.key = cmdargs.user
967 account.openstack.secret = cmdargs.passwd
968 account.openstack.auth_url = cmdargs.auth_url
969 account.openstack.tenant = cmdargs.user
970 account.openstack.mgmt_network = cmdargs.mgmt_network
971
972 plugin = rw_peas.PeasPlugin('rwcal_openstack', 'RwCal-1.0')
973 engine, info, extension = plugin()
974 driver = plugin.get_interface("Cloud")
975 # Get the RwLogger context
976 rwloggerctx = rwlogger.RwLog.Ctx.new("Cal-Log")
977 try:
978 rc = driver.init(rwloggerctx)
979 assert rc == RwStatus.SUCCESS
980 except:
981 logger.error("ERROR:Cal plugin instantiation failed. Aborting tests")
982 else:
983 logger.info("Openstack Cal plugin successfully instantiated")
984
985 cmdargs.func(driver, account, cmdargs)
986
987 elif cmdargs.provider_type == 'VSPHERE':
988 driver = cls(cmdargs.user, cmdargs.passwd, host='vcenter' )
989 cmdargs.func(driver, cmdargs)