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 2014/03/21 15:35:45 UTC

[1/6] git commit: Modify update_record method so user doesn't need to specify all the arguments.

Repository: libcloud
Updated Branches:
  refs/heads/trunk 428e14823 -> cd680cc76


Modify update_record method so user doesn't need to specify all the arguments.


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

Branch: refs/heads/trunk
Commit: ae7d6aebb7fafbc1ea2368da89e8ecfbaf6e62d8
Parents: 428e148
Author: Tomaz Muraus <to...@apache.org>
Authored: Fri Mar 21 13:39:24 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Fri Mar 21 13:39:24 2014 +0100

----------------------------------------------------------------------
 libcloud/dns/drivers/route53.py | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/ae7d6aeb/libcloud/dns/drivers/route53.py
----------------------------------------------------------------------
diff --git a/libcloud/dns/drivers/route53.py b/libcloud/dns/drivers/route53.py
index 38abca8..09dc250 100644
--- a/libcloud/dns/drivers/route53.py
+++ b/libcloud/dns/drivers/route53.py
@@ -190,7 +190,18 @@ class Route53DNSDriver(DNSDriver):
         return Record(id=id, name=name, type=type, data=data, zone=zone,
                       driver=self, extra=extra)
 
-    def update_record(self, record, name, type, data, extra):
+    def update_record(self, record, name=None, type=None, data=None,
+                      extra=None):
+
+        if not name:
+            name = record.name
+
+        if not type:
+            type = record.type
+
+        if not extra:
+            extra = record.extra
+
         batch = [
             ('DELETE', record.name, record.type, record.data, record.extra),
             ('CREATE', name, type, data, extra)]


[2/6] git commit: Update Route53 driver so update_record method works correctly for records with multiple values.

Posted by to...@apache.org.
Update Route53 driver so update_record method works correctly for records with
multiple values.


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

Branch: refs/heads/trunk
Commit: 692c5283459e7f6a6ccf064292fa4c0d1a7e9508
Parents: ae7d6ae
Author: Tomaz Muraus <to...@apache.org>
Authored: Fri Mar 21 14:31:18 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Fri Mar 21 14:34:45 2014 +0100

----------------------------------------------------------------------
 libcloud/dns/drivers/route53.py | 128 ++++++++++++++++++++++++++++++++---
 1 file changed, 120 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/692c5283/libcloud/dns/drivers/route53.py
----------------------------------------------------------------------
diff --git a/libcloud/dns/drivers/route53.py b/libcloud/dns/drivers/route53.py
index 09dc250..5cc8664 100644
--- a/libcloud/dns/drivers/route53.py
+++ b/libcloud/dns/drivers/route53.py
@@ -21,6 +21,7 @@ import base64
 import hmac
 import datetime
 import uuid
+import copy
 from libcloud.utils.py3 import httplib
 
 from hashlib import sha1
@@ -190,9 +191,71 @@ class Route53DNSDriver(DNSDriver):
         return Record(id=id, name=name, type=type, data=data, zone=zone,
                       driver=self, extra=extra)
 
+    def _update_single_value_record(self, record, name=None, type=None,
+                                    data=None, extra=None):
+        batch = [
+            ('DELETE', record.name, record.type, record.data, record.extra),
+            ('CREATE', name, type, data, extra)
+        ]
+
+        return self._post_changeset(record.zone, batch)
+
+    def _update_multi_value_record(self, record, name=None, type=None,
+                                   data=None, extra=None):
+        other_records = record.extra.get('_other_records', [])
+
+        attrs = {'xmlns': NAMESPACE}
+        changeset = ET.Element('ChangeResourceRecordSetsRequest', attrs)
+        batch = ET.SubElement(changeset, 'ChangeBatch')
+        changes = ET.SubElement(batch, 'Changes')
+
+        # Delete existing records
+        change = ET.SubElement(changes, 'Change')
+        ET.SubElement(change, 'Action').text = 'DELETE'
+
+        rrs = ET.SubElement(change, 'ResourceRecordSet')
+        ET.SubElement(rrs, 'Name').text = record.name + '.' + \
+            record.zone.domain
+        ET.SubElement(rrs, 'Type').text = self.RECORD_TYPE_MAP[record.type]
+        ET.SubElement(rrs, 'TTL').text = str(record.extra.get('ttl', '0'))
+
+        rrecs = ET.SubElement(rrs, 'ResourceRecords')
+
+        rrec = ET.SubElement(rrecs, 'ResourceRecord')
+        ET.SubElement(rrec, 'Value').text = record.data
+
+        for other_record in other_records:
+            rrec = ET.SubElement(rrecs, 'ResourceRecord')
+            ET.SubElement(rrec, 'Value').text = other_record['data']
+
+        # Re-create new (updated) records. Since we are updating a multi value
+        # record, only a single record is updated and others are left as is.
+        change = ET.SubElement(changes, 'Change')
+        ET.SubElement(change, 'Action').text = 'CREATE'
+
+        rrs = ET.SubElement(change, 'ResourceRecordSet')
+        ET.SubElement(rrs, 'Name').text = name + '.' + record.zone.domain
+        ET.SubElement(rrs, 'Type').text = self.RECORD_TYPE_MAP[type]
+        ET.SubElement(rrs, 'TTL').text = str(extra.get('ttl', '0'))
+
+        rrecs = ET.SubElement(rrs, 'ResourceRecords')
+
+        rrec = ET.SubElement(rrecs, 'ResourceRecord')
+        ET.SubElement(rrec, 'Value').text = data
+
+        for other_record in other_records:
+            rrec = ET.SubElement(rrecs, 'ResourceRecord')
+            ET.SubElement(rrec, 'Value').text = other_record['data']
+
+        uri = API_ROOT + 'hostedzone/' + record.zone.id + '/rrset'
+        data = ET.tostring(changeset)
+        self.connection.set_context({'zone_id': record.zone.id})
+        response = self.connection.request(uri, method='POST', data=data)
+
+        return response.status == httplib.OK
+
     def update_record(self, record, name=None, type=None, data=None,
                       extra=None):
-
         if not name:
             name = record.name
 
@@ -202,10 +265,20 @@ class Route53DNSDriver(DNSDriver):
         if not extra:
             extra = record.extra
 
-        batch = [
-            ('DELETE', record.name, record.type, record.data, record.extra),
-            ('CREATE', name, type, data, extra)]
-        self._post_changeset(record.zone, batch)
+        # Multiple value records need to be handled specially - we need to
+        # pass values for other records as well
+        multiple_value_record = record.extra.get('_multi_value', False)
+        other_records = record.extra.get('_other_records', [])
+
+        if multiple_value_record and other_records:
+            self._update_multi_value_record(record=record, name=name,
+                                            type=type, data=data,
+                                            extra=extra)
+        else:
+            self._update_single_value_record(record=record, name=name,
+                                             type=type, data=data,
+                                             extra=extra)
+
         id = ':'.join((self.RECORD_TYPE_MAP[type], name))
         return Record(id=id, name=name, type=type, data=data, zone=record.zone,
                       driver=self, extra=extra)
@@ -247,7 +320,7 @@ class Route53DNSDriver(DNSDriver):
             ET.SubElement(change, 'Action').text = action
 
             rrs = ET.SubElement(change, 'ResourceRecordSet')
-            ET.SubElement(rrs, 'Name').text = name + "." + zone.domain
+            ET.SubElement(rrs, 'Name').text = name + '.' + zone.domain
             ET.SubElement(rrs, 'Type').text = self.RECORD_TYPE_MAP[type_]
             ET.SubElement(rrs, 'TTL').text = str(extra.get('ttl', '0'))
 
@@ -258,7 +331,9 @@ class Route53DNSDriver(DNSDriver):
         uri = API_ROOT + 'hostedzone/' + zone.id + '/rrset'
         data = ET.tostring(changeset)
         self.connection.set_context({'zone_id': zone.id})
-        self.connection.request(uri, method='POST', data=data)
+        response = self.connection.request(uri, method='POST', data=data)
+
+        return response.status == httplib.OK
 
     def _to_zones(self, data):
         zones = []
@@ -294,8 +369,45 @@ class Route53DNSDriver(DNSDriver):
             record_set = elem.findall(fixxpath(
                                       xpath='ResourceRecords/ResourceRecord',
                                       namespace=NAMESPACE))
+            record_count = len(record_set)
+            multiple_value_record = (record_count > 1)
+
+            record_set_records = []
+
             for index, record in enumerate(record_set):
-                records.append(self._to_record(elem, zone, index))
+                # Need to special handling for records with multiple values for
+                # update to work correctly
+                record = self._to_record(elem=elem, zone=zone, index=index)
+                record.extra['_multi_value'] = multiple_value_record
+
+                if multiple_value_record:
+                    record.extra['_other_records'] = []
+
+                record_set_records.append(record)
+
+            # Store reference to other records so update works correctly
+            if multiple_value_record:
+                for index in range(0, len(record_set_records)):
+                    record = record_set_records[index]
+
+                    for other_index, other_record in \
+                            enumerate(record_set_records):
+                        if index == other_index:
+                            # Skip current record
+                            continue
+
+                        extra = copy.deepcopy(other_record.extra)
+                        extra.pop('_multi_value')
+                        extra.pop('_other_records')
+
+                        item = {'name': other_record.name,
+                                'data': other_record.data,
+                                'type': other_record.type,
+                                'extra': extra}
+                        record.extra['_other_records'].append(item)
+
+            records.extend(record_set_records)
+
         return records
 
     def _to_record(self, elem, zone, index=0):


[6/6] git commit: Add ex_create_multi_value_record method to the Route53 driver which allows user to create a record with multiple values with a single call.

Posted by to...@apache.org.
Add ex_create_multi_value_record method to the Route53 driver which allows
user to create a record with multiple values with a single call.


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

Branch: refs/heads/trunk
Commit: cd680cc760d98560ff7ace1e2ecf5e7aef664d05
Parents: 243e97f
Author: Tomaz Muraus <to...@apache.org>
Authored: Fri Mar 21 15:20:01 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Fri Mar 21 15:20:50 2014 +0100

----------------------------------------------------------------------
 CHANGES.rst                     |  4 +++
 libcloud/dns/drivers/route53.py | 47 ++++++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/cd680cc7/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 95f7ffa..744b7fc 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -87,6 +87,10 @@ DNS
   records with multiple values.
   [Tomaz Muraus]
 
+- Add ex_create_multi_value_record method to the Route53 driver which allows
+  user to create a record with multiple values with a single call.
+  [Tomaz Muraus]
+
 Changes with Apache Libcloud 0.14.1
 -----------------------------------
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/cd680cc7/libcloud/dns/drivers/route53.py
----------------------------------------------------------------------
diff --git a/libcloud/dns/drivers/route53.py b/libcloud/dns/drivers/route53.py
index 19a5bdf..d07bb6c 100644
--- a/libcloud/dns/drivers/route53.py
+++ b/libcloud/dns/drivers/route53.py
@@ -229,6 +229,53 @@ class Route53DNSDriver(DNSDriver):
                                           record_id=r.id)
         return True
 
+    def ex_create_multi_value_record(self, name, zone, type, data, extra=None):
+        """
+        Create a record with multiple values with a single call.
+
+        :return: A list of created records.
+        :rtype: ``list`` of :class:`libcloud.dns.base.Record`
+        """
+        extra = extra or {}
+
+        attrs = {'xmlns': NAMESPACE}
+        changeset = ET.Element('ChangeResourceRecordSetsRequest', attrs)
+        batch = ET.SubElement(changeset, 'ChangeBatch')
+        changes = ET.SubElement(batch, 'Changes')
+
+        change = ET.SubElement(changes, 'Change')
+        ET.SubElement(change, 'Action').text = 'CREATE'
+
+        rrs = ET.SubElement(change, 'ResourceRecordSet')
+        ET.SubElement(rrs, 'Name').text = name + '.' + zone.domain
+        ET.SubElement(rrs, 'Type').text = self.RECORD_TYPE_MAP[type]
+        ET.SubElement(rrs, 'TTL').text = str(extra.get('ttl', '0'))
+
+        rrecs = ET.SubElement(rrs, 'ResourceRecords')
+
+        # Value is provided as a multi line string
+        values = [value.strip() for value in data.split('\n') if
+                  value.strip()]
+
+        for value in values:
+            rrec = ET.SubElement(rrecs, 'ResourceRecord')
+            ET.SubElement(rrec, 'Value').text = value
+
+        uri = API_ROOT + 'hostedzone/' + zone.id + '/rrset'
+        data = ET.tostring(changeset)
+        self.connection.set_context({'zone_id': zone.id})
+        self.connection.request(uri, method='POST', data=data)
+
+        id = ':'.join((self.RECORD_TYPE_MAP[type], name))
+
+        records = []
+        for value in values:
+            record = Record(id=id, name=name, type=type, data=value, zone=zone,
+                            driver=self, extra=extra)
+            records.append(record)
+
+        return record
+
     def ex_delete_all_records(self, zone):
         """
         Remove all the records for the provided zone.


[5/6] git commit: Re-order methods.

Posted by to...@apache.org.
Re-order methods.


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

Branch: refs/heads/trunk
Commit: 243e97f0202f7e2040163da359249a5766db08cd
Parents: 9ececf6
Author: Tomaz Muraus <to...@apache.org>
Authored: Fri Mar 21 14:48:54 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Fri Mar 21 14:48:54 2014 +0100

----------------------------------------------------------------------
 libcloud/dns/drivers/route53.py | 106 +++++++++++++++++------------------
 1 file changed, 53 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/243e97f0/libcloud/dns/drivers/route53.py
----------------------------------------------------------------------
diff --git a/libcloud/dns/drivers/route53.py b/libcloud/dns/drivers/route53.py
index 86e3754..19a5bdf 100644
--- a/libcloud/dns/drivers/route53.py
+++ b/libcloud/dns/drivers/route53.py
@@ -192,6 +192,59 @@ class Route53DNSDriver(DNSDriver):
         return Record(id=id, name=name, type=type, data=data, zone=zone,
                       driver=self, extra=extra)
 
+    def update_record(self, record, name=None, type=None, data=None,
+                      extra=None):
+        name = name or record.name
+        type = type or record.type
+        extra = extra or record.extra
+
+        if not extra:
+            extra = record.extra
+
+        # Multiple value records need to be handled specially - we need to
+        # pass values for other records as well
+        multiple_value_record = record.extra.get('_multi_value', False)
+        other_records = record.extra.get('_other_records', [])
+
+        if multiple_value_record and other_records:
+            self._update_multi_value_record(record=record, name=name,
+                                            type=type, data=data,
+                                            extra=extra)
+        else:
+            self._update_single_value_record(record=record, name=name,
+                                             type=type, data=data,
+                                             extra=extra)
+
+        id = ':'.join((self.RECORD_TYPE_MAP[type], name))
+        return Record(id=id, name=name, type=type, data=data, zone=record.zone,
+                      driver=self, extra=extra)
+
+    def delete_record(self, record):
+        try:
+            r = record
+            batch = [('DELETE', r.name, r.type, r.data, r.extra)]
+            self._post_changeset(record.zone, batch)
+        except InvalidChangeBatch:
+            raise RecordDoesNotExistError(value='', driver=self,
+                                          record_id=r.id)
+        return True
+
+    def ex_delete_all_records(self, zone):
+        """
+        Remove all the records for the provided zone.
+
+        :param zone: Zone to delete records for.
+        :type  zone: :class:`Zone`
+        """
+        deletions = []
+        for r in zone.list_records():
+            if r.type in (RecordType.NS, RecordType.SOA):
+                continue
+            deletions.append(('DELETE', r.name, r.type, r.data, r.extra))
+
+        if deletions:
+            self._post_changeset(zone, deletions)
+
     def _update_single_value_record(self, record, name=None, type=None,
                                     data=None, extra=None):
         batch = [
@@ -255,59 +308,6 @@ class Route53DNSDriver(DNSDriver):
 
         return response.status == httplib.OK
 
-    def update_record(self, record, name=None, type=None, data=None,
-                      extra=None):
-        name = name or record.name
-        type = type or record.type
-        extra = extra or record.extra
-
-        if not extra:
-            extra = record.extra
-
-        # Multiple value records need to be handled specially - we need to
-        # pass values for other records as well
-        multiple_value_record = record.extra.get('_multi_value', False)
-        other_records = record.extra.get('_other_records', [])
-
-        if multiple_value_record and other_records:
-            self._update_multi_value_record(record=record, name=name,
-                                            type=type, data=data,
-                                            extra=extra)
-        else:
-            self._update_single_value_record(record=record, name=name,
-                                             type=type, data=data,
-                                             extra=extra)
-
-        id = ':'.join((self.RECORD_TYPE_MAP[type], name))
-        return Record(id=id, name=name, type=type, data=data, zone=record.zone,
-                      driver=self, extra=extra)
-
-    def delete_record(self, record):
-        try:
-            r = record
-            batch = [('DELETE', r.name, r.type, r.data, r.extra)]
-            self._post_changeset(record.zone, batch)
-        except InvalidChangeBatch:
-            raise RecordDoesNotExistError(value='', driver=self,
-                                          record_id=r.id)
-        return True
-
-    def ex_delete_all_records(self, zone):
-        """
-        Remove all the records for the provided zone.
-
-        :param zone: Zone to delete records for.
-        :type  zone: :class:`Zone`
-        """
-        deletions = []
-        for r in zone.list_records():
-            if r.type in (RecordType.NS, RecordType.SOA):
-                continue
-            deletions.append(('DELETE', r.name, r.type, r.data, r.extra))
-
-        if deletions:
-            self._post_changeset(zone, deletions)
-
     def _post_changeset(self, zone, changes_list):
         attrs = {'xmlns': NAMESPACE}
         changeset = ET.Element('ChangeResourceRecordSetsRequest', attrs)


[4/6] 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/9ececf65
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/9ececf65
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/9ececf65

Branch: refs/heads/trunk
Commit: 9ececf6531dcf10c80615f0f0fe51ea4aab85c65
Parents: 5e5eaea
Author: Tomaz Muraus <to...@apache.org>
Authored: Fri Mar 21 14:46:53 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Fri Mar 21 14:46:53 2014 +0100

----------------------------------------------------------------------
 CHANGES.rst | 7 +++++++
 1 file changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/9ececf65/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index d2b73cc..95f7ffa 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -80,6 +80,13 @@ Load Balancer
   (LIBCLOUD-522, GITHUB-253)
   [Rahul Ranjan]
 
+DNS
+~~~
+
+- Fix update_record method in the Route56 driver so it works correctly for
+  records with multiple values.
+  [Tomaz Muraus]
+
 Changes with Apache Libcloud 0.14.1
 -----------------------------------
 


[3/6] git commit: Use shorther notation.

Posted by to...@apache.org.
Use shorther notation.


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

Branch: refs/heads/trunk
Commit: 5e5eaeab4c4d24bae199f5bc061fcc3baab336cd
Parents: 692c528
Author: Tomaz Muraus <to...@apache.org>
Authored: Fri Mar 21 14:46:44 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Fri Mar 21 14:46:44 2014 +0100

----------------------------------------------------------------------
 libcloud/dns/drivers/route53.py | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/5e5eaeab/libcloud/dns/drivers/route53.py
----------------------------------------------------------------------
diff --git a/libcloud/dns/drivers/route53.py b/libcloud/dns/drivers/route53.py
index 5cc8664..86e3754 100644
--- a/libcloud/dns/drivers/route53.py
+++ b/libcloud/dns/drivers/route53.py
@@ -185,6 +185,7 @@ class Route53DNSDriver(DNSDriver):
         return response.status in [httplib.OK]
 
     def create_record(self, name, zone, type, data, extra=None):
+        extra = extra or {}
         batch = [('CREATE', name, type, data, extra)]
         self._post_changeset(zone, batch)
         id = ':'.join((self.RECORD_TYPE_MAP[type], name))
@@ -256,11 +257,9 @@ class Route53DNSDriver(DNSDriver):
 
     def update_record(self, record, name=None, type=None, data=None,
                       extra=None):
-        if not name:
-            name = record.name
-
-        if not type:
-            type = record.type
+        name = name or record.name
+        type = type or record.type
+        extra = extra or record.extra
 
         if not extra:
             extra = record.extra