Merge branch 'master' of git@github.com:jclouds/jclouds

* 'master' of git@github.com:jclouds/jclouds:
  Issue 191: added example to integrate chef with compute
  fixed parent project refs
  updated snapshot repository info
  Issue 280: added orglist command
  changed default test so that they work with self-signed certs
This commit is contained in:
Adrian Cole 2010-08-31 12:50:14 -07:00
commit c1a989c9f6
21 changed files with 719 additions and 389 deletions

View File

@ -54,7 +54,7 @@
</repository> </repository>
<repository> <repository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-rimu-snapshots-nexus</id>
<url>http://jclouds.rimuhosting.com:8081/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>

View File

@ -54,7 +54,7 @@
</repository> </repository>
<repository> <repository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-rimu-snapshots-nexus</id>
<url>http://jclouds.rimuhosting.com:8081/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>

View File

@ -52,7 +52,7 @@
</repository> </repository>
<repository> <repository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-rimu-snapshots-nexus</id>
<url>http://jclouds.rimuhosting.com:8081/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>

150
chef/compute/pom.xml Normal file
View File

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
$HeadURL$ $Revision$ $Date$ Copyright (C) 2010 Cloud Conscious, LLC
<info@cloudconscious.com>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to you under the Apache License, Version
2.0 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0.html Unless required by
applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the
License.
====================================================================
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-chef-project</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-chef-compute</artifactId>
<name>jclouds chef compute integration</name>
<description>provisions nodes with jclouds and kick's off chef to configure and integrate</description>
<properties>
<!-- for example: ec2, trmk-ecloud, bluelock-vclouddirector, cloudservers, etc -->
<jclouds.compute.provider>YOUR_PREFERRED_PROVIDER</jclouds.compute.provider>
<!-- leave blank unless you have a different url to override -->
<jclouds.compute.endpoint></jclouds.compute.endpoint>
<jclouds.compute.identity>YOUR_ACCOUNT</jclouds.compute.identity>
<jclouds.compute.credential>YOUR_CREDENTIAL</jclouds.compute.credential>
<jclouds.chef.identity>YOUR_USER</jclouds.chef.identity>
<jclouds.chef.identity.pem>${user.home}/.chef/${jclouds.chef.identity}.pem</jclouds.chef.identity.pem>
<jclouds.opscodeplatform.org>YOUR_ORG</jclouds.opscodeplatform.org>
<jclouds.chef.endpoint>https://api.opscode.com/organizations/${jclouds.opscodeplatform.org}</jclouds.chef.endpoint>
</properties>
<!-- bootstrapping: need to fetch the project POM -->
<repositories>
<repository>
<id>jclouds-googlecode-deploy</id>
<url>http://jclouds.googlecode.com/svn/repo</url>
</repository>
<repository>
<id>jclouds-rimu-snapshots-nexus</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>jclouds-chef</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>jclouds-compute</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>jclouds-compute</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>jclouds-allcompute</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
<profiles>
<profile>
<id>live</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>integration</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/*LiveTest.java</include>
</includes>
<systemProperties>
<property>
<name>jclouds.compute.provider</name>
<value>${jclouds.compute.provider}</value>
</property>
<property>
<name>jclouds.compute.endpoint</name>
<value>${jclouds.compute.endpoint}</value>
</property>
<property>
<name>jclouds.compute.identity</name>
<value>${jclouds.compute.identity}</value>
</property>
<property>
<name>jclouds.compute.credential</name>
<value>${jclouds.compute.credential}</value>
</property>
<property>
<name>jclouds.chef.identity</name>
<value>${jclouds.chef.identity}</value>
</property>
<property>
<name>jclouds.chef.identity.pem</name>
<value>${jclouds.chef.identity.pem}</value>
</property>
<property>
<name>jclouds.chef.endpoint</name>
<value>${jclouds.chef.endpoint}</value>
</property>
</systemProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -25,7 +25,7 @@
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>
<artifactId>jclouds-chef-project</artifactId> <artifactId>jclouds-chef-project</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<relativePath>../project/pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>
<artifactId>jclouds-chef</artifactId> <artifactId>jclouds-chef</artifactId>
@ -49,7 +49,7 @@
</repository> </repository>
<repository> <repository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-rimu-snapshots-nexus</id>
<url>http://jclouds.rimuhosting.com:8081/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>

View File

@ -34,5 +34,6 @@
<modules> <modules>
<module>core</module> <module>core</module>
<module>servlet</module> <module>servlet</module>
<module>compute</module>
</modules> </modules>
</project> </project>

View File

@ -26,7 +26,7 @@
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>
<artifactId>jclouds-chef-project</artifactId> <artifactId>jclouds-chef-project</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<relativePath>../project/pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>
<artifactId>jclouds-chef-servlet</artifactId> <artifactId>jclouds-chef-servlet</artifactId>
@ -41,7 +41,7 @@
</repository> </repository>
<repository> <repository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-rimu-snapshots-nexus</id>
<url>http://jclouds.rimuhosting.com:8081/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>

View File

@ -43,6 +43,7 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.SortedSet; import java.util.SortedSet;
import java.util.TreeSet; import java.util.TreeSet;
@ -50,6 +51,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import org.jclouds.Constants;
import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.ComputeType; import org.jclouds.compute.domain.ComputeType;
import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Image;
@ -180,8 +182,11 @@ public abstract class BaseComputeServiceLiveTest {
private void initializeContextAndClient() throws IOException { private void initializeContextAndClient() throws IOException {
if (context != null) if (context != null)
context.close(); context.close();
Properties props = new Properties();
props.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
props.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true");
context = new ComputeServiceContextFactory().createContext(provider, identity, credential, ImmutableSet.of( context = new ComputeServiceContextFactory().createContext(provider, identity, credential, ImmutableSet.of(
new Log4JLoggingModule(), getSshModule())); new Log4JLoggingModule(), getSshModule()), props);
client = context.getComputeService(); client = context.getComputeService();
} }

View File

@ -31,7 +31,7 @@
classpathref="maven-ant-tasks.classpath" /> classpathref="maven-ant-tasks.classpath" />
<artifact:localRepository id="local.repository" path="${user.home}/.m2/repository" /> <artifact:localRepository id="local.repository" path="${user.home}/.m2/repository" />
<artifact:remoteRepository id="jclouds-snapshot.repository" url="http://jclouds.rimuhosting.com/maven2/snapshots" /> <artifact:remoteRepository id="jclouds-snapshot.repository" url="https://oss.sonatype.org/content/repositories/snapshots" />
<artifact:remoteRepository id="shrinkwrap.repository" url="http://repository.jboss.org/maven2" /> <artifact:remoteRepository id="shrinkwrap.repository" url="http://repository.jboss.org/maven2" />
<!-- Setup maven so that we can get latest version of jclouds, shrinkwrap, and jruby --> <!-- Setup maven so that we can get latest version of jclouds, shrinkwrap, and jruby -->

View File

@ -51,7 +51,7 @@
</repository> </repository>
<repository> <repository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-rimu-snapshots-nexus</id>
<url>http://jclouds.rimuhosting.com:8081/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots> <snapshots>
</snapshots> </snapshots>
</repository> </repository>

View File

@ -52,7 +52,7 @@
</repository> </repository>
<repository> <repository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-rimu-snapshots-nexus</id>
<url>http://jclouds.rimuhosting.com:8081/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>

4
thirdparty/pom.xml vendored
View File

@ -42,8 +42,8 @@
<uniqueVersion>false</uniqueVersion> <uniqueVersion>false</uniqueVersion>
</repository> </repository>
<snapshotRepository> <snapshotRepository>
<id>jclouds-rimu-snapshots-nexus</id> <id>jclouds-snapshots</id>
<url>http://jclouds.rimuhosting.com/nexus/content/repositories/snapshots</url> <url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository> </snapshotRepository>
</distributionManagement> </distributionManagement>
</project> </project>

View File

@ -56,7 +56,7 @@
<artifact:localRepository id="local.repository" path="${user.home}/.m2/repository"/> <artifact:localRepository id="local.repository" path="${user.home}/.m2/repository"/>
<artifact:remoteRepository id="jclouds.repository" url="http://jclouds.googlecode.com/svn/repo" /> <artifact:remoteRepository id="jclouds.repository" url="http://jclouds.googlecode.com/svn/repo" />
<artifact:remoteRepository id="jclouds-snapshot.repository" url="http://jclouds.rimuhosting.com/maven2/snapshots"/> <artifact:remoteRepository id="jclouds-snapshot.repository" url="https://oss.sonatype.org/content/repositories/snapshots"/>
<!-- Setup maven so that we can get latest version of jclouds, jclouds, and jruby --> <!-- Setup maven so that we can get latest version of jclouds, jclouds, and jruby -->
<artifact:dependencies pathId="jclouds.classpath"> <artifact:dependencies pathId="jclouds.classpath">

View File

@ -44,7 +44,7 @@ import com.google.common.util.concurrent.ListenableFuture;
public interface VCloudLoginAsyncClient { public interface VCloudLoginAsyncClient {
/** /**
* This request returns a token to use in subsequent requests. After ten minutes of inactivity, * This request returns a token to use in subsequent requests. After 30 minutes of inactivity,
* the token expires and you have to request a new token with this call. * the token expires and you have to request a new token with this call.
*/ */
@POST @POST

View File

@ -27,6 +27,7 @@ import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML;
import static org.jclouds.vcloud.VCloudMediaType.VM_XML; import static org.jclouds.vcloud.VCloudMediaType.VM_XML;
import java.net.URI; import java.net.URI;
import java.util.Map;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
@ -38,6 +39,7 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import org.jclouds.predicates.validators.DnsNameValidator; import org.jclouds.predicates.validators.DnsNameValidator;
import org.jclouds.rest.annotations.Endpoint;
import org.jclouds.rest.annotations.EndpointParam; import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.MapBinder; import org.jclouds.rest.annotations.MapBinder;
@ -52,16 +54,19 @@ import org.jclouds.vcloud.binders.BindCloneVAppParamsToXmlPayload;
import org.jclouds.vcloud.binders.BindDeployVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindDeployVAppParamsToXmlPayload;
import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload;
import org.jclouds.vcloud.binders.BindUndeployVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindUndeployVAppParamsToXmlPayload;
import org.jclouds.vcloud.domain.ReferenceType;
import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.Task;
import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VApp;
import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VAppTemplate;
import org.jclouds.vcloud.domain.Vm; import org.jclouds.vcloud.domain.Vm;
import org.jclouds.vcloud.domain.ovf.OvfEnvelope; import org.jclouds.vcloud.domain.ovf.OvfEnvelope;
import org.jclouds.vcloud.endpoints.OrgList;
import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint;
import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint;
import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.CloneVAppOptions;
import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
import org.jclouds.vcloud.xml.OrgListHandler;
import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.TaskHandler;
import org.jclouds.vcloud.xml.VAppHandler; import org.jclouds.vcloud.xml.VAppHandler;
import org.jclouds.vcloud.xml.VAppTemplateHandler; import org.jclouds.vcloud.xml.VAppTemplateHandler;
@ -74,11 +79,21 @@ import com.google.common.util.concurrent.ListenableFuture;
* Provides access to VCloud resources via their REST API. * Provides access to VCloud resources via their REST API.
* <p/> * <p/>
* *
* @see <a href="https://community.vcloudexpress.terremark.com/en-us/discussion_forums/f/60.aspx" /> * @see <a href="https://community.vcloudexpress.terremark.com/en-us/discussion_forums/f/60.aspx"
* />
* @author Adrian Cole * @author Adrian Cole
*/ */
@RequestFilters(SetVCloudTokenCookie.class) @RequestFilters(SetVCloudTokenCookie.class)
public interface VCloudAsyncClient extends CommonVCloudAsyncClient { public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
/**
*
* @see VCloudClient#listOrgs
*/
@GET
@Endpoint(OrgList.class)
@XMLResponseParser(OrgListHandler.class)
@Consumes(VCloudMediaType.ORGLIST_XML)
ListenableFuture<Map<String, ReferenceType>> listOrgs();
/** /**
* @see VCloudClient#getVAppTemplate * @see VCloudClient#getVAppTemplate

View File

@ -20,12 +20,14 @@
package org.jclouds.vcloud; package org.jclouds.vcloud;
import java.net.URI; import java.net.URI;
import java.util.Map;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.jclouds.concurrent.Timeout; import org.jclouds.concurrent.Timeout;
import org.jclouds.vcloud.domain.ReferenceType;
import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.Task;
import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VApp;
import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VAppTemplate;
@ -38,11 +40,20 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
* Provides access to VCloud resources via their REST API. * Provides access to VCloud resources via their REST API.
* <p/> * <p/>
* *
* @see <a href="http://communities.vmware.com/community/developer/forums/vcloudapi" /> * @see <a
* href="http://communities.vmware.com/community/developer/forums/vcloudapi"
* />
* @author Adrian Cole * @author Adrian Cole
*/ */
@Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS)
public interface VCloudClient extends CommonVCloudClient { public interface VCloudClient extends CommonVCloudClient {
/**
* The response to a login request includes a list of the organizations to
* which the authenticated user has access.
*
* @return organizations indexed by name
*/
Map<String, ReferenceType> listOrgs();
VApp instantiateVAppTemplateInVDC(URI vDC, URI template, String appName, InstantiateVAppTemplateOptions... options); VApp instantiateVAppTemplateInVDC(URI vDC, URI template, String appName, InstantiateVAppTemplateOptions... options);
@ -53,8 +64,9 @@ public interface VCloudClient extends CommonVCloudClient {
OvfEnvelope getOvfEnvelopeForVAppTemplate(URI vAppTemplate); OvfEnvelope getOvfEnvelopeForVAppTemplate(URI vAppTemplate);
/** /**
* returns the vapp template corresponding to a catalog item in the catalog associated with the * returns the vapp template corresponding to a catalog item in the catalog
* specified name. Note that the org and catalog parameters can be null to choose default. * associated with the specified name. Note that the org and catalog
* parameters can be null to choose default.
* *
* @param orgName * @param orgName
* organization name, or null for the default * organization name, or null for the default
@ -64,7 +76,8 @@ public interface VCloudClient extends CommonVCloudClient {
* item you wish to lookup * item you wish to lookup
* *
* @throws NoSuchElementException * @throws NoSuchElementException
* if you specified an org, catalog, or catalog item name that isn't present * if you specified an org, catalog, or catalog item name that
* isn't present
*/ */
VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName,
String itemName); String itemName);
@ -76,97 +89,109 @@ public interface VCloudClient extends CommonVCloudClient {
Vm getVm(URI vm); Vm getVm(URI vm);
/** /**
* To deploy a vApp, the client makes a request to its action/deploy URL. Deploying a vApp * To deploy a vApp, the client makes a request to its action/deploy URL.
* automatically deploys all of the virtual machines it contains. To deploy a virtual machine, * Deploying a vApp automatically deploys all of the virtual machines it
* the client makes a request to its action/deploy URL. * contains. To deploy a virtual machine, the client makes a request to its
* action/deploy URL.
* <p/> * <p/>
* Deploying a Vm implicitly deploys the parent vApp if that vApp is not already deployed. * Deploying a Vm implicitly deploys the parent vApp if that vApp is not
* already deployed.
*/ */
Task deployVAppOrVm(URI vAppOrVmId); Task deployVAppOrVm(URI vAppOrVmId);
/** /**
* like {@link #deployVAppOrVm(URI)}, except deploy transistions to power on state * like {@link #deployVAppOrVm(URI)}, except deploy transistions to power on
* state
* *
*/ */
Task deployAndPowerOnVAppOrVm(URI vAppOrVmId); Task deployAndPowerOnVAppOrVm(URI vAppOrVmId);
/** /**
* Undeploying a vApp powers off or suspends any running virtual machines it contains, then frees * Undeploying a vApp powers off or suspends any running virtual machines it
* the resources reserved for the vApp and sets the vApps deploy attribute to a value of false * contains, then frees the resources reserved for the vApp and sets the
* to indicate that it is not deployed. * vApps deploy attribute to a value of false to indicate that it is not
* deployed.
* <p/> * <p/>
* Undeploying a virtual machine powers off or suspends the virtual machine, then frees the * Undeploying a virtual machine powers off or suspends the virtual machine,
* resources reserved for it and sets the its deploy attribute to a value of false to indicate * then frees the resources reserved for it and sets the its deploy attribute
* that it is not deployed. This operation has no effect on the containing vApp. * to a value of false to indicate that it is not deployed. This operation
* has no effect on the containing vApp.
* <h4>NOTE</h4> * <h4>NOTE</h4>
* Using this method will simply power off the vms. In order to save their state, use * Using this method will simply power off the vms. In order to save their
* {@link #undeployAndSaveStateOfVAppOrVm} * state, use {@link #undeployAndSaveStateOfVAppOrVm}
* *
*/ */
Task undeployVAppOrVm(URI vAppOrVmId); Task undeployVAppOrVm(URI vAppOrVmId);
/** /**
* like {@link #undeployVAppOrVm(URI)}, where the undeployed virtual machines are suspended and * like {@link #undeployVAppOrVm(URI)}, where the undeployed virtual machines
* their suspend state saved * are suspended and their suspend state saved
* *
*/ */
Task undeployAndSaveStateOfVAppOrVm(URI vAppOrVmId); Task undeployAndSaveStateOfVAppOrVm(URI vAppOrVmId);
/** /**
* A powerOn request to a vApp URL powers on all of the virtual machines in the vApp, as * A powerOn request to a vApp URL powers on all of the virtual machines in
* specified in the vApps StartupSection field. * the vApp, as specified in the vApps StartupSection field.
* <p/> * <p/>
* A powerOn request to a virtual machine URL powers on the specified virtual machine and forces * A powerOn request to a virtual machine URL powers on the specified virtual
* deployment of the parent vApp. * machine and forces deployment of the parent vApp.
* <p/> * <p/>
* <h4>NOTE</h4> A powerOn request to a vApp or virtual machine that is undeployed forces * <h4>NOTE</h4> A powerOn request to a vApp or virtual machine that is
* deployment. * undeployed forces deployment.
*/ */
Task powerOnVAppOrVm(URI vAppOrVmId); Task powerOnVAppOrVm(URI vAppOrVmId);
/** /**
* A powerOff request to a vApp URL powers off all of the virtual machines in the vApp, as * A powerOff request to a vApp URL powers off all of the virtual machines in
* specified in its StartupSection field. * the vApp, as specified in its StartupSection field.
* <p/> * <p/>
* A powerOff request to a virtual machine URL powers off the specified virtual machine. * A powerOff request to a virtual machine URL powers off the specified
* virtual machine.
*/ */
Task powerOffVAppOrVm(URI vAppOrVmId); Task powerOffVAppOrVm(URI vAppOrVmId);
/** /**
* A shutdown request to a vApp URL shuts down all of the virtual machines in the vApp, as * A shutdown request to a vApp URL shuts down all of the virtual machines in
* specified in its StartupSection field. * the vApp, as specified in its StartupSection field.
* <p/> * <p/>
* A shutdown request to a virtual machine URL shuts down the specified virtual machine. * A shutdown request to a virtual machine URL shuts down the specified
* virtual machine.
* <p/> * <p/>
* <h4>NOTE</h4Because this request sends a signal to the guest OS, the vCloud API cannot track * <h4>NOTE</h4Because this request sends a signal to the guest OS, the
* the progress or verify the result of the requested operation. Hence, void is returned * vCloud API cannot track the progress or verify the result of the requested
* operation. Hence, void is returned
*/ */
void shutdownVAppOrVm(URI vAppOrVmId); void shutdownVAppOrVm(URI vAppOrVmId);
/** /**
* A reset request to a vApp URL resets all of the virtual machines in the vApp, as specified in * A reset request to a vApp URL resets all of the virtual machines in the
* its StartupSection field. * vApp, as specified in its StartupSection field.
* <p/> * <p/>
* A reset request to a virtual machine URL resets the specified virtual machine. * A reset request to a virtual machine URL resets the specified virtual
* machine.
*/ */
Task resetVAppOrVm(URI vAppOrVmId); Task resetVAppOrVm(URI vAppOrVmId);
/** /**
* A reboot request to a vApp URL reboots all of the virtual machines in the vApp, as specified * A reboot request to a vApp URL reboots all of the virtual machines in the
* in its StartupSection field. * vApp, as specified in its StartupSection field.
* <p/> * <p/>
* A reboot request to a virtual machine URL reboots the specified virtual machine. * A reboot request to a virtual machine URL reboots the specified virtual
* machine.
* <p/> * <p/>
* <h4>NOTE</h4> Because this request sends a signal to the guest OS, the vCloud API cannot track * <h4>NOTE</h4> Because this request sends a signal to the guest OS, the
* the progress or verify the result of the requested operation. Hence, void is returned * vCloud API cannot track the progress or verify the result of the requested
* operation. Hence, void is returned
*/ */
void rebootVAppOrVm(URI vAppOrVmId); void rebootVAppOrVm(URI vAppOrVmId);
/** /**
* A suspend request to a vApp URL suspends all of the virtual machines in the vApp, as specified * A suspend request to a vApp URL suspends all of the virtual machines in
* in its StartupSection field. * the vApp, as specified in its StartupSection field.
* <p/> * <p/>
* A suspend request to a virtual machine URL suspends the specified virtual machine. * A suspend request to a virtual machine URL suspends the specified virtual
* machine.
*/ */
Task suspendVAppOrVm(URI vAppOrVmId); Task suspendVAppOrVm(URI vAppOrVmId);

View File

@ -71,6 +71,7 @@ import org.jclouds.vcloud.domain.ReferenceType;
import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.VCloudSession;
import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.domain.VDC;
import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.endpoints.Network;
import org.jclouds.vcloud.endpoints.OrgList;
import org.jclouds.vcloud.endpoints.TasksList; import org.jclouds.vcloud.endpoints.TasksList;
import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog; import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog;
import org.jclouds.vcloud.functions.AllCatalogsInOrg; import org.jclouds.vcloud.functions.AllCatalogsInOrg;
@ -94,7 +95,8 @@ import com.google.inject.name.Names;
import domain.VCloudVersionsAsyncClient; import domain.VCloudVersionsAsyncClient;
/** /**
* Configures the VCloud authentication service connection, including logging and http transport. * Configures the VCloud authentication service connection, including logging
* and http transport.
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
@ -191,6 +193,15 @@ public class CommonVCloudRestClientModule<S extends CommonVCloudClient, A extend
}); });
} }
@Provides
@Singleton
@OrgList
URI provideOrgListURI(Supplier<VCloudSession> sessionSupplier) {
VCloudSession session = sessionSupplier.get();
return URI.create(Iterables.getLast(session.getOrgs().values()).getHref().toASCIIString().replaceAll("org/.*",
"org"));
}
@Singleton @Singleton
public static class OrgMapSupplier implements Supplier<Map<String, ? extends Org>> { public static class OrgMapSupplier implements Supplier<Map<String, ? extends Org>> {
protected final Supplier<VCloudSession> sessionSupplier; protected final Supplier<VCloudSession> sessionSupplier;
@ -346,8 +357,7 @@ public class CommonVCloudRestClientModule<S extends CommonVCloudClient, A extend
@Singleton @Singleton
@org.jclouds.vcloud.endpoints.VCloudLogin @org.jclouds.vcloud.endpoints.VCloudLogin
protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService,
@Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, @Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, TimeoutException {
TimeoutException {
SortedMap<String, URI> versions = versionService.getSupportedVersions().get(180, TimeUnit.SECONDS); SortedMap<String, URI> versions = versionService.getSupportedVersions().get(180, TimeUnit.SECONDS);
checkState(versions.size() > 0, "No versions present"); checkState(versions.size() > 0, "No versions present");
checkState(versions.containsKey(version), "version " + version + " not present in: " + versions); checkState(versions.containsKey(version), "version " + version + " not present in: " + versions);
@ -454,8 +464,7 @@ public class CommonVCloudRestClientModule<S extends CommonVCloudClient, A extend
protected Supplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>> provideOrgVDCSupplierCache( protected Supplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>> provideOrgVDCSupplierCache(
@Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) {
return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>>( return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>>(
authException, seconds, authException, seconds, new Supplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>>() {
new Supplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>>() {
@Override @Override
public Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> get() { public Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> get() {
return supplier.get(); return supplier.get();
@ -521,8 +530,7 @@ public class CommonVCloudRestClientModule<S extends CommonVCloudClient, A extend
new Function<org.jclouds.vcloud.domain.Catalog, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>>() { new Function<org.jclouds.vcloud.domain.Catalog, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>>() {
@Override @Override
public Map<String, ? extends CatalogItem> apply( public Map<String, ? extends CatalogItem> apply(org.jclouds.vcloud.domain.Catalog from) {
org.jclouds.vcloud.domain.Catalog from) {
return uniqueIndex(allCatalogItemsInCatalog.apply(from), name); return uniqueIndex(allCatalogItemsInCatalog.apply(from), name);
} }
}); });

View File

@ -0,0 +1,99 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.jclouds.vcloud.domain;
import java.util.Set;
import org.jclouds.vcloud.domain.ovf.ResourceAllocation;
import org.jclouds.vcloud.domain.ovf.System;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
/**
* The InstantiateVAppTemplateParams element forms the body of an instantiateVappTemplate request.
*/
public class InstantiateVAppTemplateParams {
protected final String info;
protected final System virtualSystem;
protected final Set<ResourceAllocation> resourceAllocations = Sets.newLinkedHashSet();
public InstantiateVAppTemplateParams(String info, System virtualSystem, Iterable<? extends ResourceAllocation> resourceAllocations) {
this.info = info;
this.virtualSystem = virtualSystem;
Iterables.addAll(this.resourceAllocations, resourceAllocations);
}
public String getInfo() {
return info;
}
public System getSystem() {
return virtualSystem;
}
public Set<? extends ResourceAllocation> getResourceAllocations() {
return resourceAllocations;
}
@Override
public String toString() {
return "[info=" + getInfo() + ", virtualSystem=" + getSystem() + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((info == null) ? 0 : info.hashCode());
result = prime * result + ((resourceAllocations == null) ? 0 : resourceAllocations.hashCode());
result = prime * result + ((virtualSystem == null) ? 0 : virtualSystem.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
InstantiateVAppTemplateParams other = (InstantiateVAppTemplateParams) obj;
if (info == null) {
if (other.info != null)
return false;
} else if (!info.equals(other.info))
return false;
if (resourceAllocations == null) {
if (other.resourceAllocations != null)
return false;
} else if (!resourceAllocations.equals(other.resourceAllocations))
return false;
if (virtualSystem == null) {
if (other.virtualSystem != null)
return false;
} else if (!virtualSystem.equals(other.virtualSystem))
return false;
return true;
}
}

View File

@ -0,0 +1,40 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.jclouds.vcloud.endpoints;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
* Related to a VCloud express Org List.
*
* @author Adrian Cole
*
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Qualifier
public @interface OrgList {
}

View File

@ -45,6 +45,7 @@ import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextFactory; import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextFactory.ContextSpec; import org.jclouds.rest.RestContextFactory.ContextSpec;
import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.rest.internal.RestAnnotationProcessor;
@ -67,6 +68,7 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.CatalogHandler;
import org.jclouds.vcloud.xml.CatalogItemHandler; import org.jclouds.vcloud.xml.CatalogItemHandler;
import org.jclouds.vcloud.xml.OrgHandler; import org.jclouds.vcloud.xml.OrgHandler;
import org.jclouds.vcloud.xml.OrgListHandler;
import org.jclouds.vcloud.xml.OrgNetworkHandler; import org.jclouds.vcloud.xml.OrgNetworkHandler;
import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.TaskHandler;
import org.jclouds.vcloud.xml.TasksListHandler; import org.jclouds.vcloud.xml.TasksListHandler;
@ -125,11 +127,11 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
IOException { IOException {
Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class,
String.class, InstantiateVAppTemplateOptions[].class); String.class, InstantiateVAppTemplateOptions[].class);
processor.createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI processor
.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "CentOS 01", processorCount(1).memory(512) .createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI
.disk(1024).addNetworkConfig( .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "CentOS 01", processorCount(1).memory(
new NetworkConfig(null, URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1991"), 512).disk(1024).addNetworkConfig(
null))); new NetworkConfig(null, URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1991"), null)));
} }
public void testCloneVAppInVDC() throws SecurityException, NoSuchMethodException, IOException { public void testCloneVAppInVDC() throws SecurityException, NoSuchMethodException, IOException {
@ -157,8 +159,8 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
CloneVAppOptions[].class); CloneVAppOptions[].class);
HttpRequest request = processor.createRequest(method, URI HttpRequest request = processor.createRequest(method, URI
.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI
.create("https://vcenterprise.bluelock.com/api/v1.0/vapp/201"), "new-linux-server", .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/201"), "new-linux-server", new CloneVAppOptions()
new CloneVAppOptions().deploy().powerOn().withDescription("The description of the new vApp")); .deploy().powerOn().withDescription("The description of the new vApp"));
assertRequestLineEquals(request, assertRequestLineEquals(request,
"POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1");
@ -173,6 +175,21 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
checkFilters(request); checkFilters(request);
} }
public void testlistOrgs() throws SecurityException, NoSuchMethodException, IOException {
Method method = VCloudAsyncClient.class.getMethod("listOrgs");
HttpRequest request = processor.createRequest(method);
assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org HTTP/1.1");
assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.orgList+xml\n");
assertPayloadEquals(request, null, null, false);
assertResponseParserClassEquals(method, request, ParseSax.class);
assertSaxResponseParserClassEquals(method, OrgListHandler.class);
assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
checkFilters(request);
}
public void testOrg() throws SecurityException, NoSuchMethodException, IOException { public void testOrg() throws SecurityException, NoSuchMethodException, IOException {
Method method = VCloudAsyncClient.class.getMethod("getOrg", URI.class); Method method = VCloudAsyncClient.class.getMethod("getOrg", URI.class);
HttpRequest request = processor.createRequest(method, URI HttpRequest request = processor.createRequest(method, URI
@ -790,42 +807,17 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
protected Supplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>> provideOrgVDCSupplierCache( protected Supplier<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>> provideOrgVDCSupplierCache(
@Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) {
return Suppliers return Suppliers.<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>> ofInstance(ImmutableMap
.<Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>>> ofInstance(ImmutableMap .<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> of("org",
.<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> of(
"org",
ImmutableMap ImmutableMap.<String, org.jclouds.vcloud.domain.VDC> of("vdc", new VDCImpl("vdc", null, URI
.<String, org.jclouds.vcloud.domain.VDC> of( .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), null, null, "description", null,
"vdc", null, null, null, null, ImmutableMap.<String, ReferenceType> of("vapp", new ReferenceTypeImpl(
new VDCImpl( "vapp", "application/vnd.vmware.vcloud.vApp+xml", URI
"vdc", .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), "network",
null, new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI
URI .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), null, 0, 0, 0,
.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), false))));
null,
null,
"description",
null,
null,
null,
null,
null,
ImmutableMap
.<String, ReferenceType> of(
"vapp",
new ReferenceTypeImpl(
"vapp",
"application/vnd.vmware.vcloud.vApp+xml",
URI
.create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")),
"network",
new ReferenceTypeImpl(
"network",
"application/vnd.vmware.vcloud.vAppTemplate+xml",
URI
.create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))),
null, 0, 0, 0, false))));
} }
@ -840,17 +832,14 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
public Map<String, Org> get() { public Map<String, Org> get() {
return ImmutableMap.<String, Org> of("org", new OrgImpl("org", null, URI return ImmutableMap.<String, Org> of("org", new OrgImpl("org", null, URI
.create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "org", "description", ImmutableMap .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "org", "description", ImmutableMap
.<String, ReferenceType> of("catalog", new ReferenceTypeImpl("catalog", .<String, ReferenceType> of("catalog", new ReferenceTypeImpl("catalog", VCloudMediaType.CATALOG_XML,
VCloudMediaType.CATALOG_XML, URI URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap
.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap
.<String, ReferenceType> of("vdc", new ReferenceTypeImpl("vdc", VCloudMediaType.VDC_XML, URI .<String, ReferenceType> of("vdc", new ReferenceTypeImpl("vdc", VCloudMediaType.VDC_XML, URI
.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap
.<String, ReferenceType> of("network", new ReferenceTypeImpl("network", .<String, ReferenceType> of("network", new ReferenceTypeImpl("network", VCloudMediaType.NETWORK_XML,
VCloudMediaType.NETWORK_XML, URI URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1"))), new ReferenceTypeImpl(
.create("https://vcenterprise.bluelock.com/api/v1.0/network/1"))), "tasksList", VCloudMediaType.TASKSLIST_XML, URI
new ReferenceTypeImpl("tasksList", VCloudMediaType.TASKSLIST_XML, URI .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")), ImmutableList.<Task> of()));
.create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")), ImmutableList
.<Task> of()));
} }
} }
@ -866,12 +855,11 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
return ImmutableMap.<String, Map<String, ? extends org.jclouds.vcloud.domain.Catalog>> of("org", return ImmutableMap.<String, Map<String, ? extends org.jclouds.vcloud.domain.Catalog>> of("org",
ImmutableMap.<String, org.jclouds.vcloud.domain.Catalog> of("catalog", new CatalogImpl("catalog", "type", ImmutableMap.<String, org.jclouds.vcloud.domain.Catalog> of("catalog", new CatalogImpl("catalog", "type",
URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), null, "description", URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), null, "description", ImmutableMap
ImmutableMap.<String, ReferenceType> of("item", new ReferenceTypeImpl("item", .<String, ReferenceType> of("item", new ReferenceTypeImpl("item",
"application/vnd.vmware.vcloud.catalogItem+xml", URI "application/vnd.vmware.vcloud.catalogItem+xml", URI
.create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), "template",
"template", new ReferenceTypeImpl("template", new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI
"application/vnd.vmware.vcloud.vAppTemplate+xml", URI
.create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"))), .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"))),
ImmutableList.<Task> of(), true))); ImmutableList.<Task> of(), true)));
} }
@ -885,25 +873,13 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
@Override @Override
public Map<String, Map<String, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>>> get() { public Map<String, Map<String, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>>> get() {
return ImmutableMap return ImmutableMap.<String, Map<String, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>>> of(
.<String, Map<String, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>>> of( "org", ImmutableMap.<String, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>> of(
"org", "catalog", ImmutableMap.<String, org.jclouds.vcloud.domain.CatalogItem> of("template",
ImmutableMap new CatalogItemImpl("template", URI
.<String, Map<String, ? extends org.jclouds.vcloud.domain.CatalogItem>> of( .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"), "description",
"catalog", new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml",
ImmutableMap URI.create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")),
.<String, org.jclouds.vcloud.domain.CatalogItem> of(
"template",
new CatalogItemImpl(
"template",
URI
.create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"),
"description",
new ReferenceTypeImpl(
"template",
"application/vnd.vmware.vcloud.vAppTemplate+xml",
URI
.create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")),
ImmutableMap.<String, String> of())))); ImmutableMap.<String, String> of()))));
} }

View File

@ -47,6 +47,17 @@ public class VCloudClientLiveTest extends CommonVCloudClientLiveTest<VCloudClien
credential = checkNotNull(System.getProperty("vcloud.credential"), "vcloud.credential"); credential = checkNotNull(System.getProperty("vcloud.credential"), "vcloud.credential");
} }
@Test
public void testListOrgs() throws Exception {
for (ReferenceType response : connection.listOrgs().values()) {
assertNotNull(response);
assertNotNull(response.getName());
assertNotNull(response.getHref());
assertEquals(connection.getOrg(response.getHref()).getName(), response.getName());
assertEquals(connection.findOrgNamed(response.getName()).getName(), response.getName());
}
}
@Test @Test
public void testGetVAppTemplate() throws Exception { public void testGetVAppTemplate() throws Exception {
Org org = connection.findOrgNamed(null); Org org = connection.findOrgNamed(null);