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/01/02 00:41:41 UTC

[1/4] git commit: Add some more test for verify_hostname.

Updated Branches:
  refs/heads/trunk 139b2eb5d -> 621ccdd9a


Add some more test for verify_hostname.


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

Branch: refs/heads/trunk
Commit: 01117eead5425c429c2ee3ba0dba1b4080871c67
Parents: 139b2eb
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed Jan 1 14:47:56 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Thu Jan 2 00:09:34 2014 +0100

----------------------------------------------------------------------
 libcloud/test/test_httplib_ssl.py | 10 ++++++++++
 1 file changed, 10 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/01117eea/libcloud/test/test_httplib_ssl.py
----------------------------------------------------------------------
diff --git a/libcloud/test/test_httplib_ssl.py b/libcloud/test/test_httplib_ssl.py
index ddbaa14..5308eee 100644
--- a/libcloud/test/test_httplib_ssl.py
+++ b/libcloud/test/test_httplib_ssl.py
@@ -68,6 +68,7 @@ class TestHttpLibSSLTests(unittest.TestCase):
         self.assertEqual(libcloud.security.CA_CERTS_PATH, [file_path])
 
     def test_verify_hostname(self):
+        # commonName
         cert1 = {'notAfter': 'Feb 16 16:54:50 2013 GMT',
                  'subject': ((('countryName', 'US'),),
                              (('stateOrProvinceName', 'Delaware'),),
@@ -76,6 +77,7 @@ class TestHttpLibSSLTests(unittest.TestCase):
                              (('organizationalUnitName', 'SSL'),),
                              (('commonName', 'somemachine.python.org'),))}
 
+        # commonName
         cert2 = {'notAfter': 'Feb 16 16:54:50 2013 GMT',
                  'subject': ((('countryName', 'US'),),
                              (('stateOrProvinceName', 'Delaware'),),
@@ -86,6 +88,7 @@ class TestHttpLibSSLTests(unittest.TestCase):
                  'subjectAltName': ((('DNS', 'foo.alt.name')),
                                     (('DNS', 'foo.alt.name.1')))}
 
+        # commonName
         cert3 = {'notAfter': 'Feb 16 16:54:50 2013 GMT',
                  'subject': ((('countryName', 'US'),),
                              (('stateOrProvinceName', 'Delaware'),),
@@ -94,6 +97,7 @@ class TestHttpLibSSLTests(unittest.TestCase):
                              (('organizationalUnitName', 'SSL'),),
                              (('commonName', 'python.org'),))}
 
+        # wildcard commonName
         cert4 = {'notAfter': 'Feb 16 16:54:50 2013 GMT',
                  'subject': ((('countryName', 'US'),),
                              (('stateOrProvinceName', 'Delaware'),),
@@ -141,6 +145,12 @@ class TestHttpLibSSLTests(unittest.TestCase):
                         hostname='us-east-1.api.joyentcloud.com', cert=cert4))
         self.assertTrue(self.httplib_object._verify_hostname(
                         hostname='useast-1.api.joyentcloud.com', cert=cert4))
+        self.assertFalse(self.httplib_object._verify_hostname(
+                         hostname='t1.useast-1.api.joyentcloud.com', cert=cert4))
+        self.assertFalse(self.httplib_object._verify_hostname(
+                         hostname='ponies.useast-1.api.joyentcloud.com', cert=cert4))
+        self.assertFalse(self.httplib_object._verify_hostname(
+                         hostname='api.useast-1.api.joyentcloud.com', cert=cert4))
 
     def test_get_subject_alt_names(self):
         cert1 = {'notAfter': 'Feb 16 16:54:50 2013 GMT',


[4/4] git commit: Issue LIBCLOUD-485: Added a new constant dictionary, RESOURCE_EXTRA_ATTRIBUTES_MAP, at the top of the driver which will be used to store the xpath and transform defintions for each element of the extra dictionary for each resource. This

Posted by to...@apache.org.
Issue LIBCLOUD-485: Added a new constant dictionary,
RESOURCE_EXTRA_ATTRIBUTES_MAP, at the top of the driver which will be used to
store the xpath and transform defintions for each element of the extra
dictionary for each resource. This functionality previously existed in the
private _to_XXXX methods, but was re-located for readibility and to make it
centralize the functionality for easier management and updates going forward.

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/621ccdd9
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/621ccdd9
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/621ccdd9

Branch: refs/heads/trunk
Commit: 621ccdd9aafd1ff6361a989b2ff555336f5badfc
Parents: a5ba3db
Author: Chris DeRamus <ch...@divvycloud.com>
Authored: Mon Dec 30 14:02:33 2013 -0500
Committer: Tomaz Muraus <to...@apache.org>
Committed: Thu Jan 2 00:09:58 2014 +0100

----------------------------------------------------------------------
 libcloud/compute/drivers/ec2.py | 484 +++++++++++++++++------------------
 1 file changed, 242 insertions(+), 242 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/621ccdd9/libcloud/compute/drivers/ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py
index 533a05c..3d52214 100644
--- a/libcloud/compute/drivers/ec2.py
+++ b/libcloud/compute/drivers/ec2.py
@@ -469,6 +469,234 @@ REGION_DETAILS = {
     }
 }
 
+"""
+Define the extra dictionary for specific resources
+"""
+RESOURCE_EXTRA_ATTRIBUTES_MAP = {
+    'ebs_volume': {
+        'snapshot_id': {
+            'xpath': 'ebs/snapshotId',
+            'transform_func': str
+        },
+        'volume_size': {
+            'xpath': 'ebs/volumeSize',
+            'transform_func': int
+        },
+        'delete': {
+            'xpath': 'ebs/deleteOnTermination',
+            'transform_func': str
+        },
+        'volume_type': {
+            'xpath': 'ebs/volumeType',
+            'transform_func': str
+        },
+        'iops': {
+            'xpath': 'ebs/iops',
+            'transform_func': int
+        }
+    },
+    'image': {
+        'state': {
+            'xpath': 'imageState',
+            'transform_func': str
+        },
+        'owner_id': {
+            'xpath': 'imageOwnerId',
+            'transform_func': str
+        },
+        'owner_alias': {
+            'xpath': 'imageOwnerAlias',
+            'transform_func': str
+        },
+        'is_public': {
+            'xpath': 'isPublic',
+            'transform_func': str
+        },
+        'architecture': {
+            'xpath': 'architecture',
+            'transform_func': str
+        },
+        'image_type': {
+            'xpath': 'imageType',
+            'transform_func': str
+        },
+        'image_location': {
+            'xpath': 'imageLocation',
+            'transform_func': str
+        },
+        'platform': {
+            'xpath': 'platform',
+            'transform_func': str
+        },
+        'description': {
+            'xpath': 'description',
+            'transform_func': str
+        },
+        'root_device_type': {
+            'xpath': 'rootDeviceType',
+            'transform_func': str
+        },
+        'virtualization_type': {
+            'xpath': 'virtualizationType',
+            'transform_func': str
+        },
+        'hypervisor': {
+            'xpath': 'hypervisor',
+            'transform_func': str
+        },
+        'kernel_id': {
+            'xpath': 'kernelId',
+            'transform_func': str
+        },
+        'ramdisk_id': {
+            'xpath': 'ramdisk_id',
+            'transform_func': str
+        }
+    },
+    'network': {
+        'state': {
+            'xpath': 'state',
+            'transform_func': str
+        },
+        'dhcp_options_id': {
+            'xpath': 'dhcpOptionsId',
+            'transform_func': str
+        },
+        'instance_tenancy': {
+            'xpath': 'instanceTenancy',
+            'transform_func': str
+        },
+        'is_default': {
+            'xpath': 'isDefault',
+            'transform_func': str
+        }
+    },
+    'reserved_node': {
+        'instance_type': {
+            'xpath': 'instanceType',
+            'transform_func': str
+        },
+        'availability': {
+            'xpath': 'availabilityZone',
+            'transform_func': str
+        },
+        'start': {
+            'xpath': 'start',
+            'transform_func': str
+        },
+        'duration': {
+            'xpath': 'duration',
+            'transform_func': int
+        },
+        'usage_price': {
+            'xpath': 'usagePrice',
+            'transform_func': float
+        },
+        'fixed_price': {
+            'xpath': 'fixedPrice',
+            'transform_func': float
+        },
+        'instance_count': {
+            'xpath': 'instanceCount',
+            'transform_func': int
+        },
+        'description': {
+            'xpath': 'productDescription',
+            'transform_func': str
+        },
+        'instance_tenancy': {
+            'xpath': 'instanceTenancy',
+            'transform_func': str
+        },
+        'currency_code': {
+            'xpath': 'currencyCode',
+            'transform_func': str
+        },
+        'offering_type': {
+            'xpath': 'offeringType',
+            'transform_func': str
+        }
+    },
+    'snapshot': {
+        'volume_id': {
+            'xpath': 'volumeId',
+            'transform_func': str
+        },
+        'state': {
+            'xpath': 'status',
+            'transform_func': str
+        },
+        'description': {
+            'xpath': 'description',
+            'transform_func': str
+        },
+        'progress': {
+            'xpath': 'progress',
+            'transform_func': str
+        },
+        'start_time': {
+            'xpath': 'startTime',
+            'transform_func': parse_date
+        }
+    },
+    'subnet': {
+        'cidr_block': {
+            'xpath': 'cidrBlock',
+            'transform_func': str
+        },
+        'available_ips': {
+            'xpath': 'availableIpAddressCount',
+            'transform_func': int
+        },
+        'zone': {
+            'xpath': 'availabilityZone',
+            'transform_func': str
+        },
+        'vpc_id': {
+            'xpath': 'vpcId',
+            'transform_func': str
+        }
+    },
+    'volume': {
+        'device': {
+            'xpath': 'device',
+            'transform_func': str
+        },
+        'iops': {
+            'xpath': 'iops',
+            'transform_func': int
+        },
+        'zone': {
+            'xpath': 'availabilityZone',
+            'transform_func': str
+        },
+        'create_time': {
+            'xpath': 'createTime',
+            'transform_func': parse_date
+        },
+        'state': {
+            'xpath': 'status',
+            'transform_func': str
+        },
+        'attach_time': {
+            'xpath': 'attachmentSet/item/attachTime',
+            'transform_func': parse_date
+        },
+        'attachment_status': {
+            'xpath': 'attachmentSet/item/status',
+            'transform_func': str
+        },
+        'instance_id': {
+            'xpath': 'attachmentSet/item/instanceId',
+            'transform_func': str
+        },
+        'delete': {
+            'xpath': 'attachmentSet/item/deleteOnTermination',
+            'transform_func': str
+        }
+    }
+}
+
 VALID_EC2_REGIONS = REGION_DETAILS.keys()
 VALID_EC2_REGIONS = [r for r in VALID_EC2_REGIONS if r != 'nimbus']
 
@@ -671,56 +899,10 @@ class BaseEC2NodeDriver(NodeDriver):
         Build an EC2ReservedNode object using the reserved instance properties.
         Information on these properties can be found at http://goo.gl/ulXCC7.
         """
-        # Build our extra attributes map
-        extra_attributes_map = {
-            'instance_type': {
-                'xpath': 'instanceType',
-                'transform_func': str
-            },
-            'availability': {
-                'xpath': 'availabilityZone',
-                'transform_func': str
-            },
-            'start': {
-                'xpath': 'start',
-                'transform_func': str
-            },
-            'duration': {
-                'xpath': 'duration',
-                'transform_func': int
-            },
-            'usage_price': {
-                'xpath': 'usagePrice',
-                'transform_func': float
-            },
-            'fixed_price': {
-                'xpath': 'fixedPrice',
-                'transform_func': float
-            },
-            'instance_count': {
-                'xpath': 'instanceCount',
-                'transform_func': int
-            },
-            'description': {
-                'xpath': 'productDescription',
-                'transform_func': str
-            },
-            'instance_tenancy': {
-                'xpath': 'instanceTenancy',
-                'transform_func': str
-            },
-            'currency_code': {
-                'xpath': 'currencyCode',
-                'transform_func': str
-            },
-            'offering_type': {
-                'xpath': 'offeringType',
-                'transform_func': str
-            }
-        }
 
         # Get our extra dictionary
-        extra = self._get_extra_dict(element, extra_attributes_map)
+        extra = self._get_extra_dict(
+            element, RESOURCE_EXTRA_ATTRIBUTES_MAP['reserved_node'])
 
         try:
             size = [size for size in self.list_sizes() if
@@ -846,31 +1028,8 @@ class BaseEC2NodeDriver(NodeDriver):
         # If virtual name does not exist then this is an EBS volume.
         # Build the EBS dictionary leveraging the _get_extra_dict method.
         if mapping['virtual_name'] is None:
-            # Build our attributes map
-            attributes_map = {
-                'snapshot_id': {
-                    'xpath': 'ebs/snapshotId',
-                    'transform_func': str
-                },
-                'volume_size': {
-                    'xpath': 'ebs/volumeSize',
-                    'transform_func': int
-                },
-                'delete': {
-                    'xpath': 'ebs/deleteOnTermination',
-                    'transform_func': str
-                },
-                'volume_type': {
-                    'xpath': 'ebs/volumeType',
-                    'transform_func': str
-                },
-                'iops': {
-                    'xpath': 'ebs/iops',
-                    'transform_func': int
-                }
-            }
-
-            mapping['ebs'] = self._get_extra_dict(element, attributes_map)
+            mapping['ebs'] = self._get_extra_dict(
+                element, RESOURCE_EXTRA_ATTRIBUTES_MAP['ebs_volume'])
 
         return mapping
 
@@ -890,68 +1049,9 @@ class BaseEC2NodeDriver(NodeDriver):
         # Get our tags
         tags = self._get_resource_tags(element)
 
-        # Build our extra attributes map
-        extra_attributes_map = {
-            'state': {
-                'xpath': 'imageState',
-                'transform_func': str
-            },
-            'owner_id': {
-                'xpath': 'imageOwnerId',
-                'transform_func': str
-            },
-            'owner_alias': {
-                'xpath': 'imageOwnerAlias',
-                'transform_func': str
-            },
-            'is_public': {
-                'xpath': 'isPublic',
-                'transform_func': str
-            },
-            'architecture': {
-                'xpath': 'architecture',
-                'transform_func': str
-            },
-            'image_type': {
-                'xpath': 'imageType',
-                'transform_func': str
-            },
-            'image_location': {
-                'xpath': 'imageLocation',
-                'transform_func': str
-            },
-            'platform': {
-                'xpath': 'platform',
-                'transform_func': str
-            },
-            'description': {
-                'xpath': 'description',
-                'transform_func': str
-            },
-            'root_device_type': {
-                'xpath': 'rootDeviceType',
-                'transform_func': str
-            },
-            'virtualization_type': {
-                'xpath': 'virtualizationType',
-                'transform_func': str
-            },
-            'hypervisor': {
-                'xpath': 'hypervisor',
-                'transform_func': str
-            },
-            'kernel_id': {
-                'xpath': 'kernelId',
-                'transform_func': str
-            },
-            'ramdisk_id': {
-                'xpath': 'ramdisk_id',
-                'transform_func': str
-            }
-        }
-
         # Get our extra dictionary
-        extra = self._get_extra_dict(element, extra_attributes_map)
+        extra = self._get_extra_dict(
+            element, RESOURCE_EXTRA_ATTRIBUTES_MAP['image'])
 
         # Add our tags and block device mapping
         extra['tags'] = tags
@@ -982,48 +1082,9 @@ class BaseEC2NodeDriver(NodeDriver):
         # fall back then use the volume id
         name = name if name else tags.get('Name', volId)
 
-        # Build our extra attributes map
-        extra_attributes_map = {
-            'device': {
-                'xpath': 'device',
-                'transform_func': str
-            },
-            'iops': {
-                'xpath': 'iops',
-                'transform_func': int
-            },
-            'zone': {
-                'xpath': 'availabilityZone',
-                'transform_func': str
-            },
-            'create_time': {
-                'xpath': 'createTime',
-                'transform_func': parse_date
-            },
-            'state': {
-                'xpath': 'status',
-                'transform_func': str
-            },
-            'attach_time': {
-                'xpath': 'attachmentSet/item/attachTime',
-                'transform_func': parse_date
-            },
-            'attachment_status': {
-                'xpath': 'attachmentSet/item/status',
-                'transform_func': str
-            },
-            'instance_id': {
-                'xpath': 'attachmentSet/item/instanceId',
-                'transform_func': str
-            },
-            'delete': {
-                'xpath': 'attachmentSet/item/deleteOnTermination',
-                'transform_func': str
-            }
-        }
-
         # Get our extra dictionary
-        extra = self._get_extra_dict(element, extra_attributes_map)
+        extra = self._get_extra_dict(
+            element, RESOURCE_EXTRA_ATTRIBUTES_MAP['volume'])
 
         return StorageVolume(id=volId,
                              name=name,
@@ -1049,32 +1110,9 @@ class BaseEC2NodeDriver(NodeDriver):
         # fall back then use the snapshot id
         name = name if name else tags.get('Name', snapId)
 
-        # Build our extra attributes map
-        extra_attributes_map = {
-            'volume_id': {
-                'xpath': 'volumeId',
-                'transform_func': str
-            },
-            'state': {
-                'xpath': 'status',
-                'transform_func': str
-            },
-            'description': {
-                'xpath': 'description',
-                'transform_func': str
-            },
-            'progress': {
-                'xpath': 'progress',
-                'transform_func': str
-            },
-            'start_time': {
-                'xpath': 'startTime',
-                'transform_func': parse_date
-            }
-        }
-
         # Get our extra dictionary
-        extra = self._get_extra_dict(element, extra_attributes_map)
+        extra = self._get_extra_dict(
+            element, RESOURCE_EXTRA_ATTRIBUTES_MAP['snapshot'])
 
         # Add tags and name to the extra dict
         extra['tags'] = tags
@@ -1105,28 +1143,9 @@ class BaseEC2NodeDriver(NodeDriver):
                               xpath='cidrBlock',
                               namespace=NAMESPACE)
 
-        # Build our extra attributes map
-        extra_attributes_map = {
-            'state': {
-                'xpath': 'state',
-                'transform_func': str
-            },
-            'dhcp_options_id': {
-                'xpath': 'dhcpOptionsId',
-                'transform_func': str
-            },
-            'instance_tenancy': {
-                'xpath': 'instanceTenancy',
-                'transform_func': str
-            },
-            'is_default': {
-                'xpath': 'isDefault',
-                'transform_func': str
-            }
-        }
-
         # Get our extra dictionary
-        extra = self._get_extra_dict(element, extra_attributes_map)
+        extra = self._get_extra_dict(
+            element, RESOURCE_EXTRA_ATTRIBUTES_MAP['network'])
 
         # Add tags to the extra dict
         extra['tags'] = tags
@@ -1154,28 +1173,9 @@ class BaseEC2NodeDriver(NodeDriver):
                          xpath='state',
                          namespace=NAMESPACE)
 
-        # Build our extra attributes map
-        extra_attributes_map = {
-            'cidr_block': {
-                'xpath': 'cidrBlock',
-                'transform_func': str
-            },
-            'available_ips': {
-                'xpath': 'availableIpAddressCount',
-                'transform_func': int
-            },
-            'zone': {
-                'xpath': 'availabilityZone',
-                'transform_func': str
-            },
-            'vpc_id': {
-                'xpath': 'vpcId',
-                'transform_func': str
-            }
-        }
-
         # Get our extra dictionary
-        extra = self._get_extra_dict(element, extra_attributes_map)
+        extra = self._get_extra_dict(
+            element, RESOURCE_EXTRA_ATTRIBUTES_MAP['subnet'])
 
         # Also include our tags
         extra['tags'] = tags


[2/4] git commit: Updates CHANGES frm 0.13.3 branch.

Posted by to...@apache.org.
Updates CHANGES frm 0.13.3 branch.


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

Branch: refs/heads/trunk
Commit: dd401daa66fe6f9d430c6891528693e9b72a249e
Parents: 01117ee
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed Jan 1 15:12:09 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Thu Jan 2 00:09:57 2014 +0100

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


http://git-wip-us.apache.org/repos/asf/libcloud/blob/dd401daa/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 847dcd8..bb37f54 100644
--- a/CHANGES
+++ b/CHANGES
@@ -156,6 +156,10 @@ Changes with Apache Libcloud in development
    - Send "scrub_data" query parameter when destroying a DigitalOcean node.
      This will cause disk to be scrubbed (overwritten with 0's) when destroying
      a node. (LIBCLOUD-487)
+
+     Note: This fixes a security issue with a potential leak of data contained
+     on the destroyed node which only affects users of the DigitalOcean driver.
+     (CVE-2013-6480)
      [Tomaz Muraus]
 
   *) Storage


[3/4] git commit: docs: Update Committer Guide chapter.

Posted by to...@apache.org.
docs: Update Committer Guide chapter.


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

Branch: refs/heads/trunk
Commit: a5ba3db187e4be7e562b900ae8111d464e32f974
Parents: dd401da
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed Jan 1 22:30:37 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Thu Jan 2 00:09:58 2014 +0100

----------------------------------------------------------------------
 docs/committer_guide.rst | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/a5ba3db1/docs/committer_guide.rst
----------------------------------------------------------------------
diff --git a/docs/committer_guide.rst b/docs/committer_guide.rst
index 2572686..b90e7ee 100644
--- a/docs/committer_guide.rst
+++ b/docs/committer_guide.rst
@@ -60,13 +60,18 @@ After the patch has been applied, make sure to update ``CHANGES`` file.
 Making a release (for release managers)
 ---------------------------------------
 
+This section contains information a release manager should follow when
+preparing a release.
+
 1. Pre-release check list
+~~~~~~~~~~~~~~~~~~~~~~~~~
 
-- Make sure tests pass on all the supported Python versions (``tox``)
-- Make sure ``CHANGES`` file is up to date
-- Make sure ``__version__`` string in ``libcloud/__init__.py`` is up to date
+* Make sure tests pass on all the supported Python versions (``tox``)
+* Make sure ``CHANGES`` file is up to date
+* Make sure ``__version__`` string in ``libcloud/__init__.py`` is up to date
 
 2. Creating release artifacts
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 We have a script that runs the required setup.py commands and then hashes
 and signs the files. To run it:
@@ -84,6 +89,7 @@ This should result in a set of
 are suitable to be uploaded for a release.
 
 3. Uploading release artifacts to Apache servers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 * Add release artifacts to the dist SVN repository at
   https://dist.apache.org/repos/dist/release/libcloud/
@@ -98,10 +104,11 @@ are suitable to be uploaded for a release.
   https://dist.apache.org/repos/dist/release/libcloud/.
 
 4. Tagging a release
+~~~~~~~~~~~~~~~~~~~~
 
 .. sourcecode:: bash
 
-    git tag <tag> <commit hash>
+    git tag <version> <commit hash>
 
 For example:
 
@@ -110,9 +117,10 @@ For example:
     git tag v0.13.0 105b9610835f99704996d861d613c5a9a8b3f8b1
 
 5. Publishing package to PyPi
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 **For consistency and security reasons packages are always uploaded to PyPi
-manually using the web interface and not using the ``setup.py upload``
+manually using the web interface and not using the setup.py upload
 command.**
 
 * Run ``python setup.py register`` command. This will register a new
@@ -134,6 +142,7 @@ screenshot bellow.
    :align: center
 
 6. Verifying the release artifact check sums
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 To verify that nothing went wrong doing the release process, run the
 ``./dist/verify_checksums.sh`` script.
@@ -151,25 +160,38 @@ For example
 
 .. sourcecode:: bash
 
-    ./dist/verify_checksums apache-libcloud-0.13.2
+    ./dist/verify_checksums.sh apache-libcloud-0.13.2
 
 7. Updating doap_libcloud.rdf file
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Add information about the new release to the ``doap_libcloud.rdf`` file in the
 root of the main code repository.
 
 8. Updating website
+~~~~~~~~~~~~~~~~~~~
 
 * Update "News" page (``content/news.mdtext`` file)
 * Update "Downloads" page (``content/downloads.mdtext`` file)
 * Update "Get it" section in the sidebar (``templates/blocks/other.html`` file)
 
 9. Sending announcements
+~~~~~~~~~~~~~~~~~~~~~~~~
 
 * Send a release announcement to {dev,users}@libcloud.apache.org. If it's a
   major release also send it to announce@apache.org.
 * Send a release announcement to Twitter and Google+
 
+Note: If the release fixes a security vulnerability, you should also send
+information about a vulnerability to the following full disclosure mailing
+lists:
+
+* full-disclosure@lists.grok.org.uk
+* bugtraq@securityfocus.com
+
+The email you send should also be signed using your GPG key. You can find
+an example of such announcement on the `following url <http://seclists.org/fulldisclosure/2014/Jan/11>`_.
+
 If needed, use Apache URL shortening service - http://s.apache.org/
 
 Mailing list email templates