Commenting the existing network functions to provide clearer help
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/c923de36 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/c923de36 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/c923de36 Branch: refs/heads/trunk Commit: c923de363ae478505b7e84c9485f2832aa28d7e2 Parents: b90060b Author: Anthony Shaw <anthony.p.s...@gmail.com> Authored: Fri Oct 30 09:52:52 2015 +1100 Committer: Anthony Shaw <anthony.p.s...@gmail.com> Committed: Fri Oct 30 09:52:52 2015 +1100 ---------------------------------------------------------------------- libcloud/compute/drivers/dimensiondata.py | 155 ++++++++++++++++++++++++- 1 file changed, 149 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/c923de36/libcloud/compute/drivers/dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/dimensiondata.py b/libcloud/compute/drivers/dimensiondata.py index ee76daf..1015562 100644 --- a/libcloud/compute/drivers/dimensiondata.py +++ b/libcloud/compute/drivers/dimensiondata.py @@ -165,6 +165,15 @@ class DimensionDataNodeDriver(NodeDriver): return node def destroy_node(self, node): + """ + Deletes a node, node must be stopped before deletion + + + :keyword node: The node to delete + :type node: :class:`Node` + + :rtype: ``bool`` + """ request_elm = ET.Element('deleteServer', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -175,6 +184,15 @@ class DimensionDataNodeDriver(NodeDriver): return response_code in ['IN_PROGRESS', 'OK'] def reboot_node(self, node): + """ + Reboots a node by requesting the OS restart via the hypervisor + + + :keyword node: The node to reboot + :type node: :class:`Node` + + :rtype: ``bool`` + """ request_elm = ET.Element('rebootServer', {'xmlns': TYPES_URN, 'id': node.id}) body = self.connection.request_with_orgId_api_2( @@ -185,6 +203,13 @@ class DimensionDataNodeDriver(NodeDriver): return response_code in ['IN_PROGRESS', 'OK'] def list_nodes(self): + """ + List nodes deployed across all data center locations for your + organization. + + :return: a list of `Node` objects + :rtype: ``list`` of :class:`Node` + """ nodes = self._to_nodes( self.connection.request_with_orgId_api_2('server/server').object) @@ -377,6 +402,19 @@ class DimensionDataNodeDriver(NodeDriver): return response_code in ['IN_PROGRESS', 'OK'] def ex_attach_node_to_vlan(self, node, vlan): + """ + Attach a node to a VLAN by adding an additional NIC to + the node on the target VLAN. The IP will be automatically + assigned based on the VLAN IP network space. + + :param node: Node which should be used + :type node: :class:`Node` + + :param vlan: VLAN to attach the node to + :type vlan: :class:`DimensionDataVlan` + + :rtype: ``bool`` + """ request = ET.Element('addNic', {'xmlns': TYPES_URN}) ET.SubElement(request, 'serverId').text = node.id @@ -391,6 +429,14 @@ class DimensionDataNodeDriver(NodeDriver): return response_code in ['IN_PROGRESS', 'OK'] def ex_destroy_nic(self, nic_id): + """ + Remove a NIC on a node, removing the node from a VLAN + + :param nic_id: The identifier of the NIC to remove + :type nic_id: ``str`` + + :rtype: ``bool`` + """ request = ET.Element('removeNic', {'xmlns': TYPES_URN, 'id': nic_id}) @@ -420,6 +466,14 @@ class DimensionDataNodeDriver(NodeDriver): return self._to_networks(response) def ex_get_network_domain(self, network_domain_id): + """ + Get an individual Network Domain, by identifier + + :param network_domain_id: The identifier of the network domain + :type network_domain_id: ``str`` + + :rtype: :class:`DimensionDataNetworkDomain` + """ locations = self.list_locations() net = self.connection.request_with_orgId_api_2( 'network/networkDomain/%s' % network_domain_id).object @@ -427,10 +481,14 @@ class DimensionDataNodeDriver(NodeDriver): def ex_list_network_domains(self, location=None): """ - List networks deployed across all data center locations for your - organization. The response includes the location of each network. + List networks domains deployed across all data center locations + for your organization. + The response includes the location of each network domain. - :return: a list of DimensionDataNetwork objects + :param location: The data center to list (optional) + :type location: :class:`NodeLocation` + + :return: a list of `DimensionDataNetwork` objects :rtype: ``list`` of :class:`DimensionDataNetwork` """ params = {} @@ -446,6 +504,22 @@ class DimensionDataNodeDriver(NodeDriver): description=None): """ Deploy a new network domain to a data center + + :param location: The data center to list + :type location: :class:`NodeLocation` + + :param name: The name of the network domain to create + :type name: ``str`` + + :param service_plan: The service plan, either "ESSENTIALS" + or "ADVANCED" + :type service_plan: ``str`` + + :param description: An additional description of the network domain + :type description: ``str`` + + :return: an instance of `DimensionDataNetworkDomain` + :rtype: :class:`DimensionDataNetworkDomain` """ create_node = ET.Element('deployNetworkDomain', {'xmlns': TYPES_URN}) ET.SubElement(create_node, "datacenterId").text = location.id @@ -477,6 +551,12 @@ class DimensionDataNodeDriver(NodeDriver): def ex_update_network_domain(self, network_domain): """ Update the properties of a network domain + + :param network_domain: The network domain with updated properties + :type network_domain: :class:`DimensionDataNetworkDomain` + + :return: an instance of `DimensionDataNetworkDomain` + :rtype: :class:`DimensionDataNetworkDomain` """ edit_node = ET.Element('editNetworkDomain', {'xmlns': TYPES_URN}) edit_node.set('id', network_domain.id) @@ -494,6 +574,14 @@ class DimensionDataNodeDriver(NodeDriver): return network_domain def ex_delete_network_domain(self, network_domain): + """ + Delete a network domain + + :param network_domain: The network domain to delete + :type network_domain: :class:`DimensionDataNetworkDomain` + + :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( @@ -509,9 +597,29 @@ class DimensionDataNodeDriver(NodeDriver): name, private_ipv4_base_address, description=None, - private_ipv4_prefix_size='24'): + private_ipv4_prefix_size=24): """ Deploy a new VLAN to a network domain + + :param network_domain: The network domain to add the VLAN to + :type network_domain: :class:`DimensionDataNetworkDomain` + + :param name: The name of the VLAN to create + :type name: ``str`` + + :param private_ipv4_base_address: The base IPv4 address + e.g. 192.168.1.0 + :type private_ipv4_base_address: ``str`` + + :param description: An additional description of the VLAN + :type description: ``str`` + + :param private_ipv4_prefix_size: The size of the IPv4 + address space, e.g 24 + :type private_ipv4_prefix_size: ``int`` + + :return: an instance of `DimensionDataVlan` + :rtype: :class:`DimensionDataVlan` """ create_node = ET.Element('deployVlan', {'xmlns': TYPES_URN}) ET.SubElement(create_node, "networkDomainId").text = network_domain.id @@ -521,7 +629,7 @@ class DimensionDataNodeDriver(NodeDriver): ET.SubElement(create_node, "privateIpv4BaseAddress").text = \ private_ipv4_base_address ET.SubElement(create_node, "privateIpv4PrefixSize").text = \ - private_ipv4_prefix_size + str(private_ipv4_prefix_size) response = self.connection.request_with_orgId_api_2( 'network/deployVlan', @@ -545,6 +653,15 @@ class DimensionDataNodeDriver(NodeDriver): ) def ex_get_vlan(self, vlan_id): + """ + Get a single VLAN, by it's identifier + + :param vlan_id: The identifier of the VLAN + :type vlan_id: ``str`` + + :return: an instance of `DimensionDataVlan` + :rtype: :class:`DimensionDataVlan` + """ locations = self.list_locations() vlan = self.connection.request_with_orgId_api_2( 'network/vlan/%s' % vlan_id).object @@ -554,6 +671,12 @@ class DimensionDataNodeDriver(NodeDriver): """ Updates the properties of the given VLAN Only name and description are updated + + :param vlan: The VLAN to update + :type vlan: :class:`DimensionDataNetworkDomain` + + :return: an instance of `DimensionDataVlan` + :rtype: :class:`DimensionDataVlan` """ edit_node = ET.Element('editVlan', {'xmlns': TYPES_URN}) edit_node.set('id', vlan.id) @@ -575,6 +698,12 @@ class DimensionDataNodeDriver(NodeDriver): The expansion will not be permitted if the proposed IP space overlaps with an already deployed VLANs IP space. + + :param vlan: The VLAN to update + :type vlan: :class:`DimensionDataNetworkDomain` + + :return: an instance of `DimensionDataVlan` + :rtype: :class:`DimensionDataVlan` """ edit_node = ET.Element('expandVlan', {'xmlns': TYPES_URN}) edit_node.set('id', vlan.id) @@ -589,6 +718,14 @@ class DimensionDataNodeDriver(NodeDriver): return vlan def ex_delete_vlan(self, vlan): + """ + Deletes an existing VLAN + + :param vlan: The VLAN to delete + :type vlan: :class:`DimensionDataNetworkDomain` + + :rtype: ``bool`` + """ delete_node = ET.Element('deleteVlan', {'xmlns': TYPES_URN}) delete_node.set('id', vlan.id) result = self.connection.request_with_orgId_api_2( @@ -601,7 +738,13 @@ class DimensionDataNodeDriver(NodeDriver): def ex_list_vlans(self, location=None, network_domain=None): """ - List VLANs available in a given networkDomain + List VLANs available, can filter by location and/or network domain + + :param location: Only VLANs in this location (optional) + :type location: :class:`NodeLocation` + + :param network_domain: Only VLANs in this domain (optional) + :type network_domain: :class:`DimensionDataNetworkDomain` :return: a list of DimensionDataVlan objects :rtype: ``list`` of :class:`DimensionDataVlan`