You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2013/10/23 21:53:40 UTC

[1/2] git commit: Issue LIBCLOUD-417: Add support for more EC2 Elastic IP Address operations.

Updated Branches:
  refs/heads/trunk 5e77186bb -> 6e96a8aee


Issue LIBCLOUD-417: Add support for more EC2 Elastic IP Address operations.

Add support for:

DisassociateAddress
ReleaseAddress
AllocateAddress

Signed-off-by: Tomaz Muraus <to...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/455f11c9
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/455f11c9
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/455f11c9

Branch: refs/heads/trunk
Commit: 455f11c9d40ead11d3e4ad7a2f38f4f90b78c866
Parents: 5e77186
Author: Patrick Armstrong <pa...@uvic.ca>
Authored: Tue Oct 15 12:46:06 2013 -0400
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed Oct 23 21:46:15 2013 +0200

----------------------------------------------------------------------
 docs/compute/drivers/ec2.rst                    | 10 ++++
 .../create_ec2_node_and_associate_elastic_ip.py | 28 +++++++++++
 libcloud/compute/drivers/ec2.py                 | 51 +++++++++++++++++++-
 .../compute/fixtures/ec2/allocate_address.xml   |  5 ++
 .../fixtures/ec2/disassociate_address.xml       |  4 ++
 .../compute/fixtures/ec2/release_address.xml    |  4 ++
 libcloud/test/compute/test_ec2.py               | 24 +++++++++
 7 files changed, 124 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/455f11c9/docs/compute/drivers/ec2.rst
----------------------------------------------------------------------
diff --git a/docs/compute/drivers/ec2.rst b/docs/compute/drivers/ec2.rst
index 27aff4a..51a1a33 100644
--- a/docs/compute/drivers/ec2.rst
+++ b/docs/compute/drivers/ec2.rst
@@ -1,6 +1,16 @@
 Amazon EC2 Driver Documentation
 ===============================
 
+Examples
+--------
+
+Allocate, Associate, Disassociate, and Release an Elastic IP
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: /examples/compute/create_ec2_node_and_associate_elastic_ip.py
+   :language: python
+
+
 API Docs
 --------
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/455f11c9/docs/examples/compute/create_ec2_node_and_associate_elastic_ip.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/create_ec2_node_and_associate_elastic_ip.py b/docs/examples/compute/create_ec2_node_and_associate_elastic_ip.py
new file mode 100644
index 0000000..0f44143
--- /dev/null
+++ b/docs/examples/compute/create_ec2_node_and_associate_elastic_ip.py
@@ -0,0 +1,28 @@
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+ACCESS_ID = 'your access id'
+SECRET_KEY = 'your secret key'
+
+IMAGE_ID = 'ami-c8052d8d'
+SIZE_ID = 't1.micro'
+
+cls = get_driver(Provider.EC2_US_WEST)
+driver = cls(ACCESS_ID, SECRET_KEY)
+
+sizes = driver.list_sizes()
+images = driver.list_images()
+
+size = [s for s in sizes if s.id == SIZE_ID][0]
+image = [i for i in images if i.id == IMAGE_ID][0]
+
+node = driver.create_node(name='test-node', image=image, size=size)
+
+# Here we allocate and associate an elastic IP
+elastic_ip = driver.ex_allocate_address()
+driver.ex_associate_addresses(node, elastic_ip)
+
+# When we are done with our elastic IP, we can disassociate from our
+# node, and release it
+driver.ex_disassociate_address(elastic_ip)
+driver.ex_release_address(elastic_ip)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/455f11c9/libcloud/compute/drivers/ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py
index b4f414c..7eecacc 100644
--- a/libcloud/compute/drivers/ec2.py
+++ b/libcloud/compute/drivers/ec2.py
@@ -1300,6 +1300,36 @@ class BaseEC2NodeDriver(NodeDriver):
             'Filter.0.Value.0': node.id
         })
 
+    def ex_allocate_address(self):
+        """
+        Allocate a new Elastic IP address
+
+        :return: String representation of allocated IP address
+        :rtype: ``str``
+        """
+        params = {'Action': 'AllocateAddress'}
+
+        response = self.connection.request(self.path, params=params).object
+        public_ip = findtext(element=response, xpath='publicIp',
+                                namespace=NAMESPACE)
+        return public_ip
+
+    def ex_release_address(self, elastic_ip_address):
+        """
+        Release an Elastic IP address
+
+        :param      elastic_ip_address: Elastic IP address which should be used
+        :type       elastic_ip_address: ``str``
+
+        :return: True on success, False otherwise.
+        :rtype: ``bool``
+        """
+        params = {'Action': 'ReleaseAddress'}
+
+        params.update({'PublicIp': elastic_ip_address})
+        response = self.connection.request(self.path, params=params).object
+        return self._get_boolean(response)
+
     def ex_describe_all_addresses(self, only_allocated=False):
         """
         Return all the Elastic IP addresses for this account
@@ -1337,7 +1367,7 @@ class BaseEC2NodeDriver(NodeDriver):
 
     def ex_associate_addresses(self, node, elastic_ip_address):
         """
-        Associate an IP address with a particular node.
+        Associate an Elastic IP address with a particular node.
 
         :param      node: Node instance
         :type       node: :class:`Node`
@@ -1345,11 +1375,28 @@ class BaseEC2NodeDriver(NodeDriver):
         :param      elastic_ip_address: IP address which should be used
         :type       elastic_ip_address: ``str``
 
+        :return: True on success, False otherwise.
         :rtype: ``bool``
         """
         params = {'Action': 'AssociateAddress'}
 
-        params.update(self._pathlist('InstanceId', [node.id]))
+        params.update({'InstanceId': node.id})
+        params.update({'PublicIp': elastic_ip_address})
+        res = self.connection.request(self.path, params=params).object
+        return self._get_boolean(res)
+
+    def ex_disassociate_address(self, elastic_ip_address):
+        """
+        Disassociate an Elastic IP address
+
+        :param      elastic_ip_address: Elastic IP address which should be used
+        :type       elastic_ip_address: ``str``
+
+        :return: True on success, False otherwise.
+        :rtype: ``bool``
+        """
+        params = {'Action': 'DisassociateAddress'}
+
         params.update({'PublicIp': elastic_ip_address})
         res = self.connection.request(self.path, params=params).object
         return self._get_boolean(res)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/455f11c9/libcloud/test/compute/fixtures/ec2/allocate_address.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/ec2/allocate_address.xml b/libcloud/test/compute/fixtures/ec2/allocate_address.xml
new file mode 100644
index 0000000..eaa54bb
--- /dev/null
+++ b/libcloud/test/compute/fixtures/ec2/allocate_address.xml
@@ -0,0 +1,5 @@
+<AllocateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2010-08-31/">
+    <requestId>56926e0e-5fa3-41f3-927c-17212def59df</requestId>
+    <publicIp>192.0.2.1</publicIp>
+    <domain>standard</domain>
+</AllocateAddressResponse>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/455f11c9/libcloud/test/compute/fixtures/ec2/disassociate_address.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/ec2/disassociate_address.xml b/libcloud/test/compute/fixtures/ec2/disassociate_address.xml
new file mode 100644
index 0000000..25a9990
--- /dev/null
+++ b/libcloud/test/compute/fixtures/ec2/disassociate_address.xml
@@ -0,0 +1,4 @@
+<DisassociateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2010-08-31/">
+    <requestId>dfb841f8-cc26-4f45-a3ac-dc08589eec1d</requestId>
+    <return>true</return>
+</DisassociateAddressResponse>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/455f11c9/libcloud/test/compute/fixtures/ec2/release_address.xml
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/ec2/release_address.xml b/libcloud/test/compute/fixtures/ec2/release_address.xml
new file mode 100644
index 0000000..35243c7
--- /dev/null
+++ b/libcloud/test/compute/fixtures/ec2/release_address.xml
@@ -0,0 +1,4 @@
+<ReleaseAddressResponse xmlns="http://ec2.amazonaws.com/doc/2010-08-31/">
+    <requestId>23ec1390-8c1d-4a3e-8042-b1ad84933f57</requestId>
+    <return>true</return>
+</ReleaseAddressResponse>

http://git-wip-us.apache.org/repos/asf/libcloud/blob/455f11c9/libcloud/test/compute/test_ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py
index 687d62e..81da921 100644
--- a/libcloud/test/compute/test_ec2.py
+++ b/libcloud/test/compute/test_ec2.py
@@ -459,11 +459,23 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin):
         self.assertEqual(len(elastic_ips2), 2)
         self.assertTrue('1.2.3.5' not in elastic_ips2)
 
+    def test_ex_allocate_address(self):
+        ret = self.driver.ex_allocate_address()
+        self.assertTrue(ret)
+
+    def test_ex_release_address(self):
+        ret = self.driver.ex_release_address('1.2.3.4')
+        self.assertTrue(ret)
+
     def test_ex_associate_addresses(self):
         node = Node('i-4382922a', None, None, None, None, self.driver)
         ret = self.driver.ex_associate_addresses(node, '1.2.3.4')
         self.assertTrue(ret)
 
+    def test_ex_disassociate_address(self):
+        ret = self.driver.ex_disassociate_address('1.2.3.4')
+        self.assertTrue(ret)
+
     def test_ex_change_node_size_same_size(self):
         size = NodeSize('m1.small', 'Small Instance', None, None, None, None, driver=self.driver)
         node = Node('i-4382922a', None, None, None, None, self.driver,
@@ -777,10 +789,22 @@ class EC2MockHttp(MockHttpTestCase):
         body = self.fixtures.load('describe_addresses_multi.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _AllocateAddress(self, method, url, body, headers):
+        body = self.fixtures.load('allocate_address.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
     def _AssociateAddress(self, method, url, body, headers):
         body = self.fixtures.load('associate_address.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _DisassociateAddress(self, method, url, body, headers):
+        body = self.fixtures.load('disassociate_address.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _ReleaseAddress(self, method, url, body, headers):
+        body = self.fixtures.load('release_address.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
     def _all_addresses_DescribeAddresses(self, method, url, body, headers):
         body = self.fixtures.load('describe_addresses_all.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])


[2/2] git commit: Update changes.

Posted by to...@apache.org.
Update changes.


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/6e96a8ae
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/6e96a8ae
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/6e96a8ae

Branch: refs/heads/trunk
Commit: 6e96a8aeea9b94110fdfd5742b7031f5cd9f3463
Parents: 455f11c
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed Oct 23 21:49:57 2013 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed Oct 23 21:49:57 2013 +0200

----------------------------------------------------------------------
 CHANGES | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/6e96a8ae/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 3ecd2f1..dbd9805 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,11 @@ Changes with Apache Libcloud in development
    - Fix ex_delete_keypair method in the EC2 driver. (LIBCLOUD-415)
      [Oleg Suharev]
 
+   - Add the following new extension methods for elastic IP management to the
+     EC2 driver: ex_allocate_address, ex_disassociate_address,
+     ex_release_address. (LIBCLOUD-417)
+     [Patrick Armstrong]
+
 Changes with Apache Libcloud 0.14.0-beta2
 
  *) Compute