def get_all_vapps(self, vdc): refs = filter(lambda ref: ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml', vdc.ResourceEntities.ResourceEntity) for ref in refs: self.response = requests.get(ref.href, headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: vapp = VAPP(vAppType.parseString(self.response.content, True), self.vcloud_session.get_vcloud_headers(), self.verify) yield vapp
def get_vapp(self, vdc, vapp_name): refs = filter(lambda ref: ref.name == vapp_name and ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml', vdc.ResourceEntities.ResourceEntity) if len(refs) == 1: self.response = requests.get(refs[0].href, headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: vapp = VAPP(vAppType.parseString(self.response.content, True), self.vcloud_session.get_vcloud_headers(), self.verify) return vapp
def test_refresh_vms_status(self, get_vdc_details, get_namebyvappid, connect, get_vapp, get_vm_pci_details, get_network_id_by_name): headers = { 'Accept': 'application/*+xml;version=5.9', 'x-vcloud-authorization': '638bfee6cb5f435abc3480f480817254' } vm_id = '05e6047b-6938-4275-8940-22d1ea7245b8' vapp_resp = xml_resp.vapp_xml_response # created vdc object vdc_xml_resp = xml_resp.vdc_xml_response vdc = vdcType.parseString(vdc_xml_resp, True) # assumed return value from VIM connector get_vdc_details.return_value = vdc connect.return_value = self.vca self.vim.vca = self.vim.connect() get_namebyvappid.return_value = 'Test1_vm-69a18104-8413-4cb8-bad7-b5afaec6f9fa' get_vm_pci_details.return_value = { 'host_name': 'test-esx-1.corp.local', 'host_ip': '12.19.24.31' } get_vapp.return_value = VAPP(vAppType.parseString(vapp_resp, True), headers, False) get_network_id_by_name.return_value = '47d12505-5968-4e16-95a7-18743edb0c8b' # call to VIM connector method result = self.vim.refresh_vms_status([vm_id]) for attr in result[vm_id]: if attr == 'status': # assert verified expected and return result from VIM connector self.assertEqual(result[vm_id][attr], 'ACTIVE')
def create_vapp(self, vdc_name, vapp_name, template_name, catalog_name, network_name=None, network_mode='bridged', vm_name=None, vm_cpus=None, vm_memory=None, deploy='false', poweron='false'): self.vdc = self.get_vdc(vdc_name) if not self.vcloud_session or not self.vcloud_session.organization or not self.vdc: #"Select an organization and datacenter first" print "here" return False if '' == vm_name: vm_name = None catalogs = filter(lambda link: catalog_name == link.get_name() and link.get_type() == "application/vnd.vmware.vcloud.catalog+xml", self.vcloud_session.organization.get_Link()) if len(catalogs) == 1: self.response = requests.get(catalogs[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: catalog = catalogType.parseString(self.response.content, True) catalog_items = filter(lambda catalogItemRef: catalogItemRef.get_name() == template_name, catalog.get_CatalogItems().get_CatalogItem()) if len(catalog_items) == 1: self.response = requests.get(catalog_items[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) # use ElementTree instead because none of the types inside resources (not even catalogItemType) is able to parse the response correctly catalogItem = ET.fromstring(self.response.content) entity = [child for child in catalogItem if child.get("type") == "application/vnd.vmware.vcloud.vAppTemplate+xml"][0] vm_href = None if vm_name: self.response = requests.get(entity.get('href'), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: vAppTemplate = ET.fromstring(self.response.content) for vm in vAppTemplate.iter('{http://www.vmware.com/vcloud/v1.5}Vm'): vm_href = vm.get('href') template_params = self._create_instantiateVAppTemplateParams( vapp_name, entity.get("href"), vm_name=vm_name, vm_href=vm_href, vm_cpus=vm_cpus, vm_memory=vm_memory, deploy=deploy, power=poweron) if network_name: pass output = StringIO() template_params.export(output, 0, name_ = 'InstantiateVAppTemplateParams', namespacedef_ = '''xmlns="http://www.vmware.com/vcloud/v1.5" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData"''', pretty_print = False) body = '<?xml version="1.0" encoding="UTF-8"?>' + \ output.getvalue().replace('class:', 'rasd:')\ .replace(' xmlns:vmw="http://www.vmware.com/vcloud/v1.5"', '')\ .replace('vmw:', 'rasd:')\ .replace('Info>', "ovf:Info>") content_type = "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml" link = filter(lambda link: link.get_type() == content_type, self.vdc.get_Link()) self.response = requests.post(link[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify, data=body) print self.response.content if self.response.status_code == requests.codes.created: vApp = vAppType.parseString(self.response.content, True) task = vApp.get_Tasks().get_Task()[0] return task return False
def create_vapp(self, vdc_name, vapp_name, template_name, catalog_name, network_name=None, network_mode='bridged', vm_name=None, vm_cpus=None, vm_memory=None, deploy='false', poweron='false'): self.vdc = self.get_vdc(vdc_name) if not self.vcloud_session or not self.vcloud_session.organization or not self.vdc: #"Select an organization and datacenter first" return False if '' == vm_name: vm_name = None catalogs = filter(lambda link: catalog_name == link.get_name() and link.get_type() == "application/vnd.vmware.vcloud.catalog+xml", self.vcloud_session.organization.get_Link()) if len(catalogs) == 1: self.response = requests.get(catalogs[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: catalog = catalogType.parseString(self.response.content, True) catalog_items = filter(lambda catalogItemRef: catalogItemRef.get_name() == template_name, catalog.get_CatalogItems().get_CatalogItem()) if len(catalog_items) == 1: self.response = requests.get(catalog_items[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) # use ElementTree instead because none of the types inside resources (not even catalogItemType) is able to parse the response correctly catalogItem = ET.fromstring(self.response.content) entity = [child for child in catalogItem if child.get("type") == "application/vnd.vmware.vcloud.vAppTemplate+xml"][0] vm_href = None if vm_name: self.response = requests.get(entity.get('href'), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: vAppTemplate = ET.fromstring(self.response.content) for vm in vAppTemplate.iter('{http://www.vmware.com/vcloud/v1.5}Vm'): vm_href = vm.get('href') template_params = self._create_instantiateVAppTemplateParams( vapp_name, entity.get("href"), vm_name=vm_name, vm_href=vm_href, vm_cpus=vm_cpus, vm_memory=vm_memory, deploy=deploy, power=poweron) if network_name: pass output = StringIO() template_params.export(output, 0, name_ = 'InstantiateVAppTemplateParams', namespacedef_ = '''xmlns="http://www.vmware.com/vcloud/v1.5" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData"''', pretty_print = False) body = '<?xml version="1.0" encoding="UTF-8"?>' + \ output.getvalue().replace('class:', 'rasd:')\ .replace(' xmlns:vmw="http://www.vmware.com/vcloud/v1.5"', '')\ .replace('vmw:', 'rasd:')\ .replace('Info>', "ovf:Info>") content_type = "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml" link = filter(lambda link: link.get_type() == content_type, self.vdc.get_Link()) self.response = requests.post(link[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify, data=body) if self.response.status_code == requests.codes.created: vApp = vAppType.parseString(self.response.content, True) task = vApp.get_Tasks().get_Task()[0] return task return False
def get_ovf_descriptor(self): link = filter(lambda link: link.get_rel() == 'download:default', self.me.get_Link()) if not link: print "Can Not get download url" return headers = self.headers url = link[0].get_href() self.response = requests.get(url, headers=headers, verify=self.verify) if self.response.status_code == requests.codes.ok: return vAppType.parseString(self.response.content, True) else: return False
def get_all_vapps(self, vdc): refs = filter( lambda ref: ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml', vdc.ResourceEntities.ResourceEntity) for ref in refs: self.response = requests.get( ref.href, headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: vapp = VAPP(vAppType.parseString(self.response.content, True), self.vcloud_session.get_vcloud_headers(), self.verify) yield vapp
def get_ovf_descriptor(self): link = filter(lambda link: link.get_rel() == "download:default", self.me.get_Link()) if not link: print "Can Not get download url" return headers = self.headers url = link[0].get_href() self.response = requests.get(url, headers=headers, verify=self.verify) if self.response.status_code == requests.codes.ok: return vAppType.parseString(self.response.content, True) elif self.response.status_code == requests.codes.forbidden: LOG.error("get_ovf_descriptor failed: forbidden. vapp %s " % self.name) raise exceptions.ForbiddenException("get_ovf_descriptor failed: forbidden. vapp %s" % self.name) else: return False
def get_ovf_descriptor(self): link = filter( lambda link: link.get_rel() == 'download:default', self.me.get_Link()) if not link: print "Can Not get download url" return headers = self.headers url = link[0].get_href() self.response = requests.get(url, headers=headers, verify=self.verify) if self.response.status_code == requests.codes.ok: return vAppType.parseString(self.response.content, True) elif self.response.status_code == requests.codes.forbidden: LOG.error("get_ovf_descriptor failed: forbidden. vapp %s " % self.name) raise exceptions.ForbiddenException("get_ovf_descriptor failed: forbidden. vapp %s" % self.name) else: return False
def create_vapp(self, vdc_name, vapp_name, template_name, catalog_name=None, network_configs=[], deploy=False, poweron=False, root_gb=None): vdc = self.get_vdc(vdc_name) vapp_template_entity = self.get_vapp_template(vdc, template_name) if len(vapp_template_entity) < 1: raise exceptions.ForbiddenException("Create_vapp error, cannot find the template %s" % template_name) template_params = self._generate_instantiate_vapp_params(vapp_name, vapp_template_entity[0].href, deploy=deploy, poweron=poweron, network_configs=network_configs, root_gb=root_gb) output = StringIO() template_params.export(output, 0, name_ = 'InstantiateVAppTemplateParams', namespacedef_ = '''xmlns="http://www.vmware.com/vcloud/v1.5" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1"''', pretty_print = False) body = '<?xml version="1.0" encoding="UTF-8"?>' + \ output.getvalue().replace('class:', 'rasd:')\ .replace(' xmlns:vmw="http://www.vmware.com/vcloud/v1.5"', '')\ .replace('vmw:', 'rasd:')\ .replace('ovf:NetworkConfigSection', 'NetworkConfigSection')\ .replace('Info>', "ovf:Info>")\ .replace('<NetworkConfigSection>', '<NetworkConfigSection><ovf:Info>networks</ovf:Info>') content_type = "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml" link = filter(lambda link: link.get_type() == content_type, vdc.get_Link()) headers = self.vcloud_session.get_vcloud_headers() response = self._invoke_api(requests, 'post', link[0].href, headers=headers, data=body, verify=self.verify) if response.status_code == requests.codes.forbidden: raise exceptions.ForbiddenException("Create_vapp error, vapp_name:%s" % vapp_name) if response.status_code == requests.codes.created: vapp = vAppType.parseString(response.content, True) task = vapp.get_Tasks().get_Task()[0] return (True, task) else: return (False, response.content)