Modified: jclouds/site-content/guides/openstack/index.html URL: http://svn.apache.org/viewvc/jclouds/site-content/guides/openstack/index.html?rev=1923693&r1=1923692&r2=1923693&view=diff ============================================================================== --- jclouds/site-content/guides/openstack/index.html (original) +++ jclouds/site-content/guides/openstack/index.html Mon Feb 10 07:25:53 2025 @@ -150,84 +150,70 @@ <h1>OpenStack: Getting Started Guide</h1> </div> <ol> -<li><a href="#intro">Introduction</a></li> -<li><a href="#openstack">Get OpenStack</a></li> -<li><a href="#install">Get jclouds</a></li> -<li><a href="#terminology">Terminology</a></li> -<li><a href="#keystone">Keystone v2-v3 authentication</a></li> -<li><a href="#nova">Nova: List Servers</a></li> -<li><a href="#swift">Swift: Use Containers</a></li> -<li><a href="#next">Next Steps</a></li> -<li><a href="#pom">OpenStack Dependencies</a></li> + <li><a href="#intro">Introduction</a></li> + <li><a href="#openstack">Get OpenStack</a></li> + <li><a href="#install">Get jclouds</a></li> + <li><a href="#terminology">Terminology</a></li> + <li><a href="#keystone">Keystone v2-v3 authentication</a></li> + <li><a href="#nova">Nova: List Servers</a></li> + <li><a href="#swift">Swift: Use Containers</a></li> + <li><a href="#next">Next Steps</a></li> + <li><a href="#pom">OpenStack Dependencies</a></li> </ol> - -<h2><a id="intro"></a>Introduction</h2> - +<h2 id="introduction"><a id="intro"></a>Introduction</h2> <p><a href="https://www.openstack.org/">OpenStack</a> is a global collaboration of developers and cloud computing technologists producing the ubiquitous open source cloud computing platform for public and private clouds. The project aims to deliver solutions for all types of clouds by being simple to implement, massively scalable, and feature rich. The technology consists of a series of interrelated projects delivering various components for a cloud infrastructure solution.</p> -<h2><a id="openstack"></a>Get OpenStack</h2> - +<h2 id="get-openstack"><a id="openstack"></a>Get OpenStack</h2> <p>You can either install a private OpenStack cloud for yourself or use an existing OpenStack public cloud.</p> -<h3><a id="private"></a>Private Clouds</h3> - -<p>If you don't have a private OpenStack cloud but still want to try it out, you can use <a href="https://devstack.org/">DevStack</a> to create your own mini-OpenStack cloud.</p> - -<h3><a id="public"></a>Public Clouds</h3> +<h3 id="private-clouds"><a id="private"></a>Private Clouds</h3> +<p>If you donât have a private OpenStack cloud but still want to try it out, you can use <a href="https://devstack.org/">DevStack</a> to create your own mini-OpenStack cloud.</p> -<p>Because the OpenStack API is also open, the jclouds APIs that talk to private OpenStack clouds work just as well with public OpenStack clouds. OpenStack is used by several large public clouds, both the <a href="https://www.hpcloud.com/">HP Cloud</a> (<a href="/guides/hpcloud">HP Cloud Getting Started Guide</a>) and <a href="https://www.rackspace.com/cloud/">Rackspace Cloud</a> (<a href="/guides/rackspace">Rackspace Getting Started Guide</a>) are based on it. If you don't want to sign up for a paid public cloud, you can use <a href="https://trystack.org/">TryStack</a>.</p> +<h3 id="public-clouds"><a id="public"></a>Public Clouds</h3> +<p>Because the OpenStack API is also open, the jclouds APIs that talk to private OpenStack clouds work just as well with public OpenStack clouds. OpenStack is used by several large public clouds, both the <a href="https://www.hpcloud.com/">HP Cloud</a> (<a href="/guides/hpcloud">HP Cloud Getting Started Guide</a>) and <a href="https://www.rackspace.com/cloud/">Rackspace Cloud</a> (<a href="/guides/rackspace">Rackspace Getting Started Guide</a>) are based on it. If you donât want to sign up for a paid public cloud, you can use <a href="https://trystack.org/">TryStack</a>.</p> -<h2><a id="install"></a>Get jclouds</h2> +<h2 id="get-jclouds"><a id="install"></a>Get jclouds</h2> <ol> -<li>Ensure you are using the <a href="https://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK) version 6 or later</a>. - -<ul> -<li><code>javac -version</code></li> -</ul> -</li> -<li>Ensure you are using <a href="https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html">Maven version 3 or later</a>. - -<ul> -<li><code>mvn -version</code></li> -</ul> -</li> -<li>Create a directory to try out jclouds. - -<ul> -<li><code>mkdir jclouds</code></li> -<li><code>cd jclouds</code></li> -</ul> -</li> -<li>Make a local copy of the <a href="#pom">pom.xml</a> file below in the jclouds directory. - -<ul> -<li><code>mvn dependency:copy-dependencies "-DoutputDirectory=./lib"</code></li> -</ul> -</li> -<li>You should now have a directory with the following structure: - -<ul> -<li><code>jclouds/</code> - -<ul> -<li><code>pom.xml</code></li> -<li><code>lib/</code> - -<ul> -<li><code>*.jar</code></li> -</ul> -</li> -</ul> -</li> -</ul> -</li> + <li>Ensure you are using the <a href="https://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK) version 6 or later</a>. + <ul> + <li><code class="language-plaintext highlighter-rouge">javac -version</code></li> + </ul> + </li> + <li>Ensure you are using <a href="https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html">Maven version 3 or later</a>. + <ul> + <li><code class="language-plaintext highlighter-rouge">mvn -version</code></li> + </ul> + </li> + <li>Create a directory to try out jclouds. + <ul> + <li><code class="language-plaintext highlighter-rouge">mkdir jclouds</code></li> + <li><code class="language-plaintext highlighter-rouge">cd jclouds</code></li> + </ul> + </li> + <li>Make a local copy of the <a href="#pom">pom.xml</a> file below in the jclouds directory. + <ul> + <li><code class="language-plaintext highlighter-rouge">mvn dependency:copy-dependencies "-DoutputDirectory=./lib"</code></li> + </ul> + </li> + <li>You should now have a directory with the following structure: + <ul> + <li><code class="language-plaintext highlighter-rouge">jclouds/</code> + <ul> + <li><code class="language-plaintext highlighter-rouge">pom.xml</code></li> + <li><code class="language-plaintext highlighter-rouge">lib/</code> + <ul> + <li><code class="language-plaintext highlighter-rouge">*.jar</code></li> + </ul> + </li> + </ul> + </li> + </ul> + </li> </ol> - -<h2><a id="terminology"></a>Terminology</h2> - +<h2 id="terminology"><a id="terminology"></a>Terminology</h2> <p>There are some differences in terminology between jclouds and OpenStack that should be made clear.</p> <div class="row clearfix"> @@ -277,53 +263,47 @@ </div> </div> - -<h2><a id="keystone"></a>Keystone v2-v3 authentication</h2> +<h2 id="keystone-v2-v3-authentication"><a id="keystone"></a>Keystone v2-v3 authentication</h2> <p>OpenStack Keystone (aka: <a href="https://docs.openstack.org/keystone/latest/">OpenStack Identity Service</a>) has major changes between v2 and v3 (detail. <a href="https://docs.openstack.org/keystone/latest/contributor/http-api.html">Identity API v2.0 and v3 History</a>).</p> <p>To login, provide:</p> <ul> -<li>On v2: <em>tenant</em>, <em>user</em>, <em>password</em>.</li> -<li>On v3: a <em>project</em> (new name for <em>tenant</em>), an authentication <em>domain</em> for this <em>project</em>, a <em>user</em>, an authentication <em>domain</em> for this <em>user</em> (the two domains can be different).</li> + <li>On v2: <em>tenant</em>, <em>user</em>, <em>password</em>.</li> + <li>On v3: a <em>project</em> (new name for <em>tenant</em>), an authentication <em>domain</em> for this <em>project</em>, a <em>user</em>, an authentication <em>domain</em> for this <em>user</em> (the two domains can be different).</li> </ul> - <p>jclouds provides backward compatibility between Keystone v2 and v3, but you should keep the following in mind to fully understand authentication against your OpenStack platform (See also the recent <a href="https://jclouds.apache.org/blog/2018/01/16/keystone-v3/">OpenStack Keystone v3 Support</a> blog post).</p> -<h3>v2</h3> +<h3 id="v2">v2</h3> <p>This snippet:</p> -<div class="highlight"><pre><code class="java"><span class="kd">final</span> <span class="n">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Properties</span><span class="o">();</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"2"</span><span class="o">);</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">final</span> <span class="nc">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Properties</span><span class="o">();</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"2"</span><span class="o">);</span> -<span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v2.0"</span><span class="o">)</span> - <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"myTenant:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> +<span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v2.0"</span><span class="o">)</span> + <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"myTenant:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> <span class="o">.</span><span class="na">overrides</span><span class="o">(</span><span class="n">overrides</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>or</p> -<div class="highlight"><pre><code class="java"><span class="kd">final</span> <span class="n">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Properties</span><span class="o">();</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"2"</span><span class="o">);</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">TENANT_NAME</span><span class="o">,</span> <span class="s">"myTenant"</span><span class="o">);</span> - -<span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v2.0"</span><span class="o">)</span> - <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">final</span> <span class="nc">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Properties</span><span class="o">();</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"2"</span><span class="o">);</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">TENANT_NAME</span><span class="o">,</span> <span class="s">"myTenant"</span><span class="o">);</span> + +<span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v2.0"</span><span class="o">)</span> + <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> <span class="o">.</span><span class="na">overrides</span><span class="o">(</span><span class="n">overrides</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>Will produce when authentication needed:</p> -<pre><code>POST https://host:5000/v2.0/tokens HTTP/1.1 +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST https://host:5000/v2.0/tokens HTTP/1.1 { "auth": { "passwordCredentials": { @@ -333,26 +313,24 @@ "tenantName": "myTenant" } } -</code></pre> +</code></pre></div></div> -<h3>v3: Default (unscoped)</h3> +<h3 id="v3-default-unscoped">v3: Default (unscoped)</h3> <p>Keystone v3 requires at min a user authentication domain (generally the one you are using to login through UI console), so this snippet:</p> -<div class="highlight"><pre><code class="java"><span class="kd">final</span> <span class="n">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Properties</span><span class="o">();</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">final</span> <span class="nc">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Properties</span><span class="o">();</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> -<span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> - <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> +<span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> + <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> <span class="o">.</span><span class="na">overrides</span><span class="o">(</span><span class="n">overrides</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>Will produce when authentication needed:</p> -<pre><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 { "auth": { "identity": { @@ -370,29 +348,27 @@ "scope": "unscoped" } } -</code></pre> +</code></pre></div></div> <p>In this case, no <em>project</em> (previously <em>tenant</em> in OpenStack keystone v2) is provided.</p> -<h3>v3: Project-scoped</h3> +<h3 id="v3-project-scoped">v3: Project-scoped</h3> <p>A common usage of OpenStack keystone v3 is to provide the <a href="https://docs.openstack.org/keystone/latest/api_curl_examples.html#project-scoped">project scope</a>, this snippet:</p> -<div class="highlight"><pre><code class="java"><span class="kd">final</span> <span class="n">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Properties</span><span class="o">();</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">SCOPE</span><span class="o">,</span> <span class="s">"project:myTenant"</span><span class="o">);</span> - -<span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> - <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">final</span> <span class="nc">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Properties</span><span class="o">();</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">SCOPE</span><span class="o">,</span> <span class="s">"project:myTenant"</span><span class="o">);</span> + +<span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> + <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> <span class="o">.</span><span class="na">overrides</span><span class="o">(</span><span class="n">overrides</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>Will produce when authentication needed:</p> -<pre><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 { "auth": { "identity": { @@ -417,26 +393,24 @@ } } } -</code></pre> +</code></pre></div></div> -<p>If the project domain is different than the user domain (Use case when 'default' is used for projects and a third-part IAM like ldap is use for user authentication), use this snippet:</p> +<p>If the project domain is different than the user domain (Use case when âdefaultâ is used for projects and a third-part IAM like ldap is use for user authentication), use this snippet:</p> -<div class="highlight"><pre><code class="java"><span class="kd">final</span> <span class="n">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Properties</span><span class="o">();</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">SCOPE</span><span class="o">,</span> <span class="s">"project:myTenant"</span><span class="o">);</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">PROJECT_DOMAIN_NAME</span><span class="o">,</span> <span class="s">"default"</span><span class="o">);</span> <span class="c1">// Since jclouds > v2.1.0 (see PROJECT_DOMAIN_ID as complement)</span> - -<span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> - <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">final</span> <span class="nc">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Properties</span><span class="o">();</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">SCOPE</span><span class="o">,</span> <span class="s">"project:myTenant"</span><span class="o">);</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">PROJECT_DOMAIN_NAME</span><span class="o">,</span> <span class="s">"default"</span><span class="o">);</span> <span class="c1">// Since jclouds > v2.1.0 (see PROJECT_DOMAIN_ID as complement)</span> + +<span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> + <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> <span class="o">.</span><span class="na">overrides</span><span class="o">(</span><span class="n">overrides</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>Will produce when authentication needed:</p> -<pre><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 { "auth": { "identity": { @@ -461,27 +435,25 @@ } } } -</code></pre> +</code></pre></div></div> -<h3>v3: Domain-scoped</h3> +<h3 id="v3-domain-scoped">v3: Domain-scoped</h3> <p>If your authentication is <a href="https://docs.openstack.org/keystone/latest/api_curl_examples.html#domain-scoped">domain-scoped</a>, this snippet:</p> -<div class="highlight"><pre><code class="java"><span class="kd">final</span> <span class="n">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Properties</span><span class="o">();</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> -<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">SCOPE</span><span class="o">,</span> <span class="s">"domain:default"</span><span class="o">);</span> - -<span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> - <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">final</span> <span class="nc">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Properties</span><span class="o">();</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">KEYSTONE_VERSION</span><span class="o">,</span> <span class="s">"3"</span><span class="o">);</span> +<span class="n">overrides</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">SCOPE</span><span class="o">,</span> <span class="s">"domain:default"</span><span class="o">);</span> + +<span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"openstack-nova"</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://host:5000/v3"</span><span class="o">)</span> + <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="s">"ldap:foo"</span><span class="o">,</span> <span class="s">"bar"</span><span class="o">)</span> <span class="o">.</span><span class="na">overrides</span><span class="o">(</span><span class="n">overrides</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>Will produce when authentication needed:</p> -<pre><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST https://host:5000/v3/auth/tokens HTTP/1.1 { "auth": { "identity": { @@ -503,41 +475,36 @@ } } } -</code></pre> - -<h2><a id="nova"></a>Nova: List Servers</h2> +</code></pre></div></div> -<h3><a id="nova-intro"></a>Introduction</h3> +<h2 id="nova-list-servers"><a id="nova"></a>Nova: List Servers</h2> +<h3 id="introduction-1"><a id="nova-intro"></a>Introduction</h3> <p><a href="https://www.openstack.org/software/openstack-compute/">OpenStack Compute</a> (aka Nova) is an easy to use service that provides on-demand servers that you can use to to build dynamic websites, deliver mobile apps, or crunch big data.</p> -<h3><a id="nova-source"></a>The Source Code</h3> +<h3 id="the-source-code"><a id="nova-source"></a>The Source Code</h3> <ol> -<li>Create a Java source file called JCloudsNova.java in the jclouds directory above.</li> -<li>You should now have a directory with the following structure: - -<ul> -<li><code>jclouds/</code> - -<ul> -<li><code>JCloudsNova.java</code></li> -<li><code>pom.xml</code></li> -<li><code>lib/</code> - -<ul> -<li><code>*.jar</code></li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -<li>Open JCloudsNova.java for editing, read the code below, and copy it in.</li> + <li>Create a Java source file called JCloudsNova.java in the jclouds directory above.</li> + <li>You should now have a directory with the following structure: + <ul> + <li><code class="language-plaintext highlighter-rouge">jclouds/</code> + <ul> + <li><code class="language-plaintext highlighter-rouge">JCloudsNova.java</code></li> + <li><code class="language-plaintext highlighter-rouge">pom.xml</code></li> + <li><code class="language-plaintext highlighter-rouge">lib/</code> + <ul> + <li><code class="language-plaintext highlighter-rouge">*.jar</code></li> + </ul> + </li> + </ul> + </li> + </ul> + </li> + <li>Open JCloudsNova.java for editing, read the code below, and copy it in.</li> </ol> - -<div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableSet</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableSet</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">com.google.common.io.Closeables</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">com.google.inject.Module</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">org.jclouds.ContextBuilder</span><span class="o">;</span> @@ -550,17 +517,17 @@ <span class="kn">import</span> <span class="nn">java.io.IOException</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">java.util.Set</span><span class="o">;</span> -<span class="kd">public</span> <span class="kd">class</span> <span class="nc">JCloudsNova</span> <span class="kd">implements</span> <span class="n">Closeable</span> <span class="o">{</span> - <span class="kd">private</span> <span class="kd">final</span> <span class="n">NovaApi</span> <span class="n">novaApi</span><span class="o">;</span> - <span class="kd">private</span> <span class="kd">final</span> <span class="n">Set</span><span class="o"><</span><span class="n">String</span><span class="o">></span> <span class="n">regions</span><span class="o">;</span> +<span class="kd">public</span> <span class="kd">class</span> <span class="nc">JCloudsNova</span> <span class="kd">implements</span> <span class="nc">Closeable</span> <span class="o">{</span> + <span class="kd">private</span> <span class="kd">final</span> <span class="nc">NovaApi</span> <span class="n">novaApi</span><span class="o">;</span> + <span class="kd">private</span> <span class="kd">final</span> <span class="nc">Set</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">regions</span><span class="o">;</span> - <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span> - <span class="n">JCloudsNova</span> <span class="n">jcloudsNova</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JCloudsNova</span><span class="o">();</span> + <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">IOException</span> <span class="o">{</span> + <span class="nc">JCloudsNova</span> <span class="n">jcloudsNova</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">JCloudsNova</span><span class="o">();</span> <span class="k">try</span> <span class="o">{</span> <span class="n">jcloudsNova</span><span class="o">.</span><span class="na">listServers</span><span class="o">();</span> <span class="n">jcloudsNova</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> - <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> + <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span> <span class="n">jcloudsNova</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> @@ -568,75 +535,68 @@ <span class="o">}</span> <span class="kd">public</span> <span class="nf">JCloudsNova</span><span class="o">()</span> <span class="o">{</span> - <span class="n">Iterable</span><span class="o"><</span><span class="n">Module</span><span class="o">></span> <span class="n">modules</span> <span class="o">=</span> <span class="n">ImmutableSet</span><span class="o">.<</span><span class="n">Module</span><span class="o">></span><span class="n">of</span><span class="o">(</span><span class="k">new</span> <span class="n">SLF4JLoggingModule</span><span class="o">());</span> + <span class="nc">Iterable</span><span class="o"><</span><span class="nc">Module</span><span class="o">></span> <span class="n">modules</span> <span class="o">=</span> <span class="nc">ImmutableSet</span><span class="o">.<</span><span class="nc">Module</span><span class="o">></span><span class="n">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">SLF4JLoggingModule</span><span class="o">());</span> - <span class="c1">// Please refer to 'Keystone v2-v3 authentication' section for complete authentication use case</span> - <span class="n">String</span> <span class="n">provider</span> <span class="o">=</span> <span class="s">"openstack-nova"</span><span class="o">;</span> - <span class="n">String</span> <span class="n">identity</span> <span class="o">=</span> <span class="s">"demo:demo"</span><span class="o">;</span> <span class="c1">// tenantName:userName</span> - <span class="n">String</span> <span class="n">credential</span> <span class="o">=</span> <span class="s">"devstack"</span><span class="o">;</span> + <span class="c1">// Please refer to 'Keystone v2-v3 authentication' section for complete authentication use case</span> + <span class="nc">String</span> <span class="n">provider</span> <span class="o">=</span> <span class="s">"openstack-nova"</span><span class="o">;</span> + <span class="nc">String</span> <span class="n">identity</span> <span class="o">=</span> <span class="s">"demo:demo"</span><span class="o">;</span> <span class="c1">// tenantName:userName</span> + <span class="nc">String</span> <span class="n">credential</span> <span class="o">=</span> <span class="s">"devstack"</span><span class="o">;</span> - <span class="n">novaApi</span> <span class="o">=</span> <span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="n">provider</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"http://xxx.xxx.xxx.xxx:5000/v2.0/"</span><span class="o">)</span> + <span class="n">novaApi</span> <span class="o">=</span> <span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="n">provider</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"http://xxx.xxx.xxx.xxx:5000/v2.0/"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">identity</span><span class="o">,</span> <span class="n">credential</span><span class="o">)</span> <span class="o">.</span><span class="na">modules</span><span class="o">(</span><span class="n">modules</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="n">regions</span> <span class="o">=</span> <span class="n">novaApi</span><span class="o">.</span><span class="na">getConfiguredRegions</span><span class="o">();</span> <span class="o">}</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">listServers</span><span class="o">()</span> <span class="o">{</span> - <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">region</span> <span class="o">:</span> <span class="n">regions</span><span class="o">)</span> <span class="o">{</span> - <span class="n">ServerApi</span> <span class="n">serverApi</span> <span class="o">=</span> <span class="n">novaApi</span><span class="o">.</span><span class="na">getServerApi</span><span class="o">(</span><span class="n">region</span><span class="o">);</span> + <span class="k">for</span> <span class="o">(</span><span class="nc">String</span> <span class="n">region</span> <span class="o">:</span> <span class="n">regions</span><span class="o">)</span> <span class="o">{</span> + <span class="nc">ServerApi</span> <span class="n">serverApi</span> <span class="o">=</span> <span class="n">novaApi</span><span class="o">.</span><span class="na">getServerApi</span><span class="o">(</span><span class="n">region</span><span class="o">);</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Servers in "</span> <span class="o">+</span> <span class="n">region</span><span class="o">);</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Servers in "</span> <span class="o">+</span> <span class="n">region</span><span class="o">);</span> - <span class="k">for</span> <span class="o">(</span><span class="n">Server</span> <span class="n">server</span> <span class="o">:</span> <span class="n">serverApi</span><span class="o">.</span><span class="na">listInDetail</span><span class="o">().</span><span class="na">concat</span><span class="o">())</span> <span class="o">{</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="n">server</span><span class="o">);</span> + <span class="k">for</span> <span class="o">(</span><span class="nc">Server</span> <span class="n">server</span> <span class="o">:</span> <span class="n">serverApi</span><span class="o">.</span><span class="na">listInDetail</span><span class="o">().</span><span class="na">concat</span><span class="o">())</span> <span class="o">{</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="n">server</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> <span class="o">}</span> - <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span> - <span class="n">Closeables</span><span class="o">.</span><span class="na">close</span><span class="o">(</span><span class="n">novaApi</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span> + <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">IOException</span> <span class="o">{</span> + <span class="nc">Closeables</span><span class="o">.</span><span class="na">close</span><span class="o">(</span><span class="n">novaApi</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span> <span class="o">}</span> -<span class="o">}</span> -</code></pre></div> - +<span class="o">}</span></code></pre></figure> <p>In the constructor note that</p> <ul> -<li><code>String provider = "openstack-nova";</code> - -<ul> -<li>This ones pretty self explanatory, we're using the OpenStack Nova provider in jclouds</li> -</ul> -</li> -<li><code>String identity = "demo:demo"; // tenantName:userName</code> - -<ul> -<li>Here we use the tenant name and user name with a colon between them instead of just a user name</li> -</ul> -</li> -<li><code>String credential = "devstack";</code> - -<ul> -<li>The demo account uses ADMIN_PASSWORD too</li> + <li><code class="language-plaintext highlighter-rouge">String provider = "openstack-nova";</code> + <ul> + <li>This ones pretty self explanatory, weâre using the OpenStack Nova provider in jclouds</li> + </ul> + </li> + <li><code class="language-plaintext highlighter-rouge">String identity = "demo:demo"; // tenantName:userName</code> + <ul> + <li>Here we use the tenant name and user name with a colon between them instead of just a user name</li> + </ul> + </li> + <li><code class="language-plaintext highlighter-rouge">String credential = "devstack";</code> + <ul> + <li>The demo account uses ADMIN_PASSWORD too</li> + </ul> + </li> + <li><code class="language-plaintext highlighter-rouge">.endpoint("http://xxx.xxx.xxx.xxx:5000/v2.0/")</code> + <ul> + <li>This is the Keystone endpoint that jclouds needs to connect with to get more info (services and endpoints) from OpenStack</li> + <li>When a DevStack installation completes successfully, one of the last few lines will read something like â<code class="language-plaintext highlighter-rouge">Keystone is serving at http://xxx.xxx.xxx.xxx:5000/v2.0/</code>â</li> + <li>Set the endpoint to this URL depending on the method used to get OpenStack above.</li> + </ul> + </li> </ul> -</li> -<li><code>.endpoint("http://xxx.xxx.xxx.xxx:5000/v2.0/")</code> -<ul> -<li>This is the Keystone endpoint that jclouds needs to connect with to get more info (services and endpoints) from OpenStack</li> -<li>When a DevStack installation completes successfully, one of the last few lines will read something like "<code>Keystone is serving at http://xxx.xxx.xxx.xxx:5000/v2.0/</code>"</li> -<li>Set the endpoint to this URL depending on the method used to get OpenStack above.</li> -</ul> -</li> -</ul> +<h3 id="compile-and-run"><a id="nova-compile"></a>Compile and Run</h3> - -<h3><a id="nova-compile"></a>Compile and Run</h3> - -<pre><code>$ javac -classpath ".:lib/*" JCloudsNova.java +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ javac -classpath ".:lib/*" JCloudsNova.java $ java -classpath ".:lib/*" JCloudsNova @@ -645,41 +605,36 @@ Servers in RegionOne ... # You'll see a lot of logging in the output -</code></pre> - -<h2><a id="swift"></a>Swift: Use Containers</h2> +</code></pre></div></div> -<h3><a id="swift-intro"></a>Introduction</h3> +<h2 id="swift-use-containers"><a id="swift"></a>Swift: Use Containers</h2> +<h3 id="introduction-2"><a id="swift-intro"></a>Introduction</h3> <p><a href="https://www.openstack.org/software/openstack-storage/">OpenStack Object Storage</a> (aka Swift) provides redundant, scalable object storage using clusters of standardized servers capable of storing petabytes of data.</p> -<h3><a id="swift-source"></a>The Source Code</h3> +<h3 id="the-source-code-1"><a id="swift-source"></a>The Source Code</h3> <ol> -<li>Create a Java source file called JCloudsSwift.java in the jclouds directory above.</li> -<li>You should now have a directory with the following structure: - -<ul> -<li><code>jclouds/</code> - -<ul> -<li><code>JCloudsSwift.java</code></li> -<li><code>pom.xml</code></li> -<li><code>lib/</code> - -<ul> -<li><code>*.jar</code></li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -<li>Open JCloudsSwift.java for editing, read the code below, and copy it in.</li> + <li>Create a Java source file called JCloudsSwift.java in the jclouds directory above.</li> + <li>You should now have a directory with the following structure: + <ul> + <li><code class="language-plaintext highlighter-rouge">jclouds/</code> + <ul> + <li><code class="language-plaintext highlighter-rouge">JCloudsSwift.java</code></li> + <li><code class="language-plaintext highlighter-rouge">pom.xml</code></li> + <li><code class="language-plaintext highlighter-rouge">lib/</code> + <ul> + <li><code class="language-plaintext highlighter-rouge">*.jar</code></li> + </ul> + </li> + </ul> + </li> + </ul> + </li> + <li>Open JCloudsSwift.java for editing, read the code below, and copy it in.</li> </ol> - -<div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableMap</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableMap</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">com.google.common.collect.ImmutableSet</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">com.google.common.io.Closeables</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">com.google.inject.Module</span><span class="o">;</span> @@ -700,21 +655,21 @@ Servers in RegionOne <span class="kn">import</span> <span class="nn">static</span> <span class="n">com</span><span class="o">.</span><span class="na">google</span><span class="o">.</span><span class="na">common</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">ByteSource</span><span class="o">.</span><span class="na">wrap</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">jclouds</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">Payloads</span><span class="o">.</span><span class="na">newByteSourcePayload</span><span class="o">;</span> -<span class="kd">public</span> <span class="kd">class</span> <span class="nc">JCloudsSwift</span> <span class="kd">implements</span> <span class="n">Closeable</span> <span class="o">{</span> - <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">CONTAINER_NAME</span> <span class="o">=</span> <span class="s">"jclouds-example"</span><span class="o">;</span> - <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">OBJECT_NAME</span> <span class="o">=</span> <span class="s">"jclouds-example.txt"</span><span class="o">;</span> +<span class="kd">public</span> <span class="kd">class</span> <span class="nc">JCloudsSwift</span> <span class="kd">implements</span> <span class="nc">Closeable</span> <span class="o">{</span> + <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="nc">String</span> <span class="no">CONTAINER_NAME</span> <span class="o">=</span> <span class="s">"jclouds-example"</span><span class="o">;</span> + <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="nc">String</span> <span class="no">OBJECT_NAME</span> <span class="o">=</span> <span class="s">"jclouds-example.txt"</span><span class="o">;</span> - <span class="kd">private</span> <span class="n">SwiftApi</span> <span class="n">swiftApi</span><span class="o">;</span> + <span class="kd">private</span> <span class="nc">SwiftApi</span> <span class="n">swiftApi</span><span class="o">;</span> - <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span> - <span class="n">JCloudsSwift</span> <span class="n">jcloudsSwift</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JCloudsSwift</span><span class="o">();</span> + <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">IOException</span> <span class="o">{</span> + <span class="nc">JCloudsSwift</span> <span class="n">jcloudsSwift</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">JCloudsSwift</span><span class="o">();</span> <span class="k">try</span> <span class="o">{</span> <span class="n">jcloudsSwift</span><span class="o">.</span><span class="na">createContainer</span><span class="o">();</span> <span class="n">jcloudsSwift</span><span class="o">.</span><span class="na">uploadObjectFromString</span><span class="o">();</span> <span class="n">jcloudsSwift</span><span class="o">.</span><span class="na">listContainers</span><span class="o">();</span> <span class="n">jcloudsSwift</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> - <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> + <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span> <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span> <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span> <span class="n">jcloudsSwift</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> @@ -722,67 +677,65 @@ Servers in RegionOne <span class="o">}</span> <span class="kd">public</span> <span class="nf">JCloudsSwift</span><span class="o">()</span> <span class="o">{</span> - <span class="n">Iterable</span><span class="o"><</span><span class="n">Module</span><span class="o">></span> <span class="n">modules</span> <span class="o">=</span> <span class="n">ImmutableSet</span><span class="o">.<</span><span class="n">Module</span><span class="o">></span><span class="n">of</span><span class="o">(</span> + <span class="nc">Iterable</span><span class="o"><</span><span class="nc">Module</span><span class="o">></span> <span class="n">modules</span> <span class="o">=</span> <span class="nc">ImmutableSet</span><span class="o">.<</span><span class="nc">Module</span><span class="o">></span><span class="n">of</span><span class="o">(</span> <span class="k">new</span> <span class="nf">SLF4JLoggingModule</span><span class="o">());</span> - <span class="c1">// Please refer to 'Keystone v2-v3 authentication' section for complete authentication use case</span> - <span class="n">String</span> <span class="n">provider</span> <span class="o">=</span> <span class="s">"openstack-swift"</span><span class="o">;</span> - <span class="n">String</span> <span class="n">identity</span> <span class="o">=</span> <span class="s">"demo:demo"</span><span class="o">;</span> <span class="c1">// tenantName:userName</span> - <span class="n">String</span> <span class="n">credential</span> <span class="o">=</span> <span class="s">"devstack"</span><span class="o">;</span> + <span class="c1">// Please refer to 'Keystone v2-v3 authentication' section for complete authentication use case</span> + <span class="nc">String</span> <span class="n">provider</span> <span class="o">=</span> <span class="s">"openstack-swift"</span><span class="o">;</span> + <span class="nc">String</span> <span class="n">identity</span> <span class="o">=</span> <span class="s">"demo:demo"</span><span class="o">;</span> <span class="c1">// tenantName:userName</span> + <span class="nc">String</span> <span class="n">credential</span> <span class="o">=</span> <span class="s">"devstack"</span><span class="o">;</span> - <span class="n">swiftApi</span> <span class="o">=</span> <span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="n">provider</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"http://xxx.xxx.xxx.xxx:5000/v2.0/"</span><span class="o">)</span> + <span class="n">swiftApi</span> <span class="o">=</span> <span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="n">provider</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"http://xxx.xxx.xxx.xxx:5000/v2.0/"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">identity</span><span class="o">,</span> <span class="n">credential</span><span class="o">)</span> <span class="o">.</span><span class="na">modules</span><span class="o">(</span><span class="n">modules</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">SwiftApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">SwiftApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="o">}</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">createContainer</span><span class="o">()</span> <span class="o">{</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Create Container"</span><span class="o">);</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Create Container"</span><span class="o">);</span> - <span class="n">ContainerApi</span> <span class="n">containerApi</span> <span class="o">=</span> <span class="n">swiftApi</span><span class="o">.</span><span class="na">getContainerApi</span><span class="o">(</span><span class="s">"RegionOne"</span><span class="o">);</span> - <span class="n">CreateContainerOptions</span> <span class="n">options</span> <span class="o">=</span> <span class="n">CreateContainerOptions</span><span class="o">.</span><span class="na">Builder</span> - <span class="o">.</span><span class="na">metadata</span><span class="o">(</span><span class="n">ImmutableMap</span><span class="o">.</span><span class="na">of</span><span class="o">(</span> - <span class="s">"key1"</span><span class="o">,</span> <span class="s">"value1"</span><span class="o">,</span> - <span class="s">"key2"</span><span class="o">,</span> <span class="s">"value2"</span><span class="o">));</span> + <span class="nc">ContainerApi</span> <span class="n">containerApi</span> <span class="o">=</span> <span class="n">swiftApi</span><span class="o">.</span><span class="na">getContainerApi</span><span class="o">(</span><span class="s">"RegionOne"</span><span class="o">);</span> + <span class="nc">CreateContainerOptions</span> <span class="n">options</span> <span class="o">=</span> <span class="nc">CreateContainerOptions</span><span class="o">.</span><span class="na">Builder</span> + <span class="o">.</span><span class="na">metadata</span><span class="o">(</span><span class="nc">ImmutableMap</span><span class="o">.</span><span class="na">of</span><span class="o">(</span> + <span class="s">"key1"</span><span class="o">,</span> <span class="s">"value1"</span><span class="o">,</span> + <span class="s">"key2"</span><span class="o">,</span> <span class="s">"value2"</span><span class="o">));</span> - <span class="n">containerApi</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">CONTAINER_NAME</span><span class="o">,</span> <span class="n">options</span><span class="o">);</span> + <span class="n">containerApi</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="no">CONTAINER_NAME</span><span class="o">,</span> <span class="n">options</span><span class="o">);</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="n">CONTAINER_NAME</span><span class="o">);</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="no">CONTAINER_NAME</span><span class="o">);</span> <span class="o">}</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">uploadObjectFromString</span><span class="o">()</span> <span class="o">{</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Upload Object From String"</span><span class="o">);</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Upload Object From String"</span><span class="o">);</span> - <span class="n">ObjectApi</span> <span class="n">objectApi</span> <span class="o">=</span> <span class="n">swiftApi</span><span class="o">.</span><span class="na">getObjectApi</span><span class="o">(</span><span class="s">"RegionOne"</span><span class="o">,</span> <span class="n">CONTAINER_NAME</span><span class="o">);</span> - <span class="n">Payload</span> <span class="n">payload</span> <span class="o">=</span> <span class="n">newByteSourcePayload</span><span class="o">(</span><span class="n">wrap</span><span class="o">(</span><span class="s">"Hello World"</span><span class="o">.</span><span class="na">getBytes</span><span class="o">()));</span> + <span class="nc">ObjectApi</span> <span class="n">objectApi</span> <span class="o">=</span> <span class="n">swiftApi</span><span class="o">.</span><span class="na">getObjectApi</span><span class="o">(</span><span class="s">"RegionOne"</span><span class="o">,</span> <span class="no">CONTAINER_NAME</span><span class="o">);</span> + <span class="nc">Payload</span> <span class="n">payload</span> <span class="o">=</span> <span class="n">newByteSourcePayload</span><span class="o">(</span><span class="n">wrap</span><span class="o">(</span><span class="s">"Hello World"</span><span class="o">.</span><span class="na">getBytes</span><span class="o">()));</span> - <span class="n">objectApi</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">OBJECT_NAME</span><span class="o">,</span> <span class="n">payload</span><span class="o">,</span> <span class="n">PutOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">metadata</span><span class="o">(</span><span class="n">ImmutableMap</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="s">"key1"</span><span class="o">,</span> <span class="s">"value1"</span><span class="o">)));</span> + <span class="n">objectApi</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="no">OBJECT_NAME</span><span class="o">,</span> <span class="n">payload</span><span class="o">,</span> <span class="nc">PutOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">metadata</span><span class="o">(</span><span class="nc">ImmutableMap</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="s">"key1"</span><span class="o">,</span> <span class="s">"value1"</span><span class="o">)));</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="n">OBJECT_NAME</span><span class="o">);</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="no">OBJECT_NAME</span><span class="o">);</span> <span class="o">}</span> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">listContainers</span><span class="o">()</span> <span class="o">{</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"List Containers"</span><span class="o">);</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"List Containers"</span><span class="o">);</span> - <span class="n">ContainerApi</span> <span class="n">containerApi</span> <span class="o">=</span> <span class="n">swiftApi</span><span class="o">.</span><span class="na">getContainerApi</span><span class="o">(</span><span class="s">"RegionOne"</span><span class="o">);</span> - <span class="n">Set</span><span class="o"><</span><span class="n">Container</span><span class="o">></span> <span class="n">containers</span> <span class="o">=</span> <span class="n">containerApi</span><span class="o">.</span><span class="na">list</span><span class="o">().</span><span class="na">toSet</span><span class="o">();</span> + <span class="nc">ContainerApi</span> <span class="n">containerApi</span> <span class="o">=</span> <span class="n">swiftApi</span><span class="o">.</span><span class="na">getContainerApi</span><span class="o">(</span><span class="s">"RegionOne"</span><span class="o">);</span> + <span class="nc">Set</span><span class="o"><</span><span class="nc">Container</span><span class="o">></span> <span class="n">containers</span> <span class="o">=</span> <span class="n">containerApi</span><span class="o">.</span><span class="na">list</span><span class="o">().</span><span class="na">toSet</span><span class="o">();</span> - <span class="k">for</span> <span class="o">(</span><span class="n">Container</span> <span class="n">container</span> <span class="o">:</span> <span class="n">containers</span><span class="o">)</span> <span class="o">{</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="n">container</span><span class="o">);</span> + <span class="k">for</span> <span class="o">(</span><span class="nc">Container</span> <span class="n">container</span> <span class="o">:</span> <span class="n">containers</span><span class="o">)</span> <span class="o">{</span> + <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">" "</span> <span class="o">+</span> <span class="n">container</span><span class="o">);</span> <span class="o">}</span> <span class="o">}</span> - <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span> - <span class="n">Closeables</span><span class="o">.</span><span class="na">close</span><span class="o">(</span><span class="n">swiftApi</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span> + <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">IOException</span> <span class="o">{</span> + <span class="nc">Closeables</span><span class="o">.</span><span class="na">close</span><span class="o">(</span><span class="n">swiftApi</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span> <span class="o">}</span> -<span class="o">}</span> -</code></pre></div> +<span class="o">}</span></code></pre></figure> +<h3 id="compile-and-run-1"><a id="swift-compile"></a>Compile and Run</h3> -<h3><a id="swift-compile"></a>Compile and Run</h3> - -<pre><code>$ javac -classpath ".:lib/*" JCloudsSwift.java +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ javac -classpath ".:lib/*" JCloudsSwift.java $ java -classpath ".:lib/*" JCloudsSwift @@ -795,59 +748,55 @@ List Containers ... # You'll see a lot of logging in the output -</code></pre> +</code></pre></div></div> -<h2><a id="next"></a>Next Steps</h2> +<h2 id="next-steps"><a id="next"></a>Next Steps</h2> <ul> -<li>Try the List Servers example above with one of the public clouds. For the Rackspace Cloud the constructor becomes:</li> + <li>Try the List Servers example above with one of the public clouds. For the Rackspace Cloud the constructor becomes:</li> </ul> - -<div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">org.jclouds.Constants</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">org.jclouds.Constants</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">org.jclouds.openstack.keystone.v2_0.config.CredentialTypes</span><span class="o">;</span> <span class="kn">import</span> <span class="nn">org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties</span><span class="o">;</span> <span class="c1">// snip</span> <span class="kd">public</span> <span class="nf">JCloudsNova</span><span class="o">()</span> <span class="o">{</span> - <span class="n">Iterable</span><span class="o"><</span><span class="n">Module</span><span class="o">></span> <span class="n">modules</span> <span class="o">=</span> <span class="n">ImmutableSet</span><span class="o">.<</span><span class="n">Module</span><span class="o">></span><span class="n">of</span><span class="o">(</span><span class="k">new</span> <span class="n">SLF4JLoggingModule</span><span class="o">());</span> + <span class="nc">Iterable</span><span class="o"><</span><span class="nc">Module</span><span class="o">></span> <span class="n">modules</span> <span class="o">=</span> <span class="nc">ImmutableSet</span><span class="o">.<</span><span class="nc">Module</span><span class="o">></span><span class="n">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">SLF4JLoggingModule</span><span class="o">());</span> - <span class="n">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Properties</span><span class="o">();</span> - <span class="n">overrides</span><span class="o">.</span><span class="na">setProperty</span><span class="o">(</span><span class="n">KeystoneProperties</span><span class="o">.</span><span class="na">CREDENTIAL_TYPE</span><span class="o">,</span> <span class="n">CredentialTypes</span><span class="o">.</span><span class="na">PASSWORD_CREDENTIALS</span><span class="o">);</span> - <span class="n">overrides</span><span class="o">.</span><span class="na">setProperty</span><span class="o">(</span><span class="n">Constants</span><span class="o">.</span><span class="na">PROPERTY_API_VERSION</span><span class="o">,</span> <span class="s">"2"</span><span class="o">);</span> - - <span class="c1">// Please refer to 'Keystone v2-v3 authentication' section for complete authentication use case</span> - <span class="n">String</span> <span class="n">provider</span> <span class="o">=</span> <span class="s">"openstack-nova"</span><span class="o">;</span> - <span class="n">String</span> <span class="n">identity</span> <span class="o">=</span> <span class="s">"username"</span><span class="o">;</span> - <span class="n">String</span> <span class="n">credential</span> <span class="o">=</span> <span class="s">"password"</span><span class="o">;</span> + <span class="nc">Properties</span> <span class="n">overrides</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Properties</span><span class="o">();</span> + <span class="n">overrides</span><span class="o">.</span><span class="na">setProperty</span><span class="o">(</span><span class="nc">KeystoneProperties</span><span class="o">.</span><span class="na">CREDENTIAL_TYPE</span><span class="o">,</span> <span class="nc">CredentialTypes</span><span class="o">.</span><span class="na">PASSWORD_CREDENTIALS</span><span class="o">);</span> + <span class="n">overrides</span><span class="o">.</span><span class="na">setProperty</span><span class="o">(</span><span class="nc">Constants</span><span class="o">.</span><span class="na">PROPERTY_API_VERSION</span><span class="o">,</span> <span class="s">"2"</span><span class="o">);</span> + + <span class="c1">// Please refer to 'Keystone v2-v3 authentication' section for complete authentication use case</span> + <span class="nc">String</span> <span class="n">provider</span> <span class="o">=</span> <span class="s">"openstack-nova"</span><span class="o">;</span> + <span class="nc">String</span> <span class="n">identity</span> <span class="o">=</span> <span class="s">"username"</span><span class="o">;</span> + <span class="nc">String</span> <span class="n">credential</span> <span class="o">=</span> <span class="s">"password"</span><span class="o">;</span> - <span class="n">novaApi</span> <span class="o">=</span> <span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="n">provider</span><span class="o">)</span> - <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://identity.api.rackspacecloud.com/v2.0/"</span><span class="o">)</span> + <span class="n">novaApi</span> <span class="o">=</span> <span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="n">provider</span><span class="o">)</span> + <span class="o">.</span><span class="na">endpoint</span><span class="o">(</span><span class="s">"https://identity.api.rackspacecloud.com/v2.0/"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">identity</span><span class="o">,</span> <span class="n">credential</span><span class="o">)</span> <span class="o">.</span><span class="na">modules</span><span class="o">(</span><span class="n">modules</span><span class="o">)</span> <span class="o">.</span><span class="na">overrides</span><span class="o">(</span><span class="n">overrides</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="n">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> + <span class="o">.</span><span class="na">buildApi</span><span class="o">(</span><span class="nc">NovaApi</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="n">regions</span> <span class="o">=</span> <span class="n">novaApi</span><span class="o">.</span><span class="na">getConfiguredRegions</span><span class="o">();</span> -<span class="o">}</span> -</code></pre></div> - +<span class="o">}</span></code></pre></figure> <ul> -<li>Try using the <code>"openstack-cinder"</code> provider to list volumes (hint: see <a href="https://github.com/apache/jclouds/blob/master/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java">VolumeAndSnapshotApiLiveTest.testListVolumes()</a>).</li> -<li>Have a look at how the optional extensions are handled (hint: see <a href="https://github.com/apache/jclouds/blob/master/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiLiveTest.java#L42">FloatingIPApiLiveTest.testListFloatingIPs()</a>).</li> -<li>Change the example to do different things that you want to do.</li> -<li>Browse the <a href="https://demobox.github.com/jclouds-maven-site/latest/apidocs">Javadoc</a>.</li> -<li>Join the <a href="/community/">jclouds community</a> as either a developer or user.</li> + <li>Try using the <code class="language-plaintext highlighter-rouge">"openstack-cinder"</code> provider to list volumes (hint: see <a href="https://github.com/apache/jclouds/blob/master/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java">VolumeAndSnapshotApiLiveTest.testListVolumes()</a>).</li> + <li>Have a look at how the optional extensions are handled (hint: see <a href="https://github.com/apache/jclouds/blob/master/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApiLiveTest.java#L42">FloatingIPApiLiveTest.testListFloatingIPs()</a>).</li> + <li>Change the example to do different things that you want to do.</li> + <li>Browse the <a href="https://demobox.github.com/jclouds-maven-site/latest/apidocs">Javadoc</a>.</li> + <li>Join the <a href="/community/">jclouds community</a> as either a developer or user.</li> </ul> +<h2 id="openstack-dependencies"><a id="pom"></a>OpenStack Dependencies</h2> -<h2><a id="pom"></a>OpenStack Dependencies</h2> - -<p>This pom.xml file specifies all of the dependencies you'll need to work with OpenStack.</p> +<p>This pom.xml file specifies all of the dependencies youâll need to work with OpenStack.</p> -<div class="highlight"><pre><code class="xml"><span class="nt"><project</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/POM/4.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span> - <span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span><span class="nt">></span> +<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt"><project</span> <span class="na">xmlns=</span><span class="s">"http://maven.apache.org/POM/4.0.0"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span> + <span class="na">xsi:schemaLocation=</span><span class="s">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span><span class="nt">></span> <span class="nt"><modelVersion></span>4.0.0<span class="nt"></modelVersion></span> <span class="nt"><properties></span> <span class="nt"><jclouds.version></span>2.5.0<span class="nt"></jclouds.version></span> @@ -920,10 +869,7 @@ List Containers <span class="nt"><version></span>5.1.25<span class="nt"></version></span> <span class="nt"></dependency></span> <span class="nt"></dependencies></span> -<span class="nt"></project></span> -</code></pre></div> - - +<span class="nt"></project></span></code></pre></figure> <div class="row clearfix">
