http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/docs/storage/_supported_methods_cdn.rst ---------------------------------------------------------------------- diff --git a/docs/storage/_supported_methods_cdn.rst b/docs/storage/_supported_methods_cdn.rst index 088b5ac..bedc837 100644 --- a/docs/storage/_supported_methods_cdn.rst +++ b/docs/storage/_supported_methods_cdn.rst @@ -8,6 +8,7 @@ Provider enable container cdn enable object cdn get contain `Microsoft Azure (blobs)`_ no no no no `Backblaze B2`_ no no no no `CloudFiles`_ yes no yes yes +`DigitalOcean Spaces`_ no no no no `Google Cloud Storage`_ no no no no `KTUCloud Storage`_ yes no yes yes `Local Storage`_ yes yes yes yes @@ -23,6 +24,7 @@ Provider enable container cdn enable object cdn get contain `Amazon S3 (ap-southeast-2)`_ no no no no `Amazon S3 (ca-central-1)`_ no no no no `Amazon S3 (cn-north-1)`_ no no no no +`Amazon S3 (cn-northwest-1)`_ no no no no `Amazon S3 (eu-central-1)`_ no no no no `Amazon S3 (eu-west-1)`_ no no no no `Amazon S3 (eu-west-2)`_ no no no no @@ -40,6 +42,7 @@ Provider enable container cdn enable object cdn get contain .. _`Microsoft Azure (blobs)`: http://windows.azure.com/ .. _`Backblaze B2`: https://www.backblaze.com/b2/ .. _`CloudFiles`: http://www.rackspace.com/ +.. _`DigitalOcean Spaces`: https://www.digitalocean.com/products/object-storage/ .. _`Google Cloud Storage`: http://cloud.google.com/storage .. _`KTUCloud Storage`: http://www.rackspace.com/ .. _`Local Storage`: http://example.com @@ -55,6 +58,7 @@ Provider enable container cdn enable object cdn get contain .. _`Amazon S3 (ap-southeast-2)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (ca-central-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (cn-north-1)`: http://aws.amazon.com/s3/ +.. _`Amazon S3 (cn-northwest-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-central-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-west-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-west-2)`: http://aws.amazon.com/s3/
http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/docs/storage/_supported_methods_main.rst ---------------------------------------------------------------------- diff --git a/docs/storage/_supported_methods_main.rst b/docs/storage/_supported_methods_main.rst index 0e377a2..938ae30 100644 --- a/docs/storage/_supported_methods_main.rst +++ b/docs/storage/_supported_methods_main.rst @@ -24,6 +24,7 @@ Provider list containers list objects create container dele `Amazon S3 (ap-southeast-2)`_ yes yes yes yes yes yes yes yes yes `Amazon S3 (ca-central-1)`_ yes yes yes yes yes yes yes yes yes `Amazon S3 (cn-north-1)`_ yes yes yes yes yes yes yes yes yes +`Amazon S3 (cn-northwest-1)`_ yes yes yes yes yes yes yes yes yes `Amazon S3 (eu-central-1)`_ yes yes yes yes yes yes yes yes yes `Amazon S3 (eu-west-1)`_ yes yes yes yes yes yes yes yes yes `Amazon S3 (eu-west-2)`_ yes yes yes yes yes yes yes yes yes @@ -57,6 +58,7 @@ Provider list containers list objects create container dele .. _`Amazon S3 (ap-southeast-2)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (ca-central-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (cn-north-1)`: http://aws.amazon.com/s3/ +.. _`Amazon S3 (cn-northwest-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-central-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-west-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-west-2)`: http://aws.amazon.com/s3/ http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/docs/storage/_supported_providers.rst ---------------------------------------------------------------------- diff --git a/docs/storage/_supported_providers.rst b/docs/storage/_supported_providers.rst index 7c8687b..d33e377 100644 --- a/docs/storage/_supported_providers.rst +++ b/docs/storage/_supported_providers.rst @@ -24,6 +24,7 @@ Provider Documentation `Amazon S3 (ap-southeast-2)`_ S3_AP_SOUTHEAST2 single region driver :mod:`libcloud.storage.drivers.s3` :class:`S3APSE2StorageDriver` `Amazon S3 (ca-central-1)`_ S3_CA_CENTRAL single region driver :mod:`libcloud.storage.drivers.s3` :class:`S3CACentralStorageDriver` `Amazon S3 (cn-north-1)`_ S3_CN_NORTH single region driver :mod:`libcloud.storage.drivers.s3` :class:`S3CNNorthStorageDriver` +`Amazon S3 (cn-northwest-1)`_ S3_CN_NORTHWEST single region driver :mod:`libcloud.storage.drivers.s3` :class:`S3CNNorthWestStorageDriver` `Amazon S3 (eu-central-1)`_ S3_EU_CENTRAL single region driver :mod:`libcloud.storage.drivers.s3` :class:`S3EUCentralStorageDriver` `Amazon S3 (eu-west-1)`_ S3_EU_WEST single region driver :mod:`libcloud.storage.drivers.s3` :class:`S3EUWestStorageDriver` `Amazon S3 (eu-west-2)`_ S3_EU_WEST2 single region driver :mod:`libcloud.storage.drivers.s3` :class:`S3EUWest2StorageDriver` @@ -57,6 +58,7 @@ Provider Documentation .. _`Amazon S3 (ap-southeast-2)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (ca-central-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (cn-north-1)`: http://aws.amazon.com/s3/ +.. _`Amazon S3 (cn-northwest-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-central-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-west-1)`: http://aws.amazon.com/s3/ .. _`Amazon S3 (eu-west-2)`: http://aws.amazon.com/s3/ http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/libcloud/common/nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/common/nttcis.py b/libcloud/common/nttcis.py index 78dc73f..d257bf8 100644 --- a/libcloud/common/nttcis.py +++ b/libcloud/common/nttcis.py @@ -1693,10 +1693,6 @@ class NttCisTagKey(object): % (self.id, self.name)) -class NttCisFactory(object): - pass - - class NttCisIpAddressList(object): """ NttCis IP Address list http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/libcloud/compute/drivers/nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/nttcis.py b/libcloud/compute/drivers/nttcis.py index 18e2bdb..cfe5619 100644 --- a/libcloud/compute/drivers/nttcis.py +++ b/libcloud/compute/drivers/nttcis.py @@ -203,6 +203,7 @@ class NttCisNodeDriver(NodeDriver): :return: The newly created :class:`Node`. :rtype: :class:`Node` """ + password = None image_needs_auth = self._image_needs_auth(image) if image_needs_auth: @@ -704,6 +705,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request_elm = ET.Element('deleteServer', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -723,6 +725,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request_elm = ET.Element('rebootServer', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -781,6 +784,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of `Node` objects :rtype: ``list`` of :class:`Node` """ + node_list = [] # This is a generator so we changed from the original # and if nodes is not empty, ie, the stop iteration confdition @@ -811,6 +815,7 @@ class NttCisNodeDriver(NodeDriver): :return: List of images available :rtype: ``list`` of :class:`NodeImage` """ + params = {} if location is not None: params['datacenterId'] = self._location_to_location_id(location) @@ -829,6 +834,7 @@ class NttCisNodeDriver(NodeDriver): @inherits: :class:`NodeDriver.list_sizes` """ + return [ NodeSize(id=1, name="default", @@ -869,6 +875,7 @@ class NttCisNodeDriver(NodeDriver): :return: List of locations :rtype: ``list`` of :class:`NodeLocation` """ + params = {} if ex_id is not None: params['id'] = ex_id @@ -892,6 +899,7 @@ class NttCisNodeDriver(NodeDriver): :return: List of locations :rtype: ``list`` of :class:`NodeLocation` """ + params = {} if ex_id is not None: params['id'] = ex_id @@ -908,6 +916,7 @@ class NttCisNodeDriver(NodeDriver): :return: dictionary with keys id, day_of_week, start_hour, availability :rtype: dict """ + params = {} params['datacenterId'] = self._location_to_location_id(location) params['servicePlan'] = plan @@ -927,6 +936,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of NttCisNetwork objects :rtype: ``list`` of :class:`NttCisNetwork` """ + url_ext = '' if location is not None: url_ext = '/' + self._location_to_location_id(location) @@ -1075,11 +1085,9 @@ class NttCisNodeDriver(NodeDriver): :keyword started: Filters the node list to nodes that are started or not :type started: ``bool`` - :keyword state: Filters the node list to nodes that are in this state :type state: ``str`` - :keyword network: Filters the node list to nodes in this network :type network: :class:`NttCisNetwork` or ``str`` @@ -1087,9 +1095,9 @@ class NttCisNodeDriver(NodeDriver): network domain :type network_domain: :class:`NttCisNetworkDomain` or ``str`` - :return: a list of `Node` objects :rtype: ``generator`` of `list` of :class:`Node` + """ params = {} @@ -1153,6 +1161,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request_elm = ET.Element('startServer', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -1174,6 +1183,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request_elm = ET.Element('shutdownServer', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -1195,6 +1205,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request_elm = ET.Element('powerOffServer', {'xmlns': TYPES_URN, 'id': node.id}) @@ -1222,6 +1233,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request_elm = ET.Element('resetServer', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -1241,6 +1253,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request_elm = ET.Element('updateVmwareTools', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -1272,6 +1285,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + data = {} if name is not None: data['name'] = name @@ -1335,6 +1349,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` """ + params = {} params['serverId'] = self.list_nodes(ex_name=node)[0].id return self._to_snapshots(self.connection.request_with_orgId_api_2( @@ -1350,6 +1365,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``dict`` """ + return self._to_snapshot(self.connection.request_with_orgId_api_2( 'snapshot/snapshot/%s' % snapshot_id).object) @@ -1362,6 +1378,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` """ + update_node = ET.Element('disableSnapshotService', {'xmlns': TYPES_URN}) @@ -1377,14 +1394,16 @@ class NttCisNodeDriver(NodeDriver): def ex_initiate_manual_snapshot(self, name=None, server_id=None): """ Initiate a manual snapshot of server on the fly + :param name: optional name of server - :type ``str`` + :type name: ``str`` :param server_id: optinal parameter to use instead of name - :type ``str`` + :type `server_id`str`` :return: True of False :rtype: ``bool`` + """ if server_id is None: @@ -1453,6 +1472,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``str`` """ + create_preview = ET.Element('createSnapshotPreviewServer', {'xmlns': TYPES_URN, 'snapshotId': snapshot_id}) @@ -1510,6 +1530,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + if not isinstance(node_list, (list, tuple)): raise TypeError("Node list must be a list or a tuple.") anti_affinity_xml_request = ET.Element('createAntiAffinityRule', @@ -1534,6 +1555,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + rule_id = anti_affinity_rule update_node = ET.Element('deleteAntiAffinityRule', @@ -1575,6 +1597,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of :class:NttCisAntiAffinityRule` """ + not_none_arguments = [key for key in (network, network_domain, node) if key is not None] @@ -1629,6 +1652,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request = ET.Element('addNic', {'xmlns': TYPES_URN}) ET.SubElement(request, 'serverId').text = node.id @@ -1658,6 +1682,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + request = ET.Element('removeNic', {'xmlns': TYPES_URN, 'id': nic_id}) @@ -1680,6 +1705,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of NttCisNetwork objects :rtype: ``list`` of :class:`NttCisNetwork` """ + return self.list_networks(location=location) def ex_create_network(self, location, name, description=None): @@ -1698,6 +1724,7 @@ class NttCisNodeDriver(NodeDriver): :return: A new instance of `NttCisNetwork` :rtype: Instance of :class:`NttCisNetwork` """ + network_location = self._location_to_location_id(location) create_node = ET.Element('NewNetworkWithLocation', @@ -1728,6 +1755,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + response = self.connection.request_with_orgId_api_1( 'network/%s?delete' % network.id, method='GET').object @@ -1746,6 +1774,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + response = self.connection.request_with_orgId_api_1( 'network/%s' % network.id, method='POST', @@ -1762,6 +1791,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NttCisNetworkDomain` """ + locations = self.list_locations() net = self.connection.request_with_orgId_api_2( 'network/networkDomain/%s' % network_domain_id).object @@ -1789,6 +1819,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of `NttCisNetwork` objects :rtype: ``list`` of :class:`NttCisNetwork` """ + params = {} if location is not None: params['datacenterId'] = self._location_to_location_id(location) @@ -1826,6 +1857,7 @@ class NttCisNodeDriver(NodeDriver): :return: an instance of `NttCisNetworkDomain` :rtype: :class:`NttCisNetworkDomain` """ + create_node = ET.Element('deployNetworkDomain', {'xmlns': TYPES_URN}) ET.SubElement( create_node, @@ -1867,6 +1899,7 @@ class NttCisNodeDriver(NodeDriver): :return: an instance of `NttCisNetworkDomain` :rtype: :class:`NttCisNetworkDomain` """ + edit_node = ET.Element('editNetworkDomain', {'xmlns': TYPES_URN}) edit_node.set('id', network_domain.id) ET.SubElement(edit_node, "name").text = network_domain.name @@ -1891,6 +1924,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + delete_node = ET.Element('deleteNetworkDomain', {'xmlns': TYPES_URN}) delete_node.set('id', network_domain.id) result = self.connection.request_with_orgId_api_2( @@ -1930,6 +1964,7 @@ class NttCisNodeDriver(NodeDriver): :return: an instance of `NttCisVlan` :rtype: :class:`NttCisVlan` """ + create_node = ET.Element('deployVlan', {'xmlns': TYPES_URN}) ET.SubElement(create_node, "networkDomainId").text = network_domain.id ET.SubElement(create_node, "name").text = name @@ -1963,6 +1998,7 @@ class NttCisNodeDriver(NodeDriver): :return: an instance of `NttCisVlan` :rtype: :class:`NttCisVlan` """ + locations = self.list_locations() vlan = self.connection.request_with_orgId_api_2( 'network/vlan/%s' % vlan_id).object @@ -1979,6 +2015,7 @@ class NttCisNodeDriver(NodeDriver): :return: an instance of `NttCisVlan` :rtype: :class:`NttCisVlan` """ + edit_node = ET.Element('editVlan', {'xmlns': TYPES_URN}) edit_node.set('id', vlan.id) ET.SubElement(edit_node, "name").text = vlan.name @@ -2006,6 +2043,7 @@ class NttCisNodeDriver(NodeDriver): :return: an instance of `NttCisVlan` :rtype: :class:`NttCisVlan` """ + edit_node = ET.Element('expandVlan', {'xmlns': TYPES_URN}) edit_node.set('id', vlan.id) ET.SubElement(edit_node, "privateIpv4PrefixSize").text =\ @@ -2027,6 +2065,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + delete_node = ET.Element('deleteVlan', {'xmlns': TYPES_URN}) delete_node.set('id', vlan.id) result = self.connection.request_with_orgId_api_2( @@ -2063,6 +2102,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of NttCisVlan objects :rtype: ``list`` of :class:`NttCisVlan` """ + params = {} if location is not None: params['datacenterId'] = self._location_to_location_id(location) @@ -2237,24 +2277,24 @@ class NttCisNodeDriver(NodeDriver): :type network_domain: :class:`NttCisNetworkDomain` or ``str`` :param name: The rule's name - :type ``str`` + :type name: ``str`` :param action: 'ACCEPT_DECISIVELY' or 'DROP' - :type ``str`` + :type action: ``str`` :param ip_version: 'IPV4' or 'IPV6' - :type ``str`` + :type ip_version: ``str`` :param protocol: One of 'IP', 'ICMP', 'TCP', or 'UDP' - :type ``str`` + :type protocol: ``str`` :param source_addr: The source address, which must be an NttCisFirewallAddress instance - :type ``NttCisFirewallAddress`` + :type source_addr: ``NttCisFirewallAddress`` :param dest_addr: The destination address, which must be an NttCisFirewallAddress instance - :type `NttCisFirewallAddress`` + :type dest_addr: `NttCisFirewallAddress`` :param position: The position in which to create the rule There are two types of positions @@ -2265,7 +2305,7 @@ class NttCisNodeDriver(NodeDriver): :param enabled: Firewall rule is enabled upon creation. Set to 1 for true or 0 for false. - :type ``int`` + :type enabled: ``int`` :param position_relative_to_rule: The rule or rule name in which to decide positioning by @@ -2274,6 +2314,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + positions_without_rule = ('FIRST', 'LAST') positions_with_rule = ('BEFORE', 'AFTER') @@ -2528,6 +2569,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + update_node = ET.Element('editFirewallRule', {'xmlns': TYPES_URN}) update_node.set('id', rule.id) ET.SubElement(update_node, 'enabled').text = str(state).lower() @@ -2548,6 +2590,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + update_node = ET.Element('deleteFirewallRule', {'xmlns': TYPES_URN}) update_node.set('id', rule.id) result = self.connection.request_with_orgId_api_2( @@ -2573,6 +2616,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NttCisNatRule` """ + create_node = ET.Element('createNatRule', {'xmlns': TYPES_URN}) ET.SubElement(create_node, 'networkDomainId').text = network_domain.id ET.SubElement(create_node, 'internalIp').text = internal_ip @@ -2604,6 +2648,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of :class:`NttCisNatRule` """ + params = {} params['networkDomainId'] = network_domain.id @@ -2624,6 +2669,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NttCisNatRule` """ + rule = self.connection.request_with_orgId_api_2( 'network/natRule/%s' % rule_id).object return self._to_nat_rule(rule, network_domain) @@ -2637,6 +2683,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + update_node = ET.Element('deleteNatRule', {'xmlns': TYPES_URN}) update_node.set('id', rule.id) result = self.connection.request_with_orgId_api_2( @@ -2656,6 +2703,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NodeLocation` """ + location = None if id is not None: location = self.list_locations(ex_id=id)[0] @@ -2687,6 +2735,7 @@ class NttCisNodeDriver(NodeDriver): :param kwargs: The arguments for func :type kwargs: Keyword arguments """ + return self.connection.wait_for_state(state, func, poll_interval, timeout, *args, **kwargs) @@ -2703,6 +2752,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + update_node = ET.Element('enableServerMonitoring', {'xmlns': TYPES_URN}) update_node.set('id', node.id) @@ -2728,6 +2778,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + update_node = ET.Element('changeServerMonitoringPlan', {'xmlns': TYPES_URN}) update_node.set('id', node.id) @@ -2749,6 +2800,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + update_node = ET.Element('disableServerMonitoring', {'xmlns': TYPES_URN}) update_node.set('id', node.id) @@ -2770,6 +2822,7 @@ class NttCisNodeDriver(NodeDriver): :param bus_number: optional number of server's bus :return: whether addition is in progress or 'OK' otherwise false """ + update_node = ET.Element('addScsiController', {'xmlns': TYPES_URN}) ET.SubElement(update_node, 'serverId').text = server_id @@ -2790,6 +2843,7 @@ class NttCisNodeDriver(NodeDriver): :param controller_id: Scsi controller's id :return: whether addition is in progress or 'OK' otherwise false """ + update_node = ET.Element('removeScsiController', {'xmlns': TYPES_URN}) update_node.set('id', controller_id) result = self.connection.request_with_orgId_api_2( @@ -2865,6 +2919,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + disk = [disk for disk in node.extra['disks'] if disk.scsi_id == scsi_id][0] return self.ex_remove_storage(disk.id) @@ -2881,6 +2936,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + remove_disk = ET.Element('removeDisk', {'xmlns': TYPES_URN}) remove_disk.set('id', disk_id) @@ -2906,6 +2962,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + create_node = ET.Element('changeDiskSpeed', {'xmlns': TYPES_URN}) create_node.set('id', disk_id) ET.SubElement(create_node, 'speed').text = speed @@ -2933,6 +2990,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + create_node = ET.Element('expandDisk', {'xmlns': TYPES_URN, 'id': disk_id}) ET.SubElement(create_node, 'newSizeGb').text = str(size) @@ -2973,6 +3031,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + update = ET.Element('reconfigureServer', {'xmlns': TYPES_URN}) update.set('id', node.id) if memory_gb is not None: @@ -3009,6 +3068,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + if image_description is None: image_description = '' @@ -3072,6 +3132,7 @@ class NttCisNodeDriver(NodeDriver): :param node: The failed node to clean :type node: :class:`Node` or ``str`` """ + node_id = self._node_to_node_id(node) request_elm = ET.Element('cleanServer', {'xmlns': TYPES_URN, 'id': node_id}) @@ -3091,6 +3152,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of :class:`NodeImage` """ + params = {} if location is not None: params['datacenterId'] = self._location_to_location_id(location) @@ -3110,6 +3172,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NodeImage` """ + image = self.connection.request_with_orgId_api_2( 'image/osImage/%s' % id).object return self._to_image(image) @@ -3123,6 +3186,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NodeImage` """ + image = self.connection.request_with_orgId_api_2( 'image/customerImage/%s' % id).object return self._to_image(image) @@ -3141,6 +3205,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NodeImage` """ + try: return self.ex_get_base_image_by_id(id) except NttCisAPIException as e: @@ -3169,6 +3234,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + create_tag_key = ET.Element('createTagKey', {'xmlns': TYPES_URN}) ET.SubElement(create_tag_key, 'name').text = name if description is not None: @@ -3205,6 +3271,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of :class:`NttCisTagKey` """ + params = {} if id is not None: params['id'] = id @@ -3235,6 +3302,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: :class:`NttCisTagKey` """ + tag_key = self.connection.request_with_orgId_api_2( 'tag/tagKey/%s' % id).object return self._to_tag_key(tag_key) @@ -3244,13 +3312,14 @@ class NttCisNodeDriver(NodeDriver): NOTICE: Tag key is one of those instances where Libloud handles the search of a list for the client code. This behavior exists inconsistently across libcloud. - Get a specific tag key by Name + Get a specific tag key by Name :param name: Name of the tag key you want (required) :type name: ``str`` :rtype: :class:`NttCisTagKey` """ + tag_keys = self.ex_list_tag_keys(name=name) if len(tag_keys) != 1: raise ValueError("No tags found with name %s" % name) @@ -3281,6 +3350,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + tag_key_id = self._tag_key_to_tag_key_id(tag_key) modify_tag_key = ET.Element('editTagKey', {'xmlns': TYPES_URN, 'id': tag_key_id}) @@ -3311,6 +3381,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + tag_key_id = self._tag_key_to_tag_key_id(tag_key) remove_tag_key = ET.Element('deleteTagKey', {'xmlns': TYPES_URN, 'id': tag_key_id}) @@ -3341,6 +3412,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + asset_type = self._get_tagging_asset_type(asset) tag_key_name = self._tag_key_to_tag_key_name(tag_key) @@ -3375,6 +3447,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``bool`` """ + asset_type = self._get_tagging_asset_type(asset) tag_key_name = self._tag_key_to_tag_key_name(tag_key) @@ -3423,6 +3496,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of :class:`NttCisTag` """ + params = {} if asset_id is not None: params['assetId'] = asset_id @@ -3464,6 +3538,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of ``list`` """ + result = self.connection.raw_request_with_orgId_api_1( 'report/usage?startDate=%s&endDate=%s' % ( start_date, end_date)) @@ -3481,6 +3556,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of ``list`` """ + result = self.connection.raw_request_with_orgId_api_1( 'report/usageDetailed?startDate=%s&endDate=%s' % ( start_date, end_date)) @@ -3498,6 +3574,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of ``list`` """ + result = self.connection.raw_request_with_orgId_api_1( 'report/usageSoftwareUnits?startDate=%s&endDate=%s' % ( start_date, end_date)) @@ -3515,6 +3592,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of ``list`` """ + result = self.connection.raw_request_with_orgId_api_1( 'auditlog?startDate=%s&endDate=%s' % ( start_date, end_date)) @@ -3536,6 +3614,7 @@ class NttCisNodeDriver(NodeDriver): :rtype: ``list`` of ``list`` """ + datacenter_id = self._location_to_location_id(location) result = self.connection.raw_request_with_orgId_api_1( 'backup/detailedUsageReport?datacenterId=%s&fromDate=%s&toDate=%s' @@ -3576,6 +3655,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of NttCisIpAddressList objects :rtype: ``list`` of :class:`NttCisIpAddressList` """ + params = {'networkDomainId': self._network_domain_to_network_domain_id( ex_network_domain)} response = self.connection.request_with_orgId_api_2( @@ -3706,6 +3786,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of NttCisIpAddressList objects :rtype: ``list`` of :class:`NttCisIpAddressList` """ + if (ip_address_collection is None and child_ip_address_list is None): raise ValueError("At least one ipAddress element or one " @@ -3946,6 +4027,7 @@ class NttCisNodeDriver(NodeDriver): :return: a list of NttCisPortList objects :rtype: ``list`` of :class:`NttCisPortList` """ + params = {'networkDomainId': self._network_domain_to_network_domain_id(ex_network_domain)} response = self.connection.request_with_orgId_api_2( @@ -3977,6 +4059,7 @@ class NttCisNodeDriver(NodeDriver): :return: NttCisPortList object :rtype: :class:`NttCisPort` """ + url_path = ('network/portList/%s' % ex_portlist_id) response = self.connection.request_with_orgId_api_2( url_path).object @@ -4044,6 +4127,7 @@ class NttCisNodeDriver(NodeDriver): :return: result of operation :rtype: ``bool`` """ + new_port_list = ET.Element('createPortList', {'xmlns': TYPES_URN}) ET.SubElement( new_port_list, @@ -4972,6 +5056,7 @@ class NttCisNodeDriver(NodeDriver): type of snapshot state """ + snapshot_elements = object.findall(fixxpath('snapshot', TYPES_URN)) return [self._to_snapshot(el) for el in snapshot_elements] http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/libcloud/drs/base.py ---------------------------------------------------------------------- diff --git a/libcloud/drs/base.py b/libcloud/drs/base.py index 157fe5a..b5ee738 100644 --- a/libcloud/drs/base.py +++ b/libcloud/drs/base.py @@ -58,7 +58,7 @@ class DRSConsistencyGroup(object): self.extra = extra or {} -class Driver(BaseDriver): +class DRSDriver(BaseDriver): """ A base Driver class to derive from @@ -72,7 +72,7 @@ class Driver(BaseDriver): def __init__(self, key, secret=None, secure=True, host=None, port=None, **kwargs): - super(Driver, self).__init__(key=key, secret=secret, secure=secure, + super(DRSDriver, self).__init__(key=key, secret=secret, secure=secure, host=host, port=port, **kwargs) def create_consistency_group(self, name, journal_sz_gb, http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/libcloud/drs/drivers/nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/drs/drivers/nttcis.py b/libcloud/drs/drivers/nttcis.py index d97b632..b0930c8 100644 --- a/libcloud/drs/drivers/nttcis.py +++ b/libcloud/drs/drivers/nttcis.py @@ -6,7 +6,7 @@ from libcloud.common.nttcis import API_ENDPOINTS from libcloud.common.nttcis import DEFAULT_REGION from libcloud.common.nttcis import process_xml from libcloud.drs.types import Provider -from libcloud.drs.base import Driver +from libcloud.drs.base import DRSDriver from libcloud.common.nttcis import TYPES_URN from libcloud.utils.xml import fixxpath, findtext, findall from libcloud.common.types import LibcloudError @@ -32,7 +32,7 @@ def get_params(func): return paramed -class NttCisDRSDriver(Driver): +class NttCisDRSDriver(DRSDriver): """ NttCis node driver. """ @@ -117,15 +117,15 @@ class NttCisDRSDriver(Driver): """ Functions takes a named parameter that must be one of the following :param params: A dictionary composed of one of the follwing keys and a value - target_data_center_id: - source_network_domain_id: - target_network_domain_id: - source_server_id: - target_server_id: - name: - state: - operation_status: - drs_infrastructure_status: + * target_data_center_id= + * source_network_domain_id= + * target_network_domain_id= + * source_server_id= + * target_server_id= + * name= + * state= + * operation_status= + * drs_infrastructure_status= :return: `list` of :class: `NttCisConsistencyGroup` """ @@ -158,6 +158,26 @@ class NttCisDRSDriver(Driver): snapshots = self._to_process(paged_result) return snapshots + def expand_journal(self, consistency_group_id, size_gb): + """ + Expand the consistency group's journhal size in 100Gb increments + :param consistency_group_id: The consistency group's UUID + :type consistency_group_id: ``str`` + :param size_gb: Gb in 100 Gb increments + :type size_gb: ``str`` + :return: + """ + + expand_elm = ET.Element("expandJournal", {"id": consistency_group_id, + "xmlns": TYPES_URN}) + ET.SubElement(expand_elm, "sizeGb").text = size_gb + response = self.connection.request_with_orgId_api_2( + "consistencyGroup/expandJournal", + method="POST", + data=ET.tostring(expand_elm)).object + response_code = findtext(response, 'responseCode', TYPES_URN) + return response_code in ['IN_PROGRESS', 'OK'] + def _to_consistency_groups(self, object): cgs = findall(object, 'consistencyGroup', TYPES_URN) return [self._to_process(el) for el in cgs] http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/libcloud/loadbalancer/drivers/nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/loadbalancer/drivers/nttcis.py b/libcloud/loadbalancer/drivers/nttcis.py index 4a18376..1348c65 100644 --- a/libcloud/loadbalancer/drivers/nttcis.py +++ b/libcloud/loadbalancer/drivers/nttcis.py @@ -141,6 +141,7 @@ class NttCisLBDriver(Driver): :rtype: :class:`LoadBalancer` """ + network_domain_id = self.network_domain_id if protocol is None: protocol = 'http' http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/libcloud/test/drs/fixtures/nttcis/expand_cg.xml ---------------------------------------------------------------------- diff --git a/libcloud/test/drs/fixtures/nttcis/expand_cg.xml b/libcloud/test/drs/fixtures/nttcis/expand_cg.xml new file mode 100644 index 0000000..f29d9a1 --- /dev/null +++ b/libcloud/test/drs/fixtures/nttcis/expand_cg.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<response xmlns="urn:didata.com:api:cloud:types" requestId="na_20181106T161731342-0500_8c65ed73-ddb1-4043-981a-535a0c8e28aa"> + <operation>EXPAND_JOURNAL</operation> + <responseCode>IN_PROGRESS</responseCode> + <message>Request to Expand DRS Journal Space has been accepted. Please use appropriate Get or List API for status.</message> +</response> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/libcloud/test/drs/test_nttcis.py ---------------------------------------------------------------------- diff --git a/libcloud/test/drs/test_nttcis.py b/libcloud/test/drs/test_nttcis.py index 7431a25..a7e939c 100644 --- a/libcloud/test/drs/test_nttcis.py +++ b/libcloud/test/drs/test_nttcis.py @@ -53,6 +53,17 @@ def test_get_consistency_group_by_name(driver): assert cgs[0].id == "3710c093-7dcc-4a21-bd07-af9f4d93b6b5" +def test_expand_journal(driver): + cg_id = "3710c093-7dcc-4a21-bd07-af9f4d93b6b5" + size_gb = "100" + result = driver.expand_journal(cg_id, size_gb) + assert result is True + + +def test_start_failover_preview(driver): + pass + + class NttCisMockHttp(MockHttp): fixtures = DRSFileFixtures('nttcis') @@ -97,4 +108,12 @@ class NttCisMockHttp(MockHttp): body, headers): body = self.fixtures.load("list_cg_by_params.xml") + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + + def _caas_2_7_8a8f6abc_2745_4d8a_9cbc_8dabe5a7d0e4_consistencyGroup_expandJournal(self, + method, + url, + body, + headers): + body = self.fixtures.load("expand_cg.xml") return (httplib.OK, body, {}, httplib.responses[httplib.OK]) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/614b43d4/tests/lib_edit_test.py ---------------------------------------------------------------------- diff --git a/tests/lib_edit_test.py b/tests/lib_edit_test.py index db628c2..ff1dccc 100644 --- a/tests/lib_edit_test.py +++ b/tests/lib_edit_test.py @@ -452,6 +452,13 @@ def test_delete_listener(compute_driver, lbdriver): assert result is True +def test_expand_journal(drsdriver): + cgs = drsdriver.list_consistency_groups(name="sdk_test2_cg") + cg_id = cgs[0].id + expand_by = "100" + result = drsdriver.expand_journal(cg_id, expand_by) + assert result is True + def test_delete_consistency_group(drsdriver): cg_name = "sdk_test_cg" pass
