2 # Copyright 2016 RIFT.IO Inc
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
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 import os
,sys
,platform
24 from pprint
import pprint
27 from gi
.repository
import RwcalYang
28 from gi
.repository
.RwTypes
import RwStatus
36 def wait_till_active(driver
, account
, vm_id_list
, timeout
):
38 Wait until VM reaches ACTIVE state.
40 # Wait while VM goes to required state
43 end
= time
.time() + timeout
46 while ( time
.time() < end
) and not done
:
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':
56 def get_image_name(node
):
57 images
= driver
.list_images()
59 if i
.id == node
.extra
['imageId']:
63 def get_flavor_name(flavorid
):
66 nova
= ra_nova_connect(project
='admin')
67 for f
in nova
.flavors
.list(True):
73 return socket
.gethostname().split('.')[0]
75 def vm_register(id, driver
, account
, cmdargs
, header
=True):
77 print("Cannot register VM without reservation system")
80 if cmdargs
.reserve_new_vms
:
81 user
=os
.environ
['USER']
84 fmt
="%-28s %-12s %-12s %-15s"
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
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()
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
)
108 class OFromDict(object):
109 def __init__(self
, d
):
113 def 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")
118 rc
, sizes
= driver
.get_flavor_list(account
)
119 assert rc
== RwStatus
.SUCCESS
122 size
= [s
for s
in sizes
.flavorinfo_list
if s
.name
== cmdargs
.flavor
][0]
124 sys
.exit("Error: Failed to create VM, couldn't find flavor %s" % \
127 rc
, images
= driver
.get_image_list(account
)
128 assert rc
== RwStatus
.SUCCESS
130 sys
.exit("Error: No images found")
132 image
= [i
for i
in images
.imageinfo_list
if cmdargs
.image
in i
.name
][0]
134 sys
.exit("Error: Failed to create VM, couldn't find image %s" % \
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()
147 for n
in nodes
.vminfo_list
:
148 if n
.vm_name
.startswith(prefix
):
149 temp_str
= n
.vm_name
[len(prefix
):]
153 temp
= int(n
.vm_name
[len(prefix
):])
159 for i
in range(0, cmdargs
.count
):
161 vm_name
= cmdargs
.name
163 vm_name
= '%s%d' % (prefix
, vmid
+i
+1)
165 rc
, netlist
= driver
.get_network_list(account
)
166 assert rc
== RwStatus
.SUCCESS
167 for network
in netlist
.networkinfo_list
:
170 vm
= RwcalYang
.VMInfoItem()
172 vm
.flavor_id
= size
.id
173 vm
.image_id
= image
.id
174 vm
.cloud_init
.userdata
= ''
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
183 logger
.debug('creating VM using nets %s' % cmdargs
.networks
)
184 for net
in cmdargs
.networks
.split(','):
186 print(("Invalid network name '%s'" % net
))
187 print(('available nets are %s' % ','.join(list(nets
.keys())) ))
189 if net
!= cmdargs
.mgmt_network
:
190 vm
.network_list
.append(nets
[net
])
192 print(vm
.network_list
)
193 rc
, node_id
= driver
.create_vm(account
, vm
)
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)
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)
208 for node
in nodelist
:
209 vm_register(node
, driver
, account
, cmdargs
, header
)
213 def 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
:
219 for n
in nodes
.vminfo_list
:
220 if testbed
is not None:
222 testbed
.remove_resource(n
.vm_name
)
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
)
232 sys
.stderr
.write("waiting for %d VMs to exit...\n" % ct
)
235 rc
, nodesnw
= driver
.get_vm_list(account
)
236 assert rc
== RwStatus
.SUCCESS
237 ct
= len(nodesnw
.vminfo_list
)
242 vm_re
= re
.compile('^%s$' % cmdargs
.vm_name
)
244 for n
in nodes
.vminfo_list
:
245 if vm_re
.match(n
.vm_name
):
247 if testbed
is not None:
249 testbed
.remove_resource(n
.vm_name
)
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
)
255 print('destroyed %s' % n
.vm_name
)
257 print("No VMs matching \"%s\" found" % ( cmdargs
.vm_name
))
260 def vm_rebuild_subcommand(driver
, account
, cmdargs
):
261 images
= driver
.list_images()
264 if i
.name
== cmdargs
.image_name
:
268 print('Error: Rebuild failed - image %s not found' % cmdargs
.image_name
)
271 nodes
= driver
.list_nodes()
272 if cmdargs
.rebuild_all
:
275 if not driver
.ex_rebuild(n
,image
):
276 print('Error: failed to rebuild node %s' % n
.name
)
283 nw_nodes
= driver
.list_nodes()
285 if nw
.name
== n
.name
:
286 if nw
.state
== n
.state
:
290 vm_re
= re
.compile('^%s$' % cmdargs
.vm_name
)
293 if vm_re
.match(n
.name
):
295 if not driver
.ex_rebuild(n
,image
):
296 print('Error: failed to rebuild node %s' % n
.name
)
298 print('Rebuilt %s' % n
.name
)
302 nw_nodes
= driver
.list_nodes()
304 if nw
.name
== n
.name
:
305 if nw
.state
== n
.state
:
309 print("No VMs matching \"%s\" found" % ( cmdargs
.vm_name
))
313 def 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
:
320 print 'Error: failed to reboot node %s' % n.name
322 print "rebooted %s" % n.name
324 time
.sleep(cmdargs
.sleep_time
)
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
)
331 print("rebooted %s" % n
.vm_name
)
334 def 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
:
340 if RwStatus
.SUCCESS
!= driver
.start_vm(account
, n
.vm_id
):
341 print('Error: failed to start node %s' % n
.vm_name
)
343 print("started %s" % n
.vm_name
)
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
)
350 print("started %s" % n
.vm_name
)
352 def vm_subcommand(driver
, account
, cmdargs
):
353 """Process the vm subcommand"""
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
:
361 if not cmdargs
.ipsonly
:
362 print("%s is shutoff" % n
.vm_name
)
363 elif cmdargs
.ipsonly
:
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
])))
372 print("%s %s" % (n
.vm_name
, n
.management_ip
))
374 print("%s NO IP" % n
.vm_name
)
376 elif cmdargs
.which
== 'create':
377 vm_create_subcommand(driver
, account
, cmdargs
)
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)
388 def 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
)
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
)
402 def 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
408 for i
in images
.imageinfo_list
:
411 elif cmdargs
.which
== 'delete':
412 image_delete_subcommand(driver
, account
, cmdargs
)
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
)
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
)
434 elif cmdargs
.which
== 'getid':
435 rc
, images
= driver
.get_image_list(account
)
436 assert rc
== RwStatus
.SUCCESS
438 for i
in images
.imageinfo_list
:
439 if i
.name
== cmdargs
.image_name
:
445 def 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)
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
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
477 rc
, flavor_id
= driver
.create_flavor(account
, flavor
)
478 assert rc
== RwStatus
.SUCCESS
480 print("created flavor %s id %s" % (cmdargs
.flavor_name
, flavor_id
))
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
491 def 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
))
499 elif cmdargs
.which
== 'create':
500 nova
= ra_nova_connect(project
='admin')
501 hostagg
= nova
.aggregates
.create(cmdargs
.hostagg_name
,
503 print("created hostagg %s in %s" % (hostagg
.name
, hostagg
.availability_zone
))
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
:
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
)
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
)
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("="),])
534 def 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
)
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
,
547 floating_ips
=cmdargs
.ips
,
548 instances
=cmdargs
.vms
,
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
) ))
557 def 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':
562 nova
.security_group_rules
.create(group
.id,ip_protocol
='tcp', from_port
=1, to_port
=65535 )
566 nova
.security_group_rules
.create(group
.id, ip_protocol
='icmp',from_port
=-1, to_port
=-1 )
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'] ))
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'] ))
578 def register_subcommand(driver
, account
, cmdargs
):
579 cmdargs
.reserve_new_vms
= False
580 vm_register('all', driver
, account
, cmdargs
)
583 # Command line argument specification
585 desc
="""This tool is used to manage the VMs"""
586 kilo
=platform
.dist()[1]=='21'
587 parser
= argparse
.ArgumentParser(description
=desc
)
588 subparsers
= parser
.add_subparsers()
589 ipaddr
= socket
.gethostbyname(socket
.getfqdn())
590 reservation_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
593 default_auth_url
= 'http://10.66.4.27:5000/v3/'
595 parser
.add_argument('-t', '--provider-type', dest
='provider_type',
596 type=str, default
='OPENSTACK',
597 help='Cloud provider type (default: %(default)s)')
598 parser
.add_argument('-u', '--user-name', dest
='user',
599 type=str, default
='demo',
600 help='User name (default: %(default)s)')
601 parser
.add_argument('-p', '--password', dest
='passwd',
602 type=str, default
='mypasswd',
603 help='Password (default: %(default)s)')
604 parser
.add_argument('-m', '--mgmt-nw', dest
='mgmt_network',
605 type=str, default
='private',
606 help='mgmt-network (default: %(default)s)')
607 parser
.add_argument('-a', '--auth-url', dest
='auth_url',
608 type=str, default
=default_auth_url
,
609 help='Password (default: %(default)s)')
610 parser
.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)' )
613 parser
.add_argument('-d', '--debug', dest
='debug', action
='store_true', help='raise the logging level')
618 vm_parser
= subparsers
.add_parser('vm')
619 vm_subparsers
= vm_parser
.add_subparsers()
621 # Create VM subparser
622 vm_create_parser
= vm_subparsers
.add_parser('create')
623 vm_create_parser
.add_argument('-c', '--count',
625 help='The number of VMs to launch '
626 '(default: %(default)d)')
627 vm_create_parser
.add_argument('-i', '--image',
628 default
='rwopenstack_vm',
629 help='Specify the image for the VM (default: %(default)s)')
630 vm_create_parser
.add_argument('-n', '--name',
631 help='Specify the name of the VM')
632 vm_create_parser
.add_argument('-f', '--flavor',
633 help='Specify the flavor for the VM')
634 vm_create_parser
.add_argument('-R', '--reserve', dest
='reserve_new_vms',
635 action
='store_true', help='reserve any newly created VMs')
636 vm_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')
638 vm_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)' )
642 vm_create_parser
.set_defaults(which
='create')
643 # Reboot VM subparser
644 vm_reboot_parser
= vm_subparsers
.add_parser('reboot')
645 group
= vm_reboot_parser
.add_mutually_exclusive_group()
646 group
.add_argument('-n', '--vm-name', dest
='vm_name',
648 help='Specify the name of the VM')
649 group
.add_argument('-a', '--reboot-all',
650 dest
='reboot_all', action
='store_true',
651 help='Reboot all VMs')
652 vm_reboot_parser
.add_argument('-s', '--sleep', dest
='sleep_time', type=int, default
=4, help='time in seconds to sleep between reboots')
653 vm_reboot_parser
.set_defaults(which
='reboot')
658 vm_start_parser = vm_subparsers.add_parser('start')
659 group = vm_start_parser.add_mutually_exclusive_group()
660 group.add_argument('-n', '--vm-name', dest='vm_name',
662 help='Specify the name of the VM')
663 group.add_argument('-a', '--start-all',
664 dest='start_all', action='store_true',
665 help='Start all VMs')
666 vm_start_parser.set_defaults(which='start')
669 # Destroy VM subparser
670 vm_destroy_parser
= vm_subparsers
.add_parser('destroy')
671 group
= vm_destroy_parser
.add_mutually_exclusive_group()
672 group
.add_argument('-n', '--vm-name', dest
='vm_name',
674 help='Specify the name of the VM (accepts regular expressions)')
675 group
.add_argument('-a', '--destroy-all',
676 dest
='destroy_all', action
='store_true',
677 help='Delete all VMs')
678 group
.add_argument('-w', '--wait',
679 dest
='wait', action
='store_true',
680 help='destroy all and wait until all VMs have exited')
681 vm_destroy_parser
.set_defaults(which
='destroy')
683 # Rebuild VM subparser
684 vm_rebuild_parser
= vm_subparsers
.add_parser('rebuild')
685 group
= vm_rebuild_parser
.add_mutually_exclusive_group()
686 group
.add_argument('-n', '--vm-name', dest
='vm_name',
688 help='Specify the name of the VM (accepts regular expressions)')
689 group
.add_argument('-a', '--rebuild-all',
690 dest
='rebuild_all', action
='store_true',
691 help='Rebuild all VMs')
692 vm_rebuild_parser
.add_argument('-i', '--image-name', dest
='image_name',
694 help='Specify the name of the image')
695 vm_rebuild_parser
.set_defaults(which
='rebuild')
698 vm_list_parser
= vm_subparsers
.add_parser('list')
699 vm_list_parser
.set_defaults(which
='list')
700 vm_list_parser
.add_argument('-i', '--ips_only', dest
='ipsonly',
702 help='only list IP addresses')
704 vm_parser
.set_defaults(func
=vm_subcommand
)
707 # Subparser for image
709 image_parser
= subparsers
.add_parser('image')
710 image_subparsers
= image_parser
.add_subparsers()
712 # List image subparser
713 image_list_parser
= image_subparsers
.add_parser('list')
714 image_list_parser
.set_defaults(which
='list')
716 # Delete image subparser
717 image_destroy_parser
= image_subparsers
.add_parser('delete')
718 group
= image_destroy_parser
.add_mutually_exclusive_group()
719 group
.add_argument('-n', '--image-name', dest
='image_name',
721 help='Specify the name of the image')
722 group
.add_argument('-a', '--delete-all',
723 dest
='delete_all', action
='store_true',
724 help='Delete all images')
725 image_destroy_parser
.set_defaults(which
='delete')
728 image_create_parser
= image_subparsers
.add_parser('create')
729 image_create_parser
.set_defaults(which
='create')
730 image_create_parser
.add_argument('-n', '--image-name', dest
='image_name',
732 default
="rwopenstack_vm",
733 help='Specify the name of the image')
734 image_create_parser
.add_argument('-f', '--filename', dest
='file_name',
736 default
='/net/sharedfiles/home1/common/vm/rift-root-current.qcow2',
737 help='name of the existing qcow2 image file')
740 image_create_parser
= image_subparsers
.add_parser('getid')
741 image_create_parser
.set_defaults(which
='getid')
742 image_create_parser
.add_argument('-n', '--image-name', dest
='image_name',
744 default
="rwopenstack_vm",
745 help='Specify the name of the image')
746 image_parser
.set_defaults(func
=image_subcommand
)
749 # Subparser for flavor
751 flavor_parser
= subparsers
.add_parser('flavor')
752 flavor_subparsers
= flavor_parser
.add_subparsers()
754 # List flavor subparser
755 flavor_list_parser
= flavor_subparsers
.add_parser('list')
756 flavor_list_parser
.set_defaults(which
='list')
758 # Create flavor subparser
759 flavor_create_parser
= flavor_subparsers
.add_parser('create')
760 flavor_create_parser
.set_defaults(which
='create')
761 flavor_create_parser
.add_argument('-n', '--flavor-name', dest
='flavor_name',
763 help='Specify the name of the flavor')
764 flavor_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)')
768 flavor_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)')
772 flavor_create_parser
.add_argument('-v', '--vcpu-count', dest
='vcpu_count',
774 help='Specify the number of VCPUs '
775 '(default: %(default)d)')
776 flavor_create_parser
.add_argument('-p', '--pci-count', dest
='pci_count',
778 help='Specify the number of PCI devices '
779 '(default: %(default)d)')
780 flavor_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)')
783 flavor_create_parser
.add_argument('-e', '--hostagg-extra-specs', dest
='extra_specs',
785 help='Specify the extra spec ')
786 flavor_create_parser
.add_argument('-b', '--back-with-hugepages', dest
='enable_hugepages',
788 help='Enable memory backing with hugepages')
789 flavor_create_parser
.add_argument('-B', '--back-with-hugepages-kilo', dest
='hugepages_kilo',
791 help='Enable memory backing with hugepages for kilo')
792 flavor_create_parser
.add_argument('-D', '--dedicated_cpu', dest
='dedicated_cpu',
794 help='Dedicated CPU usage')
795 flavor_create_parser
.add_argument('-T', '--cpu_threads', dest
='cpu_threads',
797 help='CPU threads usage')
798 flavor_create_parser
.add_argument('-N', '--numa_nodes', dest
='numa_nodes',
800 help='Configure numa nodes')
801 flavor_create_parser
.add_argument('-t', '--trusted-host', dest
='trusted_host', action
='store_true', help='restrict instances to trusted hosts')
802 flavor_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')
805 # Delete flavor subparser
806 flavor_delete_parser
= flavor_subparsers
.add_parser('delete')
807 flavor_delete_parser
.set_defaults(which
='delete')
808 flavor_delete_parser
.add_argument('-n', '--flavor-name', dest
='flavor_name',
810 help='Specify the name of the flavor')
812 flavor_parser
.set_defaults(func
=flavor_subcommand
)
815 # Subparser for host-aggregate
817 hostagg_parser
= subparsers
.add_parser('hostagg')
818 hostagg_subparsers
= hostagg_parser
.add_subparsers()
820 # List host-aggregate subparser
821 hostagg_list_parser
= hostagg_subparsers
.add_parser('list')
822 hostagg_list_parser
.set_defaults(which
='list')
824 # Create hostagg subparser
825 hostagg_create_parser
= hostagg_subparsers
.add_parser('create')
826 hostagg_create_parser
.set_defaults(which
='create')
827 hostagg_create_parser
.add_argument('-n', '--hostagg-name', dest
='hostagg_name',
829 help='Specify the name of the hostagg')
830 hostagg_create_parser
.add_argument('-a', '--avail-zone', dest
='avail_zone',
832 help='Specify the name of the availability zone')
833 # Delete hostagg subparser
834 hostagg_delete_parser
= hostagg_subparsers
.add_parser('delete')
835 hostagg_delete_parser
.set_defaults(which
='delete')
836 hostagg_delete_parser
.add_argument('-n', '--hostagg-name', dest
='hostagg_name',
838 help='Specify the name of the hostagg')
839 hostagg_delete_parser
.add_argument('-f', '--force-delete-hosts', dest
='force_delete_hosts',
841 help='Delete the existing hosts')
844 hostagg_addhost_parser
= hostagg_subparsers
.add_parser('addhost')
845 hostagg_addhost_parser
.set_defaults(which
='addhost')
846 hostagg_addhost_parser
.add_argument('-n', '--hostagg-name', dest
='hostagg_name',
848 help='Specify the name of the hostagg')
849 hostagg_addhost_parser
.add_argument('-c', '--compute-host-name', dest
='host_name',
851 help='Specify the name of the host to be added')
853 # Remove host subparser
854 hostagg_delhost_parser
= hostagg_subparsers
.add_parser('delhost')
855 hostagg_delhost_parser
.set_defaults(which
='delhost')
856 hostagg_delhost_parser
.add_argument('-n', '--hostagg-name', dest
='hostagg_name',
858 help='Specify the name of the hostagg')
859 hostagg_delhost_parser
.add_argument('-c', '--compute-host-name', dest
='host_name',
861 help='Specify the name of the host to be removed')
863 # Set meta-data subparser
864 hostagg_setdata_parser
= hostagg_subparsers
.add_parser('setmetadata')
865 hostagg_setdata_parser
.set_defaults(which
='setmetadata')
866 hostagg_setdata_parser
.add_argument('-n', '--hostagg-name', dest
='hostagg_name',
868 help='Specify the name of the hostagg')
869 hostagg_setdata_parser
.add_argument('-d', '--meta-data', dest
='extra_specs',
871 help='Specify the meta-data to be associated to this host aggregate')
873 hostagg_parser
.set_defaults(func
=hostagg_subcommand
)
876 # Subparser for quota
878 quota_parser
= subparsers
.add_parser('quota')
879 quota_subparser
= quota_parser
.add_subparsers()
880 quota_set_parser
= quota_subparser
.add_parser('set')
882 # quota set subparser
883 quota_set_parser
.set_defaults(which
='set')
884 quota_set_parser
.add_argument('-p', '--project', dest
='project',
885 type=str, default
='demo',
886 help='project name that you wish to set '
888 quota_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')
892 quota_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)')
897 quota_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 '
902 quota_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')
907 # quota get subparser
908 quota_get_parser
= quota_subparser
.add_parser('get')
909 quota_get_parser
.add_argument('-p', '--project', dest
='project',
910 type=str, default
='demo',
911 help='project name that you wish to get '
913 quota_get_parser
.set_defaults(which
='get')
914 quota_parser
.set_defaults(func
=quota_subcommand
)
919 rules_parser
= subparsers
.add_parser('rules')
920 rules_parser
.set_defaults(func
=rules_subcommand
)
921 rules_subparser
= rules_parser
.add_subparsers()
922 rules_set_parser
= rules_subparser
.add_parser('set')
923 rules_set_parser
.set_defaults(which
='set')
924 rules_list_parser
= rules_subparser
.add_parser('list')
925 rules_list_parser
.set_defaults(which
='list')
927 register_parser
= subparsers
.add_parser('register')
928 register_parser
.set_defaults(func
=register_subcommand
)
930 cmdargs
= parser
.parse_args()
933 if __name__
== "__main__":
934 logger
=logging
.getLogger(__name__
)
936 logging
.basicConfig(format
='%(asctime)-15s %(levelname)s %(message)s', level
=logging
.DEBUG
)
938 logging
.basicConfig(format
='%(asctime)-15s %(levelname)s %(message)s', level
=logging
.WARNING
)
940 if cmdargs
.provider_type
== 'OPENSTACK':
941 #cls = get_driver(Provider.OPENSTACK)
943 elif cmdargs
.provider_type
== 'VSPHERE':
944 cls
= get_driver(Provider
.VSPHERE
)
946 sys
.exit("Cloud provider %s is NOT supported yet" % cmdargs
.provider_type
)
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')
954 except Exception as e
:
955 logger
.warning("Error loading Reservation library")
958 testbed
=ndl
.Testbed()
959 testbed
.set_server(cmdargs
.reservation_server_url
)
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
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")
978 rc
= driver
.init(rwloggerctx
)
979 assert rc
== RwStatus
.SUCCESS
981 logger
.error("ERROR:Cal plugin instantiation failed. Aborting tests")
983 logger
.info("Openstack Cal plugin successfully instantiated")
985 cmdargs
.func(driver
, account
, cmdargs
)
987 elif cmdargs
.provider_type
== 'VSPHERE':
988 driver
= cls(cmdargs
.user
, cmdargs
.passwd
, host
='vcenter' )
989 cmdargs
.func(driver
, cmdargs
)