Modified: libcloud/site/trunk/generated/blog/tags/news.html URL: http://svn.apache.org/viewvc/libcloud/site/trunk/generated/blog/tags/news.html?rev=1808917&r1=1808916&r2=1808917&view=diff ============================================================================== --- libcloud/site/trunk/generated/blog/tags/news.html (original) +++ libcloud/site/trunk/generated/blog/tags/news.html Tue Sep 19 17:03:53 2017 @@ -96,6 +96,395 @@ <div class="post"> + <h2><a href="/blog/2017/04/25/libcloud-2-0-0-released.html">Libcloud 2.0.0 released</a></h2> + + + + + + <span class="post-date-author">By Anthony Shaw on Apr 25, 2017</span> + + <div class="post-content"> + <p>We are pleased to announce the release of Libcloud 2.0.0.</p> + +<p>This major release brings many new features, improvements, bug-fixes, and drivers.</p> + +<h2>Release highlights</h2> + +<ul> +<li>Apache Libcloud 2.0 series replaces the use of Python httplib with a hard dependency on the <code>requests</code> package. Users no longer +have to specific Certificate Authority bundles when using Apache Libcloud</li> +<li>10% performance improvement through the use of HTTP sessions</li> +<li>Support for buffered IO streams for storage drivers</li> +<li>Support for Python 3.6, deprecation of Python 3.2</li> +<li>3 new drivers - <a href="http://libcloud.readthedocs.io/en/latest/compute/drivers/onapp.html">OnApp Compute</a>, <a href="http://libcloud.readthedocs.io/en/latest/dns/drivers/onapp.html">OnApp DNS</a>, <a href="http://libcloud.readthedocs.io/en/latest/compute/drivers/oneandone.html">1&1 Compute</a></li> +<li>Lots of improvements to our Azure ARM support</li> +<li>Continuing udates to the Amazon drivers</li> +</ul> + +<p>A detailed description of the 2.0 HTTP API is documented <a href="http://libcloud.readthedocs.io/en/latest/other/changes_in_2_0.html">here</a></p> + +<h3>Compute API Changes</h3> + +<ul> +<li>Outscale SAS doc improvements and logo update</li> +</ul> + +<h4>OnApp Changes</h4> + +<ul> +<li>Add list images support for OnApp driver</li> +<li>Add keypair management to OnApp driver</li> +</ul> + +<h4>Amazon EC2 Changes</h4> + +<ul> +<li>Add r4 instance types for AWS</li> +<li>Add support for AWS eu-west-2 and ca-central-1 regions</li> +<li>Add P2 GPU instance types</li> +<li>Add method to modify snapshot attribute for EC2</li> +<li>Add ENA support for EC2 compute images</li> +<li>Add support for forcing detachment of EBS volumes to EC2 driver</li> +<li>Add support for ModifyVolume and DescribeVolumesModifications</li> +<li>Added Import Snapshot and Describe Import Snapshot to EC2 compute driver</li> +<li>Add missing regions in AWS storage and compute drivers</li> +<li>Add SR-IOV net support to images in EC2 compute driver</li> +<li>Fix - update t2.small image size from 11 CPU to 1</li> +<li>Added Billing Product for image in EC2 compute driver</li> +</ul> + +<h4>Linode changes</h4> + +<ul> +<li>Add start, stop instance methods and fix incorrect state TERMINATED to STOPPED</li> +</ul> + +<h4>Azure ARM changes</h4> + +<ul> +<li>Fix typeerror on ex<em>list</em>nics</li> +<li>Add support for Azure Cloud Environments as well as Locations</li> +<li>Fix string representation of the VhdImage type and fix listing of Public IP addresses</li> +<li>Add network security groups to azure ARM</li> +<li>Add the ability to list resource groups</li> +<li>Fix Azure ARM driver condition for ex<em>list</em>publishers where location is specified</li> +</ul> + +<h4>Google Cloud changes</h4> + +<ul> +<li>Allow delete instances from managed group</li> +<li>Allow preemptible instances to be created</li> +<li>Remove validation checks for guestOsFeatures</li> +</ul> + +<h4>Alibaba Aliyun changes</h4> + +<ul> +<li>Add aliyun ecs instance join leave security group</li> +<li>Fix Aliyun ECS, Load balancer and storage adapters when using unicode UTF-8 characters in the names of resources</li> +</ul> + +<h4>DigitalOcean changes</h4> + +<ul> +<li>Add price_monthly extra param to digitalocean sizes</li> +</ul> + +<h4>VMWare vSphere changes</h4> + +<ul> +<li>Fix issue with authentication methods crashing</li> +</ul> + +<h3>Storage</h3> + +<ul> +<li>Reintroduce S3 multipart upload support with signature v4</li> +</ul> + +<h3>DNS</h3> + +<ul> +<li>Add <a href="http://libcloud.readthedocs.io/en/latest/dns/drivers/onapp.html">OnApp driver</a></li> +</ul> + +<h2>Minor changes</h2> + +<h3>Common</h3> + +<ul> +<li>Added an integration test API and a test suite for validating functionality +without mocking any libcloud subsystems</li> +<li>Change Cloudscale to cloudscale.ch.</li> +</ul> + +<h2>Bug Fixes</h2> + +<h3>Compute</h3> + +<h4>2.0.0</h4> + +<ul> +<li><p>Fix OpenStack drivers not correctly setting URLs when used with identity API, would default to 127.0.0.1 and service +catalog URLs were not adhered to.</p></li> +<li><p>Fix Aliyun ECS, Load balancer and storage adapters when using unicode UTF-8 characters in the names of resources +in 2.0.0rc2 < it would fail as a MalformedResponseError, Python 2.7 element tree was raising a unicode error</p></li> +<li><p>Refactor the test classes to use the full libcloud.http and libcloud.common.base modules, with Connection, +Response all used with requests<em>mock. This increases our test coverages and catches bugs in drivers' custom +parse</em>body and auth modules</p></li> +<li><p>Rename libcloud.httplib_ssl to libcloud.http now that we don't use httplib</p></li> +</ul> + +<h4>2.0.0rc2</h4> + +<ul> +<li>Fix Public IP not assigned when creating NIC on Azure ARM</li> +<li>Fix a bug in profitbricks driver where listing snapshots would request a malformed URL</li> +<li>Fix LIBCLOUD-806 bug where vsphere driver cannot be instantiated</li> +<li>[google compute] Improve performance of list nodes by caching volume information.</li> +</ul> + +<p>Full change log can be found at <a href="https://libcloud.readthedocs.org/en/latest/changelog.html">here</a>.</p> + +<h3>Special thank you</h3> + +<p>I would like to wish a special thank you to all of our community contributors +for their ongoing support to the project.</p> + +<ul> +<li>Tinu Cleatus for the OnApp driver</li> +<li>Alex Misstear for the EC2 improvements</li> +<li>Jie Ren for the Aliyun improvements</li> +<li>Francisco Ros for the DigitalOcean improvements</li> +<li>Peter Amstutz and Joseph Hall for the Azure ARM API updates</li> +<li>All of our community for their ongoing support and contributions...</li> +</ul> + +<h3>Download</h3> + +<p>The release can can be downloaded from +<a href="https://libcloud.apache.org/downloads.html">https://libcloud.apache.org/downloads.html</a> or installed using pip:</p> + +<pre> +pip install apache-libcloud==2.0.0 +</pre> + +<h3>Upgrading</h3> + +<p>If you have installed Libcloud using pip you can also use it to upgrade it:</p> + +<pre> +pip install --upgrade apache-libcloud==2.0.0 +</pre> + +<h3>Upgrade notes</h3> + +<p>A page which describes backward incompatible or semi-incompatible +changes and how to preserve the old behavior when this is possible +can be found at <a href="https://libcloud.readthedocs.org/en/latest/upgrade_notes.html">https://libcloud.readthedocs.org/en/latest/upgrade_notes.html</a></p> + +<h3>Documentation</h3> + +<p>Regular and API documentation is available at <a href="https://libcloud.readthedocs.org/en/latest/">https://libcloud.readthedocs.org/en/latest/</a></p> + +<h3>Bugs / Issues</h3> + +<p>If you find any bug or issue, please report it on our issue tracker +<a href="https://issues.apache.org/jira/browse/LIBCLOUD">https://issues.apache.org/jira/browse/LIBCLOUD</a>. +Don't forget to attach an example and / or test which reproduces your +problem.</p> + +<h3>Thanks</h3> + +<p>Thanks to everyone who contributed and made this release possible! Full +list of people who contributed to this release can be found in the +<a href="https://libcloud.readthedocs.org/en/latest/changelog.html">CHANGES file</a>.</p> + + </div> + + <div class="row section post-meta"> + <div class="col-md-12 post-tags"> + <p>Tags: <a href="/blog/tags/news.html" rel="tag">news</a>, <a href="/blog/tags/release%20announcement.html" rel="tag">release announcement</a></p> + </div> + </div> +</div> + + + + + <div class="post"> + + <h2><a href="/blog/2017/04/09/async-rfc.html">Have your say - async support in Apache Libcloud</a></h2> + + + + + + <span class="post-date-author">By Anthony Shaw on Apr 09, 2017</span> + + <div class="post-content"> + <p>One of the big requests whilst we were replacing <code>httplib</code> with the <code>requests</code> package in 2.0 was why didn't +we use a HTTP library that supports <em>asynchronous</em> API calls.</p> + +<p>The intention for 2.0 and replacing the HTTP backend classes was to improve the usability of the project, by making SSL +certificates easier to manage, improving the maintainability of our source code by using an active 3rd party package and +also improving performance and stability.</p> + +<p>Apache Libcloud already has documentation on threaded libraries like gevent and callback-based libraries like Twisted, see +<a href="https://libcloud.readthedocs.io/en/latest/other/using-libcloud-in-multithreaded-and-async-environments.html">using libcloud in multithreaded environments</a> +for examples.</p> + +<p><a href="https://www.python.org/dev/peps/pep-0492/#">PEP 492</a>, implemented in Python 3.5 provides a new coroutine protocol using methods, +<code>__await__</code> for classes, a coroutine method wrapper, or a method that returns a coroutine object. +Also async <a href="https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for">iterators</a> and <a href="https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with">context managers</a> +have been introduced.</p> + +<p>We would like to take advantage of the new language features by offering APIs in Apache Libcloud without breaking backward compatibility and +compatibility for users of <Python 3.5.</p> + +<p>Use cases for this would be:</p> + +<ul> +<li>Being able to fetch <code>Node</code> or <code>StorageObject</code>s from multiple geographies or drivers simultaneously.</li> +<li>Being able to quickly upload or download storage objects by parallelizing operations on the <code>StorageDriver</code>.</li> +<li>Being able to call a long-running API method (e.g. generate report), whilst running other code.</li> +</ul> + +<h2>Design 1 - async context managers <a href="https://github.com/apache/libcloud/pull/1016">PR 1016</a></h2> + +<p>This design would allow drivers to operate in 2 modes, the first is for synchronous method calls, they return list or object +data as per usual. The second mode, API methods like <code>NodeDriver.list_nodes</code> would return a <a href="https://www.python.org/dev/peps/pep-0492/#coroutine-objects">coroutine object</a> +and could be awaited or gathered using an event loop.</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="kn">import</span> <span class="nn">asyncio</span> + +<span class="kn">from</span> <span class="nn">integration.driver.test</span> <span class="kn">import</span> <span class="n">TestNodeDriver</span> +<span class="kn">from</span> <span class="nn">libcloud.async_util</span> <span class="kn">import</span> <span class="n">AsyncSession</span> + +<span class="n">driver</span> <span class="o">=</span> <span class="n">TestNodeDriver</span><span class="p">(</span><span class="s">'apache'</span><span class="p">,</span> <span class="s">'libcloud'</span><span class="p">)</span> + +<span class="n">async</span> <span class="k">def</span> <span class="nf">run</span><span class="p">():</span> + <span class="c"># regular API call</span> + <span class="n">nodes</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">list_nodes</span><span class="p">()</span> + + <span class="n">async</span> <span class="k">with</span> <span class="n">AsyncSession</span><span class="p">(</span><span class="n">driver</span><span class="p">)</span> <span class="k">as</span> <span class="n">async_instance</span><span class="p">:</span> + <span class="n">nodes</span> <span class="o">=</span> <span class="n">await</span> <span class="n">async_instance</span><span class="o">.</span><span class="n">list_nodes</span><span class="p">()</span> + + <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> + +<span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span> +<span class="n">loop</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">run</span><span class="p">())</span> +<span class="n">loop</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> +</code></pre></div> + +<h2>Design 2 - Additional methods in each driver for coroutines <a href="https://github.com/apache/libcloud/pull/1027">PR 1027</a></h2> + +<p>This is the second design concept for async support in Libcloud.</p> + +<p>The concept here is to have Asynchronous Mixins, <code>LibcloudConnection</code> uses requests and <code>LibcloudAsyncConnection</code> uses aiohttp for async transport <a href="https://github.com/tonybaloney/libcloud/blob/d4fe097476d2f02941e17d5e1b1d405fcf44c0f7/libcloud/connection_async.py#L22-L42">see</a></p> + +<p>The LibcloudAsyncConnection is an implementation detail of AsyncConnection, which is the API for the drivers to consume <a href="https://github.com/tonybaloney/libcloud/blob/d4fe097476d2f02941e17d5e1b1d405fcf44c0f7/libcloud/common/base.py#L742-L778">see</a></p> + +<p>The drivers then use this mixin for their custom connection classes, e.g.</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="k">class</span> <span class="nc">GoogleStorageConnection</span><span class="p">(</span><span class="n">ConnectionUserAndKey</span><span class="p">,</span> <span class="n">AsyncConnection</span><span class="p">):</span> + <span class="o">...</span> +</code></pre></div> + +<p>They then inherit from <code>libcloud.storage.base.StorageAsyncDriver</code>, which uses a new set of base methods, e.g. <code>iterate_containers_async</code> and can be implemented like this:</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"> <span class="n">async</span> <span class="k">def</span> <span class="nf">iterate_containers_async</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="n">response</span> <span class="o">=</span> <span class="n">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">request_async</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span> + <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="n">httplib</span><span class="o">.</span><span class="n">OK</span><span class="p">:</span> + <span class="n">containers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_to_containers</span><span class="p">(</span><span class="n">obj</span><span class="o">=</span><span class="n">response</span><span class="o">.</span><span class="n">object</span><span class="p">,</span> + <span class="n">xpath</span><span class="o">=</span><span class="s">'Buckets/Bucket'</span><span class="p">)</span> + <span class="k">return</span> <span class="n">containers</span> + + <span class="k">raise</span> <span class="n">LibcloudError</span><span class="p">(</span><span class="s">'Unexpected status code: </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status</span><span class="p">),</span> + <span class="n">driver</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> +</code></pre></div> + +<p>Now the consumer can more or less do this:</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="kn">from</span> <span class="nn">libcloud.storage.providers</span> <span class="kn">import</span> <span class="n">get_driver</span> +<span class="kn">from</span> <span class="nn">libcloud.storage.types</span> <span class="kn">import</span> <span class="n">Provider</span> + +<span class="kn">import</span> <span class="nn">asyncio</span> + +<span class="n">GoogleStorageDriver</span> <span class="o">=</span> <span class="n">get_driver</span><span class="p">(</span><span class="n">Provider</span><span class="o">.</span><span class="n">GOOGLE_STORAGE</span><span class="p">)</span> +<span class="n">driver</span> <span class="o">=</span> <span class="n">GoogleStorageDriver</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">KEY</span><span class="p">,</span> <span class="n">secret</span><span class="o">=</span><span class="n">SECRET</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> + +<span class="n">async</span> <span class="k">def</span> <span class="nf">run</span><span class="p">():</span> + <span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">container</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_containers_async</span><span class="p">():</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_container_objects_async</span><span class="p">(</span><span class="n">container</span><span class="p">):</span> + <span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">asyncio</span><span class="o">.</span><span class="n">ensure_future</span><span class="p">(</span><span class="n">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span> + <span class="n">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span> + +<span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span> +<span class="n">loop</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">run</span><span class="p">())</span> +<span class="n">loop</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> +</code></pre></div> + +<h2>Design 3 - Initializer with "<em>async</em>" mode</h2> + +<p>This option is similar to 2, except that if a driver is instantiated with "<code>async=True</code>", +then all driver class methods would return coroutine objects. Internally, it would +patch the Connection class with the AsyncConnection class.</p> + +<p>The downside of this is that all method calls to a driver would need to be awaited or used +by an event loop.</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="kn">from</span> <span class="nn">libcloud.storage.providers</span> <span class="kn">import</span> <span class="n">get_driver</span> +<span class="kn">from</span> <span class="nn">libcloud.storage.types</span> <span class="kn">import</span> <span class="n">Provider</span> + +<span class="kn">import</span> <span class="nn">asyncio</span> + +<span class="n">GoogleStorageDriver</span> <span class="o">=</span> <span class="n">get_driver</span><span class="p">(</span><span class="n">Provider</span><span class="o">.</span><span class="n">GOOGLE_STORAGE</span><span class="p">)</span> +<span class="n">driver</span> <span class="o">=</span> <span class="n">GoogleStorageDriver</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">KEY</span><span class="p">,</span> <span class="n">secret</span><span class="o">=</span><span class="n">SECRET</span><span class="p">,</span> <span class="n">async</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> + +<span class="n">async</span> <span class="k">def</span> <span class="nf">run</span><span class="p">():</span> + <span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">container</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_containers</span><span class="p">():</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_container_objects</span><span class="p">(</span><span class="n">container</span><span class="p">):</span> + <span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">asyncio</span><span class="o">.</span><span class="n">ensure_future</span><span class="p">(</span><span class="n">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span> + <span class="n">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span> + +<span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span> +<span class="n">loop</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">run</span><span class="p">())</span> +<span class="n">loop</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> +</code></pre></div> + +<h1>Give us feedback</h1> + +<p>Got a better idea? Have an API or design, the question we're asking is +"if you wanted to use Libcloud for an async application, what would the code look like?" This helps us design +the API and the implementation details can follow.</p> + +<p>Feel free to comment on the mailing list or on the pull requests, or raise your own pull-request with an API design.</p> + + </div> + + <div class="row section post-meta"> + <div class="col-md-12 post-tags"> + <p>Tags: <a href="/blog/tags/news.html" rel="tag">news</a>, <a href="/blog/tags/tutorial.html" rel="tag">tutorial</a></p> + </div> + </div> +</div> + + + + + <div class="post"> + <h2><a href="/blog/2017/04/07/libcloud-2-0-0-rc2-released.html">Libcloud 2.0.0rc2 released</a></h2>
Modified: libcloud/site/trunk/generated/blog/tags/release announcement.html URL: http://svn.apache.org/viewvc/libcloud/site/trunk/generated/blog/tags/release%20announcement.html?rev=1808917&r1=1808916&r2=1808917&view=diff ============================================================================== --- libcloud/site/trunk/generated/blog/tags/release announcement.html (original) +++ libcloud/site/trunk/generated/blog/tags/release announcement.html Tue Sep 19 17:03:53 2017 @@ -96,6 +96,226 @@ <div class="post"> + <h2><a href="/blog/2017/04/25/libcloud-2-0-0-released.html">Libcloud 2.0.0 released</a></h2> + + + + + + <span class="post-date-author">By Anthony Shaw on Apr 25, 2017</span> + + <div class="post-content"> + <p>We are pleased to announce the release of Libcloud 2.0.0.</p> + +<p>This major release brings many new features, improvements, bug-fixes, and drivers.</p> + +<h2>Release highlights</h2> + +<ul> +<li>Apache Libcloud 2.0 series replaces the use of Python httplib with a hard dependency on the <code>requests</code> package. Users no longer +have to specific Certificate Authority bundles when using Apache Libcloud</li> +<li>10% performance improvement through the use of HTTP sessions</li> +<li>Support for buffered IO streams for storage drivers</li> +<li>Support for Python 3.6, deprecation of Python 3.2</li> +<li>3 new drivers - <a href="http://libcloud.readthedocs.io/en/latest/compute/drivers/onapp.html">OnApp Compute</a>, <a href="http://libcloud.readthedocs.io/en/latest/dns/drivers/onapp.html">OnApp DNS</a>, <a href="http://libcloud.readthedocs.io/en/latest/compute/drivers/oneandone.html">1&1 Compute</a></li> +<li>Lots of improvements to our Azure ARM support</li> +<li>Continuing udates to the Amazon drivers</li> +</ul> + +<p>A detailed description of the 2.0 HTTP API is documented <a href="http://libcloud.readthedocs.io/en/latest/other/changes_in_2_0.html">here</a></p> + +<h3>Compute API Changes</h3> + +<ul> +<li>Outscale SAS doc improvements and logo update</li> +</ul> + +<h4>OnApp Changes</h4> + +<ul> +<li>Add list images support for OnApp driver</li> +<li>Add keypair management to OnApp driver</li> +</ul> + +<h4>Amazon EC2 Changes</h4> + +<ul> +<li>Add r4 instance types for AWS</li> +<li>Add support for AWS eu-west-2 and ca-central-1 regions</li> +<li>Add P2 GPU instance types</li> +<li>Add method to modify snapshot attribute for EC2</li> +<li>Add ENA support for EC2 compute images</li> +<li>Add support for forcing detachment of EBS volumes to EC2 driver</li> +<li>Add support for ModifyVolume and DescribeVolumesModifications</li> +<li>Added Import Snapshot and Describe Import Snapshot to EC2 compute driver</li> +<li>Add missing regions in AWS storage and compute drivers</li> +<li>Add SR-IOV net support to images in EC2 compute driver</li> +<li>Fix - update t2.small image size from 11 CPU to 1</li> +<li>Added Billing Product for image in EC2 compute driver</li> +</ul> + +<h4>Linode changes</h4> + +<ul> +<li>Add start, stop instance methods and fix incorrect state TERMINATED to STOPPED</li> +</ul> + +<h4>Azure ARM changes</h4> + +<ul> +<li>Fix typeerror on ex<em>list</em>nics</li> +<li>Add support for Azure Cloud Environments as well as Locations</li> +<li>Fix string representation of the VhdImage type and fix listing of Public IP addresses</li> +<li>Add network security groups to azure ARM</li> +<li>Add the ability to list resource groups</li> +<li>Fix Azure ARM driver condition for ex<em>list</em>publishers where location is specified</li> +</ul> + +<h4>Google Cloud changes</h4> + +<ul> +<li>Allow delete instances from managed group</li> +<li>Allow preemptible instances to be created</li> +<li>Remove validation checks for guestOsFeatures</li> +</ul> + +<h4>Alibaba Aliyun changes</h4> + +<ul> +<li>Add aliyun ecs instance join leave security group</li> +<li>Fix Aliyun ECS, Load balancer and storage adapters when using unicode UTF-8 characters in the names of resources</li> +</ul> + +<h4>DigitalOcean changes</h4> + +<ul> +<li>Add price_monthly extra param to digitalocean sizes</li> +</ul> + +<h4>VMWare vSphere changes</h4> + +<ul> +<li>Fix issue with authentication methods crashing</li> +</ul> + +<h3>Storage</h3> + +<ul> +<li>Reintroduce S3 multipart upload support with signature v4</li> +</ul> + +<h3>DNS</h3> + +<ul> +<li>Add <a href="http://libcloud.readthedocs.io/en/latest/dns/drivers/onapp.html">OnApp driver</a></li> +</ul> + +<h2>Minor changes</h2> + +<h3>Common</h3> + +<ul> +<li>Added an integration test API and a test suite for validating functionality +without mocking any libcloud subsystems</li> +<li>Change Cloudscale to cloudscale.ch.</li> +</ul> + +<h2>Bug Fixes</h2> + +<h3>Compute</h3> + +<h4>2.0.0</h4> + +<ul> +<li><p>Fix OpenStack drivers not correctly setting URLs when used with identity API, would default to 127.0.0.1 and service +catalog URLs were not adhered to.</p></li> +<li><p>Fix Aliyun ECS, Load balancer and storage adapters when using unicode UTF-8 characters in the names of resources +in 2.0.0rc2 < it would fail as a MalformedResponseError, Python 2.7 element tree was raising a unicode error</p></li> +<li><p>Refactor the test classes to use the full libcloud.http and libcloud.common.base modules, with Connection, +Response all used with requests<em>mock. This increases our test coverages and catches bugs in drivers' custom +parse</em>body and auth modules</p></li> +<li><p>Rename libcloud.httplib_ssl to libcloud.http now that we don't use httplib</p></li> +</ul> + +<h4>2.0.0rc2</h4> + +<ul> +<li>Fix Public IP not assigned when creating NIC on Azure ARM</li> +<li>Fix a bug in profitbricks driver where listing snapshots would request a malformed URL</li> +<li>Fix LIBCLOUD-806 bug where vsphere driver cannot be instantiated</li> +<li>[google compute] Improve performance of list nodes by caching volume information.</li> +</ul> + +<p>Full change log can be found at <a href="https://libcloud.readthedocs.org/en/latest/changelog.html">here</a>.</p> + +<h3>Special thank you</h3> + +<p>I would like to wish a special thank you to all of our community contributors +for their ongoing support to the project.</p> + +<ul> +<li>Tinu Cleatus for the OnApp driver</li> +<li>Alex Misstear for the EC2 improvements</li> +<li>Jie Ren for the Aliyun improvements</li> +<li>Francisco Ros for the DigitalOcean improvements</li> +<li>Peter Amstutz and Joseph Hall for the Azure ARM API updates</li> +<li>All of our community for their ongoing support and contributions...</li> +</ul> + +<h3>Download</h3> + +<p>The release can can be downloaded from +<a href="https://libcloud.apache.org/downloads.html">https://libcloud.apache.org/downloads.html</a> or installed using pip:</p> + +<pre> +pip install apache-libcloud==2.0.0 +</pre> + +<h3>Upgrading</h3> + +<p>If you have installed Libcloud using pip you can also use it to upgrade it:</p> + +<pre> +pip install --upgrade apache-libcloud==2.0.0 +</pre> + +<h3>Upgrade notes</h3> + +<p>A page which describes backward incompatible or semi-incompatible +changes and how to preserve the old behavior when this is possible +can be found at <a href="https://libcloud.readthedocs.org/en/latest/upgrade_notes.html">https://libcloud.readthedocs.org/en/latest/upgrade_notes.html</a></p> + +<h3>Documentation</h3> + +<p>Regular and API documentation is available at <a href="https://libcloud.readthedocs.org/en/latest/">https://libcloud.readthedocs.org/en/latest/</a></p> + +<h3>Bugs / Issues</h3> + +<p>If you find any bug or issue, please report it on our issue tracker +<a href="https://issues.apache.org/jira/browse/LIBCLOUD">https://issues.apache.org/jira/browse/LIBCLOUD</a>. +Don't forget to attach an example and / or test which reproduces your +problem.</p> + +<h3>Thanks</h3> + +<p>Thanks to everyone who contributed and made this release possible! Full +list of people who contributed to this release can be found in the +<a href="https://libcloud.readthedocs.org/en/latest/changelog.html">CHANGES file</a>.</p> + + </div> + + <div class="row section post-meta"> + <div class="col-md-12 post-tags"> + <p>Tags: <a href="/blog/tags/news.html" rel="tag">news</a>, <a href="/blog/tags/release%20announcement.html" rel="tag">release announcement</a></p> + </div> + </div> +</div> + + + + + <div class="post"> + <h2><a href="/blog/2017/04/07/libcloud-2-0-0-rc2-released.html">Libcloud 2.0.0rc2 released</a></h2> Modified: libcloud/site/trunk/generated/blog/tags/tutorial.html URL: http://svn.apache.org/viewvc/libcloud/site/trunk/generated/blog/tags/tutorial.html?rev=1808917&r1=1808916&r2=1808917&view=diff ============================================================================== --- libcloud/site/trunk/generated/blog/tags/tutorial.html (original) +++ libcloud/site/trunk/generated/blog/tags/tutorial.html Tue Sep 19 17:03:53 2017 @@ -96,6 +96,175 @@ <div class="post"> + <h2><a href="/blog/2017/04/09/async-rfc.html">Have your say - async support in Apache Libcloud</a></h2> + + + + + + <span class="post-date-author">By Anthony Shaw on Apr 09, 2017</span> + + <div class="post-content"> + <p>One of the big requests whilst we were replacing <code>httplib</code> with the <code>requests</code> package in 2.0 was why didn't +we use a HTTP library that supports <em>asynchronous</em> API calls.</p> + +<p>The intention for 2.0 and replacing the HTTP backend classes was to improve the usability of the project, by making SSL +certificates easier to manage, improving the maintainability of our source code by using an active 3rd party package and +also improving performance and stability.</p> + +<p>Apache Libcloud already has documentation on threaded libraries like gevent and callback-based libraries like Twisted, see +<a href="https://libcloud.readthedocs.io/en/latest/other/using-libcloud-in-multithreaded-and-async-environments.html">using libcloud in multithreaded environments</a> +for examples.</p> + +<p><a href="https://www.python.org/dev/peps/pep-0492/#">PEP 492</a>, implemented in Python 3.5 provides a new coroutine protocol using methods, +<code>__await__</code> for classes, a coroutine method wrapper, or a method that returns a coroutine object. +Also async <a href="https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for">iterators</a> and <a href="https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with">context managers</a> +have been introduced.</p> + +<p>We would like to take advantage of the new language features by offering APIs in Apache Libcloud without breaking backward compatibility and +compatibility for users of <Python 3.5.</p> + +<p>Use cases for this would be:</p> + +<ul> +<li>Being able to fetch <code>Node</code> or <code>StorageObject</code>s from multiple geographies or drivers simultaneously.</li> +<li>Being able to quickly upload or download storage objects by parallelizing operations on the <code>StorageDriver</code>.</li> +<li>Being able to call a long-running API method (e.g. generate report), whilst running other code.</li> +</ul> + +<h2>Design 1 - async context managers <a href="https://github.com/apache/libcloud/pull/1016">PR 1016</a></h2> + +<p>This design would allow drivers to operate in 2 modes, the first is for synchronous method calls, they return list or object +data as per usual. The second mode, API methods like <code>NodeDriver.list_nodes</code> would return a <a href="https://www.python.org/dev/peps/pep-0492/#coroutine-objects">coroutine object</a> +and could be awaited or gathered using an event loop.</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="kn">import</span> <span class="nn">asyncio</span> + +<span class="kn">from</span> <span class="nn">integration.driver.test</span> <span class="kn">import</span> <span class="n">TestNodeDriver</span> +<span class="kn">from</span> <span class="nn">libcloud.async_util</span> <span class="kn">import</span> <span class="n">AsyncSession</span> + +<span class="n">driver</span> <span class="o">=</span> <span class="n">TestNodeDriver</span><span class="p">(</span><span class="s">'apache'</span><span class="p">,</span> <span class="s">'libcloud'</span><span class="p">)</span> + +<span class="n">async</span> <span class="k">def</span> <span class="nf">run</span><span class="p">():</span> + <span class="c"># regular API call</span> + <span class="n">nodes</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">list_nodes</span><span class="p">()</span> + + <span class="n">async</span> <span class="k">with</span> <span class="n">AsyncSession</span><span class="p">(</span><span class="n">driver</span><span class="p">)</span> <span class="k">as</span> <span class="n">async_instance</span><span class="p">:</span> + <span class="n">nodes</span> <span class="o">=</span> <span class="n">await</span> <span class="n">async_instance</span><span class="o">.</span><span class="n">list_nodes</span><span class="p">()</span> + + <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span> + +<span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span> +<span class="n">loop</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">run</span><span class="p">())</span> +<span class="n">loop</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> +</code></pre></div> + +<h2>Design 2 - Additional methods in each driver for coroutines <a href="https://github.com/apache/libcloud/pull/1027">PR 1027</a></h2> + +<p>This is the second design concept for async support in Libcloud.</p> + +<p>The concept here is to have Asynchronous Mixins, <code>LibcloudConnection</code> uses requests and <code>LibcloudAsyncConnection</code> uses aiohttp for async transport <a href="https://github.com/tonybaloney/libcloud/blob/d4fe097476d2f02941e17d5e1b1d405fcf44c0f7/libcloud/connection_async.py#L22-L42">see</a></p> + +<p>The LibcloudAsyncConnection is an implementation detail of AsyncConnection, which is the API for the drivers to consume <a href="https://github.com/tonybaloney/libcloud/blob/d4fe097476d2f02941e17d5e1b1d405fcf44c0f7/libcloud/common/base.py#L742-L778">see</a></p> + +<p>The drivers then use this mixin for their custom connection classes, e.g.</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="k">class</span> <span class="nc">GoogleStorageConnection</span><span class="p">(</span><span class="n">ConnectionUserAndKey</span><span class="p">,</span> <span class="n">AsyncConnection</span><span class="p">):</span> + <span class="o">...</span> +</code></pre></div> + +<p>They then inherit from <code>libcloud.storage.base.StorageAsyncDriver</code>, which uses a new set of base methods, e.g. <code>iterate_containers_async</code> and can be implemented like this:</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"> <span class="n">async</span> <span class="k">def</span> <span class="nf">iterate_containers_async</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="n">response</span> <span class="o">=</span> <span class="n">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">request_async</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span> + <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="n">httplib</span><span class="o">.</span><span class="n">OK</span><span class="p">:</span> + <span class="n">containers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_to_containers</span><span class="p">(</span><span class="n">obj</span><span class="o">=</span><span class="n">response</span><span class="o">.</span><span class="n">object</span><span class="p">,</span> + <span class="n">xpath</span><span class="o">=</span><span class="s">'Buckets/Bucket'</span><span class="p">)</span> + <span class="k">return</span> <span class="n">containers</span> + + <span class="k">raise</span> <span class="n">LibcloudError</span><span class="p">(</span><span class="s">'Unexpected status code: </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status</span><span class="p">),</span> + <span class="n">driver</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> +</code></pre></div> + +<p>Now the consumer can more or less do this:</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="kn">from</span> <span class="nn">libcloud.storage.providers</span> <span class="kn">import</span> <span class="n">get_driver</span> +<span class="kn">from</span> <span class="nn">libcloud.storage.types</span> <span class="kn">import</span> <span class="n">Provider</span> + +<span class="kn">import</span> <span class="nn">asyncio</span> + +<span class="n">GoogleStorageDriver</span> <span class="o">=</span> <span class="n">get_driver</span><span class="p">(</span><span class="n">Provider</span><span class="o">.</span><span class="n">GOOGLE_STORAGE</span><span class="p">)</span> +<span class="n">driver</span> <span class="o">=</span> <span class="n">GoogleStorageDriver</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">KEY</span><span class="p">,</span> <span class="n">secret</span><span class="o">=</span><span class="n">SECRET</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> + +<span class="n">async</span> <span class="k">def</span> <span class="nf">run</span><span class="p">():</span> + <span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">container</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_containers_async</span><span class="p">():</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_container_objects_async</span><span class="p">(</span><span class="n">container</span><span class="p">):</span> + <span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">asyncio</span><span class="o">.</span><span class="n">ensure_future</span><span class="p">(</span><span class="n">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span> + <span class="n">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span> + +<span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span> +<span class="n">loop</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">run</span><span class="p">())</span> +<span class="n">loop</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> +</code></pre></div> + +<h2>Design 3 - Initializer with "<em>async</em>" mode</h2> + +<p>This option is similar to 2, except that if a driver is instantiated with "<code>async=True</code>", +then all driver class methods would return coroutine objects. Internally, it would +patch the Connection class with the AsyncConnection class.</p> + +<p>The downside of this is that all method calls to a driver would need to be awaited or used +by an event loop.</p> + +<div class="highlight"><pre><code class="python language-python" data-lang="python"><span class="kn">from</span> <span class="nn">libcloud.storage.providers</span> <span class="kn">import</span> <span class="n">get_driver</span> +<span class="kn">from</span> <span class="nn">libcloud.storage.types</span> <span class="kn">import</span> <span class="n">Provider</span> + +<span class="kn">import</span> <span class="nn">asyncio</span> + +<span class="n">GoogleStorageDriver</span> <span class="o">=</span> <span class="n">get_driver</span><span class="p">(</span><span class="n">Provider</span><span class="o">.</span><span class="n">GOOGLE_STORAGE</span><span class="p">)</span> +<span class="n">driver</span> <span class="o">=</span> <span class="n">GoogleStorageDriver</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">KEY</span><span class="p">,</span> <span class="n">secret</span><span class="o">=</span><span class="n">SECRET</span><span class="p">,</span> <span class="n">async</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> + +<span class="n">async</span> <span class="k">def</span> <span class="nf">run</span><span class="p">():</span> + <span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">container</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_containers</span><span class="p">():</span> + <span class="n">async</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">driver</span><span class="o">.</span><span class="n">iterate_container_objects</span><span class="p">(</span><span class="n">container</span><span class="p">):</span> + <span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">asyncio</span><span class="o">.</span><span class="n">ensure_future</span><span class="p">(</span><span class="n">do_stuff_with_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)))</span> + <span class="n">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span> + +<span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span> +<span class="n">loop</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">run</span><span class="p">())</span> +<span class="n">loop</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> +</code></pre></div> + +<h1>Give us feedback</h1> + +<p>Got a better idea? Have an API or design, the question we're asking is +"if you wanted to use Libcloud for an async application, what would the code look like?" This helps us design +the API and the implementation details can follow.</p> + +<p>Feel free to comment on the mailing list or on the pull requests, or raise your own pull-request with an API design.</p> + + </div> + + <div class="row section post-meta"> + <div class="col-md-12 post-tags"> + <p>Tags: <a href="/blog/tags/news.html" rel="tag">news</a>, <a href="/blog/tags/tutorial.html" rel="tag">tutorial</a></p> + </div> + </div> +</div> + + + + + <div class="post"> + <h2><a href="/blog/2016/04/06/requests-support.html">Experimental support for the requests package</a></h2> Modified: libcloud/site/trunk/generated/downloads.html URL: http://svn.apache.org/viewvc/libcloud/site/trunk/generated/downloads.html?rev=1808917&r1=1808916&r2=1808917&view=diff ============================================================================== --- libcloud/site/trunk/generated/downloads.html (original) +++ libcloud/site/trunk/generated/downloads.html Tue Sep 19 17:03:53 2017 @@ -111,17 +111,17 @@ <p>This page contains link to the latest stable release of Libcloud. If you are interested in an older release, please visit the <a href="http://archive.apache.org/dist/libcloud/">archive page</a>.</p> -<p><a name="latest-stable-release" id="latest-stable-release"><h2 class="anchor">Libcloud 2.0.0rc2 (stable) - Released on April 7, 2017</h2></a></p> +<p><a name="latest-stable-release" id="latest-stable-release"><h2 class="anchor">Libcloud 2.1.0 (stable) - Released on April 25, 2017</h2></a></p> <p>Files:</p> <ul> -<li><a href="http://www.apache.org/dyn/closer.cgi/libcloud/apache-libcloud-2.0.0rc2.tar.gz">apache-libcloud-2.0.0rc2.tar.gz</a> [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.tar.gz.asc">asc</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.tar.gz.sha1">sha1</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.tar.gz.md5">md5</a>]</li> -<li><a href="http://www.apache.org/dyn/closer.cgi/libcloud/apache-libcloud-2.0.0rc2.tar.bz2">apache-libcloud-2.0.0rc2.tar.bz2</a> [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.tar.bz2.asc">asc</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.tar.bz2.sha1">sha1</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.tar.bz2.md5">md5</a>]</li> -<li><a href="http://www.apache.org/dyn/closer.cgi/libcloud/apache-libcloud-2.0.0rc2.zip">apache-libcloud-2.0.0rc2.tar.zip</a> [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.zip.asc">asc</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.zip.sha1">sha1</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.0.0rc2.zip.md5">md5</a>]</li> +<li><a href="http://www.apache.org/dyn/closer.cgi/libcloud/apache-libcloud-2.1.0.tar.gz">apache-libcloud-2.1.0.tar.gz</a> [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.tar.gz.asc">asc</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.tar.gz.sha1">sha1</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.tar.gz.md5">md5</a>]</li> +<li><a href="http://www.apache.org/dyn/closer.cgi/libcloud/apache-libcloud-2.1.0.tar.bz2">apache-libcloud-2.1.0.tar.bz2</a> [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.tar.bz2.asc">asc</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.tar.bz2.sha1">sha1</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.tar.bz2.md5">md5</a>]</li> +<li><a href="http://www.apache.org/dyn/closer.cgi/libcloud/apache-libcloud-2.1.0.zip">apache-libcloud-2.1.0.tar.zip</a> [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.zip.asc">asc</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.zip.sha1">sha1</a>] [<a href="http://www.apache.org/dist/libcloud/apache-libcloud-2.1.0.zip.md5">md5</a>]</li> </ul> -<p>Upgrade notes: <a href="https://libcloud.readthedocs.org/en/latest/upgrade_notes.html#libcloud-2.0.0rc2">Click</a></p> +<p>Upgrade notes: <a href="https://libcloud.readthedocs.org/en/latest/upgrade_notes.html#libcloud-2.1.0">Click</a></p> <p>You are strongly encouraged to verify those packages using the <a href="https://www.apache.org/dist/libcloud/KEYS">Apache Libcloud developers KEYS</a>. You can find information on how to do that in the @@ -254,7 +254,7 @@ is mentioned above.</p> <p>3.. Verify package with <code>.asc</code> signature file</p> -<div class="highlight"><pre><code class="bash">gpg --verify apache-libcloud-2.0.0rc2.tar.bz2.asc +<div class="highlight"><pre><code class="bash">gpg --verify apache-libcloud-2.1.0.tar.bz2.asc gpg: Signature made Wed Oct 6 15:31:35 2010 CDT using DSA key ID 42721F00 gpg: Good signature from <span class="s2">"Paul Querna <...>"</span> gpg: aka <span class="s2">"Paul Querna <...>"</span> @@ -266,7 +266,7 @@ Primary key fingerprint: 39F6 691A 0ECF <p>Example of a bad signature:</p> -<div class="highlight"><pre><code class="bash">gpg --verify apache-libcloud-2.0.0rc2.tar.bz2.asc +<div class="highlight"><pre><code class="bash">gpg --verify apache-libcloud-2.1.0.tar.bz2.asc gpg: Signature made Wed Oct 6 15:31:35 2010 CDT using DSA key ID 42721F00 gpg: BAD signature from <span class="s2">"Paul Querna <...>"</span> </code></pre></div> Modified: libcloud/site/trunk/generated/getting-started.html URL: http://svn.apache.org/viewvc/libcloud/site/trunk/generated/getting-started.html?rev=1808917&r1=1808916&r2=1808917&view=diff ============================================================================== --- libcloud/site/trunk/generated/getting-started.html (original) +++ libcloud/site/trunk/generated/getting-started.html Tue Sep 19 17:03:53 2017 @@ -125,7 +125,7 @@ pip:</p> <p>If you feel adventurous and want the latest and greatest, you can install latest development version from our Git repository:</p> -<div class="highlight"><pre><code class="bash">pip install -e https://git-wip-us.apache.org/repos/asf/libcloud.git@trunk#egg<span class="o">=</span>apache-libcloud +<div class="highlight"><pre><code class="bash">pip install git+https://git-wip-us.apache.org/repos/asf/libcloud.git@trunk#egg<span class="o">=</span>apache-libcloud </code></pre></div> <p>Keep in mind that trunk is usually under heavy development and can contain Modified: libcloud/site/trunk/generated/index.html URL: http://svn.apache.org/viewvc/libcloud/site/trunk/generated/index.html?rev=1808917&r1=1808916&r2=1808917&view=diff ============================================================================== --- libcloud/site/trunk/generated/index.html (original) +++ libcloud/site/trunk/generated/index.html Tue Sep 19 17:03:53 2017 @@ -169,7 +169,7 @@ <div class="row section row-2"> <div class="col-md-6"> <h3>Installation</h3> - <p>Latest stable version: <a href="https://pypi.python.org/pypi/apache-libcloud/2.0.0rc2" target="_blank">2.0.0rc2</a></p> + <p>Latest stable version: <a href="https://pypi.python.org/pypi/apache-libcloud/2.1.0" target="_blank">2.1.0</a></p> <p><code>pip install apache-libcloud</code></p> <p>Or <a href="downloads.html">download it from our servers</a> and install it manually.</p> </div> @@ -242,19 +242,19 @@ <h3>Latest Blog Posts</h3> - <p><a href="/blog/2017/04/07/libcloud-2-0-0-rc2-released.html">Libcloud 2.0.0rc2 released</a> + <p><a href="/blog/2017/04/25/libcloud-2-0-0-released.html">Libcloud 2.0.0 released</a> - <p><a href="/blog/2016/12/29/libcloud-1-5-0-released.html">Libcloud 1.5.0 released</a> + <p><a href="/blog/2017/04/09/async-rfc.html">Have your say - async support in Apache Libcloud</a> - <p><a href="/blog/2016/11/27/libcloud-1-4-0-released.html">Libcloud 1.4.0 released</a> + <p><a href="/blog/2017/04/07/libcloud-2-0-0-rc2-released.html">Libcloud 2.0.0rc2 released</a> - <p><a href="/blog/2016/10/14/libcloud-1-3-0-released.html">Libcloud 1.3.0 released</a> + <p><a href="/blog/2016/12/29/libcloud-1-5-0-released.html">Libcloud 1.5.0 released</a> Modified: libcloud/site/trunk/generated/sitemap.xml URL: http://svn.apache.org/viewvc/libcloud/site/trunk/generated/sitemap.xml?rev=1808917&r1=1808916&r2=1808917&view=diff ============================================================================== --- libcloud/site/trunk/generated/sitemap.xml (original) +++ libcloud/site/trunk/generated/sitemap.xml Tue Sep 19 17:03:53 2017 @@ -349,8 +349,16 @@ <lastmod>2017-04-07T00:00:00+02:00</lastmod> </url> <url> + <loc>https://libcloud.apache.org/blog/2017/04/09/async-rfc.html</loc> + <lastmod>2017-04-09T00:00:00+02:00</lastmod> + </url> + <url> + <loc>https://libcloud.apache.org/blog/2017/04/25/libcloud-2-0-0-released.html</loc> + <lastmod>2017-04-25T00:00:00+02:00</lastmod> + </url> + <url> <loc>https://libcloud.apache.org/getting-started.html</loc> - <lastmod>2016-05-14T19:47:17+02:00</lastmod> + <lastmod>2017-09-19T18:58:38+02:00</lastmod> </url> <url> <loc>https://libcloud.apache.org/community-resources.html</loc> @@ -362,7 +370,7 @@ </url> <url> <loc>https://libcloud.apache.org/blog/blog/</loc> - <lastmod>2017-06-04T16:30:33+02:00</lastmod> + <lastmod>2017-09-19T18:40:11+02:00</lastmod> </url> <url> <loc>https://libcloud.apache.org/media.html</loc> @@ -378,7 +386,7 @@ </url> <url> <loc>https://libcloud.apache.org/downloads.html</loc> - <lastmod>2017-06-04T16:30:33+02:00</lastmod> + <lastmod>2017-09-19T18:40:11+02:00</lastmod> </url> <url> <loc>https://libcloud.apache.org/whois-using.html</loc> @@ -394,7 +402,7 @@ </url> <url> <loc>https://libcloud.apache.org/</loc> - <lastmod>2017-06-04T16:30:33+02:00</lastmod> + <lastmod>2017-09-19T18:40:11+02:00</lastmod> </url> <url> <loc>https://libcloud.apache.org/credits.html</loc>
