2 # -*- coding: utf-8 -*-
4 # This file is standalone vmware vcloud director util
7 # Licensed under the Apache License, Version 2.0 (the "License"); you may
8 # not use this file except in compliance with the License. You may obtain
9 # a copy of the License at
11 # http://www.apache.org/licenses/LICENSE-2.0
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16 # License for the specific language governing permissions and limitations
19 # For those usages not covered by the Apache License, Version 2.0 please
20 # contact with: mbayramov@vmware.com
25 Standalone application that leverage openmano vmware connector work with vCloud director rest api.
27 - Provides capability to create and delete VDC for specific organization.
28 - Create, delete and manage network for specific VDC
29 - List deployed VM's , VAPPs, VDSs, Organization
30 - View detail information about VM / Vapp , Organization etc
31 - Operate with images upload / boot / power on etc
35 List organization created in vCloud director
36 vmwarecli.py -u admin -p qwerty123 -c 172.16.254.206 -U Administrator -P qwerty123 -o test -v TEF list org
38 List VDC for particular organization
39 vmwarecli.py -u admin -p qwerty123 -c 172.16.254.206 -U Administrator -P qwerty123 -o test -v TEF list vdc
42 python vmwarerecli.py image upload /Users/spyroot/Developer/Openmano/Ro/vnfs/cirros/cirros.ovf
45 python vmwarerecli.py -u admin -p qwerty123 -c 172.16.254.206 -o test -v TEF image boot cirros cirros
48 python vmwarerecli.py -u admin -p qwerty123 -c 172.16.254.206 -o test -v TEF view vapp 90bd2b4e-f782-46cf-b5e2-c3817dcf6633 -u
51 python vmwarerecli.py -u admin -p qwerty123 -c 172.16.254.206 -o test -v TEF list vms
53 List VDC in OSM format
54 python vmwarerecli.py -u admin -p qwerty123 -c 172.16.254.206 -o test -v TEF list vdc -o
64 from xml
.etree
import ElementTree
as ET
67 from pyvcloud
import Http
70 from osm_ro_plugin
import vimconn
76 from osm_ro
.vimconn_vmware
import vimconnector
77 # TODO py3 uncoment from requests.packages.urllib3.exceptions import InsecureRequestWarning
78 from prettytable
import PrettyTable
80 # TODO py3 uncoment requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
82 __author__
= "Mustafa Bayramov"
83 __date__
= "$16-Sep-2016 11:09:29$"
86 # TODO move to main vim
87 def delete_network_action(vca
=None, network_uuid
=None):
89 Method leverages vCloud director and query network based on network uuid
92 vca - is active VCA connection.
93 network_uuid - is a network uuid
96 The return XML respond
99 if vca
is None or network_uuid
is None:
102 url_list
= [vca
.host
, '/api/admin/network/', network_uuid
]
103 vm_list_rest_call
= ''.join(url_list
)
105 if not (not vca
.vcloud_session
or not vca
.vcloud_session
.organization
):
106 response
= Http
.get(url
=vm_list_rest_call
,
107 headers
=vca
.vcloud_session
.get_vcloud_headers(),
110 if response
.status_code
== requests
.codes
.ok
:
111 print(response
.content
)
112 return response
.content
117 def print_vapp(vapp_dict
=None):
118 """ Method takes vapp_dict and print in tabular format
121 vapp_dict: container vapp object.
127 # following key available to print
128 # {'status': 'POWERED_OFF', 'storageProfileName': '*', 'hardwareVersion': '7', 'vmToolsVersion': '0',
130 # 'href': 'https://172.16.254.206/api/vAppTemplate/vm-129e22e8-08dc-4cb6-8358-25f635e65d3b',
131 # 'isBusy': 'false', 'isDeployed': 'false', 'isInMaintenanceMode': 'false', 'isVAppTemplate': 'true',
132 # 'networkName': 'nat', 'isDeleted': 'false', 'catalogName': 'Cirros',
133 # 'containerName': 'Cirros Template', # 'container':
134 # 'https://172.16.254.206/api/vAppTemplate/vappTemplate-b966453d-c361-4505-9e38-ccef45815e5d',
135 # 'name': 'Cirros', 'pvdcHighestSupportedHardwareVersion': '11', 'isPublished': 'false',
136 # 'numberOfCpus': '1', 'vdc': 'https://172.16.254.206/api/vdc/a5056f85-418c-4bfd-8041-adb0f48be9d9',
137 # 'guestOs': 'Other (32-bit)', 'isVdcEnabled': 'true'}
139 if vapp_dict
is None:
142 vm_table
= PrettyTable(['vm uuid',
147 'vcpu', 'memory', 'hw ver','deployed','status'])
151 entry
.append(vapp_dict
[k
]['containerName'])
152 # vm-b1f5cd4c-2239-4c89-8fdc-a41ff18e0d61
153 entry
.append(vapp_dict
[k
]['container'].split('/')[-1:][0][5:])
154 entry
.append(vapp_dict
[k
]['networkName'])
155 entry
.append(vapp_dict
[k
]['storageProfileName'])
156 entry
.append(vapp_dict
[k
]['numberOfCpus'])
157 entry
.append(vapp_dict
[k
]['memoryMB'])
158 entry
.append(vapp_dict
[k
]['pvdcHighestSupportedHardwareVersion'])
159 entry
.append(vapp_dict
[k
]['isDeployed'])
160 entry
.append(vapp_dict
[k
]['status'])
162 vm_table
.add_row(entry
)
167 def print_org(org_dict
=None):
168 """ Method takes vapp_dict and print in tabular format
171 org_dict: dictionary of organization where key is org uuid.
180 org_table
= PrettyTable(['org uuid', 'name'])
182 entry
= [k
, org_dict
[k
]]
183 org_table
.add_row(entry
)
188 def print_vm_list(vm_dict
=None):
189 """ Method takes vapp_dict and print in tabular format
192 vm_dict: dictionary of organization where key is org uuid.
200 vm_table
= PrettyTable(
201 ['vm uuid', 'vm name', 'vapp uuid', 'vdc uuid', 'network name', 'is deployed', 'vcpu', 'memory', 'status'])
207 entry
.append(vm_dict
[k
]['name'])
208 entry
.append(vm_dict
[k
]['container'].split('/')[-1:][0][5:])
209 entry
.append(vm_dict
[k
]['vdc'].split('/')[-1:][0])
210 entry
.append(vm_dict
[k
]['networkName'])
211 entry
.append(vm_dict
[k
]['isDeployed'])
212 entry
.append(vm_dict
[k
]['numberOfCpus'])
213 entry
.append(vm_dict
[k
]['memoryMB'])
214 entry
.append(vm_dict
[k
]['status'])
215 vm_table
.add_row(entry
)
218 logger
.error("wrong key {}".format(KeyError.message
))
222 def print_vdc_list(org_dict
=None):
223 """ Method takes vapp_dict and print in tabular format
226 org_dict: dictionary of organization where key is org uuid.
235 if 'vdcs' in org_dict
:
236 vdcs_dict
= org_dict
['vdcs']
237 vdc_table
= PrettyTable(['vdc uuid', 'vdc name'])
239 entry
= [k
, vdcs_dict
[k
]]
240 vdc_table
.add_row(entry
)
244 logger
.error("wrong key {}".format(KeyError.message
))
245 logger
.logger
.debug(traceback
.format_exc())
248 def print_network_list(org_dict
=None):
249 """ Method print network list.
252 org_dict: dictionary of organization that contain key networks with a list of all
253 network for for specific VDC
262 if 'networks' in org_dict
:
263 network_dict
= org_dict
['networks']
264 network_table
= PrettyTable(['network uuid', 'network name'])
265 for k
in network_dict
:
266 entry
= [k
, network_dict
[k
]]
267 network_table
.add_row(entry
)
272 logger
.error("wrong key {}".format(KeyError.message
))
273 logger
.logger
.debug(traceback
.format_exc())
276 def print_org_details(org_dict
=None):
277 """ Method takes vapp_dict and print in tabular format
280 org_dict: dictionary of organization where key is org uuid.
290 print_vdc_list(org_dict
=org_dict
)
291 print_network_list(org_dict
=org_dict
)
293 if 'catalogs' in org_dict
:
294 catalogs_dict
= org_dict
['catalogs']
296 catalog_table
= PrettyTable(['catalog uuid', 'catalog name'])
297 for k
in catalogs_dict
:
298 entry
= [k
, catalogs_dict
[k
]]
299 catalog_table
.add_row(entry
)
304 logger
.error("wrong key {}".format(KeyError.message
))
305 logger
.logger
.debug(traceback
.format_exc())
308 def delete_actions(vim
=None, action
=None, namespace
=None):
309 if action
== 'network' or namespace
.action
== 'network':
310 logger
.debug("Requesting delete for network {}".format(namespace
.network_name
))
311 network_uuid
= namespace
.network_name
312 # if request name based we need find UUID
313 # TODO optimize it or move to external function
314 if not namespace
.uuid
:
315 org_dict
= vim
.get_org_list()
317 org_net
= vim
.get_org(org
)['networks']
318 for network
in org_net
:
319 if org_net
[network
] == namespace
.network_name
:
320 network_uuid
= network
322 vim
.delete_network_action(network_uuid
=network_uuid
)
325 def list_actions(vim
=None, action
=None, namespace
=None):
326 """ Method provide list object from VDC action
329 vim - is vcloud director vim connector.
330 action - is action for list ( vdc / org etc)
331 namespace - must contain VDC / Org information.
338 myorgs
= vim
.get_org_list()
340 if myorgs
[org
] == namespace
.vcdorg
:
344 print(" Invalid organization.")
347 if action
== 'vms' or namespace
.action
== 'vms':
348 vm_dict
= vim
.get_vm_list(vdc_name
=namespace
.vcdvdc
)
349 print_vm_list(vm_dict
=vm_dict
)
350 elif action
== 'vapps' or namespace
.action
== 'vapps':
351 vapp_dict
= vim
.get_vapp_list(vdc_name
=namespace
.vcdvdc
)
352 print_vapp(vapp_dict
=vapp_dict
)
353 elif action
== 'networks' or namespace
.action
== 'networks':
355 osm_print(vim
.get_network_list(filter_dict
={}))
357 print_network_list(vim
.get_org(org_uuid
=org_id
))
358 elif action
== 'vdc' or namespace
.action
== 'vdc':
360 osm_print(vim
.get_tenant_list(filter_dict
=None))
362 print_vdc_list(vim
.get_org(org_uuid
=org_id
))
363 elif action
== 'org' or namespace
.action
== 'org':
364 print_org(org_dict
=vim
.get_org_list())
369 def print_network_details(network_dict
=None):
371 network_table
= PrettyTable(network_dict
.keys())
372 entry
= list(network_dict
.values())
373 network_table
.add_row(entry
[0])
376 logger
.error("wrong key {}".format(KeyError.message
))
377 logger
.logger
.debug(traceback
.format_exc())
380 def osm_print(generic_dict
=None):
383 for element
in generic_dict
:
384 table
= PrettyTable(element
.keys())
385 entry
= list(element
.values())
386 table
.add_row(entry
[0])
389 logger
.error("wrong key {}".format(KeyError.message
))
390 logger
.logger
.debug(traceback
.format_exc())
393 def view_actions(vim
=None, action
=None, namespace
=None):
395 orgs
= vim
.get_org_list()
397 if orgs
[org
] == namespace
.vcdorg
:
401 print(" Invalid organization.")
404 myorg
= vim
.get_org(org_uuid
=org_id
)
407 if action
== 'org' or namespace
.action
== 'org':
409 orgs
= vim
.get_org_list()
411 if namespace
.org_name
in orgs
:
412 org_id
= namespace
.org_name
414 # we need find UUID based on name provided
416 if orgs
[org
] == namespace
.org_name
:
420 logger
.debug("Requesting view for orgs {}".format(org_id
))
421 print_org_details(vim
.get_org(org_uuid
=org_id
))
424 if action
== 'vapp' or namespace
.action
== 'vapp':
425 if namespace
.vapp_name
is not None and namespace
.uuid
:
426 logger
.debug("Requesting vapp {} for vdc {}".format(namespace
.vapp_name
, namespace
.vcdvdc
))
428 vapp_uuid
= namespace
.vapp_name
429 # if request based on just name we need get UUID
430 if not namespace
.uuid
:
431 vapp_uuid
= vim
.get_vappid(vdc
=namespace
.vcdvdc
, vapp_name
=namespace
.vapp_name
)
432 if vapp_uuid
is None:
433 print("Can't find vapp by given name {}".format(namespace
.vapp_name
))
436 print(" namespace {}".format(namespace
))
437 if vapp_dict
is not None and namespace
.osm
:
438 vm_info_dict
= vim
.get_vminstance(vim_vm_uuid
=vapp_uuid
)
440 if vapp_dict
is not None and namespace
.osm
!= True:
441 vapp_dict
= vim
.get_vapp(vdc_name
=namespace
.vcdvdc
, vapp_name
=vapp_uuid
, isuuid
=True)
442 print_vapp(vapp_dict
=vapp_dict
)
445 if action
== 'network' or namespace
.action
== 'network':
446 logger
.debug("Requesting view for network {}".format(namespace
.network_name
))
447 network_uuid
= namespace
.network_name
448 # if request name based we need find UUID
449 # TODO optimize it or move to external function
450 if not namespace
.uuid
:
451 if 'networks' not in myorg
:
452 print("Network {} is undefined in vcloud director for org {} vdc {}".format(namespace
.network_name
,
457 my_org_net
= myorg
['networks']
458 for network
in my_org_net
:
459 if my_org_net
[network
] == namespace
.network_name
:
460 network_uuid
= network
463 print(print_network_details(network_dict
=vim
.get_vcd_network(network_uuid
=network_uuid
)))
466 def create_actions(vim
=None, action
=None, namespace
=None):
467 """Method gets provider vdc view from vcloud director
470 vim - is Cloud director vim connector
471 action - action for create ( network / vdc etc)
474 The return xml content of respond or None
476 if action
== 'network' or namespace
.action
== 'network':
477 logger
.debug("Creating a network in vcloud director".format(namespace
.network_name
))
478 network_uuid
= vim
.create_network(namespace
.network_name
)
479 if network_uuid
is not None:
480 print("Crated new network {} and uuid: {}".format(namespace
.network_name
, network_uuid
))
482 print("Failed create a new network {}".format(namespace
.network_name
))
483 elif action
== 'vdc' or namespace
.action
== 'vdc':
484 logger
.debug("Creating a new vdc in vcloud director.".format(namespace
.vdc_name
))
485 vdc_uuid
= vim
.create_vdc(namespace
.vdc_name
)
486 if vdc_uuid
is not None:
487 print("Crated new vdc {} and uuid: {}".format(namespace
.vdc_name
, vdc_uuid
))
489 print("Failed create a new vdc {}".format(namespace
.vdc_name
))
494 def validate_uuid4(uuid_string
):
495 """Function validate that string contain valid uuid4
498 uuid_string - valid UUID string
501 The return true if string contain valid UUID format
504 val
= uuid
.UUID(uuid_string
, version
=4)
510 def upload_image(vim
=None, image_file
=None):
511 """Function upload image to vcloud director
514 image_file - valid UUID string
517 The return true if image uploaded correctly
520 catalog_uuid
= vim
.get_image_id_from_path(path
=image_file
, progress
=True)
521 if catalog_uuid
is not None and validate_uuid4(catalog_uuid
):
522 print("Image uploaded and uuid {}".format(catalog_uuid
))
524 except vimconn
.VimConnException
as upload_exception
:
525 print("Failed uploaded {} image".format(image_file
))
526 print("Error Reason: {}".format(upload_exception
.message
))
530 def boot_image(vim
=None, image_name
=None, vm_name
=None):
531 """ Function boot image that resided in vcloud director.
532 The image name can be UUID of name.
536 image_name - image identified by UUID or text string.
541 The return true if image uploaded correctly
546 catalogs
= vim
.vca
.get_catalogs()
547 if not validate_uuid4(image_name
):
548 vim_catalog
= vim
.get_catalogid(catalog_name
=image_name
, catalogs
=catalogs
)
549 if vim_catalog
is None:
552 vim_catalog
= vim
.get_catalogid(catalog_name
=image_name
, catalogs
=catalogs
)
553 if vim_catalog
is None:
556 print(" Booting {} image id {} ".format(vm_name
, vim_catalog
))
557 vm_uuid
, _
= vim
.new_vminstance(name
=vm_name
, image_id
=vim_catalog
)
558 if vm_uuid
is not None and validate_uuid4(vm_uuid
):
559 print("Image booted and vm uuid {}".format(vm_uuid
))
560 vapp_dict
= vim
.get_vapp(vdc_name
=namespace
.vcdvdc
, vapp_name
=vm_uuid
, isuuid
=True)
561 if vapp_dict
is not None:
562 print_vapp(vapp_dict
=vapp_dict
)
564 except vimconn
.VimConnNotFoundException
as notFound
:
565 print("Failed boot {} image".format(image_name
))
566 print(notFound
.message
)
567 except vimconn
.VimConnException
as vimconError
:
568 print("Failed boot {} image".format(image_name
))
569 print(vimconError
.message
)
571 print("Failed boot {} image".format(image_name
))
577 def image_action(vim
=None, action
=None, namespace
=None):
578 """ Function present set of action to manipulate with image.
581 - delete image ( not yet done )
584 vim - vcloud director connector
585 action - string (upload/boot etc)
586 namespace - contain other attributes image name etc
592 if action
== 'upload' or namespace
.action
== 'upload':
593 upload_image(vim
=vim
, image_file
=namespace
.image
)
594 elif action
== 'boot' or namespace
.action
== 'boot':
595 boot_image(vim
=vim
, image_name
=namespace
.image
, vm_name
=namespace
.vmname
)
600 def vmwarecli(command
=None, action
=None, namespace
=None):
601 logger
.debug("Namespace {}".format(namespace
))
602 urllib3
.disable_warnings()
609 if namespace
.vcdvdc
is None:
611 vcduser
= input("Enter vcd username: ")
612 if vcduser
is not None and len(vcduser
) > 0:
615 vcduser
= namespace
.vcduser
617 if namespace
.vcdpassword
is None:
619 vcdpasword
= input("Please enter vcd password: ")
620 if vcdpasword
is not None and len(vcdpasword
) > 0:
623 vcdpasword
= namespace
.vcdpassword
625 if namespace
.vcdhost
is None:
627 vcdhost
= input("Please enter vcd host name or ip: ")
628 if vcdhost
is not None and len(vcdhost
) > 0:
631 vcdhost
= namespace
.vcdhost
633 if namespace
.vcdorg
is None:
635 vcdorg
= input("Please enter vcd organization name: ")
636 if vcdorg
is not None and len(vcdorg
) > 0:
639 vcdorg
= namespace
.vcdorg
642 vim
= vimconnector(uuid
=None,
645 tenant_name
=namespace
.vcdvdc
,
651 config
={'admin_username': namespace
.vcdamdin
, 'admin_password': namespace
.vcdadminpassword
})
652 vim
.vca
= vim
.connect()
654 except vimconn
.VimConnConnectionException
:
655 print("Failed connect to vcloud director. Please check credential and hostname.")
659 if command
== 'list' or namespace
.command
== 'list':
660 logger
.debug("Client requested list action")
661 # route request to list actions
662 list_actions(vim
=vim
, action
=action
, namespace
=namespace
)
665 if command
== 'view' or namespace
.command
== 'view':
666 logger
.debug("Client requested view action")
667 view_actions(vim
=vim
, action
=action
, namespace
=namespace
)
670 if command
== 'delete' or namespace
.command
== 'delete':
671 logger
.debug("Client requested delete action")
672 delete_actions(vim
=vim
, action
=action
, namespace
=namespace
)
675 if command
== 'create' or namespace
.command
== 'create':
676 logger
.debug("Client requested create action")
677 create_actions(vim
=vim
, action
=action
, namespace
=namespace
)
680 if command
== 'image' or namespace
.command
== 'image':
681 logger
.debug("Client requested create action")
682 image_action(vim
=vim
, action
=action
, namespace
=namespace
)
685 if __name__
== '__main__':
686 defaults
= {'vcdvdc': 'default',
688 'vcdpassword': 'admin',
689 'vcdhost': 'https://localhost',
693 parser
= argparse
.ArgumentParser()
694 parser
.add_argument('-u', '--vcduser', help='vcloud director username', type=str)
695 parser
.add_argument('-p', '--vcdpassword', help='vcloud director password', type=str)
696 parser
.add_argument('-U', '--vcdamdin', help='vcloud director password', type=str)
697 parser
.add_argument('-P', '--vcdadminpassword', help='vcloud director password', type=str)
698 parser
.add_argument('-c', '--vcdhost', help='vcloud director host', type=str)
699 parser
.add_argument('-o', '--vcdorg', help='vcloud director org', type=str)
700 parser
.add_argument('-v', '--vcdvdc', help='vcloud director vdc', type=str)
701 parser
.add_argument('-d', '--debug', help='debug level', type=int)
703 parser_subparsers
= parser
.add_subparsers(help='commands', dest
='command')
704 sub
= parser_subparsers
.add_parser('list', help='List objects (VMs, vApps, networks)')
705 sub_subparsers
= sub
.add_subparsers(dest
='action')
707 list_vms
= sub_subparsers
.add_parser('vms', help='list - all vm deployed in vCloud director')
708 list_vapps
= sub_subparsers
.add_parser('vapps', help='list - all vapps deployed in vCloud director')
709 list_network
= sub_subparsers
.add_parser('networks', help='list - all networks deployed')
710 list_network
.add_argument('-o', '--osm', default
=False, action
='store_true', help='provide view in OSM format')
713 list_vdc
= sub_subparsers
.add_parser('vdc', help='list - list all vdc for organization accessible to you')
714 list_vdc
.add_argument('-o', '--osm', default
=False, action
='store_true', help='provide view in OSM format')
716 list_org
= sub_subparsers
.add_parser('org', help='list - list of organizations accessible to you.')
718 create_sub
= parser_subparsers
.add_parser('create')
719 create_sub_subparsers
= create_sub
.add_subparsers(dest
='action')
720 create_vms
= create_sub_subparsers
.add_parser('vms')
721 create_vapp
= create_sub_subparsers
.add_parser('vapp')
722 create_vapp
.add_argument('uuid')
725 create_network
= create_sub_subparsers
.add_parser('network')
726 create_network
.add_argument('network_name', action
='store', help='create a network for a vdc')
729 create_vdc
= create_sub_subparsers
.add_parser('vdc')
730 create_vdc
.add_argument('vdc_name', action
='store', help='create a new VDC for org')
732 delete_sub
= parser_subparsers
.add_parser('delete')
733 del_sub_subparsers
= delete_sub
.add_subparsers(dest
='action')
734 del_vms
= del_sub_subparsers
.add_parser('vms')
735 del_vapp
= del_sub_subparsers
.add_parser('vapp')
736 del_vapp
.add_argument('uuid', help='view vapp based on UUID')
739 del_network
= del_sub_subparsers
.add_parser('network')
740 del_network
.add_argument('network_name', action
='store',
741 help='- delete network for vcloud director by provided name')
742 del_network
.add_argument('-u', '--uuid', default
=False, action
='store_true',
743 help='delete network for vcloud director by provided uuid')
746 del_vdc
= del_sub_subparsers
.add_parser('vdc')
748 view_sub
= parser_subparsers
.add_parser('view')
749 view_sub_subparsers
= view_sub
.add_subparsers(dest
='action')
751 view_vms_parser
= view_sub_subparsers
.add_parser('vms')
752 view_vms_parser
.add_argument('uuid', default
=False, action
='store_true',
753 help='- View VM for specific uuid in vcloud director')
754 view_vms_parser
.add_argument('name', default
=False, action
='store_true',
755 help='- View VM for specific vapp name in vcloud director')
758 view_vapp_parser
= view_sub_subparsers
.add_parser('vapp')
759 view_vapp_parser
.add_argument('vapp_name', action
='store',
760 help='- view vapp for specific vapp name in vcloud director')
761 view_vapp_parser
.add_argument('-u', '--uuid', default
=False, action
='store_true', help='view vapp based on uuid')
762 view_vapp_parser
.add_argument('-o', '--osm', default
=False, action
='store_true', help='provide view in OSM format')
765 view_network
= view_sub_subparsers
.add_parser('network')
766 view_network
.add_argument('network_name', action
='store',
767 help='- view network for specific network name in vcloud director')
768 view_network
.add_argument('-u', '--uuid', default
=False, action
='store_true', help='view network based on uuid')
770 # view VDC command and actions
771 view_vdc
= view_sub_subparsers
.add_parser('vdc')
772 view_vdc
.add_argument('vdc_name', action
='store',
773 help='- View VDC based and action based on provided vdc uuid')
774 view_vdc
.add_argument('-u', '--uuid', default
=False, action
='store_true', help='view vdc based on uuid')
776 # view organization command and actions
777 view_org
= view_sub_subparsers
.add_parser('org')
778 view_org
.add_argument('org_name', action
='store',
779 help='- View VDC based and action based on provided vdc uuid')
780 view_org
.add_argument('-u', '--uuid', default
=False, action
='store_true', help='view org based on uuid')
782 # upload image action
783 image_sub
= parser_subparsers
.add_parser('image')
784 image_subparsers
= image_sub
.add_subparsers(dest
='action')
785 upload_parser
= image_subparsers
.add_parser('upload')
786 upload_parser
.add_argument('image', default
=False, action
='store', help='- valid path to OVF image ')
787 upload_parser
.add_argument('catalog', default
=False, action
='store_true', help='- catalog name')
790 boot_parser
= image_subparsers
.add_parser('boot')
791 boot_parser
.add_argument('image', default
=False, action
='store', help='- Image name')
792 boot_parser
.add_argument('vmname', default
=False, action
='store', help='- VM name')
793 boot_parser
.add_argument('-u', '--uuid', default
=False, action
='store_true', help='view org based on uuid')
795 namespace
= parser
.parse_args()
796 # put command_line args to mapping
797 command_line_args
= {k
: v
for k
, v
in vars(namespace
).items() if v
}
801 d
.update(command_line_args
)
803 logger
= logging
.getLogger('mano.vim.vmware')
804 formatter
= logging
.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
805 ch
= logging
.StreamHandler()
806 ch
.setLevel(str.upper(d
['debug']))
807 ch
.setFormatter(formatter
)
808 logger
.addHandler(ch
)
809 logger
.setLevel(getattr(logging
, str.upper(d
['debug'])))
811 "Connecting {} username: {} org: {} vdc: {} ".format(d
['vcdhost'], d
['vcduser'], d
['vcdorg'], d
['vcdvdc']))
813 logger
.debug("command: \"{}\" actio: \"{}\"".format(d
['command'], d
['action']))
816 vmwarecli(namespace
=namespace
)