removed changes made and will create new branch
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/aa6ad8f5 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/aa6ad8f5 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/aa6ad8f5 Branch: refs/heads/trunk Commit: aa6ad8f559ec0435adc18913c804c10d70c35e9a Parents: ec05af9 Author: mitch <[email protected]> Authored: Mon Nov 26 17:32:11 2018 -0500 Committer: mitch <[email protected]> Committed: Mon Nov 26 17:32:11 2018 -0500 ---------------------------------------------------------------------- libcloud/common/nttcis.py | 55 +++++++++++++++++++++++++++---- libcloud/compute/drivers/nttcis.py | 29 +++------------- libcloud/test/compute/test_nttcis.py | 13 -------- 3 files changed, 54 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/aa6ad8f5/libcloud/common/nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/common/nttcis.py b/libcloud/common/nttcis.py index aac16fa..faf6650 100644 --- a/libcloud/common/nttcis.py +++ b/libcloud/common/nttcis.py @@ -1965,14 +1965,25 @@ def processor(mapping, name=None): Closure that keeps the deepcopy of the original dict converted to XML current. :param mapping: The converted XML to dict/lists + :type mapping: ``dict`` :param name: (Optional) what becomes the class name if provided + :type: ``str`` :return: Nothing """ mapping = mapping - + # the map_copy will have keys deleted after the key and value are processed map_copy = deepcopy(mapping) def add_items(key, value, name=None): + """ + Add items to the global attr dict, then delete key, value from map copy + :param key: from the process function becomes the attribute name + :type key: ``str`` + :param value: The value of the property and may be a dict + :type value: ``str`` + :param name: Name of class, often same as key + :type: name" ``str`` + """ if name in attrs: attrs[name].update({key: value}) elif name is not None: @@ -2033,7 +2044,6 @@ def processor(mapping, name=None): tmp_list = [build_class(k.capitalize(), i) for i in v] tmp[k] = tmp_list - print() elif isinstance(v, str): tmp.update({k: v}) return tmp @@ -2042,7 +2052,12 @@ def processor(mapping, name=None): klass = class_factory(key.capitalize(), value) return klass(value) - def process(mapping, name): + def process(mapping): + """ + This function is recursive, creating attributes for the class factory. + :param mapping: the dictionary converted from XML + :return: itself (recursive) + """ for k1, v1 in mapping.items(): if isinstance(v1, Mapping): types = [type(v) for v in v1.values()] @@ -2075,11 +2090,21 @@ def processor(mapping, name=None): if len(map_copy) == 0: return 1 - return process(mapping, name) + return process(mapping) def class_factory(cls_name, attrs): - + """ + This class takes a name and a dictionary to create a class. + The clkass has an init method, an iter for retrieving properties, + and, finally, a repr for returning the instance + :param cls_name: The name to be tacked onto the suffix NttCis + :type cls_name: ``str`` + :param attrs: The attributes and values for an instance + :type attrs: ``dict`` + :return: a class that inherits from ClassFactory + :rtype: ``ClassFactory`` + """ def __init__(self, *args, **kwargs): for key in attrs: setattr(self, key, attrs[key]) @@ -2104,6 +2129,10 @@ def class_factory(cls_name, attrs): class XmlListConfig(list): + """ + Creates a class from XML elements that make a list. If a list of + XML elements with attributes, the attributes are passed to XmlDictConfig. + """ def __init__(self, elem_list): for element in elem_list: if element is not None: @@ -2126,7 +2155,11 @@ class XmlListConfig(list): class XmlDictConfig(dict): - + """ + Inherits from dict. Looks for XML elements, such as attrib, that + can be converted to a dictionary. Any XML element that contains + other XML elements, will be passed to XmlListConfig + """ def __init__(self, parent_element): if parent_element.items(): if 'property' in parent_element.tag: @@ -2187,6 +2220,16 @@ class XmlDictConfig(dict): def process_xml(xml): + """ + Take the xml and put it into a dictionary. The process the dictionary + recursively. This returns a class based on the XML API. Thus, properties + will have the camel case found in the Java XML. This a trade-off + to reduce the number of "static" classes that all have to be synchronized + with any changes in the API. + :param xml: The serialized version of the XML returned from Cloud Control + :return: a dynamic class that inherits from ClassFactory + :rtype: `ClassFactory` + """ global attrs tree = etree.parse(BytesIO(xml)) root = tree.getroot() http://git-wip-us.apache.org/repos/asf/libcloud/blob/aa6ad8f5/libcloud/compute/drivers/nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/nttcis.py b/libcloud/compute/drivers/nttcis.py index c788124..9810958 100644 --- a/libcloud/compute/drivers/nttcis.py +++ b/libcloud/compute/drivers/nttcis.py @@ -52,7 +52,6 @@ from libcloud.common.nttcis import NttCisTagKey from libcloud.common.nttcis import NttCisTag from libcloud.common.nttcis import API_ENDPOINTS, DEFAULT_REGION from libcloud.common.nttcis import TYPES_URN -from libcloud.common.nttcis import process_xml from libcloud.common.nttcis import NETWORK_NS, GENERAL_NS from libcloud.utils.py3 import urlencode, ensure_string from libcloud.utils.xml import fixxpath, findtext, findall @@ -864,19 +863,6 @@ class NttCisNodeDriver(NodeDriver): driver=self.connection.driver), ] - def list_geographic_regions(self, params={}): - """ - Return all geographic regions available to the organization - - :return: List of regions - :rtype: ``list`` of :class:`NttCisGeographicregion` - """ - return self._to_geographic_regions( - self.connection.request_with_orgId_api_2( - "infrastructure/geographicRegion", - method="GET", - params=params).object) - def list_locations(self, ex_id=None): """ List locations (datacenters) available for instantiating servers and @@ -4989,7 +4975,11 @@ class NttCisNodeDriver(NodeDriver): return locations def _to_location(self, element): - return process_xml(ET.tostring(element)) + l = NodeLocation(id=element.get('id'), + name=findtext(element, 'displayName', TYPES_URN), + country=findtext(element, 'country', TYPES_URN), + driver=self) + return l def _to_cpu_spec(self, element): return NttCisServerCpuSpecification( @@ -5060,15 +5050,6 @@ class NttCisNodeDriver(NodeDriver): } - def _to_geographic_regions(self, object): - regions = [] - for region in object.findall(fixxpath('geographicRegion', TYPES_URN)): - regions.append(self._to_geographic_region(region)) - return regions - - def _to_geographic_region(self, el): - return process_xml(ET.tostring(el)) - def _to_ipv4_addresses(self, object): ipv4_address_elements = object.findall(fixxpath('ipv4', TYPES_URN)) return [self._to_ipv4_6_address(el) for el in ipv4_address_elements] http://git-wip-us.apache.org/repos/asf/libcloud/blob/aa6ad8f5/libcloud/test/compute/test_nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_nttcis.py b/libcloud/test/compute/test_nttcis.py index 9068edd..cff7094 100644 --- a/libcloud/test/compute/test_nttcis.py +++ b/libcloud/test/compute/test_nttcis.py @@ -61,12 +61,6 @@ def test_list_locations_response(driver): assert first_loc.country == 'US' -def test_list_geograhic_regions(driver): - ret = driver.list_geographic_regions() - assert isinstance(ret, list) - assert ret[7].isHome == 'true' - - def test_list_nodes_response(driver): NttCisMockHttp.type = None ret = driver.list_nodes() @@ -2900,11 +2894,4 @@ class NttCisMockHttp(MockHttp): body = self.fixtures.load( 'deploy_customised_server.xml' ) - return httplib.OK, body, {}, httplib.responses[httplib.OK] - - def _caas_2_7_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_infrastructure_geographicRegion( - self, method, url, body, headers): - body = self.fixtures.load( - 'geographic_regions.xml' - ) return httplib.OK, body, {}, httplib.responses[httplib.OK] \ No newline at end of file
