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/05 23:29:58 UTC
[1/6] git commit: docs: Update development section.
Updated Branches:
refs/heads/trunk 411877f45 -> 11c9f00ef
docs: Update development section.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/983c3f8a
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/983c3f8a
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/983c3f8a
Branch: refs/heads/trunk
Commit: 983c3f8a83c71cd9a3a3de43ebca4e01a645afda
Parents: 411877f
Author: Tomaz Muraus <to...@apache.org>
Authored: Sun Jan 5 22:37:44 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Jan 5 22:48:06 2014 +0100
----------------------------------------------------------------------
docs/development.rst | 48 +++++++++++++++++++++++++++++------------------
1 file changed, 30 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/983c3f8a/docs/development.rst
----------------------------------------------------------------------
diff --git a/docs/development.rst b/docs/development.rst
index 30b7568..e494cea 100644
--- a/docs/development.rst
+++ b/docs/development.rst
@@ -1,18 +1,32 @@
Development
===========
+This page describes Libcloud development process and contains general
+guidelines and information on how to contribute to the project.
+
Contributing
------------
We welcome contributions of any kind (ideas, code, tests, documentation,
examples, ...).
-This page explains how you can contribute to the Libcloud project. If you get
-stuck at any point during this process, stop by on our IRC channel (#libcloud
-on freenode) and we will do our best to assist you.
+If you need help or get stuck at any point during this process, stop by on our
+IRC channel (:ref:`#libcloud on freenode <irc>`) and we will do our best to
+assist you.
+
+General contribution guidelines
+-------------------------------
-Style guide
------------
+* Any non-trivial change must contain tests. For more information, refer to the
+ :doc:`Testing page </testing>`.
+* All the functions and methods must contain Sphinx docstrings which are used
+ to generate the API documentation. For more information, refer to the
+ :ref:`Docstring conventions <docstring-conventions>` section bellow.
+* If you are adding a new feature, make sure to add a corresponding
+ documentation.
+
+Code style guide
+----------------
* We follow `PEP8 Python Style Guide`_
* Use 4 spaces for a tab
@@ -23,7 +37,7 @@ Style guide
``tox -e lint``.
Second command fill run flake8 on all the files in the repository.
-And most importantly, follow the existing style in the files you are editing and
+And most importantly, follow the existing style in the file you are editing and
**be consistent**.
Git pre-commit hook
@@ -44,11 +58,13 @@ After you have installed this hook it will automatically check modified Python
files for violations before a commit. If a violation is found, commit will be
aborted.
+.. _code-conventions:
+
Code conventions
----------------
-This section contains some conventions you should follow when writing a
-Libcloud code.
+This section describes some general code conventions you should follow when
+writing a Libcloud code.
1. Import ordering
~~~~~~~~~~~~~~~~~~
@@ -57,7 +73,7 @@ Organize the imports in the following order:
1. Standard library imports
2. Third-party library imports
-3. Local libray (Libcloud) imports
+3. Local library (Libcloud) imports
Each section should be separated with a blank line. For example:
@@ -176,6 +192,8 @@ For example:
if domain is not None:
params['Domain'] = domain
+.. _docstring-conventions:
+
Docstring conventions
---------------------
@@ -205,16 +223,10 @@ conventions to which you should adhere to are described bellow.
``<container_type> of <objects_type>``. For example:
``:rtype: `list` of :class:`Node```
-You can find some examples in the following file: https://github.com/apache/libcloud/blob/trunk/libcloud/compute/base.py
+For more information and examples, please refer to the following links:
-General guidelines
-------------------
-
-* Any non-trivial change must contain tests
-* All the functions and methods must contain Sphinx docstrings which are used
- to generate API documentation. You can find a lot of examples of docstrings
- in the existing code e.g. - ``libcloud/compute/base.py``
-* If you are adding a new feature, make sure to add corresponding documentation
+* Sphinx Documentation - http://sphinx-doc.org/markup/desc.html#info-field-lists
+* Example Libcloud module with documentation - https://github.com/apache/libcloud/blob/trunk/libcloud/compute/base.py
Contribution workflow
---------------------
[4/6] git commit: docs: Fix all the Sphinx build warnings.
Posted by to...@apache.org.
docs: Fix all the Sphinx build warnings.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/2474219e
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/2474219e
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/2474219e
Branch: refs/heads/trunk
Commit: 2474219e1d9480873d40e18f75e979c8f96d1cca
Parents: 32c951f
Author: Tomaz Muraus <to...@apache.org>
Authored: Sun Jan 5 23:23:24 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Jan 5 23:23:24 2014 +0100
----------------------------------------------------------------------
docs/compute/drivers/index.rst | 2 ++
docs/conf.py | 5 ++++-
docs/development.rst | 4 ++--
docs/dns/drivers/index.rst | 2 ++
docs/storage/drivers/index.rst | 2 ++
5 files changed, 12 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/2474219e/docs/compute/drivers/index.rst
----------------------------------------------------------------------
diff --git a/docs/compute/drivers/index.rst b/docs/compute/drivers/index.rst
index 7de9c95..d36b603 100644
--- a/docs/compute/drivers/index.rst
+++ b/docs/compute/drivers/index.rst
@@ -1,3 +1,5 @@
+:orphan:
+
Compute Drivers Documentation
=============================
http://git-wip-us.apache.org/repos/asf/libcloud/blob/2474219e/docs/conf.py
----------------------------------------------------------------------
diff --git a/docs/conf.py b/docs/conf.py
index bc1ff23..ae5ea97 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -65,7 +65,10 @@ release = '0.14.0-dev'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
+exclude_patterns = [
+ '_build',
+ '*/_*.rst'
+]
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
http://git-wip-us.apache.org/repos/asf/libcloud/blob/2474219e/docs/development.rst
----------------------------------------------------------------------
diff --git a/docs/development.rst b/docs/development.rst
index e494cea..afe79d0 100644
--- a/docs/development.rst
+++ b/docs/development.rst
@@ -132,8 +132,8 @@ Bad:
some_method(public_ips, private_ips)
-4. Don't abuse **kwargs
-~~~~~~~~~~~~~~~~~~~~~~~
+4. Don't abuse \*\*kwargs
+~~~~~~~~~~~~~~~~~~~~~~~~~
You should always explicitly declare arguments in a function or a method
signature and only use ``**kwargs`` and ``*args`` respectively when there is a
http://git-wip-us.apache.org/repos/asf/libcloud/blob/2474219e/docs/dns/drivers/index.rst
----------------------------------------------------------------------
diff --git a/docs/dns/drivers/index.rst b/docs/dns/drivers/index.rst
index 970cccb..b1efa25 100644
--- a/docs/dns/drivers/index.rst
+++ b/docs/dns/drivers/index.rst
@@ -1,3 +1,5 @@
+:orphan:
+
DNS Drivers Documentation
=========================
http://git-wip-us.apache.org/repos/asf/libcloud/blob/2474219e/docs/storage/drivers/index.rst
----------------------------------------------------------------------
diff --git a/docs/storage/drivers/index.rst b/docs/storage/drivers/index.rst
index cf9e85f..7f29e4f 100644
--- a/docs/storage/drivers/index.rst
+++ b/docs/storage/drivers/index.rst
@@ -1,3 +1,5 @@
+:orphan:
+
Storage Drivers Documentation
=============================
[5/6] git commit: Re-generate documentation fixtures.
Posted by to...@apache.org.
Re-generate documentation fixtures.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/579439ae
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/579439ae
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/579439ae
Branch: refs/heads/trunk
Commit: 579439aece1895c5b2b048b1255e62d575277e7c
Parents: 2474219
Author: Tomaz Muraus <to...@apache.org>
Authored: Sun Jan 5 23:25:10 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Jan 5 23:25:10 2014 +0100
----------------------------------------------------------------------
docs/compute/_supported_methods_block_storage.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/579439ae/docs/compute/_supported_methods_block_storage.rst
----------------------------------------------------------------------
diff --git a/docs/compute/_supported_methods_block_storage.rst b/docs/compute/_supported_methods_block_storage.rst
index 90ad2dd..e96067e 100644
--- a/docs/compute/_supported_methods_block_storage.rst
+++ b/docs/compute/_supported_methods_block_storage.rst
@@ -33,7 +33,7 @@ Provider list volumes create volume destroy volume
`Eucalyptus`_ yes yes yes yes yes yes yes
`Exoscale`_ yes yes yes yes yes no no
`Gandi`_ yes yes yes yes yes no no
-`Google Compute Engine`_ yes yes yes yes yes no no
+`Google Compute Engine`_ yes yes yes yes yes yes yes
`GoGrid`_ no no no no no no no
`HostVirtual`_ no no no no no no no
`IBM SmartCloud Enterprise`_ yes yes yes yes yes no no
[3/6] git commit: Fix some typos and docstring issues which were
causing Sphinx warnings.
Posted by to...@apache.org.
Fix some typos and docstring issues which were causing Sphinx warnings.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/32c951f2
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/32c951f2
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/32c951f2
Branch: refs/heads/trunk
Commit: 32c951f205b9de0ca1e1fe5f6471820754c521cb
Parents: 4724923
Author: Tomaz Muraus <to...@apache.org>
Authored: Sun Jan 5 23:19:13 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Jan 5 23:19:13 2014 +0100
----------------------------------------------------------------------
libcloud/compute/base.py | 9 ++++-----
libcloud/compute/deployment.py | 2 +-
libcloud/compute/drivers/cloudstack.py | 22 +++++++---------------
libcloud/compute/drivers/ec2.py | 18 ++++++++----------
libcloud/compute/drivers/vcloud.py | 19 ++++++++-----------
5 files changed, 28 insertions(+), 42 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/32c951f2/libcloud/compute/base.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/base.py b/libcloud/compute/base.py
index 7e6b9e6..1972ba0 100644
--- a/libcloud/compute/base.py
+++ b/libcloud/compute/base.py
@@ -148,11 +148,10 @@ class Node(UuidMixin):
Althrough Node objects can be subclassed, this isn't normally
done. Instead, any driver specific information is stored in the
- "extra" proproperty of the node.
+ "extra" attribute of the node.
>>> node.extra
{'foo': 'bar'}
-
"""
def __init__(self, id, name, state, public_ips, private_ips,
@@ -177,10 +176,10 @@ class Node(UuidMixin):
:type driver: :class:`.NodeDriver`
:param size: Size of this node. (optional)
- :type size: :class:`.NodeSize:
+ :type size: :class:`.NodeSize`
:param image: Image of this node. (optional)
- :type size: :class:`.NodeImage:
+ :type size: :class:`.NodeImage`
:param extra: Optional provider specific attributes associated with
this node.
@@ -380,7 +379,7 @@ class NodeLocation(object):
:type name: ``str``
:param country: Location country.
- :type country : ``str``
+ :type country: ``str``
:param driver: Driver this location belongs to.
:type driver: :class:`.NodeDriver`
http://git-wip-us.apache.org/repos/asf/libcloud/blob/32c951f2/libcloud/compute/deployment.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/deployment.py b/libcloud/compute/deployment.py
index acab269..5cfc2c6 100644
--- a/libcloud/compute/deployment.py
+++ b/libcloud/compute/deployment.py
@@ -118,7 +118,7 @@ class ScriptDeployment(Deployment):
Runs an arbitrary shell script on the server.
This step works by first writing the content of the shell script (script
- argument) in a *.sh file on a remote server and then running that file.
+ argument) in a \*.sh file on a remote server and then running that file.
If you are running a non-shell script, make sure to put the appropriate
shebang to the top of the script. You are also advised to do that even if
http://git-wip-us.apache.org/repos/asf/libcloud/blob/32c951f2/libcloud/compute/drivers/cloudstack.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/cloudstack.py b/libcloud/compute/drivers/cloudstack.py
index 1cc82b2..5c49dc3 100644
--- a/libcloud/compute/drivers/cloudstack.py
+++ b/libcloud/compute/drivers/cloudstack.py
@@ -557,18 +557,10 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver):
"""
Stops/Suspends a running virtual machine
+ :param node: Node to stop.
:type node: :class:`CloudStackNode`
- :param id: The ID of the virtual machine
- :type id: ``str``
-
- :param forced: Force stop the VM
- (vm is marked as Stopped even when command
- fails to be send to the backend).
- The caller knows the VM is stopped.
- :type forced: ``bool``
-
- :rtype ``str``
+ :rtype: ``str``
"""
res = self._async_request(command='stopVirtualMachine',
params={'id': node.id},
@@ -844,11 +836,11 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver):
:param projectid: The project associated with keypair
:type projectid: ``str``
- :param domainid : The domain ID associated with the keypair
+ :param domainid: The domain ID associated with the keypair
:type domainid: ``str``
- :param account : The account associated with the keypair.
- Must be used with the domainId parameter.
+ :param account: The account associated with the keypair.
+ Must be used with the domainId parameter.
:type account: ``str``
:return: True of False based on success of Keypair deletion
@@ -1240,10 +1232,10 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver):
:param projectid: The project associated with keypair
:type projectid: ``str``
- :param domainid : The domain ID associated with the keypair
+ :param domainid: The domain ID associated with the keypair
:type domainid: ``str``
- :param account : The account associated with the keypair.
+ :param account: The account associated with the keypair.
Must be used with the domainId parameter.
:type account: ``str``
http://git-wip-us.apache.org/repos/asf/libcloud/blob/32c951f2/libcloud/compute/drivers/ec2.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py
index ebeae25..a40bc24 100644
--- a/libcloud/compute/drivers/ec2.py
+++ b/libcloud/compute/drivers/ec2.py
@@ -2051,14 +2051,14 @@ class BaseEC2NodeDriver(NodeDriver):
def ex_create_security_group(self, name, description, vpc_id=None):
"""
- Creates a new Security Group in EC2-Classic or a targetted VPC
+ Creates a new Security Group in EC2-Classic or a targetted VPC.
:param name: The name of the security group to Create.
This must be unique.
:type name: ``str``
:param description: Human readable description of a Security
- Group.
+ Group.
:type description: ``str``
:param description: Optional identifier for VPC networks
@@ -2116,10 +2116,10 @@ class BaseEC2NodeDriver(NodeDriver):
def ex_delete_security_group(self, name):
"""
- Wrapper method which calls ex_delete_security_group_by_name
+ Wrapper method which calls ex_delete_security_group_by_name.
:param name: The name of the security group
- :type name ``str``
+ :type name: ``str``
:rtype: ``bool``
"""
@@ -2956,7 +2956,8 @@ class BaseEC2NodeDriver(NodeDriver):
return self.ex_modify_instance_attribute(node, attributes)
def create_node(self, **kwargs):
- """Create a new EC2 node
+ """
+ Create a new EC2 node.
Reference: http://bit.ly/8ZyPSy [docs.amazonwebservices.com]
@@ -2985,9 +2986,7 @@ class BaseEC2NodeDriver(NodeDriver):
:type ex_clienttoken: ``str``
:keyword ex_blockdevicemappings: ``list`` of ``dict`` block device
- mappings. Example:
- [{'DeviceName': '/dev/sda1', 'Ebs.VolumeSize': 10},
- {'DeviceName': '/dev/sdb', 'VirtualName': 'ephemeral0'}]
+ mappings.
:type ex_blockdevicemappings: ``list`` of ``dict``
:keyword ex_iamprofile: Name or ARN of IAM profile
@@ -3142,8 +3141,7 @@ class BaseEC2NodeDriver(NodeDriver):
:return: Dictionary with the following keys:
- instance_id (``str``)
- - timestamp (``datetime.datetime``) - timestamp of the last
- output
+ - timestamp (``datetime.datetime``) - ts of the last output
- output (``str``) - console output
:rtype: ``dict``
"""
http://git-wip-us.apache.org/repos/asf/libcloud/blob/32c951f2/libcloud/compute/drivers/vcloud.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/vcloud.py b/libcloud/compute/drivers/vcloud.py
index 177820e..3b289d4 100644
--- a/libcloud/compute/drivers/vcloud.py
+++ b/libcloud/compute/drivers/vcloud.py
@@ -693,23 +693,19 @@ class VCloudNodeDriver(NodeDriver):
"""
Creates and returns node.
- @inherits: :class:`NodeDriver.create_node`
-
:keyword ex_network: link to a "Network" e.g.,
- "https://services.vcloudexpress.terremark.com/api/v0.8/network/7"
+ ``https://services.vcloudexpress...``
:type ex_network: ``str``
:keyword ex_vdc: Name of organisation's virtual data
- center where vApp VMs will be deployed.
+ center where vApp VMs will be deployed.
:type ex_vdc: ``str``
:keyword ex_cpus: number of virtual cpus (limit depends on provider)
:type ex_cpus: ``int``
- :keyword ex_row: ???
:type ex_row: ``str``
- :keyword ex_group: ????
:type ex_group: ``str``
"""
name = kwargs['name']
@@ -1336,11 +1332,12 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
return results
def create_node(self, **kwargs):
- """Creates and returns node. If the source image is:
- - vApp template - a new vApp is instantiated from template
- - existing vApp - a new vApp is cloned from the source vApp. Can
- not clone more vApps is parallel otherwise
- resource busy error is raised.
+ """
+ Creates and returns node. If the source image is:
+ - vApp template - a new vApp is instantiated from template
+ - existing vApp - a new vApp is cloned from the source vApp. Can
+ not clone more vApps is parallel otherwise
+ resource busy error is raised.
@inherits: :class:`NodeDriver.create_node`
[6/6] git commit: Treat sphinx build warnings as errors.
Posted by to...@apache.org.
Treat sphinx build warnings as errors.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/11c9f00e
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/11c9f00e
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/11c9f00e
Branch: refs/heads/trunk
Commit: 11c9f00ef1e34e7de581f62d088075b3f2af6e6f
Parents: 579439a
Author: Tomaz Muraus <to...@apache.org>
Authored: Sun Jan 5 23:25:29 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Jan 5 23:25:29 2014 +0100
----------------------------------------------------------------------
tox.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/11c9f00e/tox.ini
----------------------------------------------------------------------
diff --git a/tox.ini b/tox.ini
index 6caeed9..157031a 100644
--- a/tox.ini
+++ b/tox.ini
@@ -43,7 +43,7 @@ deps = sphinx
basepython = python2.7
changedir = docs
commands = python ../contrib/generate_provider_feature_matrix_table.py
- sphinx-build -b html -d {envtmpdir}/doctrees . _build/html
+ sphinx-build -W -b html -d {envtmpdir}/doctrees . _build/html
[testenv:lint]
deps = flake8
[2/6] git commit: docs: Update developer information page.
Posted by to...@apache.org.
docs: Update developer information page.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/4724923a
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/4724923a
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/4724923a
Branch: refs/heads/trunk
Commit: 4724923af584948a7f2f3bfdf797ff664fda2837
Parents: 983c3f8
Author: Tomaz Muraus <to...@apache.org>
Authored: Sun Jan 5 22:50:52 2014 +0100
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Jan 5 22:50:52 2014 +0100
----------------------------------------------------------------------
docs/developer_information.rst | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/4724923a/docs/developer_information.rst
----------------------------------------------------------------------
diff --git a/docs/developer_information.rst b/docs/developer_information.rst
index 71a12b1..e87182e 100644
--- a/docs/developer_information.rst
+++ b/docs/developer_information.rst
@@ -9,13 +9,15 @@ Mailing Lists
All of the communication about Libcloud development happens on our mailing
lists.
+* `announce@libcloud.apache.org`_ - Moderated and low volume mailing list which
+ is only used for distributing important project announcements and updates.
* `users@libcloud.apache.org`_ - Mailing list for general talk about Libcloud
and other off-topic things
(`users-archive <https://mail-archives.apache.org/mod_mbox/libcloud-users/>`_)
* `dev@libcloud.apache.org`_ - General mailing list for developers
(`dev-archive <https://mail-archives.apache.org/mod_mbox/libcloud-dev/>`_)
* `commits@libcloud.apache.org`_ - Commits messages go to this mailing list.
- Keep ind mind that unlike the others, this mailing list is fairly noisy.
+ Keep in mind that unlike the others, this mailing list is fairly noisy.
(`commits-archive <https://mail-archives.apache.org/mod_mbox/libcloud-commits/>`_)
Archive of old incubator mailing lists:
@@ -23,6 +25,13 @@ Archive of old incubator mailing lists:
* `incubator-libcloud`_
* `incubator-libcloud-commits`_
+.. _irc:
+
+IRC
+---
+
+* #libcloud on Freenode
+
.. _issue-tracker:
Issue Tracker
@@ -55,6 +64,7 @@ Test Coverage
Test coverage report is automatically generated after every push and can be
found at http://ci.apache.org/projects/libcloud/coverage.
+.. _`announce@libcloud.apache.org`: mailto:announce-subscribe@libcloud.apache.org
.. _`users@libcloud.apache.org`: mailto:users-subscribe@libcloud.apache.org
.. _`dev@libcloud.apache.org`: mailto:dev-subscribe@libcloud.apache.org
.. _`commits@libcloud.apache.org`: mailto:commits-subscribe@libcloud.apache.org