Modified: jclouds/site-content/start/compute/index.html URL: http://svn.apache.org/viewvc/jclouds/site-content/start/compute/index.html?rev=1923693&r1=1923692&r2=1923693&view=diff ============================================================================== --- jclouds/site-content/start/compute/index.html (original) +++ jclouds/site-content/start/compute/index.html Mon Feb 10 07:25:53 2025 @@ -149,134 +149,117 @@ <div class="page-header"> <h1>Compute Guide</h1> </div> - <h2>Introduction</h2> - + <h2 id="introduction">Introduction</h2> <p>The jclouds Compute API provides a basic abstraction across Compute APIs such as Amazon EC2 and OpenStack Nova. We also have integrations for popular tools such as Ant and Maven.</p> -<h2>Features</h2> - -<h3>Location Aware API</h3> +<h2 id="features">Features</h2> +<h3 id="location-aware-api">Location Aware API</h3> -<p>Unlike other tools, our compute api doesn't require you to establish multiple connections to clouds who are multi-homed. +<p>Unlike other tools, our compute api doesnât require you to establish multiple connections to clouds who are multi-homed. For example, you can use the same object to access your resources in all regions of EC2. This allows you greater visibility into your resources and provides means to logically tie cross-wan resources together.</p> -<h3>Node Sets</h3> - +<h3 id="node-sets">Node Sets</h3> <p>Using our compute API, you can run multiple nodes as a set regardless of the underlying cloud API. In this way, you can fire up a 20 node cluster and manage it by its group name, as opposed to dealing with each node individually.</p> -<h3>SSH keys</h3> - +<h3 id="ssh-keys">SSH keys</h3> <p>Our compute API natively helps with moving your ssh keys to the node on startup, so that -you don't have to worry about remembering or storing random passwords or keys provided by the service.</p> - -<h3>Run Script</h3> +you donât have to worry about remembering or storing random passwords or keys provided by the service.</p> +<h3 id="run-script">Run Script</h3> <p>Our runScript features provide simple means for executing scripts on the machines in a set. It also includes special exception types that will allow you to handle errors appropriately.</p> -<h3>Stub Provider</h3> - +<h3 id="stub-provider">Stub Provider</h3> <p>As more people are looking at concepts like devops, it follows that infrastructure as code implies testability as a concern. One of our steps to help is the addition of a stub compute provider, which you can join with our in-memory blobstore to test your provisioning instructions before you try them out with your credit card:</p> -<h3>Credential persistence</h3> +<h3 id="credential-persistence">Credential persistence</h3> <p>As of jclouds beta-9, you can now supply a map to persist credentials of your nodes across connections. Using a blobstore-backed map, -this means you can keep track of all of your cloud nodes' credentials in a single place.</p> - -<h3>Supported Providers</h3> +this means you can keep track of all of your cloud nodesâ credentials in a single place.</p> +<h3 id="supported-providers">Supported Providers</h3> <p>See <a href="/reference/providers/#compute">Compute API: Supported Providers</a> for providers that can be used equally in any Compute API tool.</p> -<p><em>Note, that if you use the <code>jclouds-allcompute</code> dependency, your project will have all of the above!</em></p> +<p><em>Note, that if you use the <code class="language-plaintext highlighter-rouge">jclouds-allcompute</code> dependency, your project will have all of the above!</em></p> -<h2>API</h2> - -<h3>Concepts</h3> +<h2 id="api">API</h2> +<h3 id="concepts">Concepts</h3> <p>The Compute API is a portable means of managing nodes in clouds. It can manage nodes as a set and address resources in any cloud without needing separate connections. It also has a Template feature which allows you to search for configurations that match parameters such as CPU count or operating system. Finally, it contains utilities to execute scripts as part of the bootstrap process of your nodes.</p> -<h3>Template</h3> +<h3 id="template">Template</h3> <p>Templates are a way of encapsulating the requirements of your nodes such that similar configurations can be launched in other clouds.</p> <p>A Template consists of the following elements:</p> <ul> -<li>Image - defines which bytes boot your node, and details such as the operating system you wish to run.</li> -<li>Hardware - defines CPU, memory, disk, and supported architecture .</li> -<li>Location - defines the region or datacenter in which your node(s) should run.</li> -<li>Options - defines optional parameters such as inbound ports to open or scripts to execute at boot time.</li> + <li>Image - defines which bytes boot your node, and details such as the operating system you wish to run.</li> + <li>Hardware - defines CPU, memory, disk, and supported architecture .</li> + <li>Location - defines the region or datacenter in which your node(s) should run.</li> + <li>Options - defines optional parameters such as inbound ports to open or scripts to execute at boot time.</li> </ul> - <p>Templates can be created from your service context via a TemplateBuilder. This builder allows you -to specify your requirements with statements such as <code>minCores</code> and <code>imageId</code>.</p> - -<h3>Operating System</h3> +to specify your requirements with statements such as <code class="language-plaintext highlighter-rouge">minCores</code> and <code class="language-plaintext highlighter-rouge">imageId</code>.</p> +<h3 id="operating-system">Operating System</h3> <p>An Image is different from an Operating System. It is really a bunch of state that includes an operating system, software and configuration. It is often versioned independently of the operating system. Before, we lumped together operating system with image, as this is what amazon and some others did. However, this assumes nodes are created from images. This is not the case in OVF-based systems like vCloud, and we really had no clean way to address this before. Operating System as a type works much cleaner and across more systems.</p> -<h3>Hardware</h3> - +<h3 id="hardware">Hardware</h3> <p>We previously had a class called Size which held a combination of size and hardware configuration data. While simple, it limited our ability to address fine grained concerns, as it assumed there is only a single disk, processor, etc. Our new Hardware type is much more robust, while still extremely simple to use. While mounted volume information is read-only at the moment, expect us to add portability over systems like EBS in the near future.</p> -<h3>Usage</h3> +<h3 id="usage">Usage</h3> <p>Using the API is straightforward. You need to create a context to the service you wish to manage, and then act on it. -Here's how to perform common commands.</p> +Hereâs how to perform common commands.</p> -<h3>Open your context and get a service reference</h3> +<h3 id="open-your-context-and-get-a-service-reference">Open your context and get a service reference</h3> <p>Here, you specify the particular service you wish to manage and get a reference to ComputeService.</p> -<div class="highlight"><pre><code class="java"><span class="n">ComputeServiceContext</span> <span class="n">context</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">"trmk-ecloud"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">ComputeServiceContext</span> <span class="n">context</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">"trmk-ecloud"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">user</span><span class="o">,</span> <span class="n">password</span><span class="o">)</span> - <span class="o">.</span><span class="na">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">Log4JLoggingModule</span><span class="o">(),</span> + <span class="o">.</span><span class="na">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="nf">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">Log4JLoggingModule</span><span class="o">(),</span> <span class="k">new</span> <span class="nf">SshjSshClientModule</span><span class="o">()))</span> - <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="n">ComputeServiceContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> - -<span class="n">ComputeService</span> <span class="n">client</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getComputeService</span><span class="o">();</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="nc">ComputeServiceContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -<h3>List the nodes you have in all locations</h3> +<span class="nc">ComputeService</span> <span class="n">client</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getComputeService</span><span class="o">();</span></code></pre></figure> -<p>As mentioned above, this context can operate all of your nodes across the globe. Here's how to list them</p> +<h3 id="list-the-nodes-you-have-in-all-locations">List the nodes you have in all locations</h3> +<p>As mentioned above, this context can operate all of your nodes across the globe. Hereâs how to list them</p> -<div class="highlight"><pre><code class="java"><span class="k">for</span> <span class="o">(</span><span class="n">ComputeMetadata</span> <span class="n">node</span> <span class="o">:</span> <span class="n">client</span><span class="o">.</span><span class="na">listNodes</span><span class="o">())</span> <span class="o">{</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="k">for</span> <span class="o">(</span><span class="nc">ComputeMetadata</span> <span class="n">node</span> <span class="o">:</span> <span class="n">client</span><span class="o">.</span><span class="na">listNodes</span><span class="o">())</span> <span class="o">{</span> <span class="n">node</span><span class="o">.</span><span class="na">getId</span><span class="o">();</span> <span class="c1">// how does jclouds address this in a global scope</span> <span class="n">node</span><span class="o">.</span><span class="na">getProviderId</span><span class="o">();</span> <span class="c1">// how does the provider api address this in a specific scope</span> <span class="n">node</span><span class="o">.</span><span class="na">getName</span><span class="o">();</span> <span class="c1">// if the node is named, what is it?</span> <span class="n">node</span><span class="o">.</span><span class="na">getLocation</span><span class="o">();</span> <span class="c1">// where in the world is the node</span> -<span class="o">}</span> -</code></pre></div> +<span class="o">}</span></code></pre></figure> - -<p>Note that the result is of type <code>ComputeMetadata</code> rather than the more useful <code>NodeMetadata</code>. +<p>Note that the result is of type <code class="language-plaintext highlighter-rouge">ComputeMetadata</code> rather than the more useful <code class="language-plaintext highlighter-rouge">NodeMetadata</code>. This is because many services offer only minimal details on listing. To flesh out the objects you want, call the <em>Get Node Metadata</em> command.</p> -<h3>Get Node Metadata</h3> - +<h3 id="get-node-metadata">Get Node Metadata</h3> <p>Use the <em>Get Node Metadata</em> command to retrieve commonly required information about a node.</p> -<div class="highlight"><pre><code class="java"><span class="n">NodeMetadata</span> <span class="n">metadata</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">getNodeMetadata</span><span class="o">(</span><span class="n">node</span><span class="o">.</span><span class="na">getId</span><span class="o">());</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">NodeMetadata</span> <span class="n">metadata</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">getNodeMetadata</span><span class="o">(</span><span class="n">node</span><span class="o">.</span><span class="na">getId</span><span class="o">());</span> <span class="n">metadata</span><span class="o">.</span><span class="na">getId</span><span class="o">();</span> <span class="n">metadata</span><span class="o">.</span><span class="na">getProviderId</span><span class="o">();</span> <span class="n">metadata</span><span class="o">.</span><span class="na">getLocation</span><span class="o">();</span> @@ -288,11 +271,9 @@ call the <em>Get Node Metadata</em> comm <span class="n">metadata</span><span class="o">.</span><span class="na">getState</span><span class="o">();</span> <span class="n">metadata</span><span class="o">.</span><span class="na">getPrivateAddresses</span><span class="o">();</span> <span class="n">metadata</span><span class="o">.</span><span class="na">getPublicAddresses</span><span class="o">();</span> -<span class="n">metadata</span><span class="o">.</span><span class="na">getCredentials</span><span class="o">();</span><span class="c1">// only available after createNodesInGroup, identifies login user/credential</span> -</code></pre></div> +<span class="n">metadata</span><span class="o">.</span><span class="na">getCredentials</span><span class="o">();</span><span class="c1">// only available after createNodesInGroup, identifies login user/credential</span></code></pre></figure> - -<h3>List Assignable Locations</h3> +<h3 id="list-assignable-locations">List Assignable Locations</h3> <p>The <em>List Assignable Location</em> command returns all the valid locations for nodes. The list locations command returns all the valid locations for nodes. @@ -300,12 +281,9 @@ A location has a scope, which is typical like eu-west, where a zone is similar to a datacenter. If a location has a parent, that implies it is within that location. For example a location can be a rack, whose parent is likely to be a zone.</p> -<div class="highlight"><pre><code class="java"><span class="n">Set</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">Location</span><span class="o">></span> <span class="n">listAssignableLocations</span><span class="o">();</span> -</code></pre></div> - - -<h3>List Hardware Profiles</h3> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">Set</span><span class="o"><?</span> <span class="kd">extends</span> <span class="nc">Location</span><span class="o">></span> <span class="nf">listAssignableLocations</span><span class="o">();</span></code></pre></figure> +<h3 id="list-hardware-profiles">List Hardware Profiles</h3> <p>The <em>List Hardware Profiles</em> command returns settings including virtual CPU count, memory, and disks.</p> <p>CPU count is not a portable quantity across clouds, as they are The list hardware profiles @@ -313,157 +291,125 @@ command shows you the options including a portable quantity across clouds, as they are measured differently. However, it is a good indicator of relative speed within a cloud. memory is measured in megabytes and disks in gigabytes.</p> -<div class="highlight"><pre><code class="java"><span class="n">Set</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">Hardware</span><span class="o">></span> <span class="n">listHardwareProfiles</span><span class="o">();</span> -</code></pre></div> - - -<h3>List Images</h3> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">Set</span><span class="o"><?</span> <span class="kd">extends</span> <span class="nc">Hardware</span><span class="o">></span> <span class="nf">listHardwareProfiles</span><span class="o">();</span></code></pre></figure> +<h3 id="list-images">List Images</h3> <p>The <em>List Images</em> command define the operating system and metadata related to a node. In some clouds, images are bound to a specific region, and their identifiers are different across regions. For this reason, you should consider matching image requirements like operating system family with TemplateBuilder as opposed to choosing an image explicitly.</p> -<div class="highlight"><pre><code class="java"> <span class="n">Set</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">Image</span><span class="o">></span> <span class="n">listImages</span><span class="o">();</span> -</code></pre></div> +<figure class="highlight"><pre><code class="language-java" data-lang="java"> <span class="nc">Set</span><span class="o"><?</span> <span class="kd">extends</span> <span class="nc">Image</span><span class="o">></span> <span class="nf">listImages</span><span class="o">();</span></code></pre></figure> - -<h3>Create Nodes with Group</h3> +<h3 id="create-nodes-with-group">Create Nodes with Group</h3> <p>The compute API treats nodes as a group based on a group you specify. Using this group, you can choose to operate on one or many nodes as a logical unit without regard to the implementation details of the cloud.</p> -<p><code>createNodesInGroup</code> returns all of the nodes the API was able to launch into in a running state with port 22 open. +<p><code class="language-plaintext highlighter-rouge">createNodesInGroup</code> returns all of the nodes the API was able to launch into in a running state with port 22 open. If resources such as security groups are needed, they will be reused or created for you. -Here's an example of how to start a nodeSet:</p> - -<div class="highlight"><pre><code class="java"><span class="n">NodeSet</span> <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="n">template</span><span class="o">);</span> -</code></pre></div> +Hereâs an example of how to start a nodeSet:</p> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">NodeSet</span> <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="n">template</span><span class="o">);</span></code></pre></figure> <p>The set that is returned will include credentials you can use to ssh into the nodes. -The "credential" part of the credentials is either a password or a private key. You have to inspect the value to determine this. -Make sure you look also at the "identity" part of the credentials object so that you don't attempt to login as the wrong user.</p> - -<div class="highlight"><pre><code class="java"><span class="k">if</span> <span class="o">(</span><span class="n">node</span><span class="o">.</span><span class="na">getCredentials</span><span class="o">().</span><span class="na">credential</span><span class="o">.</span><span class="na">startsWith</span><span class="o">(</span><span class="s">"-----BEGIN RSA PRIVATE KEY-----"</span><span class="o">))</span> - <span class="c1">// it is a private key, not a password.</span> -</code></pre></div> +The âcredentialâ part of the credentials is either a password or a private key. You have to inspect the value to determine this. +Make sure you look also at the âidentityâ part of the credentials object so that you donât attempt to login as the wrong user.</p> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="k">if</span> <span class="o">(</span><span class="n">node</span><span class="o">.</span><span class="na">getCredentials</span><span class="o">().</span><span class="na">credential</span><span class="o">.</span><span class="na">startsWith</span><span class="o">(</span><span class="s">"-----BEGIN RSA PRIVATE KEY-----"</span><span class="o">))</span> + <span class="c1">// it is a private key, not a password.</span></code></pre></figure> <p>Note: If all you want to do is execute a script at bootup, you should consider use of the runScript option.</p> -<h3>Predicate Commands</h3> - -<p>Commands ending in <code>Matching</code> allow you to decide which subset of nodes you want to affect. +<h3 id="predicate-commands">Predicate Commands</h3> +<p>Commands ending in <code class="language-plaintext highlighter-rouge">Matching</code> allow you to decide which subset of nodes you want to affect. All predicate commands are run in parallel for highest efficiency.</p> -<h4>Example Predicates</h4> +<h4 id="example-predicates">Example Predicates</h4> -<p>There are a number of predicates in the <code>NodePredicates</code> class. Here are a few combinations that you may find interesting:</p> +<p>There are a number of predicates in the <code class="language-plaintext highlighter-rouge">NodePredicates</code> class. Here are a few combinations that you may find interesting:</p> <ul> -<li><code>runningInGroup(group)</code> - affect any nodes that are already running, refined to a specific group</li> + <li><code class="language-plaintext highlighter-rouge">runningInGroup(group)</code> - affect any nodes that are already running, refined to a specific group</li> </ul> - -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.</span><span class="na">runningInGroup</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.</span><span class="na">runningInGroup</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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">RunScriptOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">overrideCredentialsWith</span><span class="o">;</span> -<span class="n">Map</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">NodeMetadata</span><span class="o">,</span> <span class="n">ExecResponse</span><span class="o">></span> <span class="n">responses</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">runScriptOnNodesMatching</span><span class="o">(</span><span class="n">runningInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">),</span> <span class="n">script</span><span class="o">,</span> - <span class="n">overrideCredentialsWith</span><span class="o">(</span><span class="n">creds</span><span class="o">));</span> -</code></pre></div> - +<span class="nc">Map</span><span class="o"><?</span> <span class="kd">extends</span> <span class="nc">NodeMetadata</span><span class="o">,</span> <span class="nc">ExecResponse</span><span class="o">></span> <span class="n">responses</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">runScriptOnNodesMatching</span><span class="o">(</span><span class="n">runningInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">),</span> <span class="n">script</span><span class="o">,</span> + <span class="n">overrideCredentialsWith</span><span class="o">(</span><span class="n">creds</span><span class="o">));</span></code></pre></figure> <ul> -<li><code>and(withGroup(group), not(TERMINATED))</code> match everything that has a group, but not destroyed.</li> + <li><code class="language-plaintext highlighter-rouge">and(withGroup(group), not(TERMINATED))</code> match everything that has a group, but not destroyed.</li> </ul> - -<div class="highlight"><pre><code class="java"><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">base</span><span class="o">.</span><span class="na">Predicates</span><span class="o">.*;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">base</span><span class="o">.</span><span class="na">Predicates</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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.*;</span> <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">collect</span><span class="o">.</span><span class="na">Iterables</span><span class="o">.*;</span> -<span class="n">Iterable</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">NodeMetadata</span><span class="o">></span> <span class="n">billedNodes</span> <span class="o">=</span> <span class="n">filter</span><span class="o">(</span><span class="n">client</span><span class="o">.</span><span class="na">listNodesDetailsMatching</span><span class="o">(</span><span class="n">all</span><span class="o">()),</span> <span class="n">and</span><span class="o">(</span><span class="n">withGroup</span><span class="o">(</span><span class="n">group</span><span class="o">),</span> <span class="n">not</span><span class="o">(</span><span class="n">TERMINATED</span><span class="o">))));</span> -</code></pre></div> - +<span class="nc">Iterable</span><span class="o"><?</span> <span class="kd">extends</span> <span class="nc">NodeMetadata</span><span class="o">></span> <span class="n">billedNodes</span> <span class="o">=</span> <span class="n">filter</span><span class="o">(</span><span class="n">client</span><span class="o">.</span><span class="na">listNodesDetailsMatching</span><span class="o">(</span><span class="n">all</span><span class="o">()),</span> <span class="n">and</span><span class="o">(</span><span class="n">withGroup</span><span class="o">(</span><span class="n">group</span><span class="o">),</span> <span class="n">not</span><span class="o">(</span><span class="no">TERMINATED</span><span class="o">))));</span></code></pre></figure> -<h4>Commands</h4> +<h4 id="commands">Commands</h4> -<h5>Destroy Nodes Matching Predicate</h5> +<h5 id="destroy-nodes-matching-predicate">Destroy Nodes Matching Predicate</h5> <p>nodes matching the filter are destroyed as a logical set. -When the last node in a set is destroyed, any indirect resources it uses, such as keypairs, are also destroyed. Ex. here's how to destroy all nodes with a specific group:</p> - -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.*;</span> - <span class="n">client</span><span class="o">.</span><span class="na">destroyNodesMatching</span><span class="o">(</span><span class="n">withGroup</span><span class="o">(</span><span class="n">group</span><span class="o">));</span> -</code></pre></div> - +When the last node in a set is destroyed, any indirect resources it uses, such as keypairs, are also destroyed. Ex. hereâs how to destroy all nodes with a specific group:</p> -<h5>Reboot Nodes Matching Predicate</h5> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.*;</span> + <span class="n">client</span><span class="o">.</span><span class="na">destroyNodesMatching</span><span class="o">(</span><span class="n">withGroup</span><span class="o">(</span><span class="n">group</span><span class="o">));</span></code></pre></figure> -<p>Ex. here's how to reboot all nodes with a specific group:</p> +<h5 id="reboot-nodes-matching-predicate">Reboot Nodes Matching Predicate</h5> +<p>Ex. hereâs how to reboot all nodes with a specific group:</p> -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.*;</span> - <span class="n">client</span><span class="o">.</span><span class="na">rebootNodesMatching</span><span class="o">(</span><span class="n">withGroup</span><span class="o">(</span><span class="n">group</span><span class="o">));</span> -</code></pre></div> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.*;</span> + <span class="n">client</span><span class="o">.</span><span class="na">rebootNodesMatching</span><span class="o">(</span><span class="n">withGroup</span><span class="o">(</span><span class="n">group</span><span class="o">));</span></code></pre></figure> +<h5 id="run-script-on-nodes-matching-predicate">Run Script on Nodes Matching Predicate</h5> +<p>Hereâs how to run a script on all nodes as root with the credentials that they were created with.</p> -<h5>Run Script on Nodes Matching Predicate</h5> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.</span><span class="na">runningInGroup</span><span class="o">;</span> -<p>Here's how to run a script on all nodes as root with the credentials that they were created with.</p> +<span class="n">responses</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">runScriptOnNodesMatching</span><span class="o">(</span><span class="n">runningInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">),</span> <span class="n">script</span><span class="o">);</span></code></pre></figure> -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.</span><span class="na">runningInGroup</span><span class="o">;</span> - -<span class="n">responses</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">runScriptOnNodesMatching</span><span class="o">(</span><span class="n">runningInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">),</span> <span class="n">script</span><span class="o">);</span> -</code></pre></div> - - -<p>If you created your nodes using the <code>authorizePublicKey</code> option, then you are probably interested in using that again here. +<p>If you created your nodes using the <code class="language-plaintext highlighter-rouge">authorizePublicKey</code> option, then you are probably interested in using that again here. However, you should always look up the login user associated with the host, as it may not be root.</p> <p><em>Note</em> if you think this should change, please file an issue. For example, we could in the future create a sudo-able login user on the nodes, simplifying this process.</p> -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.</span><span class="na">runningInGroup</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">predicates</span><span class="o">.</span><span class="na">NodePredicates</span><span class="o">.</span><span class="na">runningInGroup</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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">RunScriptOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">overrideCredentialsWith</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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">authorizePublicKey</span><span class="o">;</span> <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="n">authorizePublicKey</span><span class="o">(</span><span class="n">myKey</span><span class="o">));</span> -<span class="n">Credentials</span> <span class="n">good</span> <span class="o">=</span> <span class="n">nodes</span><span class="o">.</span><span class="na">iterator</span><span class="o">().</span><span class="na">next</span><span class="o">().</span><span class="na">getCredentials</span><span class="o">();</span> +<span class="nc">Credentials</span> <span class="n">good</span> <span class="o">=</span> <span class="n">nodes</span><span class="o">.</span><span class="na">iterator</span><span class="o">().</span><span class="na">next</span><span class="o">().</span><span class="na">getCredentials</span><span class="o">();</span> <span class="c1">// save this off</span> <span class="n">loginUser</span> <span class="o">=</span> <span class="n">good</span><span class="o">.</span><span class="na">identity</span><span class="o">;</span> <span class="c1">// later, you will use your key with the default login user</span> <span class="n">responses</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">runScriptOnNodesMatching</span><span class="o">(</span><span class="n">runningInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">),</span> <span class="n">script</span><span class="o">,</span> - <span class="n">overrideCredentialsWith</span><span class="o">(</span><span class="k">new</span> <span class="n">Credentials</span><span class="o">(</span><span class="n">loginUser</span><span class="o">,</span> <span class="n">myKey</span><span class="o">));</span> -</code></pre></div> - + <span class="n">overrideCredentialsWith</span><span class="o">(</span><span class="k">new</span> <span class="nc">Credentials</span><span class="o">(</span><span class="n">loginUser</span><span class="o">,</span> <span class="n">myKey</span><span class="o">));</span></code></pre></figure> -<h3>Individual Node Commands</h3> +<h3 id="individual-node-commands">Individual Node Commands</h3> +<p>Individual commands are executed against a specific nodeâs <code class="language-plaintext highlighter-rouge">id</code> (not <code class="language-plaintext highlighter-rouge">providerId</code>!). +You can save time if you know you are only affecting one node, and donât need jcloudsâ help finding it.</p> -<p>Individual commands are executed against a specific node's <code>id</code> (not <code>providerId</code>!). -You can save time if you know you are only affecting one node, and don't need jclouds' help finding it.</p> +<h4 id="commands-1">Commands</h4> +<h5 id="get-node-metadata-1">Get Node Metadata</h5> -<h4>Commands</h4> +<p>If you save a nodeâs id to disk, you can inflate it later without querying by using the <code class="language-plaintext highlighter-rouge">getNodeMetadata</code> command.</p> -<h5>Get Node Metadata</h5> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">NodeMetadata</span> <span class="n">metadata</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">getNodeMetadata</span><span class="o">(</span><span class="n">savedId</span><span class="o">);</span></code></pre></figure> -<p>If you save a node's id to disk, you can inflate it later without querying by using the <code>getNodeMetadata</code> command.</p> +<h5 id="destroy-node">Destroy Node</h5> +<h5 id="reboot-node">Reboot Node</h5> -<div class="highlight"><pre><code class="java"><span class="n">NodeMetadata</span> <span class="n">metadata</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">getNodeMetadata</span><span class="o">(</span><span class="n">savedId</span><span class="o">);</span> -</code></pre></div> +<h3 id="logging">Logging</h3> +<p>You can now see status of compute commands by enabling at least DEBUG on the log category: âjclouds.computeâ. Here is example output:</p> - -<h5>Destroy Node</h5> - -<h5>Reboot Node</h5> - -<h3>Logging</h3> - -<p>You can now see status of compute commands by enabling at least DEBUG on the log category: "jclouds.compute". Here is example output:</p> - -<div class="highlight"><pre><code class="text">2010-02-06 09:43:54,985 DEBUG [jclouds.compute] (main) >> providing images -2010-02-06 09:44:01,186 DEBUG [jclouds.compute] (main) << didn't match os(folding) +<figure class="highlight"><pre><code class="language-text" data-lang="text">2010-02-06 09:43:54,985 DEBUG [jclouds.compute] (main) >> providing images +2010-02-06 09:44:01,186 DEBUG [jclouds.compute] (main) << didn't match os(folding) 2010-02-06 09:44:01,642 DEBUG [jclouds.compute] (main) << images(614) 2010-02-06 09:44:01,672 DEBUG [jclouds.compute] (main) >> terminating servers by group(ec2) 2010-02-06 09:44:03,314 DEBUG [jclouds.compute] (main) << destroyed @@ -478,288 +424,247 @@ You can save time if you know you are on 2010-02-06 09:44:07,243 DEBUG [jclouds.compute] (main) >> authorizing securityGroup region(us-east-1) name(ec2) port(22) 2010-02-06 09:44:07,824 DEBUG [jclouds.compute] (main) << authorized securityGroup(ec2) 2010-02-06 09:44:07,828 DEBUG [jclouds.compute] (main) >> running 2 instance region(us-east-1) zone(null) ami(ami-87a243ee) type(m1.large) keyPair(ec2) securityGroup(ec2) -2010-02-06 09:44:09,239 DEBUG [jclouds.compute] (main) << started instances(i-7c180614,i-7e180616) -</code></pre></div> - +2010-02-06 09:44:09,239 DEBUG [jclouds.compute] (main) << started instances(i-7c180614,i-7e180616)</code></pre></figure> <p>If you are using the Log4JLoggingModule, here is an example log4j.xml stanza you can use to enable compute logging:</p> -<div class="highlight"><pre><code class="xml"><span class="nt"><appender</span> <span class="na">name=</span><span class="s">"COMPUTEFILE"</span> <span class="na">class=</span><span class="s">"org.apache.log4j.DailyRollingFileAppender"</span><span class="nt">></span> - <span class="nt"><param</span> <span class="na">name=</span><span class="s">"File"</span> <span class="na">value=</span><span class="s">"logs/jclouds-compute.log"</span> <span class="nt">/></span> - <span class="nt"><param</span> <span class="na">name=</span><span class="s">"Append"</span> <span class="na">value=</span><span class="s">"true"</span> <span class="nt">/></span> - <span class="nt"><param</span> <span class="na">name=</span><span class="s">"DatePattern"</span> <span class="na">value=</span><span class="s">"'.'yyyy-MM-dd"</span> <span class="nt">/></span> - <span class="nt"><param</span> <span class="na">name=</span><span class="s">"Threshold"</span> <span class="na">value=</span><span class="s">"TRACE"</span> <span class="nt">/></span> - <span class="nt"><layout</span> <span class="na">class=</span><span class="s">"org.apache.log4j.PatternLayout"</span><span class="nt">></span> - <span class="nt"><param</span> <span class="na">name=</span><span class="s">"ConversionPattern"</span> <span class="na">value=</span><span class="s">"%d %-5p [%c] (%t) %m%n"</span> <span class="nt">/></span> +<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt"><appender</span> <span class="na">name=</span><span class="s">"COMPUTEFILE"</span> <span class="na">class=</span><span class="s">"org.apache.log4j.DailyRollingFileAppender"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"File"</span> <span class="na">value=</span><span class="s">"logs/jclouds-compute.log"</span> <span class="nt">/></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"Append"</span> <span class="na">value=</span><span class="s">"true"</span> <span class="nt">/></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"DatePattern"</span> <span class="na">value=</span><span class="s">"'.'yyyy-MM-dd"</span> <span class="nt">/></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"Threshold"</span> <span class="na">value=</span><span class="s">"TRACE"</span> <span class="nt">/></span> + <span class="nt"><layout</span> <span class="na">class=</span><span class="s">"org.apache.log4j.PatternLayout"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"ConversionPattern"</span> <span class="na">value=</span><span class="s">"%d %-5p [%c] (%t) %m%n"</span> <span class="nt">/></span> <span class="nt"></layout></span> <span class="nt"></appender></span> -<span class="nt"><appender</span> <span class="na">name=</span><span class="s">"ASYNCCOMPUTE"</span> <span class="na">class=</span><span class="s">"org.apache.log4j.AsyncAppender"</span><span class="nt">></span> - <span class="nt"><appender-ref</span> <span class="na">ref=</span><span class="s">"COMPUTEFILE"</span> <span class="nt">/></span> +<span class="nt"><appender</span> <span class="na">name=</span><span class="s">"ASYNCCOMPUTE"</span> <span class="na">class=</span><span class="s">"org.apache.log4j.AsyncAppender"</span><span class="nt">></span> + <span class="nt"><appender-ref</span> <span class="na">ref=</span><span class="s">"COMPUTEFILE"</span> <span class="nt">/></span> <span class="nt"></appender></span> -<span class="nt"><category</span> <span class="na">name=</span><span class="s">"jclouds.compute"</span><span class="nt">></span> - <span class="nt"><priority</span> <span class="na">value=</span><span class="s">"TRACE"</span> <span class="nt">/></span> - <span class="nt"><appender-ref</span> <span class="na">ref=</span><span class="s">"ASYNCCOMPUTE"</span> <span class="nt">/></span> -<span class="nt"></category></span> -</code></pre></div> - - -<h2>Advanced Usage</h2> +<span class="nt"><category</span> <span class="na">name=</span><span class="s">"jclouds.compute"</span><span class="nt">></span> + <span class="nt"><priority</span> <span class="na">value=</span><span class="s">"TRACE"</span> <span class="nt">/></span> + <span class="nt"><appender-ref</span> <span class="na">ref=</span><span class="s">"ASYNCCOMPUTE"</span> <span class="nt">/></span> +<span class="nt"></category></span></code></pre></figure> +<h2 id="advanced-usage">Advanced Usage</h2> <p>Almost all advanced features require ssh. You will likely also want to use log4j and our -enterprise configuration module. Here's how to configure these.</p> +enterprise configuration module. Hereâs how to configure these.</p> -<div class="highlight"><pre><code class="java"><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">Set</span><span class="o"><</span><span class="n">Module</span><span class="o">></span> <span class="n">wiring</span> <span class="o">=</span> <span class="n">ImmutableSet</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">JschSshClientModule</span><span class="o">(),</span> <span class="k">new</span> <span class="n">Log4JLoggingModule</span><span class="o">(),</span> <span class="k">new</span> <span class="n">EnterpriseConfigurationModule</span><span class="o">());</span> -<span class="n">ComputeServiceContext</span> <span class="n">context</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">"trmk-ecloud"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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="nc">Set</span><span class="o"><</span><span class="nc">Module</span><span class="o">></span> <span class="n">wiring</span> <span class="o">=</span> <span class="nc">ImmutableSet</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">JschSshClientModule</span><span class="o">(),</span> <span class="k">new</span> <span class="nc">Log4JLoggingModule</span><span class="o">(),</span> <span class="k">new</span> <span class="nc">EnterpriseConfigurationModule</span><span class="o">());</span> +<span class="nc">ComputeServiceContext</span> <span class="n">context</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">"trmk-ecloud"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">user</span><span class="o">,</span> <span class="n">password</span><span class="o">)</span> <span class="o">.</span><span class="na">modules</span><span class="o">(</span><span class="n">wiring</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">buildView</span><span class="o">(</span><span class="n">ComputeServiceContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="nc">ComputeServiceContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>For mode information, check out the [[jcloudsAPI]] wiki page.</p> -<h3>Uploading binary files to the node</h3> +<h3 id="uploading-binary-files-to-the-node">Uploading binary files to the node</h3> -<p>You'll need to get an ssh client for the node in order to upload files in the current version of jclouds.</p> +<p>Youâll need to get an ssh client for the node in order to upload files in the current version of jclouds.</p> <p>if you just created the node, it will have login credentials set in node.getCredentials(). Ask for an ssh client based on the node.</p> -<div class="highlight"><pre><code class="java"><span class="n">client</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">utils</span><span class="o">().</span><span class="na">sshForNode</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">node</span><span class="o">);</span> -</code></pre></div> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">client</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">utils</span><span class="o">().</span><span class="na">sshForNode</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">node</span><span class="o">);</span></code></pre></figure> +<p>if the nodeâs credentials arenât set, youâll have to assign them first.</p> -<p>if the node's credentials aren't set, you'll have to assign them first.</p> - -<div class="highlight"><pre><code class="java"><span class="n">client</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">utils</span><span class="o">().</span><span class="na">sshForNode</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">NodeMetadataBuilder</span><span class="o">.</span><span class="na">fromNodeMetadata</span><span class="o">(</span><span class="n">node</span><span class="o">).</span><span class="na">credentials</span><span class="o">(</span> - <span class="k">new</span> <span class="nf">Credentials</span><span class="o">(</span><span class="s">"adrian"</span><span class="o">,</span><span class="n">sshKeyInString</span><span class="o">)).</span><span class="na">build</span><span class="o">());</span> -</code></pre></div> - +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">client</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">utils</span><span class="o">().</span><span class="na">sshForNode</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="nc">NodeMetadataBuilder</span><span class="o">.</span><span class="na">fromNodeMetadata</span><span class="o">(</span><span class="n">node</span><span class="o">).</span><span class="na">credentials</span><span class="o">(</span> + <span class="k">new</span> <span class="nf">Credentials</span><span class="o">(</span><span class="s">"adrian"</span><span class="o">,</span><span class="n">sshKeyInString</span><span class="o">)).</span><span class="na">build</span><span class="o">());</span></code></pre></figure> <p>Once you have the client, you can push files to it</p> -<div class="highlight"><pre><code class="java"><span class="n">client</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"/path/to/file"</span><span class="o">,</span> <span class="n">Payloads</span><span class="o">.</span><span class="na">newFilePayload</span><span class="o">(</span><span class="n">contents</span><span class="o">));</span> -</code></pre></div> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">client</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"/path/to/file"</span><span class="o">,</span> <span class="nc">Payloads</span><span class="o">.</span><span class="na">newFilePayload</span><span class="o">(</span><span class="n">contents</span><span class="o">));</span></code></pre></figure> +<p>Hereâs a full example:</p> -<p>Here's a full example:</p> - -<div class="highlight"><pre><code class="java"> <span class="n">SshClient</span> <span class="n">ssh</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">utils</span><span class="o">().</span><span class="na">sshForNode</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">node</span><span class="o">);</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"> <span class="nc">SshClient</span> <span class="n">ssh</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">utils</span><span class="o">().</span><span class="na">sshForNode</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">node</span><span class="o">);</span> <span class="k">try</span> <span class="o">{</span> <span class="n">ssh</span><span class="o">.</span><span class="na">connect</span><span class="o">();</span> - <span class="n">ssh</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"/path/to/file"</span><span class="o">,</span> -<span class="n">Payloads</span><span class="o">.</span><span class="na">newPayload</span><span class="o">(</span><span class="n">fileOrInputStreamOrBytesOrString</span><span class="o">));</span> + <span class="n">ssh</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="s">"/path/to/file"</span><span class="o">,</span> +<span class="nc">Payloads</span><span class="o">.</span><span class="na">newPayload</span><span class="o">(</span><span class="n">fileOrInputStreamOrBytesOrString</span><span class="o">));</span> <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span> <span class="k">if</span> <span class="o">(</span><span class="n">ssh</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="n">ssh</span><span class="o">.</span><span class="na">disconnect</span><span class="o">();</span> - <span class="o">}</span> -</code></pre></div> - + <span class="o">}</span></code></pre></figure> -<h3>Selecting a correct package manager</h3> +<h3 id="selecting-a-correct-package-manager">Selecting a correct package manager</h3> -<p>Below, you'll see how you can consolidate bootstrap instructions when empowered with an operating system type. - No more listing the dozen flavors of compatible unix's when all you're really concerned about is the package manager:</p> +<p>Below, youâll see how you can consolidate bootstrap instructions when empowered with an operating system type. + No more listing the dozen flavors of compatible unixâs when all youâre really concerned about is the package manager:</p> -<div class="highlight"><pre><code class="java"><span class="k">if</span> <span class="o">(</span><span class="n">OperatingSystemPredicates</span><span class="o">.</span><span class="na">supportsApt</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">os</span><span class="o">))</span> - <span class="k">return</span> <span class="n">RunScriptData</span><span class="o">.</span><span class="na">APT_RUN_SCRIPT</span><span class="o">;</span> -<span class="k">else</span> <span class="nf">if</span> <span class="o">(</span><span class="n">OperatingSystemPredicates</span><span class="o">.</span><span class="na">supportsYum</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">os</span><span class="o">))</span> - <span class="k">return</span> <span class="n">RunScriptData</span><span class="o">.</span><span class="na">YUM_RUN_SCRIPT</span> -<span class="k">else</span> <span class="nf">if</span> <span class="o">(</span><span class="n">OperatingSystemPredicates</span><span class="o">.</span><span class="na">supportsZypper</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">os</span><span class="o">))</span> - <span class="k">return</span> <span class="n">RunScriptData</span><span class="o">.</span><span class="na">ZYPPER_RUN_SCRIPT</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="k">if</span> <span class="o">(</span><span class="nc">OperatingSystemPredicates</span><span class="o">.</span><span class="na">supportsApt</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">os</span><span class="o">))</span> + <span class="k">return</span> <span class="nc">RunScriptData</span><span class="o">.</span><span class="na">APT_RUN_SCRIPT</span><span class="o">;</span> +<span class="k">else</span> <span class="nf">if</span> <span class="o">(</span><span class="nc">OperatingSystemPredicates</span><span class="o">.</span><span class="na">supportsYum</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">os</span><span class="o">))</span> + <span class="k">return</span> <span class="nc">RunScriptData</span><span class="o">.</span><span class="na">YUM_RUN_SCRIPT</span> +<span class="k">else</span> <span class="nf">if</span> <span class="o">(</span><span class="nc">OperatingSystemPredicates</span><span class="o">.</span><span class="na">supportsZypper</span><span class="o">().</span><span class="na">apply</span><span class="o">(</span><span class="n">os</span><span class="o">))</span> + <span class="k">return</span> <span class="nc">RunScriptData</span><span class="o">.</span><span class="na">ZYPPER_RUN_SCRIPT</span><span class="o">;</span> <span class="k">else</span> - <span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalArgumentException</span><span class="o">(</span><span class="s">"don't know how to handle"</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="na">toString</span><span class="o">());</span> -</code></pre></div> - - -<h3>Opening ports</h3> + <span class="k">throw</span> <span class="k">new</span> <span class="nf">IllegalArgumentException</span><span class="o">(</span><span class="s">"don't know how to handle"</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="na">toString</span><span class="o">());</span></code></pre></figure> +<h3 id="opening-ports">Opening ports</h3> <p>Unless you specify otherwise, only access to public IP on port 22 is explicitly configured. -In clouds such as hosting.com and Rackspace, this doesn't matter, as all services are available by default. +In clouds such as hosting.com and Rackspace, this doesnât matter, as all services are available by default. However, in clouds like Terremark and EC2, you will want to open at least 1 additional port most of the time. -Here's how:</p> +Hereâs how:</p> -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">inboundPorts</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">inboundPorts</span><span class="o">;</span> <span class="o">...</span> - <span class="n">Template</span> <span class="n">template</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">templateBuilder</span><span class="o">().</span><span class="na">options</span><span class="o">(</span><span class="n">inboundPorts</span><span class="o">(</span><span class="mi">22</span><span class="o">,</span> <span class="mi">8080</span><span class="o">)).</span><span class="na">build</span><span class="o">();</span> + <span class="nc">Template</span> <span class="n">template</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">templateBuilder</span><span class="o">().</span><span class="na">options</span><span class="o">(</span><span class="n">inboundPorts</span><span class="o">(</span><span class="mi">22</span><span class="o">,</span> <span class="mi">8080</span><span class="o">)).</span><span class="na">build</span><span class="o">();</span> <span class="c1">// start 2 nodes</span> - <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="n">template</span><span class="o">);</span> -</code></pre></div> - - -<h3>Template Matching</h3> + <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="n">template</span><span class="o">);</span></code></pre></figure> -<h4>Matching an operating system version</h4> +<h3 id="template-matching">Template Matching</h3> -<div class="highlight"><pre><code class="java"><span class="n">template</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">templateBuilder</span><span class="o">().</span><span class="na">hardwareId</span><span class="o">(</span><span class="n">InstanceType</span><span class="o">.</span><span class="na">M1_SMALL</span><span class="o">)</span> - <span class="o">.</span><span class="na">osVersionMatches</span><span class="o">(</span><span class="s">"10.04"</span><span class="o">).</span><span class="na">imageDescriptionMatches</span><span class="o">(</span><span class="s">"ubuntu-images"</span><span class="o">).</span><span class="na">osFamily</span><span class="o">(</span><span class="n">OsFamily</span><span class="o">.</span><span class="na">UBUNTU</span><span class="o">).</span><span class="na">build</span><span class="o">();</span> -</code></pre></div> +<h4 id="matching-an-operating-system-version">Matching an operating system version</h4> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">template</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">templateBuilder</span><span class="o">().</span><span class="na">hardwareId</span><span class="o">(</span><span class="nc">InstanceType</span><span class="o">.</span><span class="na">M1_SMALL</span><span class="o">)</span> + <span class="o">.</span><span class="na">osVersionMatches</span><span class="o">(</span><span class="s">"10.04"</span><span class="o">).</span><span class="na">imageDescriptionMatches</span><span class="o">(</span><span class="s">"ubuntu-images"</span><span class="o">).</span><span class="na">osFamily</span><span class="o">(</span><span class="nc">OsFamily</span><span class="o">.</span><span class="na">UBUNTU</span><span class="o">).</span><span class="na">build</span><span class="o">();</span></code></pre></figure> -<h3>Authorizing your RSA SSH Public Key</h3> +<h3 id="authorizing-your-rsa-ssh-public-key">Authorizing your RSA SSH Public Key</h3> <p>The compute API supports authorizing a public key on a node or node set. This allows you to use a single credential across the entire set of nodes. Note that this does not change the private key of the node. -If you are interested in changing the private key, look at the <code>installPrivateKey</code> option.</p> +If you are interested in changing the private key, look at the <code class="language-plaintext highlighter-rouge">installPrivateKey</code> option.</p> -<p>In order to use this feature, you must generate or load your RSA public key into a String. Set the option <code>authorizePublicKey</code> to this value. Note that if you have done this correctly, your key will start with <code>ssh-rsa</code>.</p> +<p>In order to use this feature, you must generate or load your RSA public key into a String. Set the option <code class="language-plaintext highlighter-rouge">authorizePublicKey</code> to this value. Note that if you have done this correctly, your key will start with <code class="language-plaintext highlighter-rouge">ssh-rsa</code>.</p> <p>Ex.</p> -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">authorizePublicKey</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">authorizePublicKey</span><span class="o">;</span> <span class="o">...</span> - <span class="n">Template</span> <span class="n">template</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">templateBuilder</span><span class="o">().</span><span class="na">options</span><span class="o">(</span><span class="n">authorizePublicKey</span><span class="o">(</span><span class="n">Payloads</span><span class="o">.</span><span class="na">newPayload</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">"/home/me/.ssh/id_rsa.pub"</span><span class="o">)).</span><span class="na">build</span><span class="o">();</span> + <span class="nc">Template</span> <span class="n">template</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">templateBuilder</span><span class="o">().</span><span class="na">options</span><span class="o">(</span><span class="n">authorizePublicKey</span><span class="o">(</span><span class="nc">Payloads</span><span class="o">.</span><span class="na">newPayload</span><span class="o">(</span><span class="k">new</span> <span class="nc">File</span><span class="o">(</span><span class="s">"/home/me/.ssh/id_rsa.pub"</span><span class="o">)).</span><span class="na">build</span><span class="o">();</span> <span class="c1">// start 10 nodes</span> - <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="n">template</span><span class="o">);</span> -</code></pre></div> - + <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="n">template</span><span class="o">);</span></code></pre></figure> <p>Note that SSH must be configured for this feature to work.</p> -<p>To install an SSH private key for a different user, override the credentials with the <code>overrideCredentialsWith</code> method.</p> +<p>To install an SSH private key for a different user, override the credentials with the <code class="language-plaintext highlighter-rouge">overrideCredentialsWith</code> method.</p> -<h3>Installing your RSA SSH Private Key</h3> +<h3 id="installing-your-rsa-ssh-private-key">Installing your RSA SSH Private Key</h3> -<p>The compute API supports replacing the node's private key with one you specify. +<p>The compute API supports replacing the nodeâs private key with one you specify. This is different than authorizing your public key. The private key determines the identity of root on your machine so that outgoing SSH can be authorized. You can use this feature alongside authorizing RSA to establish an SSH mesh. An SSH mesh can be used to manage tools such as Hadoop.</p> <p>In order to use this feature, you must generate or load your RSA key into a String. Set the option -<code>installPrivateKey</code> to this value. Note that if you have done this correctly, your key will start with -<code>-----BEGIN RSA PRIVATE KEY-----</code>.</p> +<code class="language-plaintext highlighter-rouge">installPrivateKey</code> to this value. Note that if you have done this correctly, your key will start with +<code class="language-plaintext highlighter-rouge">-----BEGIN RSA PRIVATE KEY-----</code>.</p> <p>Ex.</p> -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">installPrivateKey</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">installPrivateKey</span><span class="o">;</span> <span class="o">...</span> <span class="c1">// start 10 nodes</span> - <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="n">installPrivateKey</span><span class="o">(</span><span class="n">Files</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">"/home/me/.ssh/id_rsa"</span><span class="o">));</span> -</code></pre></div> - + <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="n">installPrivateKey</span><span class="o">(</span><span class="nc">Files</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="k">new</span> <span class="nc">File</span><span class="o">(</span><span class="s">"/home/me/.ssh/id_rsa"</span><span class="o">));</span></code></pre></figure> <p>Note that SSH must be configured for this feature to work.</p> -<h3>Adding a post-boot script</h3> +<h3 id="adding-a-post-boot-script">Adding a post-boot script</h3> -<p>The compute API supports injection and execution of a single file as <code>root</code> post-bootup. +<p>The compute API supports injection and execution of a single file as <code class="language-plaintext highlighter-rouge">root</code> post-bootup. The exact implementation depends on the features offered by the target cloud.</p> -<p>In order to use this feature, you must generate or load a script as a jclouds <code>Statement</code> or a String value. -Set the option <code>runScript</code> to this value.</p> +<p>In order to use this feature, you must generate or load a script as a jclouds <code class="language-plaintext highlighter-rouge">Statement</code> or a String value. +Set the option <code class="language-plaintext highlighter-rouge">runScript</code> to this value.</p> <p>Ex.</p> -<div class="highlight"><pre><code class="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">runScript</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><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">compute</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">TemplateOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">runScript</span><span class="o">;</span> <span class="o">...</span> <span class="c1">// start 10 nodes</span> - <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="n">runScript</span><span class="o">(</span><span class="n">Files</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">"runscript.sh"</span><span class="o">)));</span> -</code></pre></div> - + <span class="n">nodes</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">createNodesInGroup</span><span class="o">(</span><span class="n">group</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="n">runScript</span><span class="o">(</span><span class="nc">Files</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="k">new</span> <span class="nc">File</span><span class="o">(</span><span class="s">"runscript.sh"</span><span class="o">)));</span></code></pre></figure> <p>Note that SSH must be configured for this feature to work.</p> -<h4>Default Template</h4> - +<h4 id="default-template">Default Template</h4> <p>While many configurations may work with runScript, we setup the default template so that it can work -without parameters (ex. <code>templateBuilder().build()</code> works).</p> +without parameters (ex. <code class="language-plaintext highlighter-rouge">templateBuilder().build()</code> works).</p> -<h5>1.0.0</h5> +<h5 id="100">1.0.0</h5> <p>As of jclouds 1.0.0 here are the template patterns that represent the default template.</p> -<p><em>Unless specified below, the default template is <code>osFamily(UBUNTU).osVersionMatches("10.04").os64Bit(true)</code></em></p> +<p><em>Unless specified below, the default template is <code class="language-plaintext highlighter-rouge">osFamily(UBUNTU).osVersionMatches("10.04").os64Bit(true)</code></em></p> <p><em>This is significantly out of date.</em></p> <table> -<thead> -<tr> -<th> <em>provider</em> </th> -<th> <em>default template</em> </th> -</tr> -</thead> -<tbody> -<tr> -<td> ec2 </td> -<td> osFamily(AMZN_LINUX).os64Bit(true) </td> -</tr> -<tr> -<td> gogrid </td> -<td> osFamily(CENTOS).imageNameMatches(".<em>w/ None.</em>") </td> -</tr> -</tbody> + <thead> + <tr> + <th><em>provider</em></th> + <th><em>default template</em></th> + </tr> + </thead> + <tbody> + <tr> + <td>ec2</td> + <td>osFamily(AMZN_LINUX).os64Bit(true)</td> + </tr> + <tr> + <td>gogrid</td> + <td>osFamily(CENTOS).imageNameMatches(â.<em>w/ None.</em>â)</td> + </tr> + </tbody> </table> - -<h5>Test Scripts</h5> +<h5 id="test-scripts">Test Scripts</h5> <ul> -<li>OperatingSystemPredicates.supportsApt().apply(node.getOperatingSystem())</li> + <li>OperatingSystemPredicates.supportsApt().apply(node.getOperatingSystem())</li> </ul> - -<div class="highlight"><pre><code class="text">echo nameserver 208.67.222.222 >> /etc/resolv.conf +<figure class="highlight"><pre><code class="language-text" data-lang="text">echo nameserver 208.67.222.222 >> /etc/resolv.conf cp /etc/apt/sources.list /etc/apt/sources.list.old -sed 's~us.archive.ubuntu.com~mirror.anl.gov/pub~g' /etc/apt/sources.list.old >/etc/apt/sources.list +sed 's~us.archive.ubuntu.com~mirror.anl.gov/pub~g' /etc/apt/sources.list.old >/etc/apt/sources.list apt-get update -apt-get install -f -y --force-yes openjdk-6-jdk -</code></pre></div> - +apt-get install -f -y --force-yes openjdk-6-jdk</code></pre></figure> <ul> -<li>OperatingSystemPredicates.supportsYum().apply(node.getOperatingSystem())</li> + <li>OperatingSystemPredicates.supportsYum().apply(node.getOperatingSystem())</li> </ul> +<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">echo </span>nameserver 208.67.222.222 <span class="o">>></span> /etc/resolv.conf +<span class="nb">echo</span> <span class="s2">"[jdkrepo]"</span> <span class="o">>></span> /etc/yum.repos.d/CentOS-Base.repo +<span class="nb">echo</span> <span class="s2">"name=jdkrepository"</span> <span class="o">>></span> /etc/yum.repos.d/CentOS-Base.repo +<span class="nb">echo</span> <span class="s2">"baseurl=http://ec2-us-east-mirror.rightscale.com/epel/5/i386/"</span> <span class="o">>></span> /etc/yum.repos.d/CentOS-Base.repo +<span class="nb">echo</span> <span class="s2">"enabled=1"</span> <span class="o">>></span> /etc/yum.repos.d/CentOS-Base.repo +yum <span class="nt">--nogpgcheck</span> <span class="nt">-y</span> <span class="nb">install </span>java-1.6.0-openjdk +<span class="nb">echo</span> <span class="s2">"export PATH=</span><span class="se">\"</span><span class="s2">/usr/lib/jvm/jre-1.6.0-openjdk/bin/:</span><span class="se">\$</span><span class="s2">PATH</span><span class="se">\"</span><span class="s2">"</span> <span class="o">>></span> /root/.bashrc</code></pre></figure> + +<h3 id="creating-non-root-users">Creating non-root users</h3> + +<p>To add additional users on nodes, use the <code class="language-plaintext highlighter-rouge">UserAdd.Builder</code> facility, like this:</p> + +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">UserAdd</span><span class="o">.</span><span class="na">Builder</span> <span class="n">userBuilder</span> <span class="o">=</span> <span class="nc">UserAdd</span><span class="o">.</span><span class="na">builder</span><span class="o">();</span> +<span class="n">userBuilder</span><span class="o">.</span><span class="na">login</span><span class="o">(</span><span class="s">"john.doe"</span><span class="o">);</span> +<span class="n">userBuilder</span><span class="o">.</span><span class="na">authorizeRSAPublicKey</span><span class="o">(</span><span class="s">"john's public key"</span><span class="o">);</span> +<span class="nc">Statement</span> <span class="n">userBuilderStatement</span> <span class="o">=</span> <span class="n">userBuilder</span><span class="o">.</span><span class="na">build</span><span class="o">();</span></code></pre></figure> -<div class="highlight"><pre><code class="bash"><span class="nb">echo </span>nameserver 208.67.222.222 >> /etc/resolv.conf -<span class="nb">echo</span> <span class="s2">"[jdkrepo]"</span> >> /etc/yum.repos.d/CentOS-Base.repo -<span class="nb">echo</span> <span class="s2">"name=jdkrepository"</span> >> /etc/yum.repos.d/CentOS-Base.repo -<span class="nb">echo</span> <span class="s2">"baseurl=http://ec2-us-east-mirror.rightscale.com/epel/5/i386/"</span> >> /etc/yum.repos.d/CentOS-Base.repo -<span class="nb">echo</span> <span class="s2">"enabled=1"</span> >> /etc/yum.repos.d/CentOS-Base.repo -yum --nogpgcheck -y install java-1.6.0-openjdk -<span class="nb">echo</span> <span class="s2">"export PATH=\"/usr/lib/jvm/jre-1.6.0-openjdk/bin/:\$PATH\""</span> >> /root/.bashrc -</code></pre></div> - +<p>and run the built statement in <code class="language-plaintext highlighter-rouge">templateOptions.runScript</code> or add to a <code class="language-plaintext highlighter-rouge">StatementList</code>.</p> -<h3>Creating non-root users</h3> - -<p>To add additional users on nodes, use the <code>UserAdd.Builder</code> facility, like this:</p> - -<div class="highlight"><pre><code class="java"><span class="n">UserAdd</span><span class="o">.</span><span class="na">Builder</span> <span class="n">userBuilder</span> <span class="o">=</span> <span class="n">UserAdd</span><span class="o">.</span><span class="na">builder</span><span class="o">();</span> -<span class="n">userBuilder</span><span class="o">.</span><span class="na">login</span><span class="o">(</span><span class="s">"john.doe"</span><span class="o">);</span> -<span class="n">userBuilder</span><span class="o">.</span><span class="na">authorizeRSAPublicKey</span><span class="o">(</span><span class="s">"john's public key"</span><span class="o">);</span> -<span class="n">Statement</span> <span class="n">userBuilderStatement</span> <span class="o">=</span> <span class="n">userBuilder</span><span class="o">.</span><span class="na">build</span><span class="o">();</span> -</code></pre></div> - - -<p>and run the built statement in <code>templateOptions.runScript</code> or add to a <code>StatementList</code>.</p> - -<h4>Note on internal implementation and debugging</h4> - -<p>The jclouds API allows many <code>Statements</code> to be built entirely from high-level concepts, +<h4 id="note-on-internal-implementation-and-debugging">Note on internal implementation and debugging</h4> +<p>The jclouds API allows many <code class="language-plaintext highlighter-rouge">Statements</code> to be built entirely from high-level concepts, without having to resort to OS-specific scripts. This enables developers to express what they mean without having to deal with the gory details of various OS flavors. -To see the commands that will be executed, print the result of <code>Statement.render(OsFamily.UNIX)</code>, for example.</p> +To see the commands that will be executed, print the result of <code class="language-plaintext highlighter-rouge">Statement.render(OsFamily.UNIX)</code>, for example.</p> -<h3>Sharing the credential store between ComputeService instances</h3> +<h3 id="sharing-the-credential-store-between-computeservice-instances">Sharing the credential store between ComputeService instances</h3> -<p>By default there's a separate credential store per ComputeService instance. To change that and share the +<p>By default thereâs a separate credential store per ComputeService instance. To change that and share the same credential store between instances create your ComputeService as follows:</p> -<div class="highlight"><pre><code class="java"><span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Map</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">ByteSource</span><span class="o">></span> <span class="n">SHARED_CREDENTIAL_STORE</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ConcurrentHashMap</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">ByteSource</span><span class="o">>();</span> -<span class="o">...</span> -<span class="n">Module</span> <span class="n">sharedCredStore</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CredentialStoreModule</span><span class="o">(</span><span class="n">SHARED_CREDENTIAL_STORE</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">"provider"</span><span class="o">)</span> - <span class="o">.</span><span class="na">modules</span><span class="o">(</span><span class="n">ImmutableSet</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">sharedCredStore</span><span class="o">,</span> <span class="o">...))</span>
[... 12 lines stripped ...]
