def create(ctx, name, description, catalog, template, network, memory, cpu, disk_size, ip_allocation_mode, vm_name, hostname, storage_profile, accept_all_eulas): try: restore_session(ctx, vdc_required=True) client = ctx.obj['client'] vdc_href = ctx.obj['profiles'].get('vdc_href') vdc = VDC(client, href=vdc_href) if catalog is None and template is None: vapp_resource = vdc.create_vapp( name, description=description, network=network, accept_all_eulas=accept_all_eulas) else: vapp_resource = vdc.instantiate_vapp( name, catalog, template, description=description, network=network, memory=memory, cpu=cpu, disk_size=disk_size, deploy=True, power_on=True, accept_all_eulas=accept_all_eulas, cust_script=None, ip_allocation_mode=ip_allocation_mode, vm_name=vm_name, hostname=hostname, storage_profile=storage_profile) stdout(vapp_resource.Tasks.Task[0], ctx) except Exception as e: stderr(e, ctx)
def create(ctx, name, description, catalog, template, network, memory, cpu, disk_size, ip_allocation_mode, vm_name, hostname, storage_profile, accept_all_eulas): try: client = ctx.obj['client'] vdc_href = ctx.obj['profiles'].get('vdc_href') vdc = VDC(client, href=vdc_href) if catalog is None and template is None: vapp_resource = vdc.create_vapp( name, description=description, network=network, accept_all_eulas=accept_all_eulas) else: vapp_resource = vdc.instantiate_vapp( name, catalog, template, network=network, memory=memory, cpu=cpu, disk_size=disk_size, deploy=True, power_on=True, accept_all_eulas=accept_all_eulas, cust_script=None, ip_allocation_mode=ip_allocation_mode, vm_name=vm_name, hostname=hostname, storage_profile=storage_profile) stdout(vapp_resource.Tasks.Task[0], ctx) except Exception as e: stderr(e, ctx)
def test_0001_create_vapp(self): org_resource = self.client.get_org_by_name( self.config['vcd']['org_to_use']) self.logger.debug('org: %s' % org_resource.get('name')) org = Org(self.client, href=org_resource.get('href')) vdc_resource = org.get_vdc(self.config['vcd']['vdc']) vdc = VDC(self.client, resource=vdc_resource) assert self.config['vcd']['vdc'] == vdc.get_resource().get('name') result = vdc.create_vapp(self.config['vcd']['vapp'], network=self.config['vcd']['network'], fence_mode=self.config['vcd']['fence_mode']) task = self.client.get_task_monitor().wait_for_status( task=result.Tasks.Task[0]) assert task.get('status') == TaskStatus.SUCCESS.value
def test_0001_create_vapp(self): logged_in_org = self.client.get_org() org = Org(self.client, resource=logged_in_org) v = org.get_vdc(self.config['vcd']['vdc']) vdc = VDC(self.client, href=v.get('href')) assert self.config['vcd']['vdc'] == vdc.get_resource().get('name') result = vdc.create_vapp(self.config['vcd']['vapp'], network=self.config['vcd']['network'], fence_mode=self.config['vcd']['fence_mode']) task = self.client.get_task_monitor().wait_for_status( task=result.Tasks.Task[0], timeout=60, poll_frequency=2, fail_on_statuses=None, expected_target_statuses=[ TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR, TaskStatus.CANCELED ], callback=None) assert task.get('status') == TaskStatus.SUCCESS.value
def test_0001_create_vapp(self): logged_in_org = self.client.get_org() org = Org(self.client, resource=logged_in_org) v = org.get_vdc(self.config['vcd']['vdc']) vdc = VDC(self.client, href=v.get('href')) assert self.config['vcd']['vdc'] == vdc.get_resource().get('name') result = vdc.create_vapp(self.config['vcd']['vapp'], network=self.config['vcd']['network'], fence_mode=self.config['vcd']['fence_mode']) task = self.client.get_task_monitor().wait_for_status( task=result.Tasks.Task[0], timeout=60, poll_frequency=2, fail_on_statuses=None, expected_target_statuses=[ TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR, TaskStatus.CANCELED], callback=None) assert task.get('status') == TaskStatus.SUCCESS.value
class Vapp(VcdAnsibleModule): def __init__(self, **kwargs): super(Vapp, self).__init__(**kwargs) logged_in_org = self.client.get_org() self.org = Org(self.client, resource=logged_in_org) vdc_resource = self.org.get_vdc(self.params.get('vdc')) self.vdc = VDC(self.client, href=vdc_resource.get('href')) def manage_states(self): state = self.params.get('state') if state == "present": return self.create() if state == "absent": return self.delete() def manage_operations(self): state = self.params.get('operation') if state == "poweron": return self.power_on() if state == "poweroff": return self.power_off() if state == "deploy": return self.deploy() if state == "undeploy": return self.undeploy() if state == "list_vms": return self.list_vms() if state == "list_networks": return self.list_networks() def get_vapp(self): vapp_name = self.params.get('vapp_name') vapp_resource = self.vdc.get_vapp(vapp_name) return VApp(self.client, name=vapp_name, resource=vapp_resource) def instantiate(self): params = self.params vapp_name = params.get('vapp_name') catalog_name = params.get('catalog_name') template_name = params.get('template_name') description = params.get('description') network = params.get('network') fence_mode = params.get('fence_mode') ip_allocation_mode = params.get('ip_allocation_mode') deploy = params.get('deploy') power_on = params.get('power_on') accept_all_eulas = params.get('accept_all_eulas') memory = params.get('memory') cpu = params.get('cpu') disk_size = params.get('disk_size') vmpassword = params.get('vmpassword') cust_script = params.get('cust_script') vm_name = params.get('vm_name') hostname = params.get('hostname') ip_address = params.get('ip_address') storage_profile = params.get('storage_profile') network_adapter_type = params.get('network_adapter_type') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: create_vapp_task = self.vdc.instantiate_vapp( name=vapp_name, catalog=catalog_name, template=template_name, description=description, network=network, fence_mode=fence_mode, ip_allocation_mode=ip_allocation_mode, deploy=deploy, power_on=power_on, accept_all_eulas=accept_all_eulas, memory=memory, cpu=cpu, disk_size=disk_size, password=vmpassword, cust_script=cust_script, vm_name=vm_name, hostname=hostname, ip_address=ip_address, storage_profile=storage_profile, network_adapter_type=network_adapter_type) self.execute_task(create_vapp_task.Tasks.Task[0]) response['msg'] = 'Vapp {} has been created.'.format(vapp_name) response['changed'] = True else: response['warnings'] = "Vapp {} is already present.".format(vapp_name) return response def create(self): params = self.params catalog_name = params.get('catalog_name') # vapp initialization if catalog has been provided if catalog_name: return self.instantiate() vapp_name = params.get('vapp_name') description = params.get('description') network = params.get('network') fence_mode = params.get('fence_mode') accept_all_eulas = params.get('accept_all_eulas') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: create_vapp_task = self.vdc.create_vapp( name=vapp_name, description=description, network=network, fence_mode=fence_mode, accept_all_eulas=accept_all_eulas) self.execute_task(create_vapp_task.Tasks.Task[0]) response['msg'] = 'Vapp {} has been created.'.format(vapp_name) response['changed'] = True else: response['warnings'] = "Vapp {} is already present.".format(vapp_name) return response def delete(self): vapp_name = self.params.get('vapp_name') force = self.params.get('force') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: response['warnings'] = "Vapp {} is not present.".format(vapp_name) else: delete_vapp_task = self.vdc.delete_vapp(name=vapp_name, force=force) self.execute_task(delete_vapp_task) response['msg'] = 'Vapp {} has been deleted.'.format(vapp_name) response['changed'] = True return response def power_on(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False vapp = self.get_vapp() try: if not vapp.is_powered_on(): vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) power_on_vapp_task = vapp.power_on() self.execute_task(power_on_vapp_task) response['msg'] = 'Vapp {} has been powered on.'.format(vapp_name) response['changed'] = True else: response['warnings'] = 'Vapp {} is already powered on.'.format(vapp_name) except OperationNotSupportedException: response['warnings'] = 'Operation is not supported. You may have no VM(s) in {}'.format(vapp_name) return response def power_off(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False vapp = self.get_vapp() try: if not vapp.is_powered_off(): vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) power_off_vapp_task = vapp.power_off() self.execute_task(power_off_vapp_task) response['msg'] = 'Vapp {} has been powered off.'.format(vapp_name) response['changed'] = True else: response['warnings'] = 'Vapp {} is already powered off.'.format(vapp_name) except OperationNotSupportedException: response['warnings'] = 'Operation is not supported. You may have no VM(s) in {}'.format(vapp_name) return response def deploy(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False vapp = self.get_vapp() if not vapp.is_deployed(): vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) deploy_vapp_task = vapp.deploy() self.execute_task(deploy_vapp_task) response['msg'] = 'Vapp {} has been deployed.'.format(vapp_name) response['changed'] = True else: response['warnings'] = 'Vapp {} is already deployed.'.format(vapp_name) return response def undeploy(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False vapp = self.get_vapp() if vapp.is_deployed(): vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) undeploy_vapp_task = vapp.undeploy() self.execute_task(undeploy_vapp_task) response['msg'] = 'Vapp {} has been undeployed.'.format(vapp_name) response['changed'] = True else: response['warnings'] = 'Vapp {} is already undeployed.'.format(vapp_name) return response def list_vms(self): vapp = self.get_vapp() response = dict() response['msg'] = list() for vm in vapp.get_all_vms(): vm_details = dict() vm_details['name'] = vm.get('name') vm_details['status'] = VM_STATUSES[vm.get('status')] vm_details['deployed'] = vm.get('deployed') == 'true' try: vm_details['ip_address'] = vapp.get_primary_ip(vm.get('name')) except Exception: vm_details['ip_address'] = None response['msg'].append(vm_details) return response def list_networks(self): vapp = self.get_vapp() response = dict() response['msg'] = list() for network in vapp.get_all_networks(): response['msg'].append(network.get('{' + NSMAP['ovf'] + '}name')) return response
def create_cluster_thread(self): network_name = self.body['network'] try: clusters = load_from_metadata(self.client_tenant, name=self.cluster_name) if len(clusters) != 0: raise Exception('Cluster already exists.') org_resource = self.client_tenant.get_org() org = Org(self.client_tenant, resource=org_resource) vdc_resource = org.get_vdc(self.body['vdc']) vdc = VDC(self.client_tenant, resource=vdc_resource) template = self.get_template() self.update_task(TaskStatus.RUNNING, self.op, message='Creating cluster vApp %s(%s)' % (self.cluster_name, self.cluster_id)) vapp_resource = vdc.create_vapp(self.cluster_name, description='cluster %s' % self.cluster_name, network=network_name, fence_mode='bridged') t = self.client_tenant.get_task_monitor().wait_for_status( task=vapp_resource.Tasks.Task[0], timeout=60, poll_frequency=2, fail_on_status=None, expected_target_statuses=[ TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR, TaskStatus.CANCELED ], callback=None) assert t.get('status').lower() == TaskStatus.SUCCESS.value tags = {} tags['cse.cluster.id'] = self.cluster_id tags['cse.version'] = pkg_resources.require( 'container-service-extension')[0].version tags['cse.template'] = template['name'] vapp = VApp(self.client_tenant, href=vapp_resource.get('href')) for k, v in tags.items(): t = vapp.set_metadata('GENERAL', 'READWRITE', k, v) self.client_tenant.get_task_monitor().\ wait_for_status( task=t, timeout=600, poll_frequency=5, fail_on_status=None, expected_target_statuses=[TaskStatus.SUCCESS], callback=None) self.update_task(TaskStatus.RUNNING, self.op, message='Creating master node for %s(%s)' % (self.cluster_name, self.cluster_id)) vapp.reload() add_nodes(1, template, TYPE_MASTER, self.config, self.client_tenant, org, vdc, vapp, self.body, wait=True) self.update_task(TaskStatus.RUNNING, self.op, message='Initializing cluster %s(%s)' % (self.cluster_name, self.cluster_id)) vapp.reload() init_cluster(self.config, vapp, template) master_ip = get_master_ip(self.config, vapp, template) t = vapp.set_metadata('GENERAL', 'READWRITE', 'cse.master.ip', master_ip) self.client_tenant.get_task_monitor().\ wait_for_status( task=t, timeout=600, poll_frequency=5, fail_on_status=None, expected_target_statuses=[TaskStatus.SUCCESS], callback=None) if self.body['node_count'] > 0: self.update_task(TaskStatus.RUNNING, self.op, message='Creating %s node(s) for %s(%s)' % (self.body['node_count'], self.cluster_name, self.cluster_id)) add_nodes(self.body['node_count'], template, TYPE_NODE, self.config, self.client_tenant, org, vdc, vapp, self.body, wait=True) self.update_task(TaskStatus.RUNNING, self.op, message='Adding %s node(s) to %s(%s)' % (self.body['node_count'], self.cluster_name, self.cluster_id)) vapp.reload() join_cluster(self.config, vapp, template) self.update_task(TaskStatus.SUCCESS, self.op, message='Created cluster %s(%s)' % (self.cluster_name, self.cluster_id)) except Exception as e: LOGGER.error(traceback.format_exc()) self.update_task(TaskStatus.ERROR, self.op, error_message=str(e))
class Vapp(VcdAnsibleModule): def __init__(self, **kwargs): super(Vapp, self).__init__(**kwargs) logged_in_org = self.client.get_org() self.org = Org(self.client, resource=logged_in_org) vdc_resource = self.org.get_vdc(self.params.get('vdc')) self.vdc = VDC(self.client, href=vdc_resource.get('href')) def manage_states(self): state = self.params.get('state') if state == "present": return self.create() if state == "absent": return self.delete() def manage_operations(self): operation = self.params.get('operation') if operation == "poweron": return self.power_on() if operation == "poweroff": return self.power_off() if operation == "list_vms": return self.list_vms() if operation == "list_networks": return self.list_networks() if operation == "share": return self.share() if operation == "unshare": return self.unshare() if operation == "set_meta": return self.set_meta() if operation == "get_meta": return self.get_meta() if operation == "remove_meta": return self.remove_meta() if operation == "add_org_network": return self.add_org_network() if operation == "delete_org_network": return self.delete_org_network() def get_vapp(self): vapp_name = self.params.get('vapp_name') vapp_resource = self.vdc.get_vapp(vapp_name) return VApp(self.client, name=vapp_name, resource=vapp_resource) def instantiate(self): params = self.params vapp_name = params.get('vapp_name') catalog_name = params.get('catalog_name') template_name = params.get('template_name') description = params.get('description') network = params.get('network') fence_mode = params.get('fence_mode') ip_allocation_mode = params.get('ip_allocation_mode') deploy = params.get('deploy') power_on = params.get('power_on') accept_all_eulas = params.get('accept_all_eulas') memory = params.get('memory') cpu = params.get('cpu') disk_size = params.get('disk_size') vmpassword = params.get('vmpassword') cust_script = params.get('cust_script') vm_name = params.get('vm_name') hostname = params.get('hostname') ip_address = params.get('ip_address') storage_profile = params.get('storage_profile') network_adapter_type = params.get('network_adapter_type') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: create_vapp_task = self.vdc.instantiate_vapp( name=vapp_name, catalog=catalog_name, template=template_name, description=description, network=network, fence_mode=fence_mode, ip_allocation_mode=ip_allocation_mode, deploy=deploy, power_on=power_on, accept_all_eulas=accept_all_eulas, memory=memory, cpu=cpu, disk_size=disk_size, password=vmpassword, cust_script=cust_script, vm_name=vm_name, hostname=hostname, ip_address=ip_address, storage_profile=storage_profile, network_adapter_type=network_adapter_type) self.execute_task(create_vapp_task.Tasks.Task[0]) msg = 'Vapp {} has been created' response['msg'] = msg.format(vapp_name) response['changed'] = True else: msg = "Vapp {} is already present" response['warnings'] = msg.format(vapp_name) return response def create(self): params = self.params catalog_name = params.get('catalog_name') # vapp initialization if catalog has been provided if catalog_name: return self.instantiate() vapp_name = params.get('vapp_name') description = params.get('description') network = params.get('network') fence_mode = params.get('fence_mode') accept_all_eulas = params.get('accept_all_eulas') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: create_vapp_task = self.vdc.create_vapp( name=vapp_name, description=description, network=network, fence_mode=fence_mode, accept_all_eulas=accept_all_eulas) self.execute_task(create_vapp_task.Tasks.Task[0]) msg = 'Vapp {} has been created' response['msg'] = msg.format(vapp_name) response['changed'] = True else: msg = "Vapp {} is already present" response['warnings'] = msg.format(vapp_name) return response def delete(self): vapp_name = self.params.get('vapp_name') force = self.params.get('force') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: response['warnings'] = "Vapp {} is not present.".format(vapp_name) else: delete_vapp_task = self.vdc.delete_vapp( name=vapp_name, force=force) self.execute_task(delete_vapp_task) response['msg'] = 'Vapp {} has been deleted.'.format(vapp_name) response['changed'] = True return response def power_on(self): response = dict() response['changed'] = False vapp_name = self.params.get('vapp_name') try: vapp = self.get_vapp() deploy_vapp_task = vapp.deploy() self.execute_task(deploy_vapp_task) msg = 'Vapp {} has been powered on' response['msg'] = msg.format(vapp_name) response['changed'] = True except OperationNotSupportedException as ex: response['warnings'] = str(ex) except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def power_off(self): response = dict() response['changed'] = False vapp_name = self.params.get('vapp_name') try: vapp = self.get_vapp() undeploy_vapp_task = vapp.undeploy(action="powerOff") self.execute_task(undeploy_vapp_task) response['msg'] = 'Vapp {} has been powered off'.format(vapp_name) response['changed'] = True except OperationNotSupportedException as ex: response['warnings'] = str(ex) except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def list_vms(self): response = dict() response['msg'] = list() response['changed'] = False try: vapp = self.get_vapp() for vm in vapp.get_all_vms(): try: ip = vapp.get_primary_ip(vm.get('name')) except Exception: ip = None finally: response['msg'].append({ "name": vm.get('name'), "status": VM_STATUSES[vm.get('status')], "deployed": vm.get('deployed') == 'true', "ip_address": ip }) except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def list_networks(self): response = dict() response['changed'] = False try: vapp = self.get_vapp() networks = vapp.get_all_networks() response['msg'] = [ network.get('{' + NSMAP['ovf'] + '}name') for network in networks ] except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def share(self): response = dict() response['changed'] = False access = self.params.get("shared_access") try: vapp = self.get_vapp() vapp.share_with_org_members(everyone_access_level=access) msg = "Vapp is shared across org with {0} access" response['msg'] = msg.format(access) response['changed'] = True except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def unshare(self): response = dict() response['changed'] = False try: vapp = self.get_vapp() vapp.unshare_from_org_members() response['msg'] = "Sharing has been stopped for Vapp" response['changed'] = True except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def set_meta(self): response = dict() response['changed'] = False vapp_name = self.params.get('vapp_name') metadata = self.params.get('metadata') domain = self.params.get("metadata_domain") visibility = self.params.get("metadata_visibility") metadata_type = self.params.get("metadata_type") metadata_type = "Metadata{0}Value".format(metadata_type) try: vapp = self.get_vapp() domain = MetadataDomain(domain) visibility = MetadataVisibility(visibility) metadata_type = MetadataValueType(metadata_type) set_meta_task = vapp.set_multiple_metadata(metadata, domain=domain, visibility=visibility, metadata_value_type=metadata_type) self.execute_task(set_meta_task) msg = "Metadata {0} have been set to vApp {1}" response["msg"] = msg.format(list(metadata.keys()), vapp_name) except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def get_meta(self): response = dict() response['changed'] = False response['msg'] = dict() try: vapp = self.get_vapp() metadata = vapp.get_metadata() response['msg'] = { metadata.MetadataEntry.Key.text: metadata.MetadataEntry.TypedValue.Value.text } except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def remove_meta(self): response = dict() response['changed'] = False vapp_name = self.params.get('vapp_name') domain = self.params.get("metadata_domain") metadata = self.params.get('metadata') domain = MetadataDomain(domain) response['msg'] = list() try: vapp = self.get_vapp() for key in metadata: remove_meta_task = vapp.remove_metadata(key, domain=domain) self.execute_task(remove_meta_task) msg = "Metadata {0} have been removed from vApp {1}" response["msg"] = msg.format(list(metadata.keys()), vapp_name) except EntityNotFoundException as ex: response['warnings'] = str(ex) return response def add_org_network(self): response = dict() response['changed'] = False vapp_name = self.params.get('vapp_name') network = self.params.get("network") try: vapp = self.get_vapp() vapp.connect_org_vdc_network(network) response['changed'] = True msg = "Org Network {0} has been added to vApp {1}" response['msg'] = msg.format(network, vapp_name) except EntityNotFoundException as ex: response['warnings'] = str(ex) except InvalidStateException as ex: response['warnings'] = str(ex) return response def delete_org_network(self): response = dict() response['changed'] = False vapp_name = self.params.get('vapp_name') network = self.params.get("network") try: vapp = self.get_vapp() vapp.disconnect_org_vdc_network(network) response['changed'] = True msg = "Org Network {0} has been added to vApp {1}" response['msg'] = msg.format(network, vapp_name) except EntityNotFoundException as ex: response['warnings'] = str(ex) except InvalidStateException as ex: response['warnings'] = str(ex) return response
def create_cluster_thread(self): network_name = self.req_spec.get(RequestKey.NETWORK_NAME) try: clusters = load_from_metadata(self.tenant_client, name=self.cluster_name) if len(clusters) != 0: raise ClusterAlreadyExistsError(f"Cluster {self.cluster_name} " "already exists.") org_resource = self.tenant_client.get_org_by_name( self.req_spec.get(RequestKey.ORG_NAME)) org = Org(self.tenant_client, resource=org_resource) vdc_resource = org.get_vdc(self.req_spec.get(RequestKey.OVDC_NAME)) vdc = VDC(self.tenant_client, resource=vdc_resource) template = self._get_template() self._update_task( TaskStatus.RUNNING, message=f"Creating cluster vApp {self.cluster_name}" f"({self.cluster_id})") try: vapp_resource = vdc.create_vapp( self.cluster_name, description=f"cluster {self.cluster_name}", network=network_name, fence_mode='bridged') except Exception as e: raise ClusterOperationError( "Error while creating vApp:", str(e)) self.tenant_client.get_task_monitor().wait_for_status( vapp_resource.Tasks.Task[0]) tags = {} tags['cse.cluster.id'] = self.cluster_id tags['cse.version'] = pkg_resources.require( 'container-service-extension')[0].version tags['cse.template'] = template['name'] vapp = VApp(self.tenant_client, href=vapp_resource.get('href')) for k, v in tags.items(): task = vapp.set_metadata('GENERAL', 'READWRITE', k, v) self.tenant_client.get_task_monitor().wait_for_status(task) self._update_task( TaskStatus.RUNNING, message=f"Creating master node for {self.cluster_name}" f"({self.cluster_id})") vapp.reload() server_config = get_server_runtime_config() try: add_nodes(1, template, NodeType.MASTER, server_config, self.tenant_client, org, vdc, vapp, self.req_spec) except Exception as e: raise MasterNodeCreationError( "Error while adding master node:", str(e)) self._update_task( TaskStatus.RUNNING, message=f"Initializing cluster {self.cluster_name}" f"({self.cluster_id})") vapp.reload() init_cluster(server_config, vapp, template) master_ip = get_master_ip(server_config, vapp, template) task = vapp.set_metadata('GENERAL', 'READWRITE', 'cse.master.ip', master_ip) self.tenant_client.get_task_monitor().wait_for_status(task) if self.req_spec.get(RequestKey.NUM_WORKERS) > 0: self._update_task( TaskStatus.RUNNING, message=f"Creating " f"{self.req_spec.get(RequestKey.NUM_WORKERS)} " f"node(s) for " f"{self.cluster_name}({self.cluster_id})") try: add_nodes(self.req_spec.get(RequestKey.NUM_WORKERS), template, NodeType.WORKER, server_config, self.tenant_client, org, vdc, vapp, self.req_spec) except Exception as e: raise WorkerNodeCreationError( "Error while creating worker node:", str(e)) self._update_task( TaskStatus.RUNNING, message=f"Adding " f"{self.req_spec.get(RequestKey.NUM_WORKERS)} " f"node(s) to " f"{self.cluster_name}({self.cluster_id})") vapp.reload() join_cluster(server_config, vapp, template) if self.req_spec.get(RequestKey.ENABLE_NFS): self._update_task( TaskStatus.RUNNING, message=f"Creating NFS node for {self.cluster_name}" f"({self.cluster_id})") try: add_nodes(1, template, NodeType.NFS, server_config, self.tenant_client, org, vdc, vapp, self.req_spec) except Exception as e: raise NFSNodeCreationError( "Error while creating NFS node:", str(e)) self._update_task( TaskStatus.SUCCESS, message=f"Created cluster {self.cluster_name}" f"({self.cluster_id})") except (MasterNodeCreationError, WorkerNodeCreationError, NFSNodeCreationError, ClusterJoiningError, ClusterInitializationError, ClusterOperationError) as e: LOGGER.error(traceback.format_exc()) error_obj = error_to_json(e) stack_trace = \ ''.join(error_obj[ERROR_MESSAGE_KEY][ERROR_STACKTRACE_KEY]) self._update_task( TaskStatus.ERROR, error_message=error_obj[ERROR_MESSAGE_KEY] [ERROR_DESCRIPTION_KEY], stack_trace=stack_trace) raise e except Exception as e: LOGGER.error(traceback.format_exc()) error_obj = error_to_json(e) stack_trace = \ ''.join(error_obj[ERROR_MESSAGE_KEY][ERROR_STACKTRACE_KEY]) self._update_task( TaskStatus.ERROR, error_message=error_obj[ERROR_MESSAGE_KEY][ERROR_DESCRIPTION_KEY], # noqa: E501 stack_trace=stack_trace) finally: self._disconnect_sys_admin()
except Exception: print(" Catalog item '{0} / {1}' ... KO. Exiting.".format( vm_cfg['catalog'], vm_cfg['catalog_item'])) exit(0) # Check for vApps and create them if they don't exist. We have to # reload the VDC object so it has all the links to current vApps. vdc.reload() try: vapp = vdc.get_vapp(cfg.vapp['name']) print("vApp exists: {0}".format(cfg.vapp['name'])) except Exception: print("vApp does not exist: name={0}".format(cfg.vapp['name'])) vapp = vdc.create_vapp(name=cfg.vapp['name'], description=cfg.vapp['description'], network=cfg.vapp['network'], accept_all_eulas=cfg.vapp['accept_all_eulas']) print(" vApp '{0}' ... instanciated ...\r".format(cfg.vapp['name']), end='') handle_task(client, vapp.Tasks.Task[0]) print(" vApp '{0}' ... OK {1}".format(cfg.vapp['name'], "".ljust(20))) # We don't track the task as instantiating a vApp takes a while. # Uncomment below if you want to ensure the vApps are available. # handle_task(client, vapp_resource.Tasks.Task[0]) vdc.reload() vapp_resource = vdc.get_vapp(cfg.vapp['name']) vapp = VApp(client, resource=vapp_resource) vms = []
def create_cluster_thread(self): network_name = self.body['network'] try: clusters = load_from_metadata(self.tenant_client, name=self.cluster_name) if len(clusters) != 0: raise ClusterAlreadyExistsError(f"Cluster {self.cluster_name} " "already exists.") org_resource = self.tenant_client.get_org() org = Org(self.tenant_client, resource=org_resource) vdc_resource = org.get_vdc(self.body['vdc']) vdc = VDC(self.tenant_client, resource=vdc_resource) template = self.get_template() self.update_task(TaskStatus.RUNNING, message='Creating cluster vApp %s(%s)' % (self.cluster_name, self.cluster_id)) try: vapp_resource = vdc.create_vapp(self.cluster_name, description='cluster %s' % self.cluster_name, network=network_name, fence_mode='bridged') except Exception as e: raise ClusterOperationError('Error while creating vApp:', str(e)) self.tenant_client.get_task_monitor().wait_for_status( vapp_resource.Tasks.Task[0]) tags = {} tags['cse.cluster.id'] = self.cluster_id tags['cse.version'] = pkg_resources.require( 'container-service-extension')[0].version tags['cse.template'] = template['name'] vapp = VApp(self.tenant_client, href=vapp_resource.get('href')) for k, v in tags.items(): task = vapp.set_metadata('GENERAL', 'READWRITE', k, v) self.tenant_client.get_task_monitor().wait_for_status(task) self.update_task(TaskStatus.RUNNING, message='Creating master node for %s(%s)' % (self.cluster_name, self.cluster_id)) vapp.reload() server_config = get_server_runtime_config() try: add_nodes(1, template, TYPE_MASTER, server_config, self.tenant_client, org, vdc, vapp, self.body) except Exception as e: raise MasterNodeCreationError( "Error while adding master node:", str(e)) self.update_task(TaskStatus.RUNNING, message='Initializing cluster %s(%s)' % (self.cluster_name, self.cluster_id)) vapp.reload() init_cluster(server_config, vapp, template) master_ip = get_master_ip(server_config, vapp, template) task = vapp.set_metadata('GENERAL', 'READWRITE', 'cse.master.ip', master_ip) self.tenant_client.get_task_monitor().wait_for_status(task) if self.body['node_count'] > 0: self.update_task(TaskStatus.RUNNING, message='Creating %s node(s) for %s(%s)' % (self.body['node_count'], self.cluster_name, self.cluster_id)) try: add_nodes(self.body['node_count'], template, TYPE_NODE, server_config, self.tenant_client, org, vdc, vapp, self.body) except Exception as e: raise WorkerNodeCreationError( "Error while creating worker node:", str(e)) self.update_task(TaskStatus.RUNNING, message='Adding %s node(s) to %s(%s)' % (self.body['node_count'], self.cluster_name, self.cluster_id)) vapp.reload() join_cluster(server_config, vapp, template) if self.body['enable_nfs']: self.update_task(TaskStatus.RUNNING, message='Creating NFS node for %s(%s)' % (self.cluster_name, self.cluster_id)) try: add_nodes(1, template, TYPE_NFS, server_config, self.tenant_client, org, vdc, vapp, self.body) except Exception as e: raise NFSNodeCreationError( "Error while creating NFS node:", str(e)) self.update_task(TaskStatus.SUCCESS, message='Created cluster %s(%s)' % (self.cluster_name, self.cluster_id)) except (MasterNodeCreationError, WorkerNodeCreationError, NFSNodeCreationError, ClusterJoiningError, ClusterInitializationError, ClusterOperationError) as e: LOGGER.error(traceback.format_exc()) error_obj = error_to_json(e) stack_trace = ''.join(error_obj[ERROR_MESSAGE][ERROR_STACKTRACE]) self.update_task( TaskStatus.ERROR, error_message=error_obj[ERROR_MESSAGE][ERROR_DESCRIPTION], stack_trace=stack_trace) raise e except Exception as e: LOGGER.error(traceback.format_exc()) error_obj = error_to_json(e) stack_trace = ''.join(error_obj[ERROR_MESSAGE][ERROR_STACKTRACE]) self.update_task( TaskStatus.ERROR, error_message=error_obj[ERROR_MESSAGE][ERROR_DESCRIPTION], stack_trace=stack_trace) finally: self._disconnect_sys_admin()
class Vapp(VcdAnsibleModule): def __init__(self, **kwargs): super(Vapp, self).__init__(**kwargs) logged_in_org = self.client.get_org() self.org = Org(self.client, resource=logged_in_org) vdc_resource = self.org.get_vdc(self.params.get('vdc')) self.vdc = VDC(self.client, href=vdc_resource.get('href')) def manage_states(self): state = self.params.get('state') if state == "present": catalog_name = self.params.get('catalog_name') if catalog_name: return self.instantiate() else: return self.create() if state == "absent": return self.delete() def manage_operations(self): state = self.params.get('operation') if state == "poweron": return self.power_on() if state == "poweroff": return self.power_off() if state == "deploy": return self.deploy() if state == "undeploy": return self.undeploy() if state == "list_vms": return self.list_vms() if state == "list_networks": return self.list_networks() def instantiate(self): params = self.params vapp_name = params.get('vapp_name') catalog_name = params.get('catalog_name') template_name = params.get('template_name') description = params.get('description') network = params.get('network') fence_mode = params.get('fence_mode') ip_allocation_mode = params.get('ip_allocation_mode') deploy = params.get('deploy') power_on = params.get('power_on') accept_all_eulas = params.get('accept_all_eulas') memory = params.get('memory') cpu = params.get('cpu') disk_size = params.get('disk_size') vmpassword = params.get('vmpassword') cust_script = params.get('cust_script') vm_name = params.get('vm_name') hostname = params.get('hostname') ip_address = params.get('ip_address') storage_profile = params.get('storage_profile') network_adapter_type = params.get('network_adapter_type') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: create_vapp_task = self.vdc.instantiate_vapp( name=vapp_name, catalog=catalog_name, template=template_name, description=description, network=network, fence_mode=fence_mode, ip_allocation_mode=ip_allocation_mode, deploy=deploy, power_on=power_on, accept_all_eulas=accept_all_eulas, memory=memory, cpu=cpu, disk_size=disk_size, password=vmpassword, cust_script=cust_script, vm_name=vm_name, hostname=hostname, ip_address=ip_address, storage_profile=storage_profile, network_adapter_type=network_adapter_type) self.execute_task(create_vapp_task.Tasks.Task[0]) response['msg'] = 'Vapp {} has been created.'.format(vapp_name) response['changed'] = True else: response['warnings'] = "Vapp {} is already present.".format(vapp_name) return response def create(self): params = self.params vapp_name = params.get('vapp_name') description = params.get('description') network = params.get('network') fence_mode = params.get('fence_mode') accept_all_eulas = params.get('accept_all_eulas') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: create_vapp_task = self.vdc.create_vapp( name=vapp_name, description=description, network=network, fence_mode=fence_mode, accept_all_eulas=accept_all_eulas) self.execute_task(create_vapp_task.Tasks.Task[0]) response['msg'] = 'Vapp {} has been created.'.format(vapp_name) response['changed'] = True else: response['warnings'] = "Vapp {} is already present.".format(vapp_name) return response def delete(self): vapp_name = self.params.get('vapp_name') force = self.params.get('force') response = dict() response['changed'] = False try: self.vdc.get_vapp(vapp_name) except EntityNotFoundException: response['warnings'] = "Vapp {} is not present.".format(vapp_name) else: delete_vapp_task = self.vdc.delete_vapp(name=vapp_name, force=force) self.execute_task(delete_vapp_task) response['msg'] = 'Vapp {} has been deleted.'.format(vapp_name) response['changed'] = True return response def power_on(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False try: vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) power_on_vapp_task = vapp.power_on() self.execute_task(power_on_vapp_task) response['msg'] = 'Vapp {} has been powered on.'.format(vapp_name) response['changed'] = True except OperationNotSupportedException: response['warnings'] = 'Vapp {} is already powered on.'.format(vapp_name) return response def power_off(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False try: vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) power_off_vapp_task = vapp.power_off() self.execute_task(power_off_vapp_task) response['msg'] = 'Vapp {} has been powered off.'.format(vapp_name) response['changed'] = True except OperationNotSupportedException: response['warnings'] = 'Vapp {} is already powered off.'.format(vapp_name) return response def deploy(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False try: vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) deploy_vapp_task = vapp.deploy() self.execute_task(deploy_vapp_task) response['msg'] = 'Vapp {} has been deployed.'.format(vapp_name) response['changed'] = True except OperationNotSupportedException: response['warnings'] = 'Vapp {} is already deployed.'.format(vapp_name) return response def undeploy(self): vapp_name = self.params.get('vapp_name') response = dict() response['changed'] = False try: vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) undeploy_vapp_task = vapp.undeploy() self.execute_task(undeploy_vapp_task) response['msg'] = 'Vapp {} has been undeployed.'.format(vapp_name) response['changed'] = True except OperationNotSupportedException: response['warnings'] = 'Vapp {} is already undeployed.'.format(vapp_name) return response def list_vms(self): vapp_name = self.params.get('vapp_name') vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) response = dict() response['msg'] = [] for vm in vapp.get_all_vms(): vm_details = dict() vm_details['name'] = vm.get('name') vm_details['status'] = VM_STATUSES[vm.get('status')] vm_details['deployed'] = vm.get('deployed')=='true' try: vm_details['ip_address'] = vapp.get_primary_ip(vm.get('name')) except: vm_details['ip_address'] = None response['msg'].append(vm_details) return response def list_networks(self): vapp_name = self.params.get('vapp_name') vapp_resource = self.vdc.get_vapp(vapp_name) vapp = VApp(self.client, name=vapp_name, resource=vapp_resource) response = dict() response['msg'] = [] for network in vapp.get_all_networks(): response['msg'].append(network.get('{'+NSMAP['ovf']+'}name')) return response