Issue 464: started read-only features

This commit is contained in:
Adrian Cole 2011-02-06 17:29:52 -08:00
parent 6f545c0277
commit 1b91cca8c1
55 changed files with 6940 additions and 0 deletions

View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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-project</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../project/pom.xml</relativePath>
</parent>
<groupId>org.jclouds.api</groupId>
<artifactId>cloudstack</artifactId>
<name>jclouds cloudstack core</name>
<description>jclouds components to access cloudstack</description>
<!-- bootstrapping: need to fetch the project POM -->
<repositories>
<repository>
<id>jclouds-rimu-snapshots-nexus</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<properties>
<test.cloudstack.endpoint>http://localhost:8080/client/api</test.cloudstack.endpoint>
<test.cloudstack.apiversion>2.2</test.cloudstack.apiversion>
<test.cloudstack.identity>FIXME_apiKey</test.cloudstack.identity>
<test.cloudstack.credential>FIXME_secretKey</test.cloudstack.credential>
</properties>
<dependencies>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-jsch</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.42</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jclouds.driver</groupId>
<artifactId>jclouds-log4j</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</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>
<systemProperties>
<property>
<name>test.cloudstack.endpoint</name>
<value>${test.cloudstack.endpoint}</value>
</property>
<property>
<name>test.cloudstack.apiversion</name>
<value>${test.cloudstack.apiversion}</value>
</property>
<property>
<name>test.cloudstack.identity</name>
<value>${test.cloudstack.identity}</value>
</property>
<property>
<name>test.cloudstack.credential</name>
<value>${test.cloudstack.credential}</value>
</property>
</systemProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -0,0 +1,61 @@
/**
*
* 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.cloudstack;
import org.jclouds.cloudstack.features.NetworkAsyncClient;
import org.jclouds.cloudstack.features.OfferingAsyncClient;
import org.jclouds.cloudstack.features.TemplateAsyncClient;
import org.jclouds.cloudstack.features.ZoneAsyncClient;
import org.jclouds.rest.annotations.Delegate;
/**
* Provides asynchronous access to CloudStack via their REST API.
* <p/>
*
* @see CloudStackClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
public interface CloudStackAsyncClient {
/**
* Provides asynchronous access to Zone features.
*/
@Delegate
ZoneAsyncClient getZoneClient();
/**
* Provides asynchronous access to Template features.
*/
@Delegate
TemplateAsyncClient getTemplateClient();
/**
* Provides asynchronous access to Service, Disk, and Network Offering features.
*/
@Delegate
OfferingAsyncClient getOfferingClient();
/**
* Provides asynchronous access to Network features.
*/
@Delegate
NetworkAsyncClient getNetworkClient();
}

View File

@ -0,0 +1,65 @@
/**
*
* 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.cloudstack;
import java.util.concurrent.TimeUnit;
import org.jclouds.cloudstack.features.NetworkClient;
import org.jclouds.cloudstack.features.OfferingClient;
import org.jclouds.cloudstack.features.TemplateClient;
import org.jclouds.cloudstack.features.ZoneClient;
import org.jclouds.concurrent.Timeout;
import org.jclouds.rest.annotations.Delegate;
/**
* Provides synchronous access to CloudStack.
* <p/>
*
* @see CloudStackAsyncClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
public interface CloudStackClient {
/**
* Provides synchronous access to Zone features.
*/
@Delegate
ZoneClient getZoneClient();
/**
* Provides synchronous access to Template features.
*/
@Delegate
TemplateClient getTemplateClient();
/**
* Provides synchronous access to Service, Disk, and Network Offering features.
*/
@Delegate
OfferingClient getOfferingClient();
/**
* Provides synchronous access to Network features.
*/
@Delegate
NetworkClient getNetworkClient();
}

View File

@ -0,0 +1,45 @@
/**
*
* 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.cloudstack;
import java.util.List;
import java.util.Properties;
import org.jclouds.cloudstack.config.CloudStackRestClientModule;
import org.jclouds.rest.RestContextBuilder;
import com.google.inject.Module;
/**
*
* @author Adrian Cole
*/
public class CloudStackContextBuilder extends
RestContextBuilder<CloudStackClient, CloudStackAsyncClient> {
public CloudStackContextBuilder(Properties props) {
super(CloudStackClient.class, CloudStackAsyncClient.class, props);
}
protected void addClientModule(List<Module> modules) {
modules.add(new CloudStackRestClientModule());
}
}

View File

@ -0,0 +1,45 @@
/**
*
* 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.cloudstack;
import static org.jclouds.Constants.PROPERTY_API_VERSION;
import java.util.Properties;
import org.jclouds.PropertiesBuilder;
/**
* Builds properties used in cloudstack Clients
*
* @author Adrian Cole
*/
public class CloudStackPropertiesBuilder extends PropertiesBuilder {
@Override
protected Properties defaultProperties() {
Properties properties = super.defaultProperties();
properties.setProperty(PROPERTY_API_VERSION, "2.2");
return properties;
}
public CloudStackPropertiesBuilder(Properties properties) {
super(properties);
}
}

View File

@ -0,0 +1,80 @@
/**
*
* 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.cloudstack.config;
import java.util.Map;
import org.jclouds.cloudstack.CloudStackAsyncClient;
import org.jclouds.cloudstack.CloudStackClient;
import org.jclouds.cloudstack.features.NetworkAsyncClient;
import org.jclouds.cloudstack.features.NetworkClient;
import org.jclouds.cloudstack.features.OfferingAsyncClient;
import org.jclouds.cloudstack.features.OfferingClient;
import org.jclouds.cloudstack.features.TemplateAsyncClient;
import org.jclouds.cloudstack.features.TemplateClient;
import org.jclouds.cloudstack.features.ZoneAsyncClient;
import org.jclouds.cloudstack.features.ZoneClient;
import org.jclouds.cloudstack.handlers.CloudStackErrorHandler;
import org.jclouds.http.HttpErrorHandler;
import org.jclouds.http.RequiresHttp;
import org.jclouds.http.annotation.ClientError;
import org.jclouds.http.annotation.Redirection;
import org.jclouds.http.annotation.ServerError;
import org.jclouds.json.config.GsonModule.DateAdapter;
import org.jclouds.json.config.GsonModule.Iso8601DateAdapter;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.config.RestClientModule;
import com.google.common.collect.ImmutableMap;
/**
* Configures the cloudstack connection.
*
* @author Adrian Cole
*/
@RequiresHttp
@ConfiguresRestClient
public class CloudStackRestClientModule extends RestClientModule<CloudStackClient, CloudStackAsyncClient> {
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
.put(ZoneClient.class, ZoneAsyncClient.class)//
.put(TemplateClient.class, TemplateAsyncClient.class)//
.put(OfferingClient.class, OfferingAsyncClient.class)//
.put(NetworkClient.class, NetworkAsyncClient.class)//
.build();
public CloudStackRestClientModule() {
super(CloudStackClient.class, CloudStackAsyncClient.class, DELEGATE_MAP);
}
@Override
protected void configure() {
bind(DateAdapter.class).to(Iso8601DateAdapter.class);
super.configure();
}
@Override
protected void bindErrorHandlers() {
bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(CloudStackErrorHandler.class);
bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(CloudStackErrorHandler.class);
bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(CloudStackErrorHandler.class);
}
}

View File

@ -0,0 +1,217 @@
/**
*
* 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.cloudstack.domain;
import java.util.Date;
import java.util.Set;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
import com.google.gson.annotations.SerializedName;
/**
*
* @author Adrian Cole
*/
public class DiskOffering {
private String id;
private String name;
@SerializedName("displaytext")
private String displayText;
private Date created;
private String domain;
@SerializedName("domainid")
private String domainId;
@SerializedName("disksize")
private int diskSize;
@SerializedName("iscustomized")
private boolean customized;
private String tags;
public DiskOffering(String id, String name, String displayText, Date created, String domain, String domainId,
int diskSize, boolean customized, Set<String> tags) {
this.id = id;
this.name = name;
this.displayText = displayText;
this.created = created;
this.domain = domain;
this.domainId = domainId;
this.diskSize = diskSize;
this.customized = customized;
this.tags = Joiner.on(',').join(tags);
}
/**
* present only for serializer
*
*/
DiskOffering() {
}
/**
*
* @return the id of the disk offering
*/
public String getId() {
return id;
}
/**
*
* @return the name of the disk offering
*/
public String getName() {
return name;
}
/**
*
* @return an alternate display text of the disk offering.
*/
public String getDisplayText() {
return displayText;
}
/**
*
* @return the date this disk offering was created
*/
public Date getCreated() {
return created;
}
/**
*
* @return Domain name for the offering
*/
public String getDomain() {
return domain;
}
/**
*
* @return the domain id of the disk offering
*/
public String getDomainId() {
return domainId;
}
/**
*
* @return the size of the disk offering in GB
*/
public int getDiskSize() {
return diskSize;
}
/**
*
* @return the ha support in the disk offering
*/
public boolean isCustomized() {
return customized;
}
/**
*
* @return the tags for the disk offering
*/
public Set<String> getTags() {
return tags != null ? ImmutableSet.copyOf(Splitter.on(',').split(tags)) : ImmutableSet.<String> of();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result + (customized ? 1231 : 1237);
result = prime * result + diskSize;
result = prime * result + ((displayText == null) ? 0 : displayText.hashCode());
result = prime * result + ((domain == null) ? 0 : domain.hashCode());
result = prime * result + ((domainId == null) ? 0 : domainId.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((tags == null) ? 0 : tags.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;
DiskOffering other = (DiskOffering) obj;
if (created == null) {
if (other.created != null)
return false;
} else if (!created.equals(other.created))
return false;
if (customized != other.customized)
return false;
if (diskSize != other.diskSize)
return false;
if (displayText == null) {
if (other.displayText != null)
return false;
} else if (!displayText.equals(other.displayText))
return false;
if (domain == null) {
if (other.domain != null)
return false;
} else if (!domain.equals(other.domain))
return false;
if (domainId == null) {
if (other.domainId != null)
return false;
} else if (!domainId.equals(other.domainId))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (tags == null) {
if (other.tags != null)
return false;
} else if (!tags.equals(other.tags))
return false;
return true;
}
@Override
public String toString() {
return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", created=" + created + ", diskSize="
+ diskSize + ", iscustomized=" + customized + ", domain=" + domain + ", domainId=" + domainId
+ ", tags=" + tags + "]";
}
}

View File

@ -0,0 +1,58 @@
/**
*
* 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.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.CaseFormat;
/**
*
* @author Adrian Cole
* @see NetworkOfferingClient#listNetworkOfferings
*/
public enum GuestIPType {
/**
* guest IP address will be issued by Dhcp server in the guest virtual network. Dhcp role is
* played by domain router.
*/
VIRTUAL,
/**
* traffic directly to the network and VMs created here are assigned an IP directly from the
* network as configured
*/
DIRECT,
UNRECOGNIZED;
@Override
public String toString() {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name());
}
public static GuestIPType fromValue(String type) {
try {
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type")));
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}

View File

@ -0,0 +1,564 @@
/**
*
* 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.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList.Builder;
import com.google.gson.annotations.SerializedName;
/**
*
* @author Adrian Cole
*/
public class Network {
private String id;
private String account;
@SerializedName("broadcastdomaintype")
private String broadcastDomainType;
@SerializedName("broadcasturi")
private URI broadcastURI;
@SerializedName("displaytext")
private String displayText;
@SerializedName("dns1")
private String DNS1;
@SerializedName("dns2")
private String DNS2;
private String domain;
@Nullable
@SerializedName("domainid")
private String domainId;
@SerializedName("endip")
private String endIP;
private String gateway;
@SerializedName("isdefault")
private boolean isDefault;
@SerializedName("isshared")
private boolean isShared;
@SerializedName("issystem")
private boolean isSystem;
private String netmask;
@SerializedName("networkdomain")
private String networkDomain;
@SerializedName("networkofferingavailability")
private String networkOfferingAvailability;
@SerializedName("networkofferingid")
private String networkOfferingDisplayText;
@SerializedName("networkofferingid")
private String networkOfferingId;
@SerializedName("networkofferingname")
private String networkOfferingName;
private String related;
@SerializedName("startip")
private String startIP;
private String name;
private String state;
@SerializedName("type")
private GuestIPType guestIPType;
@SerializedName("vlan")
private String VLAN;
@SerializedName("traffictype")
private TrafficType trafficType;
@SerializedName("zoneid")
private String zoneId;
@SerializedName("service")
private Set<? extends NetworkService> services = ImmutableSet.<NetworkService> of();
/**
* present only for serializer
*
*/
Network() {
}
public Network(String id, String account, String broadcastDomainType, URI broadcastURI, String displayText,
List<String> DNS, String domain, String domainId, String endIP, String gateway, boolean isDefault,
boolean isShared, boolean isSystem, String netmask, String networkDomain,
String networkOfferingAvailability, String networkOfferingDisplayText, String networkOfferingId,
String networkOfferingName, String related, String startIP, String name, String state, GuestIPType type,
String vLAN, TrafficType trafficType, String zoneId, Set<? extends NetworkService> services) {
this.id = id;
this.account = account;
this.broadcastDomainType = broadcastDomainType;
this.broadcastURI = broadcastURI;
this.displayText = displayText;
this.DNS1 = checkNotNull(DNS, "DNS").size() > 0 ? DNS.get(0) : null;
this.DNS2 = DNS.size() > 1 ? DNS.get(1) : null;
this.domain = domain;
this.domainId = domainId;
this.endIP = endIP;
this.gateway = gateway;
this.isDefault = isDefault;
this.isShared = isShared;
this.isSystem = isSystem;
this.netmask = netmask;
this.networkDomain = networkDomain;
this.networkOfferingAvailability = networkOfferingAvailability;
this.networkOfferingDisplayText = networkOfferingDisplayText;
this.networkOfferingId = networkOfferingId;
this.networkOfferingName = networkOfferingName;
this.related = related;
this.startIP = startIP;
this.name = name;
this.state = state;
this.guestIPType = type;
this.VLAN = vLAN;
this.trafficType = trafficType;
this.zoneId = zoneId;
this.services = ImmutableSet.copyOf(checkNotNull(services, "services"));
}
/**
*
* @return network id
*/
public String getId() {
return id;
}
/**
*
* @return the name of the account to which the template beLongs
*/
public String getAccount() {
return account;
}
/**
*
* @return Broadcast domain type of the network
*/
public String getBroadcastDomainType() {
return broadcastDomainType;
}
/**
*
* @return broadcast uri of the network
*/
public URI getBroadcastURI() {
return broadcastURI;
}
/**
*
* @return the display text of the zone
*/
public String getDisplayText() {
return displayText;
}
/**
*
* @return the external DNS for the network
*/
public List<String> getDNS() {
Builder<String> builder = ImmutableList.builder();
if (DNS1 != null && !"".equals(DNS1))
builder.add(DNS1);
if (DNS2 != null && !"".equals(DNS2))
builder.add(DNS2);
return builder.build();
}
/**
*
* @return Domain name for the Vms in the zone
*/
public String getDomain() {
return domain;
}
/**
*
* @return the ID of the containing domain, null for public zones
*/
@Nullable
public String getDomainId() {
return domainId;
}
/**
*
* @return the end ip of the network
*/
public String getEndIP() {
return endIP;
}
/**
*
* @return the network's gateway
*/
public String getGateway() {
return gateway;
}
/**
*
* @return true if network offering is default, false otherwise
*/
public boolean isDefault() {
return isDefault;
}
/**
*
* @return true if network offering is shared, false otherwise
*/
public boolean isShared() {
return isShared;
}
/**
*
* @return true if network offering is system, false otherwise
*/
public boolean isSystem() {
return isSystem;
}
/**
*
* @return network name
*/
public String getName() {
return name;
}
/**
*
* @return the GuestIPType of the network
*/
public GuestIPType getGuestIPType() {
return guestIPType;
}
/**
*
* @return state of the network
*/
public String getState() {
return state;
}
/**
*
* @return the vlan range of the zone
*/
public String getVLAN() {
return VLAN;
}
/**
*
* @return the traffic type for this network offering
*/
public TrafficType getTrafficType() {
return trafficType;
}
/**
*
* @return the network's netmask
*/
public String getNetmask() {
return netmask;
}
/**
*
* @return the network domain
*/
public String getNetworkDomain() {
return networkDomain;
}
/**
*
* @return availability of the network offering the network is created from
*/
public String getNetworkOfferingAvailability() {
return networkOfferingAvailability;
}
/**
*
* @return display text of the network offering the network is created from
*/
public String getNetworkOfferingDisplayText() {
return networkOfferingDisplayText;
}
/**
*
* @return network offering id the network is created from
*/
public String getNetworkOfferingId() {
return networkOfferingId;
}
/**
*
* @return name of the network offering the network is created from
*/
public String getNetworkOfferingName() {
return networkOfferingName;
}
/**
*
* @return related to what other network configuration
*/
public String getRelated() {
return related;
}
/**
*
* @return the start ip of the network
*/
public String getStartIP() {
return startIP;
}
/**
*
* @return zone id of the network
*/
public String getZoneId() {
return zoneId;
}
/**
*
* @return the list of services
*/
public Set<? extends NetworkService> getServices() {
return services;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((DNS1 == null) ? 0 : DNS1.hashCode());
result = prime * result + ((DNS2 == null) ? 0 : DNS2.hashCode());
result = prime * result + ((VLAN == null) ? 0 : VLAN.hashCode());
result = prime * result + ((account == null) ? 0 : account.hashCode());
result = prime * result + ((broadcastDomainType == null) ? 0 : broadcastDomainType.hashCode());
result = prime * result + ((broadcastURI == null) ? 0 : broadcastURI.hashCode());
result = prime * result + ((displayText == null) ? 0 : displayText.hashCode());
result = prime * result + ((domain == null) ? 0 : domain.hashCode());
result = prime * result + ((domainId == null) ? 0 : domainId.hashCode());
result = prime * result + ((endIP == null) ? 0 : endIP.hashCode());
result = prime * result + ((gateway == null) ? 0 : gateway.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + (isDefault ? 1231 : 1237);
result = prime * result + (isShared ? 1231 : 1237);
result = prime * result + (isSystem ? 1231 : 1237);
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((netmask == null) ? 0 : netmask.hashCode());
result = prime * result + ((networkDomain == null) ? 0 : networkDomain.hashCode());
result = prime * result + ((networkOfferingAvailability == null) ? 0 : networkOfferingAvailability.hashCode());
result = prime * result + ((networkOfferingDisplayText == null) ? 0 : networkOfferingDisplayText.hashCode());
result = prime * result + ((networkOfferingId == null) ? 0 : networkOfferingId.hashCode());
result = prime * result + ((networkOfferingName == null) ? 0 : networkOfferingName.hashCode());
result = prime * result + ((related == null) ? 0 : related.hashCode());
result = prime * result + ((services == null) ? 0 : services.hashCode());
result = prime * result + ((startIP == null) ? 0 : startIP.hashCode());
result = prime * result + ((state == null) ? 0 : state.hashCode());
result = prime * result + ((trafficType == null) ? 0 : trafficType.hashCode());
result = prime * result + ((guestIPType == null) ? 0 : guestIPType.hashCode());
result = prime * result + ((zoneId == null) ? 0 : zoneId.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;
Network other = (Network) obj;
if (DNS1 == null) {
if (other.DNS1 != null)
return false;
} else if (!DNS1.equals(other.DNS1))
return false;
if (DNS2 == null) {
if (other.DNS2 != null)
return false;
} else if (!DNS2.equals(other.DNS2))
return false;
if (VLAN == null) {
if (other.VLAN != null)
return false;
} else if (!VLAN.equals(other.VLAN))
return false;
if (account == null) {
if (other.account != null)
return false;
} else if (!account.equals(other.account))
return false;
if (broadcastDomainType == null) {
if (other.broadcastDomainType != null)
return false;
} else if (!broadcastDomainType.equals(other.broadcastDomainType))
return false;
if (broadcastURI == null) {
if (other.broadcastURI != null)
return false;
} else if (!broadcastURI.equals(other.broadcastURI))
return false;
if (displayText == null) {
if (other.displayText != null)
return false;
} else if (!displayText.equals(other.displayText))
return false;
if (domain == null) {
if (other.domain != null)
return false;
} else if (!domain.equals(other.domain))
return false;
if (domainId == null) {
if (other.domainId != null)
return false;
} else if (!domainId.equals(other.domainId))
return false;
if (endIP == null) {
if (other.endIP != null)
return false;
} else if (!endIP.equals(other.endIP))
return false;
if (gateway == null) {
if (other.gateway != null)
return false;
} else if (!gateway.equals(other.gateway))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (isDefault != other.isDefault)
return false;
if (isShared != other.isShared)
return false;
if (isSystem != other.isSystem)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (netmask == null) {
if (other.netmask != null)
return false;
} else if (!netmask.equals(other.netmask))
return false;
if (networkDomain == null) {
if (other.networkDomain != null)
return false;
} else if (!networkDomain.equals(other.networkDomain))
return false;
if (networkOfferingAvailability == null) {
if (other.networkOfferingAvailability != null)
return false;
} else if (!networkOfferingAvailability.equals(other.networkOfferingAvailability))
return false;
if (networkOfferingDisplayText == null) {
if (other.networkOfferingDisplayText != null)
return false;
} else if (!networkOfferingDisplayText.equals(other.networkOfferingDisplayText))
return false;
if (networkOfferingId == null) {
if (other.networkOfferingId != null)
return false;
} else if (!networkOfferingId.equals(other.networkOfferingId))
return false;
if (networkOfferingName == null) {
if (other.networkOfferingName != null)
return false;
} else if (!networkOfferingName.equals(other.networkOfferingName))
return false;
if (related == null) {
if (other.related != null)
return false;
} else if (!related.equals(other.related))
return false;
if (services == null) {
if (other.services != null)
return false;
} else if (!services.equals(other.services))
return false;
if (startIP == null) {
if (other.startIP != null)
return false;
} else if (!startIP.equals(other.startIP))
return false;
if (state == null) {
if (other.state != null)
return false;
} else if (!state.equals(other.state))
return false;
if (trafficType == null) {
if (other.trafficType != null)
return false;
} else if (!trafficType.equals(other.trafficType))
return false;
if (guestIPType == null) {
if (other.guestIPType != null)
return false;
} else if (!guestIPType.equals(other.guestIPType))
return false;
if (zoneId == null) {
if (other.zoneId != null)
return false;
} else if (!zoneId.equals(other.zoneId))
return false;
return true;
}
@Override
public String toString() {
return "Network [id=" + id + ", state=" + state + ", name=" + name + ", displayText=" + displayText + ", guestIPType="
+ guestIPType + ", trafficType=" + trafficType + ", DNS=" + getDNS() + ", VLAN=" + VLAN + ", account="
+ account + ", startIP=" + startIP + ", endIP=" + endIP + ", netmask=" + netmask + ", gateway="
+ gateway + ", broadcastDomainType=" + broadcastDomainType + ", broadcastURI=" + broadcastURI
+ ", services=" + services + ", domain=" + domain + ", domainId=" + domainId + ", isDefault="
+ isDefault + ", isShared=" + isShared + ", isSystem=" + isSystem + ", related=" + related + ", zoneId="
+ zoneId + ", networkDomain=" + networkDomain + ", networkOfferingAvailability="
+ networkOfferingAvailability + ", networkOfferingDisplayText=" + networkOfferingDisplayText
+ ", networkOfferingId=" + networkOfferingId + ", networkOfferingName=" + networkOfferingName + "]";
}
}

View File

@ -0,0 +1,239 @@
/**
*
* 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.cloudstack.domain;
import java.util.Date;
import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
import com.google.gson.annotations.SerializedName;
/**
*
* @author Adrian Cole
*/
public class NetworkOffering {
private String id;
private String name;
@SerializedName("displaytext")
private String displayText;
private Date created;
private String availability;
@SerializedName("maxconnections")
private Integer maxConnections;
@SerializedName("isdefault")
private boolean isDefault;
@SerializedName("specifyvlan")
private boolean supportsVLAN;
@SerializedName("traffictype")
private TrafficType trafficType;
private String tags;
public NetworkOffering(String id, String name, String displayText, @Nullable Date created, String availability,
boolean supportsVLAN, @Nullable Integer maxConnections, boolean isDefault, TrafficType trafficType,
Set<String> tags) {
this.id = id;
this.name = name;
this.displayText = displayText;
this.created = created;
this.availability = availability;
this.supportsVLAN = supportsVLAN;
this.maxConnections = maxConnections;
this.isDefault = isDefault;
this.trafficType = trafficType;
this.tags = Joiner.on(',').join(tags);
}
/**
* present only for serializer
*
*/
NetworkOffering() {
}
/**
*
* @return the id of the network offering
*/
public String getId() {
return id;
}
/**
*
* @return the name of the network offering
*/
public String getName() {
return name;
}
/**
*
* @return an alternate display text of the network offering.
*/
public String getDisplayText() {
return displayText;
}
/**
*
* @return the date this network offering was created
*/
@Nullable
public Date getCreated() {
return created;
}
/**
*
* @return Availability name for the offering
*/
public String getAvailability() {
return availability;
}
/**
*
* @return true if network offering supports vlans, false otherwise
*/
public boolean supportsVLAN() {
return supportsVLAN;
}
/**
*
* @return the max number of concurrent connection the network offering supports
*/
@Nullable
public Integer getMaxConnections() {
return maxConnections;
}
/**
*
* @return true if network offering is default, false otherwise
*/
public boolean isDefault() {
return isDefault;
}
/**
*
* @return the traffic type for this network offering
*/
public TrafficType getTrafficType() {
return trafficType;
}
/**
*
* @return the tags for the network offering
*/
public Set<String> getTags() {
return tags != null ? ImmutableSet.copyOf(Splitter.on(',').split(tags)) : ImmutableSet.<String> of();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((availability == null) ? 0 : availability.hashCode());
result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result + ((displayText == null) ? 0 : displayText.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + (isDefault ? 1231 : 1237);
result = prime * result + ((maxConnections == null) ? 0 : maxConnections.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + (supportsVLAN ? 1231 : 1237);
result = prime * result + ((tags == null) ? 0 : tags.hashCode());
result = prime * result + ((trafficType == null) ? 0 : trafficType.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;
NetworkOffering other = (NetworkOffering) obj;
if (availability == null) {
if (other.availability != null)
return false;
} else if (!availability.equals(other.availability))
return false;
if (created == null) {
if (other.created != null)
return false;
} else if (!created.equals(other.created))
return false;
if (displayText == null) {
if (other.displayText != null)
return false;
} else if (!displayText.equals(other.displayText))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (isDefault != other.isDefault)
return false;
if (maxConnections == null) {
if (other.maxConnections != null)
return false;
} else if (!maxConnections.equals(other.maxConnections))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (supportsVLAN != other.supportsVLAN)
return false;
if (tags == null) {
if (other.tags != null)
return false;
} else if (!tags.equals(other.tags))
return false;
if (trafficType == null) {
if (other.trafficType != null)
return false;
} else if (!trafficType.equals(other.trafficType))
return false;
return true;
}
@Override
public String toString() {
return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", created=" + created
+ ", maxConnections=" + maxConnections + ", trafficType=" + trafficType + ", isDefault=" + isDefault
+ ", availability=" + availability + ", supportsVLAN=" + supportsVLAN + ", tags=" + tags + "]";
}
}

View File

@ -0,0 +1,150 @@
/**
*
* 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.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Set;
import com.google.common.collect.ImmutableSet;
import com.google.gson.annotations.SerializedName;
/**
*
* @author Adrian Cole
*/
public class NetworkService {
public static class Capability {
private String name;
private String value;
Capability() {
}
public Capability(String name, String value) {
this.name = checkNotNull(name, "name");
this.value = checkNotNull(value, "value");
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((value == null) ? 0 : value.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;
NetworkService.Capability other = (NetworkService.Capability) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
@Override
public String toString() {
return "[name=" + name + ", value=" + value + "]";
}
}
private String name;
@SerializedName("capability")
private Set<? extends NetworkService.Capability> capabilities = ImmutableSet.of();
NetworkService() {
}
public NetworkService(String name, Set<? extends NetworkService.Capability> capabilities) {
this.name = checkNotNull(name, "name");
this.capabilities = ImmutableSet.copyOf(checkNotNull(capabilities, "capabilities"));
}
public String getName() {
return name;
}
public Set<? extends NetworkService.Capability> getCapabilities() {
return capabilities;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((capabilities == null) ? 0 : capabilities.hashCode());
result = prime * result + ((name == null) ? 0 : name.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;
NetworkService other = (NetworkService) obj;
if (capabilities == null) {
if (other.capabilities != null)
return false;
} else if (!capabilities.equals(other.capabilities))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "[name=" + name + ", capabilities=" + capabilities + "]";
}
}

View File

@ -0,0 +1,52 @@
/**
*
* 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.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.cloudstack.features.TemplateClient;
import com.google.common.base.CaseFormat;
/**
*
* @author Adrian Cole
* @see TemplateClient#listZones
*/
public enum NetworkType {
BASIC,
ADVANCED,
UNRECOGNIZED;
@Override
public String toString() {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name());
}
public static NetworkType fromValue(String type) {
try {
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type")));
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}

View File

@ -0,0 +1,261 @@
/**
*
* 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.cloudstack.domain;
import java.util.Date;
import java.util.Set;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
import com.google.gson.annotations.SerializedName;
/**
*
* @author Adrian Cole
*/
public class ServiceOffering {
private String id;
private String name;
@SerializedName("displaytext")
private String displayText;
private Date created;
private String domain;
@SerializedName("domainid")
private String domainId;
@SerializedName("cpunumber")
private int cpuNumber;
@SerializedName("cpuspeed")
private int cpuSpeed;
private int memory;
@SerializedName("offerha")
private boolean haSupport;
@SerializedName("storagetype")
private StorageType storageType;
private String tags;
public ServiceOffering(String id, String name, String displayText, Date created, String domain, String domainId,
int cpuNumber, int cpuSpeed, int memory, boolean haSupport, StorageType storageType, Set<String> tags) {
this.id = id;
this.name = name;
this.displayText = displayText;
this.created = created;
this.domain = domain;
this.domainId = domainId;
this.cpuNumber = cpuNumber;
this.cpuSpeed = cpuSpeed;
this.memory = memory;
this.haSupport = haSupport;
this.storageType = storageType;
this.tags = Joiner.on(',').join(tags);
}
/**
* present only for serializer
*
*/
ServiceOffering() {
}
/**
*
* @return the id of the service offering
*/
public String getId() {
return id;
}
/**
*
* @return the name of the service offering
*/
public String getName() {
return name;
}
/**
*
* @return an alternate display text of the service offering.
*/
public String getDisplayText() {
return displayText;
}
/**
*
* @return the date this service offering was created
*/
public Date getCreated() {
return created;
}
/**
*
* @return Domain name for the offering
*/
public String getDomain() {
return domain;
}
/**
*
* @return the domain id of the service offering
*/
public String getDomainId() {
return domainId;
}
/**
*
* @return the number of CPU
*/
public int getCpuNumber() {
return cpuNumber;
}
/**
*
* @return the clock rate CPU speed in Mhz
*/
public int getCpuSpeed() {
return cpuSpeed;
}
/**
*
* @return the memory in MB
*/
public int getMemory() {
return memory;
}
/**
*
* @return the ha support in the service offering
*/
public boolean supportsHA() {
return haSupport;
}
/**
*
* @return the storage type for this service offering
*/
public StorageType getStorageType() {
return storageType;
}
/**
*
* @return the tags for the service offering
*/
public Set<String> getTags() {
return tags != null ? ImmutableSet.copyOf(Splitter.on(',').split(tags)) : ImmutableSet.<String> of();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + cpuNumber;
result = prime * result + cpuSpeed;
result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result + ((displayText == null) ? 0 : displayText.hashCode());
result = prime * result + ((domain == null) ? 0 : domain.hashCode());
result = prime * result + ((domainId == null) ? 0 : domainId.hashCode());
result = prime * result + (haSupport ? 1231 : 1237);
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + memory;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((storageType == null) ? 0 : storageType.hashCode());
result = prime * result + ((tags == null) ? 0 : tags.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;
ServiceOffering other = (ServiceOffering) obj;
if (cpuNumber != other.cpuNumber)
return false;
if (cpuSpeed != other.cpuSpeed)
return false;
if (created == null) {
if (other.created != null)
return false;
} else if (!created.equals(other.created))
return false;
if (displayText == null) {
if (other.displayText != null)
return false;
} else if (!displayText.equals(other.displayText))
return false;
if (domain == null) {
if (other.domain != null)
return false;
} else if (!domain.equals(other.domain))
return false;
if (domainId == null) {
if (other.domainId != null)
return false;
} else if (!domainId.equals(other.domainId))
return false;
if (haSupport != other.haSupport)
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (memory != other.memory)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (storageType == null) {
if (other.storageType != null)
return false;
} else if (!storageType.equals(other.storageType))
return false;
if (tags == null) {
if (other.tags != null)
return false;
} else if (!tags.equals(other.tags))
return false;
return true;
}
@Override
public String toString() {
return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", created=" + created + ", cpuNumber="
+ cpuNumber + ", cpuSpeed=" + cpuSpeed + ", memory=" + memory + ", storageType=" + storageType
+ ", haSupport=" + haSupport + ", domain=" + domain + ", domainId=" + domainId + ", tags=" + tags + "]";
}
}

View File

@ -0,0 +1,52 @@
/**
*
* 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.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.cloudstack.features.OfferingClient;
import com.google.common.base.CaseFormat;
/**
*
* @author Adrian Cole
* @see OfferingClient#listServiceOfferings
*/
public enum StorageType {
LOCAL,
SHARED,
UNRECOGNIZED;
@Override
public String toString() {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name());
}
public static StorageType fromValue(String type) {
try {
return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type")));
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}

View File

@ -0,0 +1,538 @@
/**
*
* 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.cloudstack.domain;
import java.util.Date;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
/**
*
* @author Adrian Cole
*/
public class Template {
public enum Type {
USER, BUILTIN, UNRECOGNIZED;
public static Type fromValue(String type) {
try {
return valueOf(checkNotNull(type, "type"));
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}
public enum Format {
VHD, QCOW2, OVA, UNRECOGNIZED;
public static Format fromValue(String format) {
try {
return valueOf(checkNotNull(format, "format"));
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}
private String id;
@SerializedName("displaytext")
private String displayText;
private String domain;
@SerializedName("domainid")
private String domainId;
private String account;
@SerializedName("accountid")
private String accountId;
@SerializedName("zonename")
private String zone;
@SerializedName("zoneid")
private String zoneId;
@SerializedName("ostypename")
private String OSType;
@SerializedName("ostypeid")
private String OSTypeId;
private String name;
@SerializedName("templatetype")
private Type type;
private String status;
private Format format;
private String hypervisor;
private Long size;
private Date created;
private Date removed;
@SerializedName("crossZones")
private boolean crossZones;
@SerializedName("bootable")
private boolean bootable;
@SerializedName("isextractable")
private boolean extractable;
@SerializedName("isfeatured")
private boolean featured;
@SerializedName("ispublic")
private boolean ispublic;
@SerializedName("isready")
private boolean ready;
@SerializedName("passwordenabled")
private boolean passwordEnabled;
@Nullable
@SerializedName("jobid")
private String jobId;
@SerializedName("jobstatus")
private String jobStatus;
public Template(String id, String displayText, String domain, String domainId, String account, String accountId,
String zone, String zoneId, String oSType, String oSTypeId, String name, Type type, String status,
Format format, String hypervisor, Long size, Date created, Date removed, boolean crossZones,
boolean bootable, boolean extractable, boolean featured, boolean ispublic, boolean ready,
boolean passwordEnabled, String jobId, String jobStatus) {
this.id = id;
this.displayText = displayText;
this.domain = domain;
this.domainId = domainId;
this.account = account;
this.accountId = accountId;
this.zone = zone;
this.zoneId = zoneId;
this.OSType = oSType;
this.OSTypeId = oSTypeId;
this.name = name;
this.type = type;
this.status = status;
this.format = format;
this.hypervisor = hypervisor;
this.size = size;
this.created = created;
this.removed = removed;
this.crossZones = crossZones;
this.bootable = bootable;
this.extractable = extractable;
this.featured = featured;
this.ispublic = ispublic;
this.ready = ready;
this.passwordEnabled = passwordEnabled;
this.jobId = jobId;
this.jobStatus = jobStatus;
}
/**
* present only for serializer
*
*/
Template() {
}
/**
*
* @return Template id
*/
public String getId() {
return id;
}
/**
*
* @return the display text of the template
*/
public String getDisplayText() {
return displayText;
}
/**
*
* @return the name of the domain to which the template beLongs
*/
public String getDomain() {
return domain;
}
/**
*
* @return the ID of the domain to which the template beLongs
*/
public String getDomainId() {
return domainId;
}
/**
*
* @return the name of the account to which the template beLongs
*/
public String getAccount() {
return account;
}
/**
*
* @return the ID of the account to which the template beLongs
*/
public String getAccountId() {
return accountId;
}
/**
*
* @return the name of the zone to which the template beLongs
*/
public String getZone() {
return zone;
}
/**
*
* @return the ID of the zone to which the template beLongs
*/
public String getZoneId() {
return zoneId;
}
/**
*
* @return the name of the OS type to which the template beLongs
*/
public String getOSType() {
return OSType;
}
/**
*
* @return the ID of the OS type to which the template beLongs
*/
public String getOSTypeId() {
return OSTypeId;
}
/**
*
* @return Template name
*/
public String getName() {
return name;
}
/**
*
* @return
*/
public String getStatus() {
return status;
}
/**
*
* @return the format of the template.
*/
public Format getFormat() {
return format;
}
/**
*
* @return the hypervisor on which the template runs
*/
public String getHypervisor() {
return hypervisor;
}
/**
*
* @return the size of the template in kilobytes
*/
public Long getSize() {
return size;
}
/**
*
* @return the type of the template
*/
public Type getType() {
return type;
}
/**
*
* @return the date this template was created
*/
public Date getCreated() {
return created;
}
/**
*
* @return the date this template was removed
*/
public Date getRemoved() {
return removed;
}
/**
*
* @return true if the template is managed across all Zones, false otherwise
*/
public boolean isCrossZones() {
return crossZones;
}
/**
*
* @return true if the ISO is bootable, false otherwise
*/
public boolean isBootable() {
return bootable;
}
/**
*
* @return true if the template is extractable, false otherwise
*/
public boolean isExtractable() {
return extractable;
}
/**
*
* @return true if this template is a featured template, false otherwise
*/
public boolean isFeatured() {
return featured;
}
/**
*
* @return true if this template is a public template, false otherwise
*/
public boolean isPublic() {
return ispublic;
}
/**
*
* @return true if the template is ready to be deployed from, false otherwise
*/
public boolean isReady() {
return ready;
}
/**
*
* @return true if the reset password feature is enabled, false otherwise
*/
public boolean isPasswordEnabled() {
return passwordEnabled;
}
/**
*
* @return shows the current pending asynchronous job ID, or null if current pending jobs are
* acting on the template
*/
@Nullable
public String getJobId() {
return jobId;
}
/**
*
* @return shows the current pending asynchronous job status
*/
public String getJobStatus() {
return jobStatus;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((OSType == null) ? 0 : OSType.hashCode());
result = prime * result + ((OSTypeId == null) ? 0 : OSTypeId.hashCode());
result = prime * result + ((account == null) ? 0 : account.hashCode());
result = prime * result + ((accountId == null) ? 0 : accountId.hashCode());
result = prime * result + (bootable ? 1231 : 1237);
result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result + (crossZones ? 1231 : 1237);
result = prime * result + ((displayText == null) ? 0 : displayText.hashCode());
result = prime * result + ((domain == null) ? 0 : domain.hashCode());
result = prime * result + ((domainId == null) ? 0 : domainId.hashCode());
result = prime * result + (extractable ? 1231 : 1237);
result = prime * result + (featured ? 1231 : 1237);
result = prime * result + ((format == null) ? 0 : format.hashCode());
result = prime * result + ((hypervisor == null) ? 0 : hypervisor.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + (ispublic ? 1231 : 1237);
result = prime * result + ((jobId == null) ? 0 : jobId.hashCode());
result = prime * result + ((jobStatus == null) ? 0 : jobStatus.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + (passwordEnabled ? 1231 : 1237);
result = prime * result + (ready ? 1231 : 1237);
result = prime * result + ((removed == null) ? 0 : removed.hashCode());
result = prime * result + ((size == null) ? 0 : size.hashCode());
result = prime * result + ((status == null) ? 0 : status.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((zone == null) ? 0 : zone.hashCode());
result = prime * result + ((zoneId == null) ? 0 : zoneId.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;
Template other = (Template) obj;
if (OSType == null) {
if (other.OSType != null)
return false;
} else if (!OSType.equals(other.OSType))
return false;
if (OSTypeId == null) {
if (other.OSTypeId != null)
return false;
} else if (!OSTypeId.equals(other.OSTypeId))
return false;
if (account == null) {
if (other.account != null)
return false;
} else if (!account.equals(other.account))
return false;
if (accountId == null) {
if (other.accountId != null)
return false;
} else if (!accountId.equals(other.accountId))
return false;
if (bootable != other.bootable)
return false;
if (created == null) {
if (other.created != null)
return false;
} else if (!created.equals(other.created))
return false;
if (crossZones != other.crossZones)
return false;
if (displayText == null) {
if (other.displayText != null)
return false;
} else if (!displayText.equals(other.displayText))
return false;
if (domain == null) {
if (other.domain != null)
return false;
} else if (!domain.equals(other.domain))
return false;
if (domainId == null) {
if (other.domainId != null)
return false;
} else if (!domainId.equals(other.domainId))
return false;
if (extractable != other.extractable)
return false;
if (featured != other.featured)
return false;
if (format == null) {
if (other.format != null)
return false;
} else if (!format.equals(other.format))
return false;
if (hypervisor == null) {
if (other.hypervisor != null)
return false;
} else if (!hypervisor.equals(other.hypervisor))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (ispublic != other.ispublic)
return false;
if (jobId == null) {
if (other.jobId != null)
return false;
} else if (!jobId.equals(other.jobId))
return false;
if (jobStatus == null) {
if (other.jobStatus != null)
return false;
} else if (!jobStatus.equals(other.jobStatus))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (passwordEnabled != other.passwordEnabled)
return false;
if (ready != other.ready)
return false;
if (removed == null) {
if (other.removed != null)
return false;
} else if (!removed.equals(other.removed))
return false;
if (size == null) {
if (other.size != null)
return false;
} else if (!size.equals(other.size))
return false;
if (status == null) {
if (other.status != null)
return false;
} else if (!status.equals(other.status))
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
if (zone == null) {
if (other.zone != null)
return false;
} else if (!zone.equals(other.zone))
return false;
if (zoneId == null) {
if (other.zoneId != null)
return false;
} else if (!zoneId.equals(other.zoneId))
return false;
return true;
}
@Override
public String toString() {
return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", format=" + format + ", type=" + type
+ ", hypervisor=" + hypervisor + ", size=" + size + ", status=" + status + ", created=" + created
+ ", removed=" + removed + ", OSType=" + OSType + ", OSTypeId=" + OSTypeId + ", account=" + account
+ ", accountId=" + accountId + ", domain=" + domain + ", domainId=" + domainId + ", zone=" + zone
+ ", zoneId=" + zoneId + ", ready=" + ready + ", bootable=" + bootable + ", crossZones=" + crossZones
+ ", extractable=" + extractable + ", featured=" + featured + ", ispublic=" + ispublic
+ ", passwordEnabled=" + passwordEnabled + ", jobId=" + jobId + ", jobStatus=" + jobStatus + "]";
}
}

View File

@ -0,0 +1,57 @@
/**
*
* 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.cloudstack.domain;
import org.jclouds.cloudstack.features.TemplateClient;
import com.google.common.base.CaseFormat;
/**
*
* @author Adrian Cole
* @see TemplateClient#listTemplates
*/
public enum TemplateFilter {
/**
* templates that are featured and are public
*/
FEATURED,
/**
* templates that have been registered/created by the owner
*/
SELF,
/**
* templates that have been registered/created by the owner that can be used to deploy a new VM
*/
SELF_EXECUTABLE,
/**
* all templates that can be used to deploy a new VM
*/
EXECUTABLE,
/**
* templates that are public
*/
COMMUNITY;
@Override
public String toString() {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, name());
}
}

View File

@ -0,0 +1,67 @@
/**
*
* 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.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.CaseFormat;
/**
*
* @author Adrian Cole
* @see NetworkOfferingClient#listNetworkOfferings
*/
public enum TrafficType {
/**
* traffic to the public internet
*/
PUBLIC,
/**
* VM-to-VM traffic and VMs are assigned a virtual IP created by CloudStack
*/
GUEST,
/**
* System network that only Admin can view, and only when isSystem is specified.
*/
STORAGE,
/**
* System network that only Admin can view, and only when isSystem is specified.
*/
MANAGEMENT,
/**
* System network that only Admin can view, and only when isSystem is specified.
*/
CONTROL,
UNRECOGNIZED;
@Override
public String toString() {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name());
}
public static TrafficType fromValue(String type) {
try {
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type")));
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}

View File

@ -0,0 +1,306 @@
/**
*
* 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.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.List;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;
import com.google.gson.annotations.SerializedName;
/**
*
* @author Adrian Cole
*/
public class Zone {
private String id;
private String description;
@SerializedName("displaytext")
private String displayText;
@SerializedName("dns1")
private String DNS1;
@SerializedName("dns2")
private String DNS2;
private String domain;
@Nullable
@SerializedName("domainid")
private String domainId;
@SerializedName("guestcidraddress")
private String guestCIDRAddress;
@SerializedName("internaldns1")
private String internalDNS1;
@SerializedName("internaldns2")
private String internalDNS2;
private String name;
@SerializedName("networktype")
private NetworkType networkType;
private String status;
@SerializedName("vlan")
private String VLAN;
/**
* present only for serializer
*
*/
Zone() {
}
public Zone(String id, String description, String displayText, List<String> DNS, String domain, String domainId,
String guestCIDRAddress, List<String> internalDNS, String name, NetworkType networkType, String status,
String vLAN) {
this.id = id;
this.description = description;
this.displayText = displayText;
this.DNS1 = checkNotNull(DNS, "DNS").size() > 0 ? DNS.get(0) : null;
this.DNS2 = DNS.size() > 1 ? DNS.get(1) : null;
this.domain = domain;
this.domainId = domainId;
this.guestCIDRAddress = guestCIDRAddress;
this.internalDNS1 = checkNotNull(internalDNS, "internalDNS").size() > 0 ? internalDNS.get(0) : null;
this.internalDNS2 = internalDNS.size() > 1 ? internalDNS.get(1) : null;
this.name = name;
this.networkType = networkType;
this.status = status;
this.VLAN = vLAN;
}
/**
*
* @return Zone id
*/
public String getId() {
return id;
}
/**
*
* @return Zone description
*/
public String getDescription() {
return description;
}
/**
*
* @return the display text of the zone
*/
public String getDisplayText() {
return displayText;
}
/**
*
* @return the external DNS for the Zone
*/
public List<String> getDNS() {
Builder<String> builder = ImmutableList.builder();
if (DNS1 != null && !"".equals(DNS1))
builder.add(DNS1);
if (DNS2 != null && !"".equals(DNS2))
builder.add(DNS2);
return builder.build();
}
/**
*
* @return Domain name for the Vms in the zone
*/
public String getDomain() {
return domain;
}
/**
*
* @return the ID of the containing domain, null for public zones
*/
@Nullable
public String getDomainId() {
return domainId;
}
/**
*
* @return the guest CIDR address for the Zone
*/
public String getGuestCIDRAddress() {
return guestCIDRAddress;
}
/**
*
* @return the internal DNS for the Zone
*/
public List<String> getInternalDNS() {
Builder<String> builder = ImmutableList.builder();
if (internalDNS1 != null && !"".equals(internalDNS1))
builder.add(internalDNS1);
if (internalDNS2 != null && !"".equals(internalDNS2))
builder.add(internalDNS2);
return builder.build();
}
/**
*
* @return Zone name
*/
public String getName() {
return name;
}
/**
*
* @return the network type of the zone; can be Basic or Advanced
*/
public NetworkType getNetworkType() {
return networkType;
}
/**
*
* @return
*/
public String getStatus() {
return status;
}
/**
*
* @return the vlan range of the zone
*/
public String getVLAN() {
return VLAN;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((DNS1 == null) ? 0 : DNS1.hashCode());
result = prime * result + ((DNS2 == null) ? 0 : DNS2.hashCode());
result = prime * result + ((VLAN == null) ? 0 : VLAN.hashCode());
result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((displayText == null) ? 0 : displayText.hashCode());
result = prime * result + ((domain == null) ? 0 : domain.hashCode());
result = prime * result + ((domainId == null) ? 0 : domainId.hashCode());
result = prime * result + ((guestCIDRAddress == null) ? 0 : guestCIDRAddress.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((internalDNS1 == null) ? 0 : internalDNS1.hashCode());
result = prime * result + ((internalDNS2 == null) ? 0 : internalDNS2.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((networkType == null) ? 0 : networkType.hashCode());
result = prime * result + ((status == null) ? 0 : status.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;
Zone other = (Zone) obj;
if (DNS1 == null) {
if (other.DNS1 != null)
return false;
} else if (!DNS1.equals(other.DNS1))
return false;
if (DNS2 == null) {
if (other.DNS2 != null)
return false;
} else if (!DNS2.equals(other.DNS2))
return false;
if (VLAN == null) {
if (other.VLAN != null)
return false;
} else if (!VLAN.equals(other.VLAN))
return false;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
if (displayText == null) {
if (other.displayText != null)
return false;
} else if (!displayText.equals(other.displayText))
return false;
if (domain == null) {
if (other.domain != null)
return false;
} else if (!domain.equals(other.domain))
return false;
if (domainId == null) {
if (other.domainId != null)
return false;
} else if (!domainId.equals(other.domainId))
return false;
if (guestCIDRAddress == null) {
if (other.guestCIDRAddress != null)
return false;
} else if (!guestCIDRAddress.equals(other.guestCIDRAddress))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (internalDNS1 == null) {
if (other.internalDNS1 != null)
return false;
} else if (!internalDNS1.equals(other.internalDNS1))
return false;
if (internalDNS2 == null) {
if (other.internalDNS2 != null)
return false;
} else if (!internalDNS2.equals(other.internalDNS2))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (networkType == null) {
if (other.networkType != null)
return false;
} else if (!networkType.equals(other.networkType))
return false;
if (status == null) {
if (other.status != null)
return false;
} else if (!status.equals(other.status))
return false;
return true;
}
@Override
public String toString() {
return "[id=" + id + ", status=" + status + ", name=" + name + ", description=" + description + ", displayText="
+ displayText + ", domain=" + domain + ", domainId=" + domainId + ", networkType=" + networkType
+ ", guestCIDRAddress=" + guestCIDRAddress + ", VLAN=" + VLAN + ", DNS=" + getDNS() + ", internalDNS="
+ getInternalDNS() + "]";
}
}

View File

@ -0,0 +1,73 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.jclouds.cloudstack.domain.Network;
import org.jclouds.cloudstack.filters.QuerySigner;
import org.jclouds.cloudstack.options.ListNetworksOptions;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.Unwrap;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides asynchronous access to cloudstack via their REST API.
* <p/>
*
* @see NetworkClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@RequestFilters(QuerySigner.class)
@QueryParams(keys = "response", values = "json")
public interface NetworkAsyncClient {
/**
* @see NetworkClient#listNetworks
*/
@GET
@QueryParams(keys = "command", values = "listNetworks")
@Unwrap(depth = 2)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<Network>> listNetworks(ListNetworksOptions... options);
/**
* @see NetworkClient#getNetwork
*/
@GET
@QueryParams(keys = "command", values = "listNetworks")
@Unwrap(depth = 3, edgeCollection = Set.class)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<Network> getNetwork(@QueryParam("id") String id);
}

View File

@ -0,0 +1,57 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.jclouds.cloudstack.domain.Network;
import org.jclouds.cloudstack.options.ListNetworksOptions;
import org.jclouds.concurrent.Timeout;
/**
* Provides synchronous access to CloudStack network features.
* <p/>
*
* @see NetworkAsyncClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
public interface NetworkClient {
/**
* Lists networks
*
* @param options
* if present, how to constrain the list.
* @return networks matching query, or empty set, if no networks are found
*/
Set<Network> listNetworks(ListNetworksOptions... options);
/**
* get a specific network by id
*
* @param id
* network to get
* @return network or null if not found
*/
Network getNetwork(String id);
}

View File

@ -0,0 +1,117 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.jclouds.cloudstack.domain.DiskOffering;
import org.jclouds.cloudstack.domain.NetworkOffering;
import org.jclouds.cloudstack.domain.ServiceOffering;
import org.jclouds.cloudstack.filters.QuerySigner;
import org.jclouds.cloudstack.options.ListDiskOfferingsOptions;
import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions;
import org.jclouds.cloudstack.options.ListServiceOfferingsOptions;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.Unwrap;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides asynchronous access to cloudstack via their REST API.
* <p/>
*
* @see OfferingClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@RequestFilters(QuerySigner.class)
@QueryParams(keys = "response", values = "json")
public interface OfferingAsyncClient {
/**
* @see OfferingClient#listServiceOfferings
*/
@GET
@QueryParams(keys = "command", values = "listServiceOfferings")
@Unwrap(depth = 2)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<ServiceOffering>> listServiceOfferings(ListServiceOfferingsOptions... options);
/**
* @see OfferingClient#getServiceOffering
*/
@GET
@QueryParams(keys = "command", values = "listServiceOfferings")
@Unwrap(depth = 3, edgeCollection = Set.class)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<ServiceOffering> getServiceOffering(@QueryParam("id") String id);
/**
* @see OfferingClient#listDiskOfferings
*/
@GET
@QueryParams(keys = "command", values = "listDiskOfferings")
@Unwrap(depth = 2)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<DiskOffering>> listDiskOfferings(ListDiskOfferingsOptions... options);
/**
* @see OfferingClient#getDiskOffering
*/
@GET
@QueryParams(keys = "command", values = "listDiskOfferings")
@Unwrap(depth = 3, edgeCollection = Set.class)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<DiskOffering> getDiskOffering(@QueryParam("id") String id);
/**
* @see NetworkOfferingClient#listNetworkOfferings
*/
@GET
@QueryParams(keys = "command", values = "listNetworkOfferings")
@Unwrap(depth = 2)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<NetworkOffering>> listNetworkOfferings(ListNetworkOfferingsOptions... options);
/**
* @see NetworkOfferingClient#getNetworkOffering
*/
@GET
@QueryParams(keys = "command", values = "listNetworkOfferings")
@Unwrap(depth = 3, edgeCollection = Set.class)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<NetworkOffering> getNetworkOffering(@QueryParam("id") String id);
}

View File

@ -0,0 +1,96 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.jclouds.cloudstack.domain.DiskOffering;
import org.jclouds.cloudstack.domain.NetworkOffering;
import org.jclouds.cloudstack.domain.ServiceOffering;
import org.jclouds.cloudstack.options.ListDiskOfferingsOptions;
import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions;
import org.jclouds.cloudstack.options.ListServiceOfferingsOptions;
import org.jclouds.concurrent.Timeout;
/**
* Provides synchronous access to CloudStack zone features.
* <p/>
*
* @see OfferingAsyncClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
public interface OfferingClient {
/**
* Lists service offerings
*
* @param options
* if present, how to constrain the list.
* @return service offerings matching query, or empty set, if no service offerings are found
*/
Set<ServiceOffering> listServiceOfferings(ListServiceOfferingsOptions... options);
/**
* get a specific service offering by id
*
* @param id
* offering to get
* @return service offering or null if not found
*/
ServiceOffering getServiceOffering(String id);
/**
* Lists disk offerings
*
* @param options
* if present, how to constrain the list.
* @return disk offerings matching query, or empty set, if no disk offerings are found
*/
Set<DiskOffering> listDiskOfferings(ListDiskOfferingsOptions... options);
/**
* get a specific disk offering by id
*
* @param id
* offering to get
* @return disk offering or null if not found
*/
DiskOffering getDiskOffering(String id);
/**
* Lists service offerings
*
* @param options
* if present, how to constrain the list.
* @return service offerings matching query, or empty set, if no service offerings are found
*/
Set<NetworkOffering> listNetworkOfferings(ListNetworkOfferingsOptions... options);
/**
* get a specific service offering by id
*
* @param id
* offering to get
* @return service offering or null if not found
*/
NetworkOffering getNetworkOffering(String id);
}

View File

@ -0,0 +1,83 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.jclouds.cloudstack.domain.Template;
import org.jclouds.cloudstack.filters.QuerySigner;
import org.jclouds.cloudstack.options.ListTemplatesOptions;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.Unwrap;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides asynchronous access to cloudstack via their REST API.
* <p/>
*
* @see TemplateClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@RequestFilters(QuerySigner.class)
@QueryParams(keys = "response", values = "json")
public interface TemplateAsyncClient {
/**
* @see TemplateClient#listTemplates
*/
@GET
@QueryParams(keys = { "command", "templatefilter" }, values = { "listTemplates", "executable" })
@Unwrap(depth = 2)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<Template>> listTemplates();
/**
* @see TemplateClient#listTemplates(ListTemplatesOptions)
*/
@GET
@QueryParams(keys = "command", values = "listTemplates")
@Unwrap(depth = 2)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<Template>> listTemplates(ListTemplatesOptions options);
/**
* @see TemplateClient#getTemplate
*/
@GET
@QueryParams(keys = { "command", "templatefilter" }, values = { "listTemplates", "executable" })
@Unwrap(depth = 3, edgeCollection = Set.class)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<Template> getTemplate(@QueryParam("id") String id);
}

View File

@ -0,0 +1,65 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.jclouds.cloudstack.domain.Template;
import org.jclouds.cloudstack.domain.TemplateFilter;
import org.jclouds.cloudstack.options.ListTemplatesOptions;
import org.jclouds.concurrent.Timeout;
/**
* Provides synchronous access to CloudStack template features.
* <p/>
*
* @see TemplateAsyncClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
public interface TemplateClient {
/**
* List all executable templates.
*
* @return all executable templates, or empty set, if no templates are found
*/
Set<Template> listTemplates();
/**
* List all public, private, and privileged templates.
*
* @param options
* if present, how to constrain the list, defaults to all executable templates
* @return templates matching query, or empty set, if no templates are found
* @see TemplateFilter
*/
Set<Template> listTemplates(ListTemplatesOptions options);
/**
* get a specific template by id
*
* @param id
* template to get
* @return template or null if not found
*/
Template getTemplate(String id);
}

View File

@ -0,0 +1,73 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.jclouds.cloudstack.domain.Zone;
import org.jclouds.cloudstack.filters.QuerySigner;
import org.jclouds.cloudstack.options.ListZonesOptions;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.Unwrap;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import com.google.common.util.concurrent.ListenableFuture;
/**
* Provides asynchronous access to cloudstack via their REST API.
* <p/>
*
* @see ZoneClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@RequestFilters(QuerySigner.class)
@QueryParams(keys = "response", values = "json")
public interface ZoneAsyncClient {
/**
* @see ZoneClient#listZones
*/
@GET
@QueryParams(keys = "command", values = "listZones")
@Unwrap(depth = 2)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<Zone>> listZones(ListZonesOptions... options);
/**
* @see ZoneClient#getZone
*/
@GET
@QueryParams(keys = "command", values = "listZones")
@Unwrap(depth = 3, edgeCollection = Set.class)
@Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<Zone> getZone(@QueryParam("id") String id);
}

View File

@ -0,0 +1,56 @@
/**
*
* 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.cloudstack.features;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.jclouds.cloudstack.domain.Zone;
import org.jclouds.cloudstack.options.ListZonesOptions;
import org.jclouds.concurrent.Timeout;
/**
* Provides synchronous access to CloudStack zone features.
* <p/>
*
* @see ZoneAsyncClient
* @see <a href="http://download.cloud.com/releases/2.2/api/TOC_User.html" />
* @author Adrian Cole
*/
@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
public interface ZoneClient {
/**
* Lists zones
*
* @param options
* if present, how to constrain the list.
* @return zones matching query, or empty set, if no zones are found
*/
Set<Zone> listZones(ListZonesOptions... options);
/**
* get a specific zone by id
*
* @param id
* zone to get
* @return zone or null if not found
*/
Zone getZone(String id);
}

View File

@ -0,0 +1,144 @@
/**
*
* 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.cloudstack.filters;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.ws.rs.core.UriBuilder;
import org.jclouds.Constants;
import org.jclouds.crypto.Crypto;
import org.jclouds.crypto.CryptoStreams;
import org.jclouds.http.HttpException;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.HttpUtils;
import org.jclouds.http.internal.SignatureWire;
import org.jclouds.http.utils.ModifyRequest;
import org.jclouds.io.InputSuppliers;
import org.jclouds.logging.Logger;
import org.jclouds.rest.RequestSigner;
import org.jclouds.util.Strings2;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import com.google.common.collect.ImmutableMultimap.Builder;
/**
*
* @see <a href= "http://download.cloud.com/releases/2.2/api/user/2.2api_security_details.html" />
* @author Adrian Cole
*
*/
@Singleton
public class QuerySigner implements HttpRequestFilter, RequestSigner {
private final SignatureWire signatureWire;
private final String accessKey;
private final String secretKey;
private final Crypto crypto;
private final HttpUtils utils;
private final Provider<UriBuilder> builder;
@Resource
@Named(Constants.LOGGER_SIGNATURE)
private Logger signatureLog = Logger.NULL;
@Inject
public QuerySigner(SignatureWire signatureWire, @Named(Constants.PROPERTY_IDENTITY) String accessKey,
@Named(Constants.PROPERTY_CREDENTIAL) String secretKey, Crypto crypto, HttpUtils utils,
Provider<UriBuilder> builder) {
this.signatureWire = signatureWire;
this.accessKey = accessKey;
this.secretKey = secretKey;
this.crypto = crypto;
this.utils = utils;
this.builder = builder;
}
public HttpRequest filter(HttpRequest request) throws HttpException {
checkNotNull(request, "request must be present");
Multimap<String, String> decodedParams = ModifyRequest.parseQueryToMap(request.getEndpoint().getQuery());
addSigningParams(decodedParams);
String stringToSign = createStringToSign(request, decodedParams);
String signature = sign(stringToSign);
addSignature(decodedParams, signature);
request = request.toBuilder().endpoint(
builder.get().uri(request.getEndpoint()).replaceQuery(ModifyRequest.makeQueryLine(decodedParams, null))
.build()).build();
utils.logRequest(signatureLog, request, "<<");
return request;
}
@VisibleForTesting
void addSignature(Multimap<String, String> params, String signature) {
params.replaceValues("signature", ImmutableList.of(signature));
}
@VisibleForTesting
public String sign(String stringToSign) {
String signature;
try {
signature = CryptoStreams.base64(CryptoStreams.mac(InputSuppliers.of(stringToSign), crypto.hmacSHA1(secretKey
.getBytes())));
if (signatureWire.enabled())
signatureWire.input(Strings2.toInputStream(signature));
} catch (Exception e) {
throw new HttpException("error signing request", e);
}
return signature;
}
@VisibleForTesting
public String createStringToSign(HttpRequest request, Multimap<String, String> decodedParams) {
utils.logRequest(signatureLog, request, ">>");
Builder<String, String> builder = ImmutableMultimap.<String, String> builder();
for (String key : ImmutableSortedSet.copyOf(decodedParams.keySet()))
builder.put(key.toLowerCase(), Iterables.getOnlyElement(decodedParams.get(key)).toLowerCase());
String stringToSign = ModifyRequest.makeQueryLine(builder.build(), null);
if (signatureWire.enabled())
signatureWire.output(stringToSign);
return stringToSign;
}
@VisibleForTesting
void addSigningParams(Multimap<String, String> params) {
params.replaceValues("apiKey", ImmutableList.of(accessKey));
params.removeAll("signature");
}
public String createStringToSign(HttpRequest input) {
Multimap<String, String> decodedParams = ModifyRequest.parseQueryToMap(input.getEndpoint().getQuery());
addSigningParams(decodedParams);
return createStringToSign(input, decodedParams);
}
}

View File

@ -0,0 +1,98 @@
/**
*
* 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.cloudstack.handlers;
import java.io.IOException;
import javax.annotation.Resource;
import javax.inject.Singleton;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpErrorHandler;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.HttpResponseException;
import org.jclouds.logging.Logger;
import org.jclouds.rest.AuthorizationException;
import org.jclouds.rest.ResourceNotFoundException;
import org.jclouds.util.Strings2;
import com.google.common.base.Throwables;
import com.google.common.io.Closeables;
/**
*
* @author Adrian Cole
*
*/
@Singleton
public class CloudStackErrorHandler implements HttpErrorHandler {
@Resource
protected Logger logger = Logger.NULL;
public void handleError(HttpCommand command, HttpResponse response) {
// it is important to always read fully and close streams
String message = parseMessage(response);
Exception exception = message != null ? new HttpResponseException(command, response, message)
: new HttpResponseException(command, response);
try {
message = message != null ? message : String.format("%s -> %s", command.getCurrentRequest().getRequestLine(),
response.getStatusLine());
switch (response.getStatusCode()) {
case 400:
exception = new IllegalArgumentException(message, exception);
break;
case 401:
exception = new AuthorizationException(message, exception);
break;
case 404:
if (!command.getCurrentRequest().getMethod().equals("DELETE")) {
exception = new ResourceNotFoundException(message, exception);
}
break;
case 405:
exception = new IllegalArgumentException(message, exception);
break;
case 409:
exception = new IllegalStateException(message, exception);
break;
}
} finally {
if (response.getPayload() != null)
Closeables.closeQuietly(response.getPayload().getInput());
command.setException(exception);
}
}
public String parseMessage(HttpResponse response) {
if (response.getPayload() == null)
return null;
try {
return Strings2.toStringAndClose(response.getPayload().getInput());
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
response.getPayload().getInput().close();
} catch (IOException e) {
Throwables.propagate(e);
}
}
}
}

View File

@ -0,0 +1,90 @@
/**
*
* 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.cloudstack.options;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.collect.ImmutableSet;
/**
* Options used to control what disk offerings are returned
*
* @see <a href="http://download.cloud.com/releases/2.2/api/user/listDiskOfferings.html" />
* @author Adrian Cole
*/
public class ListDiskOfferingsOptions extends BaseHttpRequestOptions {
public static final ListDiskOfferingsOptions NONE = new ListDiskOfferingsOptions();
/**
* @param id
* the ID of the disk offering
*/
public ListDiskOfferingsOptions id(String id) {
this.queryParameters.replaceValues("id", ImmutableSet.of(id));
return this;
}
/**
* @param domainId
* the ID of the domain associated with the disk offering
*/
public ListDiskOfferingsOptions domainId(String domainId) {
this.queryParameters.replaceValues("domainid", ImmutableSet.of(domainId));
return this;
}
/**
* @param name
* the disk offering name
*/
public ListDiskOfferingsOptions name(String name) {
this.queryParameters.replaceValues("name", ImmutableSet.of(name));
return this;
}
public static class Builder {
/**
* @see ListDiskOfferingsOptions#name
*/
public static ListDiskOfferingsOptions name(String name) {
ListDiskOfferingsOptions options = new ListDiskOfferingsOptions();
return options.name(name);
}
/**
* @see ListDiskOfferingsOptions#domainId
*/
public static ListDiskOfferingsOptions domainId(String id) {
ListDiskOfferingsOptions options = new ListDiskOfferingsOptions();
return options.domainId(id);
}
/**
* @see ListDiskOfferingsOptions#id
*/
public static ListDiskOfferingsOptions id(String id) {
ListDiskOfferingsOptions options = new ListDiskOfferingsOptions();
return options.id(id);
}
}
}

View File

@ -0,0 +1,175 @@
/**
*
* 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.cloudstack.options;
import org.jclouds.cloudstack.domain.TrafficType;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.collect.ImmutableSet;
/**
* Options used to control what network offerings are returned
*
* @see <a href="http://download.cloud.com/releases/2.2/api/user/listNetworkOfferings.html" />
* @author Adrian Cole
*/
public class ListNetworkOfferingsOptions extends BaseHttpRequestOptions {
public static final ListNetworkOfferingsOptions NONE = new ListNetworkOfferingsOptions();
/**
* @param id
* the ID of the network offering
*/
public ListNetworkOfferingsOptions id(String id) {
this.queryParameters.replaceValues("id", ImmutableSet.of(id));
return this;
}
/**
* @param name
* the network offering name
*/
public ListNetworkOfferingsOptions name(String name) {
this.queryParameters.replaceValues("name", ImmutableSet.of(name));
return this;
}
/**
* @param displayText
* network offerings by display text
*/
public ListNetworkOfferingsOptions displayText(String displayText) {
this.queryParameters.replaceValues("displaytext", ImmutableSet.of(displayText));
return this;
}
/**
* @param availability
* the availability of network offering. Default value is Required
*/
public ListNetworkOfferingsOptions availability(String availability) {
this.queryParameters.replaceValues("availability", ImmutableSet.of(availability));
return this;
}
/**
* @param isDefault
* true if network offering is default, false otherwise
*/
public ListNetworkOfferingsOptions isDefault(boolean isDefault) {
this.queryParameters.replaceValues("isdefault", ImmutableSet.of(isDefault + ""));
return this;
}
/**
* @param isShared
* true if network offering is shared, false otherwise
*/
public ListNetworkOfferingsOptions isShared(boolean isShared) {
this.queryParameters.replaceValues("isshared", ImmutableSet.of(isShared + ""));
return this;
}
/**
* @param specifyVLAN
* True if we allow the network supports vlan, false otherwise. If you create network
* using this offering, you must specify vlan.
*/
public ListNetworkOfferingsOptions specifyVLAN(boolean specifyVLAN) {
this.queryParameters.replaceValues("specifyvlan", ImmutableSet.of(specifyVLAN + ""));
return this;
}
/**
* @param trafficType
* type of the traffic
*/
public ListNetworkOfferingsOptions trafficType(TrafficType trafficType) {
this.queryParameters.replaceValues("traffictype", ImmutableSet.of(trafficType.toString()));
return this;
}
public static class Builder {
/**
* @see ListNetworkOfferingsOptions#specifyVLAN
*/
public static ListNetworkOfferingsOptions specifyVLAN(boolean specifyVLAN) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.specifyVLAN(specifyVLAN);
}
/**
* @see ListNetworkOfferingsOptions#isDefault
*/
public static ListNetworkOfferingsOptions isDefault(boolean isDefault) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.isDefault(isDefault);
}
/**
* @see ListNetworkOfferingsOptions#isShared
*/
public static ListNetworkOfferingsOptions isShared(boolean isShared) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.isShared(isShared);
}
/**
* @see ListNetworkOfferingsOptions#displayText
*/
public static ListNetworkOfferingsOptions displayText(String displayText) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.displayText(displayText);
}
/**
* @see ListNetworkOfferingsOptions#name
*/
public static ListNetworkOfferingsOptions name(String name) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.name(name);
}
/**
* @see ListNetworkOfferingsOptions#availability
*/
public static ListNetworkOfferingsOptions availability(String availability) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.availability(availability);
}
/**
* @see ListNetworkOfferingsOptions#id
*/
public static ListNetworkOfferingsOptions id(String id) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.id(id);
}
/**
* @see ListNetworkOfferingsOptions#trafficType
*/
public static ListNetworkOfferingsOptions trafficType(TrafficType trafficType) {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions();
return options.trafficType(trafficType);
}
}
}

View File

@ -0,0 +1,197 @@
/**
*
* 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.cloudstack.options;
import org.jclouds.cloudstack.domain.NetworkType;
import org.jclouds.cloudstack.domain.TrafficType;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.collect.ImmutableSet;
/**
* Options used to control what networks information is returned
*
* @see <a href="http://download.cloud.com/releases/2.2/api/user/listNetworks.html" />
* @author Adrian Cole
*/
public class ListNetworksOptions extends BaseHttpRequestOptions {
public static final ListNetworksOptions NONE = new ListNetworksOptions();
/**
* @param isDefault
* true if network is default, false otherwise
*/
public ListNetworksOptions isDefault(boolean isDefault) {
this.queryParameters.replaceValues("isdefault", ImmutableSet.of(isDefault + ""));
return this;
}
/**
* @param isShared
* true if network is shared, false otherwise
*/
public ListNetworksOptions isShared(boolean isShared) {
this.queryParameters.replaceValues("isshared", ImmutableSet.of(isShared + ""));
return this;
}
/**
* @param isSystem
* true if network is system, false otherwise
*/
public ListNetworksOptions isSystem(boolean isSystem) {
this.queryParameters.replaceValues("issystem", ImmutableSet.of(isSystem + ""));
return this;
}
/**
* @param type
* the type of the network
*/
public ListNetworksOptions type(NetworkType type) {
this.queryParameters.replaceValues("type", ImmutableSet.of(type.toString()));
return this;
}
/**
* @param id
* list networks by id
*/
public ListNetworksOptions id(String id) {
this.queryParameters.replaceValues("id", ImmutableSet.of(id));
return this;
}
/**
*
* @param account
* account who will own the VLAN. If VLAN is Zone wide, this parameter should be
* ommited
*/
public ListNetworksOptions account(String account) {
this.queryParameters.replaceValues("account", ImmutableSet.of(account));
return this;
}
/**
* @param domainId
* domain ID of the account owning a VLAN
*/
public ListNetworksOptions domainId(String domainId) {
this.queryParameters.replaceValues("domainid", ImmutableSet.of(domainId));
return this;
}
/**
* @param zoneId
* the Zone ID of the network
*/
public ListNetworksOptions zoneId(String zoneId) {
this.queryParameters.replaceValues("zoneid", ImmutableSet.of(zoneId));
return this;
}
/**
* @param trafficType
* type of the traffic
*/
public ListNetworksOptions trafficType(TrafficType trafficType) {
this.queryParameters.replaceValues("traffictype", ImmutableSet.of(trafficType.toString()));
return this;
}
public static class Builder {
/**
* @see ListNetworksOptions#isDefault
*/
public static ListNetworksOptions isDefault(boolean isDefault) {
ListNetworksOptions options = new ListNetworksOptions();
return options.isDefault(isDefault);
}
/**
* @see ListNetworksOptions#isShared
*/
public static ListNetworksOptions isShared(boolean isShared) {
ListNetworksOptions options = new ListNetworksOptions();
return options.isShared(isShared);
}
/**
* @see ListNetworksOptions#isSystem
*/
public static ListNetworksOptions isSystem(boolean isSystem) {
ListNetworksOptions options = new ListNetworksOptions();
return options.isSystem(isSystem);
}
/**
* @see ListNetworksOptions#type
*/
public static ListNetworksOptions type(NetworkType type) {
ListNetworksOptions options = new ListNetworksOptions();
return options.type(type);
}
/**
* @see ListNetworksOptions#domainId
*/
public static ListNetworksOptions domainId(String id) {
ListNetworksOptions options = new ListNetworksOptions();
return options.domainId(id);
}
/**
* @see ListNetworksOptions#account
*/
public static ListNetworksOptions account(String account) {
ListNetworksOptions options = new ListNetworksOptions();
return options.account(account);
}
/**
* @see ListNetworksOptions#id
*/
public static ListNetworksOptions id(String id) {
ListNetworksOptions options = new ListNetworksOptions();
return options.id(id);
}
/**
* @see ListNetworksOptions#zoneId
*/
public static ListNetworksOptions zoneId(String id) {
ListNetworksOptions options = new ListNetworksOptions();
return options.zoneId(id);
}
/**
* @see ListNetworksOptions#trafficType
*/
public static ListNetworksOptions trafficType(TrafficType trafficType) {
ListNetworksOptions options = new ListNetworksOptions();
return options.trafficType(trafficType);
}
}
}

View File

@ -0,0 +1,109 @@
/**
*
* 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.cloudstack.options;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.collect.ImmutableSet;
/**
* Options used to control what service offerings are returned
*
* @see <a href="http://download.cloud.com/releases/2.2/api/user/listServiceOfferings.html" />
* @author Adrian Cole
*/
public class ListServiceOfferingsOptions extends BaseHttpRequestOptions {
public static final ListServiceOfferingsOptions NONE = new ListServiceOfferingsOptions();
/**
* @param id
* the ID of the service offering
*/
public ListServiceOfferingsOptions id(String id) {
this.queryParameters.replaceValues("id", ImmutableSet.of(id));
return this;
}
/**
* @param domainId
* the ID of the domain associated with the service offering
*/
public ListServiceOfferingsOptions domainId(String domainId) {
this.queryParameters.replaceValues("domainid", ImmutableSet.of(domainId));
return this;
}
/**
* @param name
* the service offering name
*/
public ListServiceOfferingsOptions name(String name) {
this.queryParameters.replaceValues("name", ImmutableSet.of(name));
return this;
}
/**
* @param virtualMachineId
* the ID of the virtual machine. Pass this in if you want to see the available service
* offering that a virtual machine can be changed to.
*/
public ListServiceOfferingsOptions virtualMachineId(String virtualMachineId) {
this.queryParameters.replaceValues("virtualmachineid", ImmutableSet.of(virtualMachineId));
return this;
}
public static class Builder {
/**
* @see ListServiceOfferingsOptions#name
*/
public static ListServiceOfferingsOptions name(String name) {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions();
return options.name(name);
}
/**
* @see ListServiceOfferingsOptions#domainId
*/
public static ListServiceOfferingsOptions domainId(String id) {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions();
return options.domainId(id);
}
/**
* @see ListServiceOfferingsOptions#id
*/
public static ListServiceOfferingsOptions id(String id) {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions();
return options.id(id);
}
/**
* @see ListServiceOfferingsOptions#virtualMachineId
*/
public static ListServiceOfferingsOptions virtualMachineId(String virtualMachineId) {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions();
return options.virtualMachineId(virtualMachineId);
}
}
}

View File

@ -0,0 +1,168 @@
/**
*
* 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.cloudstack.options;
import org.jclouds.cloudstack.domain.TemplateFilter;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.collect.ImmutableSet;
/**
* Options used to control what templates information is returned
*
* @see <a href="http://download.cloud.com/releases/2.2/api/user/listTemplates.html" />
* @author Adrian Cole
*/
public class ListTemplatesOptions extends BaseHttpRequestOptions {
public ListTemplatesOptions() {
filter(TemplateFilter.EXECUTABLE);
}
public static final ListTemplatesOptions NONE = new ListTemplatesOptions();
/**
* @param filter
* how to constrain the list
*/
public ListTemplatesOptions filter(TemplateFilter filter) {
this.queryParameters.replaceValues("templatefilter", ImmutableSet.of(filter.toString()));
return this;
}
/**
* @param id
* the template ID
*/
public ListTemplatesOptions id(String id) {
this.queryParameters.replaceValues("id", ImmutableSet.of(id));
return this;
}
/**
*
* @param account
* account id
* @param domain
* domain id
*/
public ListTemplatesOptions accountInDomain(String account, String domain) {
this.queryParameters.replaceValues("account", ImmutableSet.of(account));
return domainId(domain);
}
/**
* @param name
* the template name
*/
public ListTemplatesOptions name(String name) {
this.queryParameters.replaceValues("name", ImmutableSet.of(name));
return this;
}
/**
* @param domainId
* list all templates in specified domain. If used with the account parameter, lists
* all templates for an account in the specified domain.
*/
public ListTemplatesOptions domainId(String domainId) {
this.queryParameters.replaceValues("domainid", ImmutableSet.of(domainId));
return this;
}
/**
* @param zoneId
* list templates by zoneId.
*/
public ListTemplatesOptions zoneId(String zoneId) {
this.queryParameters.replaceValues("zoneid", ImmutableSet.of(zoneId));
return this;
}
/**
* @param hypervisor
* the hypervisor for which to restrict the search
*/
public ListTemplatesOptions hypervisor(String hypervisor) {
this.queryParameters.replaceValues("hypervisor", ImmutableSet.of(hypervisor));
return this;
}
public static class Builder {
/**
* @see ListTemplatesOptions#filter
*/
public static ListTemplatesOptions filter(TemplateFilter filter) {
ListTemplatesOptions options = new ListTemplatesOptions();
return options.filter(filter);
}
/**
* @see ListTemplatesOptions#domainId
*/
public static ListTemplatesOptions domainId(String id) {
ListTemplatesOptions options = new ListTemplatesOptions();
return options.domainId(id);
}
/**
* @see ListTemplatesOptions#accountInDomain
*/
public static ListTemplatesOptions accountInDomain(String account, String domain) {
ListTemplatesOptions options = new ListTemplatesOptions();
return options.accountInDomain(account, domain);
}
/**
* @see ListTemplatesOptions#id
*/
public static ListTemplatesOptions id(String id) {
ListTemplatesOptions options = new ListTemplatesOptions();
return options.id(id);
}
/**
* @see ListTemplatesOptions#name
*/
public static ListTemplatesOptions name(String name) {
ListTemplatesOptions options = new ListTemplatesOptions();
return options.name(name);
}
/**
* @see ListTemplatesOptions#zoneId
*/
public static ListTemplatesOptions zoneId(String id) {
ListTemplatesOptions options = new ListTemplatesOptions();
return options.zoneId(id);
}
/**
* @see ListTemplatesOptions#hypervisor
*/
public static ListTemplatesOptions hypervisor(String hypervisor) {
ListTemplatesOptions options = new ListTemplatesOptions();
return options.hypervisor(hypervisor);
}
}
}

View File

@ -0,0 +1,92 @@
/**
*
* 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.cloudstack.options;
import org.jclouds.http.options.BaseHttpRequestOptions;
import com.google.common.collect.ImmutableSet;
/**
* Options used to control what zones information is returned
*
* @see <a href="http://download.cloud.com/releases/2.2/api/user/listZones.html" />
* @author Adrian Cole
*/
public class ListZonesOptions extends BaseHttpRequestOptions {
public static final ListZonesOptions NONE = new ListZonesOptions();
/**
* @param id
* the ID of the zone
*/
public ListZonesOptions id(String id) {
this.queryParameters.replaceValues("id", ImmutableSet.of(id));
return this;
}
/**
* @param domainId
* the ID of the domain associated with the zone
*/
public ListZonesOptions domainId(String domainId) {
this.queryParameters.replaceValues("domainid", ImmutableSet.of(domainId));
return this;
}
/**
* @param available
* true if you want to retrieve all available Zones. False if you only want to return
* the Zones from which you have at least one VM. Default is false.
*/
public ListZonesOptions available(boolean available) {
this.queryParameters.replaceValues("available", ImmutableSet.of(available + ""));
return this;
}
public static class Builder {
/**
* @see ListZonesOptions#available
*/
public static ListZonesOptions available(boolean available) {
ListZonesOptions options = new ListZonesOptions();
return options.available(available);
}
/**
* @see ListZonesOptions#domainId
*/
public static ListZonesOptions domainId(String id) {
ListZonesOptions options = new ListZonesOptions();
return options.domainId(id);
}
/**
* @see ListZonesOptions#id
*/
public static ListZonesOptions id(String id) {
ListZonesOptions options = new ListZonesOptions();
return options.id(id);
}
}
}

View File

@ -0,0 +1,77 @@
/**
*
* 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.cloudstack;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import org.jclouds.cloudstack.features.BaseCloudStackAsyncClientTest;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code CloudStackAsyncClient}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "CloudStackAsyncClientTest")
public class CloudStackAsyncClientTest extends BaseCloudStackAsyncClientTest<CloudStackAsyncClient> {
private CloudStackAsyncClient asyncClient;
private CloudStackClient syncClient;
public void testSync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException {
assert syncClient.getZoneClient() != null;
assert syncClient.getTemplateClient() != null;
assert syncClient.getOfferingClient() != null;
assert syncClient.getNetworkClient() != null;
}
public void testAsync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException {
assert asyncClient.getZoneClient() != null;
assert asyncClient.getTemplateClient() != null;
assert asyncClient.getOfferingClient() != null;
assert asyncClient.getNetworkClient() != null;
}
@Override
protected TypeLiteral<RestAnnotationProcessor<CloudStackAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<CloudStackAsyncClient>>() {
};
}
@BeforeClass
@Override
protected void setupFactory() throws IOException {
super.setupFactory();
asyncClient = injector.getInstance(CloudStackAsyncClient.class);
syncClient = injector.getInstance(CloudStackClient.class);
}
@Override
protected void checkFilters(HttpRequest request) {
}
}

View File

@ -0,0 +1,147 @@
///**
// *
// * 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.cloudstack;
//
//import static org.testng.Assert.assertEquals;
//
//import java.io.IOException;
//import java.util.logging.Logger;
//
//import org.jclouds.compute.domain.ExecResponse;
//import org.jclouds.cloudstack.domain.Instance;
//import org.jclouds.cloudstack.domain.InstanceAction;
//import org.jclouds.cloudstack.domain.InstanceState;
//import org.jclouds.cloudstack.features.ReadOnlyCloudStackClientLiveTest;
//import org.jclouds.cloudstack.options.CreateInstanceOptions;
//import org.jclouds.domain.Credentials;
//import org.jclouds.http.HttpRequest;
//import org.jclouds.net.IPSocket;
//import org.jclouds.ssh.SshClient;
//import org.jclouds.ssh.jsch.config.JschSshClientModule;
//import org.testng.annotations.AfterGroups;
//import org.testng.annotations.Test;
//
//import com.google.common.collect.Iterables;
//import com.google.gson.Gson;
//import com.google.inject.Guice;
//
///**
// * Tests behavior of {@code CloudStackClient}
// *
// * @author Adrian Cole
// */
//@Test(groups = "live", sequential = true, testName = "CloudStackClientLiveTest")
//public class CloudStackClientLiveTest extends ReadOnlyCloudStackClientLiveTest {
//
// protected String prefix = System.getProperty("user.name") + ".test";
// protected Instance instance;
//
// public void testCreateInstance() throws Exception {
// Logger.getAnonymousLogger().info("starting instance");
// instance = client.createInstance(Iterables.get(client.listImages(), 0).getId(),
// CreateInstanceOptions.Builder.named(prefix));
// instance = client.getInstance(instance.getHref());
// checkStartedInstance();
//
// Instance newInfo = client.getInstance(instance.getHref());
// checkInstanceMatchesGet(newInfo);
//
// }
//
// protected void checkInstanceMatchesGet(Instance newInfo) {
// assertEquals(newInfo.getHref(), instance.getHref());
// }
//
// protected void checkStartedInstance() {
// System.out.println(new Gson().toJson(instance));
// assertEquals(instance.getName(), prefix);
// assertEquals(instance.getState(), InstanceState.RUNNING);
// }
//
// @Test(dependsOnMethods = "testCreateInstance")
// public void testConnectivity() throws Exception {
// Logger.getAnonymousLogger().info("awaiting ssh");
// // TODO
// // assert socketTester.apply(new IPSocket(Iterables.get(instance.getPublicAddresses(), 0),
// // 22)) : instance;
// // doConnectViaSsh(instance, getSshCredentials(instance));
// }
//
// private Credentials getSshCredentials(Instance instance2) {
// // TODO
// return null;
// }
//
// public HttpRequest refreshInstanceAndGetAction(InstanceAction action) {
// return client.getInstance(instance.getHref()).getActions().get(action);
// }
//
// @Test(dependsOnMethods = "testConnectivity")
// public void testLifeCycle() throws Exception {
// client.performAction(refreshInstanceAndGetAction(InstanceAction.STOP));
// assertEquals(client.getInstance(instance.getHref()).getState(), InstanceState.STOPPED);
//
// client.performAction(refreshInstanceAndGetAction(InstanceAction.START));
// assertEquals(client.getInstance(instance.getHref()).getState(), InstanceState.RUNNING);
//
// client.performAction(refreshInstanceAndGetAction(InstanceAction.REBOOT));
// assertEquals(client.getInstance(instance.getHref()).getState(), InstanceState.RUNNING);
//
// }
//
// @Test(dependsOnMethods = "testLifeCycle")
// public void testDestroyInstance() throws Exception {
// try {
// client.performAction(refreshInstanceAndGetAction(InstanceAction.STOP));
// assertEquals(client.getInstance(instance.getHref()).getState(), InstanceState.STOPPED);
// } catch (IllegalArgumentException e) {
// }
// client.performAction(refreshInstanceAndGetAction(InstanceAction.DESTROY));
// assertEquals(client.getInstance(instance.getHref()), null);
// }
//
// protected void doConnectViaSsh(Instance instance, Credentials creds) throws IOException {
// SshClient ssh = Guice.createInjector(new JschSshClientModule()).getInstance(SshClient.Factory.class)
// .create(new IPSocket(Iterables.get(instance.getPublicAddresses(), 0), 22), creds);
// try {
// ssh.connect();
// ExecResponse hello = ssh.exec("echo hello");
// assertEquals(hello.getOutput().trim(), "hello");
// System.err.println(ssh.exec("df -k").getOutput());
// System.err.println(ssh.exec("mount").getOutput());
// System.err.println(ssh.exec("uname -a").getOutput());
// } finally {
// if (ssh != null)
// ssh.disconnect();
// }
// }
//
// @AfterGroups(groups = "live")
// @Override
// protected void tearDown() {
// try {
// testDestroyInstance();
// } catch (Exception e) {
// // no need to check null or anything as we swallow all
// }
// super.tearDown();
// }
//
//}

View File

@ -0,0 +1,68 @@
/**
*
* 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.cloudstack.features;
import static org.testng.Assert.assertEquals;
import java.util.Properties;
import org.jclouds.cloudstack.CloudStackAsyncClient;
import org.jclouds.cloudstack.CloudStackClient;
import org.jclouds.cloudstack.config.CloudStackRestClientModule;
import org.jclouds.cloudstack.filters.QuerySigner;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.RequiresHttp;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextSpec;
import com.google.inject.Module;
/**
* @author Adrian Cole
*/
public abstract class BaseCloudStackAsyncClientTest<T> extends RestClientTest<T> {
@RequiresHttp
@ConfiguresRestClient
public static class CloudStackRestClientModuleExtension extends CloudStackRestClientModule {
}
@Override
protected void checkFilters(HttpRequest request) {
assertEquals(request.getFilters().size(), 1);
assertEquals(request.getFilters().get(0).getClass(), QuerySigner.class);
}
@Override
protected Module createModule() {
return new CloudStackRestClientModuleExtension();
}
@Override
public RestContextSpec<CloudStackClient, CloudStackAsyncClient> createContextSpec() {
Properties props = new Properties();
props.setProperty("cloudstack.endpoint", "http://localhost:8080/client/api");
return new RestContextFactory().createContextSpec("cloudstack", "apiKey", "secretKey", props);
}
}

View File

@ -0,0 +1,97 @@
/**
*
* 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.cloudstack.features;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.jclouds.Constants;
import org.jclouds.cloudstack.CloudStackAsyncClient;
import org.jclouds.cloudstack.CloudStackClient;
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.net.IPSocket;
import org.jclouds.predicates.InetSocketAddressConnect;
import org.jclouds.predicates.RetryablePredicate;
import org.jclouds.rest.RestContext;
import org.jclouds.rest.RestContextFactory;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
/**
*
* @author Adrian Cole
*/
public class BaseCloudStackClientLiveTest {
protected CloudStackClient client;
protected RestContext<CloudStackClient, CloudStackAsyncClient> context;
protected String provider = "cloudstack";
protected String identity;
protected String credential;
protected String endpoint;
protected String apiversion;
protected Predicate<IPSocket> socketTester;
protected void setupCredentials() {
identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider
+ ".identity must be set. ex. apiKey");
credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider
+ ".credential must be set. ex. secretKey");
endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider
+ ".endpoint must be set. ex. http://localhost:8080/client/api");
apiversion = System.getProperty("test." + provider + ".apiversion");
}
protected Properties setupProperties() {
Properties overrides = new Properties();
overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true");
overrides.setProperty(provider + ".identity", identity);
overrides.setProperty(provider + ".credential", credential);
overrides.setProperty(provider + ".endpoint", endpoint);
if (apiversion != null)
overrides.setProperty(provider + ".apiversion", apiversion);
return overrides;
}
@BeforeGroups(groups = "live")
public void setupClient() {
setupCredentials();
Properties overrides = setupProperties();
context = new RestContextFactory().createContext(provider, ImmutableSet.<Module> of(new Log4JLoggingModule()),
overrides);
client = context.getApi();
socketTester = new RetryablePredicate<IPSocket>(new InetSocketAddressConnect(), 180, 1, TimeUnit.SECONDS);
}
@AfterGroups(groups = "live")
protected void tearDown() {
if (context != null)
context.close();
}
}

View File

@ -0,0 +1,102 @@
/**
*
* 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.cloudstack.features;
import java.io.IOException;
import java.lang.reflect.Method;
import org.jclouds.cloudstack.domain.NetworkType;
import org.jclouds.cloudstack.options.ListNetworksOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code NetworkAsyncClient}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "NetworkAsyncClientTest")
public class NetworkAsyncClientTest extends BaseCloudStackAsyncClientTest<NetworkAsyncClient> {
public void testListNetworks() throws SecurityException, NoSuchMethodException, IOException {
Method method = NetworkAsyncClient.class.getMethod("listNetworks", ListNetworksOptions[].class);
HttpRequest httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listNetworks HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListNetworksOptions() throws SecurityException, NoSuchMethodException, IOException {
Method method = NetworkAsyncClient.class.getMethod("listNetworks", ListNetworksOptions[].class);
HttpRequest httpRequest = processor.createRequest(method, ListNetworksOptions.Builder.type(NetworkType.ADVANCED).domainId(
"domainId").id("id"));
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listNetworks&type=Advanced&domainid=domainId&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testGetNetwork() throws SecurityException, NoSuchMethodException, IOException {
Method method = NetworkAsyncClient.class.getMethod("getNetwork", String.class);
HttpRequest httpRequest = processor.createRequest(method, "id");
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listNetworks&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValueInSet.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<NetworkAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<NetworkAsyncClient>>() {
};
}
}

View File

@ -0,0 +1,93 @@
/**
*
* 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.cloudstack.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Set;
import org.jclouds.cloudstack.domain.GuestIPType;
import org.jclouds.cloudstack.domain.Network;
import org.jclouds.cloudstack.options.ListNetworksOptions;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
/**
* Tests behavior of {@code NetworkClientLiveTest}
*
* @author Adrian Cole
*/
@Test(groups = "live", sequential = true, testName = "NetworkClientLiveTest")
public class NetworkClientLiveTest extends BaseCloudStackClientLiveTest {
public void testListNetworks() throws Exception {
Set<Network> response = client.getNetworkClient().listNetworks();
assert null != response;
long networkCount = response.size();
assertTrue(networkCount >= 0);
for (Network network : response) {
Network newDetails = Iterables.getOnlyElement(client.getNetworkClient().listNetworks(
ListNetworksOptions.Builder.id(network.getId())));
assertEquals(network, newDetails);
assertEquals(network, client.getNetworkClient().getNetwork(network.getId()));
assert network.getId() != null : network;
assert network.getName() != null : network;
assert network.getDNS().size() != 0 : network;
assert network.getGuestIPType() != null && network.getGuestIPType() != GuestIPType.UNRECOGNIZED : network;
assert network.getAccount() != null : network;
assert network.getBroadcastDomainType() != null : network;
// TODO understand when this is null and for what reason
// assert network.getBroadcastURI() != null : network;
assert network.getDisplayText() != null : network;
assert network.getNetworkDomain() != null : network;
assert network.getNetworkOfferingAvailability() != null : network;
assert network.getNetworkOfferingDisplayText() != null : network;
assert network.getNetworkOfferingId() != null : network;
assert network.getNetworkOfferingName() != null : network;
assert network.getRelated() != null : network;
assert network.getServices().size() != 0 : network;
assert network.getState() != null : network;
assert network.getTrafficType() != null : network;
assert network.getZoneId() != null : network;
assert network.getDomain() != null : network;
assert network.getDomainId() != null : network;
switch (network.getGuestIPType()) {
case VIRTUAL:
assert network.getNetmask() == null : network;
assert network.getGateway() == null : network;
assert network.getVLAN() == null : network;
assert network.getStartIP() == null : network;
assert network.getEndIP() == null : network;
break;
case DIRECT:
assert network.getNetmask() != null : network;
assert network.getGateway() != null : network;
assert network.getVLAN() != null : network;
assert network.getStartIP() != null : network;
assert network.getEndIP() != null : network;
break;
}
}
}
}

View File

@ -0,0 +1,209 @@
/**
*
* 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.cloudstack.features;
import java.io.IOException;
import java.lang.reflect.Method;
import org.jclouds.cloudstack.options.ListDiskOfferingsOptions;
import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions;
import org.jclouds.cloudstack.options.ListServiceOfferingsOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code OfferingAsyncClient}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "ServiceOfferingAsyncClientTest")
public class OfferingAsyncClientTest extends BaseCloudStackAsyncClientTest<OfferingAsyncClient> {
public void testListDiskOfferings() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("listDiskOfferings", ListDiskOfferingsOptions[].class);
HttpRequest httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listDiskOfferings HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListDiskOfferingsOptions() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("listDiskOfferings", ListDiskOfferingsOptions[].class);
HttpRequest httpRequest = processor.createRequest(method, ListDiskOfferingsOptions.Builder.domainId("domainId")
.id("id"));
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listDiskOfferings&domainid=domainId&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testGetDiskOffering() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("getDiskOffering", String.class);
HttpRequest httpRequest = processor.createRequest(method, "id");
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listDiskOfferings&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValueInSet.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListNetworkOfferings() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("listNetworkOfferings", ListNetworkOfferingsOptions[].class);
HttpRequest httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listNetworkOfferings HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListNetworkOfferingsOptions() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("listNetworkOfferings", ListNetworkOfferingsOptions[].class);
HttpRequest httpRequest = processor.createRequest(method, ListNetworkOfferingsOptions.Builder.availability(
"Default").isShared(true).id("id"));
assertRequestLineEquals(
httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listNetworkOfferings&availability=Default&isshared=true&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testGetNetworkOffering() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("getNetworkOffering", String.class);
HttpRequest httpRequest = processor.createRequest(method, "id");
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listNetworkOfferings&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValueInSet.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListServiceOfferings() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("listServiceOfferings", ListServiceOfferingsOptions[].class);
HttpRequest httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listServiceOfferings HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListServiceOfferingsOptions() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("listServiceOfferings", ListServiceOfferingsOptions[].class);
HttpRequest httpRequest = processor.createRequest(method, ListServiceOfferingsOptions.Builder.virtualMachineId(
"vmId").domainId("domainId").id("id"));
assertRequestLineEquals(
httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listServiceOfferings&virtualmachineid=vmId&domainid=domainId&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testGetServiceOffering() throws SecurityException, NoSuchMethodException, IOException {
Method method = OfferingAsyncClient.class.getMethod("getServiceOffering", String.class);
HttpRequest httpRequest = processor.createRequest(method, "id");
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listServiceOfferings&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValueInSet.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<OfferingAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<OfferingAsyncClient>>() {
};
}
}

View File

@ -0,0 +1,106 @@
/**
*
* 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.cloudstack.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Set;
import org.jclouds.cloudstack.domain.DiskOffering;
import org.jclouds.cloudstack.domain.NetworkOffering;
import org.jclouds.cloudstack.domain.ServiceOffering;
import org.jclouds.cloudstack.domain.StorageType;
import org.jclouds.cloudstack.domain.TrafficType;
import org.jclouds.cloudstack.options.ListDiskOfferingsOptions;
import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions;
import org.jclouds.cloudstack.options.ListServiceOfferingsOptions;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
/**
* Tests behavior of {@code OfferingClient}
*
* @author Adrian Cole
*/
@Test(groups = "live", sequential = true, testName = "OfferingClientLiveTest")
public class OfferingClientLiveTest extends BaseCloudStackClientLiveTest {
public void testListDiskOfferings() throws Exception {
Set<DiskOffering> response = client.getOfferingClient().listDiskOfferings();
assert null != response;
long offeringCount = response.size();
assertTrue(offeringCount >= 0);
for (DiskOffering offering : response) {
DiskOffering newDetails = Iterables.getOnlyElement(client.getOfferingClient().listDiskOfferings(
ListDiskOfferingsOptions.Builder.id(offering.getId())));
assertEquals(offering, newDetails);
assertEquals(offering, client.getOfferingClient().getDiskOffering(offering.getId()));
assert offering.getId() != null : offering;
assert offering.getName() != null : offering;
assert offering.getCreated() != null : offering;
assert offering.getDisplayText() != null : offering;
assert offering.getDiskSize() > 0 || (offering.getDiskSize() == 0 && offering.isCustomized()) : offering;
assert offering.getTags() != null : offering;
}
}
public void testListServiceOfferings() throws Exception {
Set<ServiceOffering> response = client.getOfferingClient().listServiceOfferings();
assert null != response;
long offeringCount = response.size();
assertTrue(offeringCount >= 0);
for (ServiceOffering offering : response) {
ServiceOffering newDetails = Iterables.getOnlyElement(client.getOfferingClient().listServiceOfferings(
ListServiceOfferingsOptions.Builder.id(offering.getId())));
assertEquals(offering, newDetails);
assertEquals(offering, client.getOfferingClient().getServiceOffering(offering.getId()));
assert offering.getId() != null : offering;
assert offering.getName() != null : offering;
assert offering.getCreated() != null : offering;
assert offering.getDisplayText() != null : offering;
assert offering.getCpuNumber() > 0 : offering;
assert offering.getCpuSpeed() > 0 : offering;
assert offering.getMemory() > 0 : offering;
assert offering.getStorageType() != null && StorageType.UNRECOGNIZED != offering.getStorageType() : offering;
assert offering.getTags() != null : offering;
}
}
public void testListNetworkOfferings() throws Exception {
Set<NetworkOffering> response = client.getOfferingClient().listNetworkOfferings();
assert null != response;
long offeringCount = response.size();
assertTrue(offeringCount >= 0);
for (NetworkOffering offering : response) {
NetworkOffering newDetails = Iterables.getOnlyElement(client.getOfferingClient().listNetworkOfferings(
ListNetworkOfferingsOptions.Builder.id(offering.getId())));
assertEquals(offering, newDetails);
assertEquals(offering, client.getOfferingClient().getNetworkOffering(offering.getId()));
assert offering.getId() != null : offering;
assert offering.getName() != null : offering;
assert offering.getDisplayText() != null : offering;
assert offering.getMaxConnections() == null || offering.getMaxConnections() > 0 : offering;
assert offering.getTrafficType() != null && TrafficType.UNRECOGNIZED != offering.getTrafficType() : offering;
assert offering.getTags() != null : offering;
}
}
}

View File

@ -0,0 +1,103 @@
/**
*
* 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.cloudstack.features;
import java.io.IOException;
import java.lang.reflect.Method;
import org.jclouds.cloudstack.domain.TemplateFilter;
import org.jclouds.cloudstack.options.ListTemplatesOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code TemplateAsyncClient}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "TemplateAsyncClientTest")
public class TemplateAsyncClientTest extends BaseCloudStackAsyncClientTest<TemplateAsyncClient> {
public void testListTemplates() throws SecurityException, NoSuchMethodException, IOException {
Method method = TemplateAsyncClient.class.getMethod("listTemplates");
HttpRequest httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listTemplates&templatefilter=executable HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListTemplatesOptions() throws SecurityException, NoSuchMethodException, IOException {
Method method = TemplateAsyncClient.class.getMethod("listTemplates", ListTemplatesOptions.class);
HttpRequest httpRequest = processor.createRequest(method, ListTemplatesOptions.Builder.accountInDomain(
"accountId", "domainId").hypervisor("xen").filter(TemplateFilter.FEATURED));
assertRequestLineEquals(
httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listTemplates&account=accountId&domainid=domainId&hypervisor=xen&templatefilter=featured HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testGetTemplate() throws SecurityException, NoSuchMethodException, IOException {
Method method = TemplateAsyncClient.class.getMethod("getTemplate", String.class);
HttpRequest httpRequest = processor.createRequest(method, "id");
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listTemplates&templatefilter=executable&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValueInSet.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<TemplateAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<TemplateAsyncClient>>() {
};
}
}

View File

@ -0,0 +1,69 @@
/**
*
* 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.cloudstack.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Set;
import org.jclouds.cloudstack.domain.Template;
import org.jclouds.cloudstack.options.ListTemplatesOptions;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
/**
* Tests behavior of {@code TemplateClientLiveTest}
*
* @author Adrian Cole
*/
@Test(groups = "live", sequential = true, testName = "TemplateClientLiveTest")
public class TemplateClientLiveTest extends BaseCloudStackClientLiveTest {
public void testListTemplates() throws Exception {
Set<Template> response = client.getTemplateClient().listTemplates();
assert null != response;
long zoneCount = response.size();
assertTrue(zoneCount >= 0);
for (Template template : response) {
Template newDetails = Iterables.getOnlyElement(client.getTemplateClient().listTemplates(
ListTemplatesOptions.Builder.id(template.getId())));
assertEquals(template, newDetails);
assertEquals(template, client.getTemplateClient().getTemplate(template.getId()));
assert template.getId() != null : template;
assert template.getName() != null : template;
assert template.getDisplayText() != null : template;
assert template.getCreated() != null : template;
assert template.getFormat() != null && template.getFormat() != Template.Format.UNRECOGNIZED : template;
assert template.getOSType() != null : template;
assert template.getOSTypeId() != null : template;
assert template.getAccount() != null : template;
assert template.getZone() != null : template;
assert template.getZoneId() != null : template;
assert template.getStatus() != null : template;
assert template.getType() != null && template.getType() != Template.Type.UNRECOGNIZED : template;
assert template.getHypervisor() != null : template;
assert template.getDomain() != null : template;
assert template.getDomainId() != null : template;
}
}
}

View File

@ -0,0 +1,112 @@
/**
*
* 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.cloudstack.features;
import java.io.IOException;
import java.lang.reflect.Method;
import org.jclouds.cloudstack.options.ListZonesOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
import com.google.inject.TypeLiteral;
/**
* Tests behavior of {@code ZoneAsyncClient}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "ZoneAsyncClientTest")
public class ZoneAsyncClientTest extends BaseCloudStackAsyncClientTest<ZoneAsyncClient> {
public void testListZones() throws SecurityException, NoSuchMethodException, IOException {
Method method = ZoneAsyncClient.class.getMethod("listZones", ListZonesOptions[].class);
HttpRequest httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listZones HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
// now make sure request filters apply by replaying
httpRequest = Iterables.getOnlyElement(httpRequest.getFilters()).filter(httpRequest);
httpRequest = Iterables.getOnlyElement(httpRequest.getFilters()).filter(httpRequest);
assertRequestLineEquals(
httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listZones&apiKey=apiKey&signature=hNz838u4Z1ofz9vRaqYo9GDv1Io%3D HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testListZonesOptions() throws SecurityException, NoSuchMethodException, IOException {
Method method = ZoneAsyncClient.class.getMethod("listZones", ListZonesOptions[].class);
HttpRequest httpRequest = processor.createRequest(method, ListZonesOptions.Builder.available(true).domainId(
"domainId").id("id"));
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listZones&available=true&domainid=domainId&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValue.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
checkFilters(httpRequest);
}
public void testGetZone() throws SecurityException, NoSuchMethodException, IOException {
Method method = ZoneAsyncClient.class.getMethod("getZone", String.class);
HttpRequest httpRequest = processor.createRequest(method, "id");
assertRequestLineEquals(httpRequest,
"GET http://localhost:8080/client/api?response=json&command=listZones&id=id HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyNestedJsonValueInSet.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
checkFilters(httpRequest);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<ZoneAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<ZoneAsyncClient>>() {
};
}
}

View File

@ -0,0 +1,75 @@
/**
*
* 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.cloudstack.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Set;
import org.jclouds.cloudstack.domain.NetworkType;
import org.jclouds.cloudstack.domain.Zone;
import org.jclouds.cloudstack.options.ListZonesOptions;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
/**
* Tests behavior of {@code ZoneClientLiveTest}
*
* @author Adrian Cole
*/
@Test(groups = "live", sequential = true, testName = "ZoneClientLiveTest")
public class ZoneClientLiveTest extends BaseCloudStackClientLiveTest {
public void testListZones() throws Exception {
Set<Zone> response = client.getZoneClient().listZones();
assert null != response;
long zoneCount = response.size();
assertTrue(zoneCount >= 0);
for (Zone zone : response) {
Zone newDetails = Iterables.getOnlyElement(client.getZoneClient().listZones(
ListZonesOptions.Builder.id(zone.getId())));
assertEquals(zone, newDetails);
assertEquals(zone, client.getZoneClient().getZone(zone.getId()));
assert zone.getId() != null : zone;
assert zone.getName() != null : zone;
assert zone.getDNS().size() != 0 : zone;
assert zone.getInternalDNS().size() != 0 : zone;
assert zone.getNetworkType() != null && zone.getNetworkType() != NetworkType.UNRECOGNIZED : zone;
switch (zone.getNetworkType()) {
case ADVANCED:
assert zone.getVLAN() != null : zone;
assert zone.getDomain() == null : zone;
assert zone.getDomainId() == null : zone;
assert zone.getGuestCIDRAddress() != null : zone;
break;
case BASIC:
assert zone.getVLAN() == null : zone;
assert zone.getDomain() != null : zone;
assert zone.getDomainId() != null : zone;
assert zone.getGuestCIDRAddress() == null : zone;
break;
}
}
}
}

View File

@ -0,0 +1,98 @@
/**
*
* 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.cloudstack.filters;
import static org.testng.Assert.assertEquals;
import java.net.URI;
import java.util.List;
import java.util.Map;
import org.jclouds.PropertiesBuilder;
import org.jclouds.http.HttpRequest;
import org.jclouds.logging.config.NullLoggingModule;
import org.jclouds.rest.RequestSigner;
import org.jclouds.rest.RestContextBuilder;
import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextSpec;
import org.jclouds.rest.BaseRestClientTest.MockModule;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
/**
* Tests behavior of {@code QuerySigner}
*
* @author Adrian Cole
*/
// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
@Test(groups = "unit", testName = "QuerySignerTest")
public class QuerySignerTest {
@SuppressWarnings("unchecked")
public static final RestContextSpec<Map, List> DUMMY_SPEC = new RestContextSpec<Map, List>("cloudstack",
"http://localhost:8080/client/api", "2.2", "", "apiKey", "secretKey", Map.class, List.class,
PropertiesBuilder.class, (Class) RestContextBuilder.class, ImmutableList.<Module> of(new MockModule(),
new NullLoggingModule(), new AbstractModule() {
@Override
protected void configure() {
bind(RequestSigner.class).to(QuerySigner.class);
}
}));
@Test
void testCreateStringToSign() {
QuerySigner filter = RestContextFactory.createContextBuilder(DUMMY_SPEC).buildInjector().getInstance(
QuerySigner.class);
assertEquals(filter.createStringToSign(HttpRequest.builder().method("GET").endpoint(
URI.create("http://localhost:8080/client/api?command=listZones")).build()),
"apikey=apikey&command=listzones");
}
@Test
void testFilter() {
QuerySigner filter = RestContextFactory.createContextBuilder(DUMMY_SPEC).buildInjector().getInstance(
QuerySigner.class);
assertEquals(
filter.filter(
HttpRequest.builder().method("GET").endpoint(
URI.create("http://localhost:8080/client/api?command=listZones")).build())
.getRequestLine(),
"GET http://localhost:8080/client/api?command=listZones&apiKey=apiKey&signature=2UG8AcnMaozL3BINdjgkJ%2BRzjEY%3D HTTP/1.1");
}
@Test
void testFilterTwice() {
QuerySigner filter = RestContextFactory.createContextBuilder(DUMMY_SPEC).buildInjector().getInstance(
QuerySigner.class);
HttpRequest request = HttpRequest.builder().method("GET").endpoint(
URI.create("http://localhost:8080/client/api?command=listZones")).build();
for (int i = 0; i < 2; i++) {
request = filter.filter(request);
assertEquals(
request.getRequestLine(),
"GET http://localhost:8080/client/api?command=listZones&apiKey=apiKey&signature=2UG8AcnMaozL3BINdjgkJ%2BRzjEY%3D HTTP/1.1");
}
}
}

View File

@ -0,0 +1,123 @@
/**
*
* 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.cloudstack.handlers;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.reportMatcher;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import java.net.URI;
import org.easymock.IArgumentMatcher;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.io.Payloads;
import org.jclouds.rest.AuthorizationException;
import org.jclouds.rest.ResourceNotFoundException;
import org.jclouds.util.Strings2;
import org.testng.annotations.Test;
import com.google.inject.Guice;
/**
*
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class CloudStackErrorHandlerTest {
@Test
public void test400MakesIllegalArgumentException() {
assertCodeMakes("GET", URI.create("https://cloudstack.com/foo"), 400, "", "Bad Request",
IllegalArgumentException.class);
}
@Test
public void test401MakesAuthorizationException() {
assertCodeMakes("GET", URI.create("https://cloudstack.com/foo"), 401, "", "Unauthorized",
AuthorizationException.class);
}
@Test
public void test404MakesResourceNotFoundException() {
assertCodeMakes("GET", URI.create("https://cloudstack.com/foo"), 404, "", "Not Found",
ResourceNotFoundException.class);
}
@Test
public void test405MakesIllegalArgumentException() {
assertCodeMakes("GET", URI.create("https://cloudstack.com/foo"), 405, "", "Method Not Allowed",
IllegalArgumentException.class);
}
@Test
public void test409MakesIllegalStateException() {
assertCodeMakes("GET", URI.create("https://cloudstack.com/foo"), 409, "", "Conflict", IllegalStateException.class);
}
private void assertCodeMakes(String method, URI uri, int statusCode, String message, String content,
Class<? extends Exception> expected) {
assertCodeMakes(method, uri, statusCode, message, "text/xml", content, expected);
}
private void assertCodeMakes(String method, URI uri, int statusCode, String message, String contentType,
String content, Class<? extends Exception> expected) {
CloudStackErrorHandler function = Guice.createInjector().getInstance(CloudStackErrorHandler.class);
HttpCommand command = createMock(HttpCommand.class);
HttpRequest request = new HttpRequest(method, uri);
HttpResponse response = new HttpResponse(statusCode, message, Payloads.newInputStreamPayload(Strings2
.toInputStream(content)));
response.getPayload().getContentMetadata().setContentType(contentType);
expect(command.getCurrentRequest()).andReturn(request).atLeastOnce();
command.setException(classEq(expected));
replay(command);
function.handleError(command, response);
verify(command);
}
public static Exception classEq(final Class<? extends Exception> in) {
reportMatcher(new IArgumentMatcher() {
@Override
public void appendTo(StringBuffer buffer) {
buffer.append("classEq(");
buffer.append(in);
buffer.append(")");
}
@Override
public boolean matches(Object arg) {
return arg.getClass() == in;
}
});
return null;
}
}

View File

@ -0,0 +1,69 @@
/**
*
* 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.cloudstack.options;
import static org.jclouds.cloudstack.options.ListDiskOfferingsOptions.Builder.domainId;
import static org.jclouds.cloudstack.options.ListDiskOfferingsOptions.Builder.id;
import static org.jclouds.cloudstack.options.ListDiskOfferingsOptions.Builder.name;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
/**
* Tests behavior of {@code ListDiskOfferingsOptions}
*
* @author Adrian Cole
*/
@Test(groups = "unit")
public class ListDiskOfferingsOptionsTest {
public void testId() {
ListDiskOfferingsOptions options = new ListDiskOfferingsOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testIdStatic() {
ListDiskOfferingsOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testName() {
ListDiskOfferingsOptions options = new ListDiskOfferingsOptions().name("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("name"));
}
public void testNameStatic() {
ListDiskOfferingsOptions options = name("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("name"));
}
public void testDomainId() {
ListDiskOfferingsOptions options = new ListDiskOfferingsOptions().domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testDomainIdStatic() {
ListDiskOfferingsOptions options = domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
}

View File

@ -0,0 +1,125 @@
/**
*
* 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.cloudstack.options;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.availability;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.displayText;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.id;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.isDefault;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.isShared;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.specifyVLAN;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.trafficType;
import static org.testng.Assert.assertEquals;
import org.jclouds.cloudstack.domain.TrafficType;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
/**
* Tests behavior of {@code ListNetworkOfferingsOptions}
*
* @author Adrian Cole
*/
@Test(groups = "unit")
public class ListNetworkOfferingsOptionsTest {
public void testIsDefault() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().isDefault(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isdefault"));
}
public void testIsDefaultStatic() {
ListNetworkOfferingsOptions options = isDefault(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isdefault"));
}
public void testIsShared() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().isShared(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isshared"));
}
public void testIsSharedStatic() {
ListNetworkOfferingsOptions options = isShared(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isshared"));
}
public void testId() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testIdStatic() {
ListNetworkOfferingsOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testSpecifyVLAN() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().specifyVLAN(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("specifyvlan"));
}
public void testSpecifyVLANStatic() {
ListNetworkOfferingsOptions options = specifyVLAN(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("specifyvlan"));
}
public void testAvailability() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().availability("moo");
assertEquals(ImmutableList.of("moo"), options.buildQueryParameters().get("availability"));
}
public void testAvailabilityStatic() {
ListNetworkOfferingsOptions options = availability("moo");
assertEquals(ImmutableList.of("moo"), options.buildQueryParameters().get("availability"));
}
public void testTrafficType() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().trafficType(TrafficType.GUEST);
assertEquals(ImmutableList.of("Guest"), options.buildQueryParameters().get("traffictype"));
}
public void testTrafficTypeStatic() {
ListNetworkOfferingsOptions options = trafficType(TrafficType.GUEST);
assertEquals(ImmutableList.of("Guest"), options.buildQueryParameters().get("traffictype"));
}
public void testName() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testNameStatic() {
ListNetworkOfferingsOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testDisplayText() {
ListNetworkOfferingsOptions options = new ListNetworkOfferingsOptions().displayText("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("displaytext"));
}
public void testDisplayTextStatic() {
ListNetworkOfferingsOptions options = displayText("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("displaytext"));
}
}

View File

@ -0,0 +1,146 @@
/**
*
* 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.cloudstack.options;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.account;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.domainId;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.id;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.isDefault;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.isShared;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.isSystem;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.trafficType;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.type;
import static org.jclouds.cloudstack.options.ListNetworksOptions.Builder.zoneId;
import static org.testng.Assert.assertEquals;
import org.jclouds.cloudstack.domain.NetworkType;
import org.jclouds.cloudstack.domain.TrafficType;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
/**
* Tests behavior of {@code ListNetworksOptions}
*
* @author Adrian Cole
*/
@Test(groups = "unit")
public class ListNetworksOptionsTest {
public void testIsDefault() {
ListNetworksOptions options = new ListNetworksOptions().isDefault(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isdefault"));
}
public void testIsDefaultStatic() {
ListNetworksOptions options = isDefault(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isdefault"));
}
public void testIsSystem() {
ListNetworksOptions options = new ListNetworksOptions().isSystem(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("issystem"));
}
public void testIsSystemStatic() {
ListNetworksOptions options = isSystem(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("issystem"));
}
public void testIsShared() {
ListNetworksOptions options = new ListNetworksOptions().isShared(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isshared"));
}
public void testIsSharedStatic() {
ListNetworksOptions options = isShared(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("isshared"));
}
public void testId() {
ListNetworksOptions options = new ListNetworksOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testIdStatic() {
ListNetworksOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testDomainId() {
ListNetworksOptions options = new ListNetworksOptions().domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testDomainIdStatic() {
ListNetworksOptions options = domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testAccountId() {
ListNetworksOptions options = new ListNetworksOptions().account("moo");
assertEquals(ImmutableList.of("moo"), options.buildQueryParameters().get("account"));
}
public void testAccountIdStatic() {
ListNetworksOptions options = account("moo");
assertEquals(ImmutableList.of("moo"), options.buildQueryParameters().get("account"));
}
public void testTrafficType() {
ListNetworksOptions options = new ListNetworksOptions().trafficType(TrafficType.GUEST);
assertEquals(ImmutableList.of("Guest"), options.buildQueryParameters().get("traffictype"));
}
public void testTrafficTypeStatic() {
ListNetworksOptions options = trafficType(TrafficType.GUEST);
assertEquals(ImmutableList.of("Guest"), options.buildQueryParameters().get("traffictype"));
}
public void testName() {
ListNetworksOptions options = new ListNetworksOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testNameStatic() {
ListNetworksOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testZoneId() {
ListNetworksOptions options = new ListNetworksOptions().zoneId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("zoneid"));
}
public void testZoneIdStatic() {
ListNetworksOptions options = zoneId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("zoneid"));
}
public void testType() {
ListNetworksOptions options = new ListNetworksOptions().type(NetworkType.ADVANCED);
assertEquals(ImmutableList.of("Advanced"), options.buildQueryParameters().get("type"));
}
public void testTypeStatic() {
ListNetworksOptions options = type(NetworkType.ADVANCED);
assertEquals(ImmutableList.of("Advanced"), options.buildQueryParameters().get("type"));
}
}

View File

@ -0,0 +1,79 @@
/**
*
* 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.cloudstack.options;
import static org.jclouds.cloudstack.options.ListServiceOfferingsOptions.Builder.domainId;
import static org.jclouds.cloudstack.options.ListServiceOfferingsOptions.Builder.id;
import static org.jclouds.cloudstack.options.ListServiceOfferingsOptions.Builder.name;
import static org.jclouds.cloudstack.options.ListServiceOfferingsOptions.Builder.virtualMachineId;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
/**
* Tests behavior of {@code ListServiceOfferingsOptions}
*
* @author Adrian Cole
*/
@Test(groups = "unit")
public class ListServiceOfferingsOptionsTest {
public void testId() {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testIdStatic() {
ListServiceOfferingsOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testName() {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions().name("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("name"));
}
public void testNameStatic() {
ListServiceOfferingsOptions options = name("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("name"));
}
public void testDomainId() {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions().domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testDomainIdStatic() {
ListServiceOfferingsOptions options = domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testVirtualMachineId() {
ListServiceOfferingsOptions options = new ListServiceOfferingsOptions().virtualMachineId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("virtualmachineid"));
}
public void testVirtualMachineIdStatic() {
ListServiceOfferingsOptions options = virtualMachineId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("virtualmachineid"));
}
}

View File

@ -0,0 +1,119 @@
/**
*
* 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.cloudstack.options;
import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.accountInDomain;
import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.domainId;
import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.filter;
import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.hypervisor;
import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.id;
import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.zoneId;
import static org.testng.Assert.assertEquals;
import org.jclouds.cloudstack.domain.TemplateFilter;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
/**
* Tests behavior of {@code ListTemplatesOptions}
*
* @author Adrian Cole
*/
@Test(groups = "unit")
public class ListTemplatesOptionsTest {
public void testId() {
ListTemplatesOptions options = new ListTemplatesOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testIdStatic() {
ListTemplatesOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testDomainId() {
ListTemplatesOptions options = new ListTemplatesOptions().domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testDomainIdStatic() {
ListTemplatesOptions options = domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testAccountInDomainId() {
ListTemplatesOptions options = new ListTemplatesOptions().accountInDomain("moo", "goo");
assertEquals(ImmutableList.of("moo"), options.buildQueryParameters().get("account"));
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testAccountInDomainIdStatic() {
ListTemplatesOptions options = accountInDomain("moo", "goo");
assertEquals(ImmutableList.of("moo"), options.buildQueryParameters().get("account"));
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testHypervisor() {
ListTemplatesOptions options = new ListTemplatesOptions().hypervisor("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("hypervisor"));
}
public void testHypervisorStatic() {
ListTemplatesOptions options = hypervisor("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("hypervisor"));
}
public void testName() {
ListTemplatesOptions options = new ListTemplatesOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testNameStatic() {
ListTemplatesOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testZoneId() {
ListTemplatesOptions options = new ListTemplatesOptions().zoneId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("zoneid"));
}
public void testZoneIdStatic() {
ListTemplatesOptions options = zoneId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("zoneid"));
}
public void testFilterDefault() {
assertEquals(ImmutableList.of("executable"), new ListTemplatesOptions().buildQueryParameters().get(
"templatefilter"));
}
public void testFilter() {
ListTemplatesOptions options = new ListTemplatesOptions().filter(TemplateFilter.SELF_EXECUTABLE);
assertEquals(ImmutableList.of("self-executable"), options.buildQueryParameters().get("templatefilter"));
}
public void testFilterStatic() {
ListTemplatesOptions options = filter(TemplateFilter.SELF_EXECUTABLE);
assertEquals(ImmutableList.of("self-executable"), options.buildQueryParameters().get("templatefilter"));
}
}

View File

@ -0,0 +1,68 @@
/**
*
* 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.cloudstack.options;
import static org.jclouds.cloudstack.options.ListZonesOptions.Builder.available;
import static org.jclouds.cloudstack.options.ListZonesOptions.Builder.domainId;
import static org.jclouds.cloudstack.options.ListZonesOptions.Builder.id;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
/**
* Tests behavior of {@code ListZonesOptions}
*
* @author Adrian Cole
*/
@Test(groups = "unit")
public class ListZonesOptionsTest {
public void testId() {
ListZonesOptions options = new ListZonesOptions().id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testAvailable() {
ListZonesOptions options = new ListZonesOptions().available(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("available"));
}
public void testDomainId() {
ListZonesOptions options = new ListZonesOptions().domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
public void testIdStatic() {
ListZonesOptions options = id("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("id"));
}
public void testAvailableStatic() {
ListZonesOptions options = available(true);
assertEquals(ImmutableList.of("true"), options.buildQueryParameters().get("available"));
}
public void testDomainIdStatic() {
ListZonesOptions options = domainId("goo");
assertEquals(ImmutableList.of("goo"), options.buildQueryParameters().get("domainid"));
}
}

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
====================================================================
-->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!--
For more configuration infromation and examples see the Apache
Log4j website: http://logging.apache.org/log4j/
-->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="false">
<!-- A time/date based rolling appender -->
<appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-wire.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- A time/date based rolling appender -->
<appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-compute.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- A time/date based rolling appender -->
<appender name="SSHFILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="target/test-data/jclouds-ssh.log" />
<param name="Append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
<!--
The full pattern: Date MS Priority [Category]
(Thread:NDC) Message\n <param name="ConversionPattern"
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="COMPUTEFILE" />
</appender>
<appender name="ASYNCSSH" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="SSHFILE" />
</appender>
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
<appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="WIREFILE" />
</appender>
<!-- ================ -->
<!-- Limit categories -->
<!-- ================ -->
<category name="org.jclouds">
<priority value="DEBUG" />
<appender-ref ref="ASYNC" />
</category>
<category name="jclouds.headers">
<priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" />
</category>
<category name="jclouds.ssh">
<priority value="DEBUG" />
<appender-ref ref="ASYNCSSH" />
</category>
<category name="jclouds.wire">
<priority value="DEBUG" />
<appender-ref ref="ASYNCWIRE" />
</category>
<category name="jclouds.compute">
<priority value="TRACE" />
<appender-ref ref="ASYNCCOMPUTE" />
</category>
<!-- ======================= -->
<!-- Setup the Root category -->
<!-- ======================= -->
<root>
<priority value="WARN" />
</root>
</log4j:configuration>