def get_media(self, catalog_name, media_name): refs = filter( lambda ref: ref.name == catalog_name and ref.type_ == 'application/vnd.vmware.vcloud.catalog+xml', self.vcloud_session.organization.Link) if len(refs) == 1: self.response = requests.get( refs[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() == media_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) # print self.response.content if self.response.status_code == requests.codes.ok: doc = self.parsexml_(self.response.content) for element in doc._children: if element.tag == '{http://www.vmware.com/vcloud/v1.5}Entity': return element.attrib
def get_media(self, catalog_name, media_name): refs = filter(lambda ref: ref.name == catalog_name and ref.type_ == 'application/vnd.vmware.vcloud.catalog+xml', self.vcloud_session.organization.Link) if len(refs) == 1: response = self._invoke_api(requests, 'get', refs[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if response.status_code == requests.codes.ok: catalog = catalogType.parseString(response.content, True) catalog_items = filter(lambda catalogItemRef: catalogItemRef.get_name() == media_name, catalog.get_CatalogItems().get_CatalogItem()) if len(catalog_items) == 1: response = self._invoke_api(requests, 'get', catalog_items[0].get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if response.status_code == requests.codes.ok: doc = self.parsexml_(response.content) for element in doc._children: if element.tag == '{http://www.vmware.com/vcloud/v1.5}Entity': return element.attrib elif response.status_code == requests.codes.forbidden: excep_msg = "Get_media forbidden,get media_ref error, media_name:%s" % (media_name) raise exceptions.ForbiddenException(excep_msg) else: excep_msg = "Get_media failed, get media_ref error, response:%s" % (response) raise exceptions.VCloudDriverException(excep_msg) else: excep_msg = "Get_media error, catalog_items size is not one, media_name:%s" % (media_name) raise exceptions.VCloudDriverException(excep_msg) elif response.status_code == requests.codes.forbidden: excep_msg = "Get_media forbidden, media_name:%s" % (media_name) raise exceptions.ForbiddenException(excep_msg) else: excep_msg = "Get_media failed, response:%s" % (response) raise exceptions.VCloudDriverException(excep_msg)
def get_catalogs(self): links = filter(lambda link: link.get_type() == "application/vnd.vmware.vcloud.catalog+xml", self.vcloud_session.organization.Link) catalogs = [] for link in links: self.response = requests.get(link.get_href(), headers=self.vcloud_session.get_vcloud_headers(), verify=self.verify) if self.response.status_code == requests.codes.ok: catalogs.append(catalogType.parseString(self.response.content, True)) return catalogs
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_media(self, catalog_name, media_name): refs = filter(lambda ref: ref.name == catalog_name and ref.type_ == 'application/vnd.vmware.vcloud.catalog+xml', self.vcloud_session.organization.Link) if len(refs) == 1: self.response = requests.get(refs[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() == media_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) # print self.response.content if self.response.status_code == requests.codes.ok: doc = self.parsexml_(self.response.content) for element in doc._children: if element.tag == '{http://www.vmware.com/vcloud/v1.5}Entity': return element.attrib
def test_get_image_list(self, get_catalogs, connect): catalog1 = xml_resp.catalog1_xml_response catalog2 = xml_resp.catalog2_xml_response catalogs = [ catalogType.parseString(cat, True) for cat in catalog1, catalog2 ] connect.return_value = self.vca self.vim.vca = self.vim.connect() # assumed return value from VIM connector self.vim.vca.get_catalogs.return_value = catalogs result = self.vim.get_image_list( {'id': '32ccb082-4a65-41f6-bcd6-38942e8a3829'}) # assert verified expected and return result from VIM connector for item in result: self.assertEqual(item['id'], '32ccb082-4a65-41f6-bcd6-38942e8a3829')