mirror of https://github.com/apache/jclouds.git
Merge pull request #659 from aplowe/openstack-nova2
Openstack Quantum: adding openstack network api
This commit is contained in:
commit
8159b6618f
|
@ -45,4 +45,8 @@ public interface ServiceType {
|
||||||
* Identity Service (Keystone)
|
* Identity Service (Keystone)
|
||||||
*/
|
*/
|
||||||
public static final String IDENTITY = "identity";
|
public static final String IDENTITY = "identity";
|
||||||
|
/**
|
||||||
|
* Network Service (Quantum)
|
||||||
|
*/
|
||||||
|
public static final String NETWORK = "network";
|
||||||
}
|
}
|
|
@ -95,8 +95,19 @@ public class ParseAccessTest extends BaseItemParserTest<Access> {
|
||||||
.tenantId("3456")
|
.tenantId("3456")
|
||||||
.publicURL(URI.create("https://az-3.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456"))
|
.publicURL(URI.create("https://az-3.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456"))
|
||||||
.region("az-3.region-a.geo-1")
|
.region("az-3.region-a.geo-1")
|
||||||
.versionId("1.1").build()).build()
|
.versionId("1.1").build()).build(),
|
||||||
).build();
|
|
||||||
|
Service.builder().name("Quantum Service").type("network").endpoints(
|
||||||
|
Endpoint.builder()
|
||||||
|
.tenantId("3456")
|
||||||
|
.publicURL(URI.create("https://csnode.jclouds.org:9696/v1.0/tenants/3456"))
|
||||||
|
.internalURL(URI.create("https://csnode.jclouds.org:9696/v1.0/tenants/3456"))
|
||||||
|
.adminURL(URI.create("https://csnode.jclouds.org:9696/v1.0"))
|
||||||
|
.region("region-a.geo-1")
|
||||||
|
.versionId("1.0").build()
|
||||||
|
).build())
|
||||||
|
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,20 @@
|
||||||
"versionList": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com"
|
"versionList": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
"type": "network",
|
||||||
|
"name": "Quantum Service",
|
||||||
|
"endpoints": [{
|
||||||
|
"tenantId": "3456",
|
||||||
|
"adminURL": "https://csnode.jclouds.org:9696/v1.0",
|
||||||
|
"region": "region-a.geo-1",
|
||||||
|
"versionId": "1.0",
|
||||||
|
"publicURL": "https://csnode.jclouds.org:9696/v1.0/tenants/3456",
|
||||||
|
"internalURL": "https://csnode.jclouds.org:9696/v1.0/tenants/3456"
|
||||||
|
}],
|
||||||
|
"endpoints_links": []
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -409,7 +409,9 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
this.caller = caller;
|
this.caller = caller;
|
||||||
try {
|
try {
|
||||||
callerEndpoint = getEndpointFor(caller.getMethod(), caller.getArgs(), injector);
|
UriBuilder builder = uriBuilderProvider.get().uri(getEndpointFor(caller.getMethod(), caller.getArgs(), injector));
|
||||||
|
Multimap<String, String> tokenValues = addPathAndGetTokens(caller.getMethod().getDeclaringClass(), caller.getMethod(), caller.getArgs(), builder);
|
||||||
|
callerEndpoint = builder.buildFromEncodedMap(Maps2.convertUnsafe(tokenValues));
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
Throwables.propagate(e);
|
Throwables.propagate(e);
|
||||||
|
@ -785,7 +787,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static URI addHostIfMissing(URI original, URI withHost) {
|
public static URI addHostIfMissing(URI original, URI withHost) {
|
||||||
checkNotNull(withHost, "URI witHost cannot be null");
|
checkNotNull(withHost, "URI withHost cannot be null");
|
||||||
checkArgument(withHost.getHost() != null, "URI withHost must have host:" + withHost);
|
checkArgument(withHost.getHost() != null, "URI withHost must have host:" + withHost);
|
||||||
|
|
||||||
if (original == null)
|
if (original == null)
|
||||||
|
|
|
@ -223,6 +223,10 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
|
|
||||||
@Delegate
|
@Delegate
|
||||||
public Optional<Callee> getOptionalCallee(@EndpointParam URI endpoint);
|
public Optional<Callee> getOptionalCallee(@EndpointParam URI endpoint);
|
||||||
|
|
||||||
|
@Delegate
|
||||||
|
@Path("/testing/testing/{wibble}")
|
||||||
|
public Callee getCalleeWithPath(@EndpointParam URI endpoint, @PathParam("wibble") String wibble);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Timeout(duration = 10, timeUnit = TimeUnit.NANOSECONDS)
|
@Timeout(duration = 10, timeUnit = TimeUnit.NANOSECONDS)
|
||||||
|
@ -253,6 +257,10 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
|
|
||||||
@Delegate
|
@Delegate
|
||||||
public Optional<AsyncCallee> getOptionalCallee(@EndpointParam URI endpoint);
|
public Optional<AsyncCallee> getOptionalCallee(@EndpointParam URI endpoint);
|
||||||
|
|
||||||
|
@Delegate
|
||||||
|
@Path("/testing/testing/{wibble}")
|
||||||
|
public AsyncCallee getCalleeWithPath(@EndpointParam URI endpoint, @PathParam("wibble") String wibble);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAsyncDelegateIsLazyLoadedAndRequestIncludesVersionAndPath() throws InterruptedException,
|
public void testAsyncDelegateIsLazyLoadedAndRequestIncludesVersionAndPath() throws InterruptedException,
|
||||||
|
@ -330,6 +338,30 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAsyncDelegateWithPathParamIsLazyLoadedAndRequestIncludesEndpointVersionAndPath() throws InterruptedException,
|
||||||
|
ExecutionException {
|
||||||
|
Injector child = injectorForCaller(new HttpCommandExecutorService() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Future<HttpResponse> submit(HttpCommand command) {
|
||||||
|
assertEquals(command.getCurrentRequest().getRequestLine(), "GET http://howdyboys/testing/testing/thepathparam/client/1/foo HTTP/1.1");
|
||||||
|
return Futures.immediateFuture(HttpResponse.builder().build());
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
child.getInstance(AsyncCallee.class);
|
||||||
|
assert false : "Callee shouldn't be bound yet";
|
||||||
|
} catch (ConfigurationException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
child.getInstance(AsyncCaller.class).getCalleeWithPath(URI.create("http://howdyboys"), "thepathparam").onePath("foo").get();
|
||||||
|
|
||||||
|
assertEquals(child.getInstance(AsyncCaller.class).getURI(), URI.create("http://localhost:1111"));
|
||||||
|
}
|
||||||
|
|
||||||
public void testAsyncDelegateIsLazyLoadedAndRequestIncludesEndpointVersionAndPathOptionalPresent()
|
public void testAsyncDelegateIsLazyLoadedAndRequestIncludesEndpointVersionAndPathOptionalPresent()
|
||||||
throws InterruptedException, ExecutionException {
|
throws InterruptedException, ExecutionException {
|
||||||
Injector child = injectorForCaller(new HttpCommandExecutorService() {
|
Injector child = injectorForCaller(new HttpCommandExecutorService() {
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. jclouds 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
|
||||||
|
|
||||||
|
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.5.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../../project/pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<groupId>org.jclouds.labs</groupId>
|
||||||
|
<artifactId>openstack-quantum</artifactId>
|
||||||
|
<name>jcloud openstack-quantum api</name>
|
||||||
|
<description>jclouds components to access an implementation of OpenStack Quantum</description>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- keystone endpoint -->
|
||||||
|
<test.openstack-quantum.endpoint>http://localhost:5000</test.openstack-quantum.endpoint>
|
||||||
|
<!-- keystone version -->
|
||||||
|
<test.openstack-quantum.api-version>1.0</test.openstack-quantum.api-version>
|
||||||
|
<test.openstack-quantum.build-version></test.openstack-quantum.build-version>
|
||||||
|
<test.openstack-quantum.identity>FIXME_IDENTITY</test.openstack-quantum.identity>
|
||||||
|
<test.openstack-quantum.credential>FIXME_CREDENTIALS</test.openstack-quantum.credential>
|
||||||
|
<test.jclouds.keystone.credential-type>passwordCredentials</test.jclouds.keystone.credential-type>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jclouds.common</groupId>
|
||||||
|
<artifactId>openstack-common</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<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.common</groupId>
|
||||||
|
<artifactId>openstack-common</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<type>test-jar</type>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jclouds.driver</groupId>
|
||||||
|
<artifactId>jclouds-slf4j</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
<version>1.0.0</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>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<test.openstack-quantum.endpoint>${test.openstack-quantum.endpoint}</test.openstack-quantum.endpoint>
|
||||||
|
<test.openstack-quantum.api-version>${test.openstack-quantum.api-version}</test.openstack-quantum.api-version>
|
||||||
|
<test.openstack-quantum.build-version>${test.openstack-quantum.build-version}</test.openstack-quantum.build-version>
|
||||||
|
<test.openstack-quantum.identity>${test.openstack-quantum.identity}</test.openstack-quantum.identity>
|
||||||
|
<test.openstack-quantum.credential>${test.openstack-quantum.credential}</test.openstack-quantum.credential>
|
||||||
|
<test.jclouds.keystone.credential-type>${test.jclouds.keystone.credential-type}</test.jclouds.keystone.credential-type>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
|
||||||
|
<Export-Package>org.jclouds.openstack.quantum.v1_0*;version="${project.version}"</Export-Package>
|
||||||
|
<Import-Package>
|
||||||
|
org.jclouds.rest.internal;version="${project.version}",
|
||||||
|
org.jclouds*;version="${project.version}",
|
||||||
|
*
|
||||||
|
</Import-Package>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,99 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0;
|
||||||
|
|
||||||
|
import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.SERVICE_TYPE;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.jclouds.apis.ApiMetadata;
|
||||||
|
import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.config.QuantumRestClientModule;
|
||||||
|
import org.jclouds.openstack.services.ServiceType;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.jclouds.rest.internal.BaseRestApiMetadata;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.reflect.TypeToken;
|
||||||
|
import com.google.inject.Module;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of {@link ApiMetadata} for Quantum 1.0 API
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
public class QuantumApiMetadata extends BaseRestApiMetadata {
|
||||||
|
/** The serialVersionUID */
|
||||||
|
private static final long serialVersionUID = -7273686435105663195L;
|
||||||
|
|
||||||
|
public static final TypeToken<RestContext<QuantumClient, QuantumAsyncClient>> CONTEXT_TOKEN = new TypeToken<RestContext<QuantumClient, QuantumAsyncClient>>() {
|
||||||
|
private static final long serialVersionUID = -3493117927790861884L;
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return new Builder().fromApiMetadata(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public QuantumApiMetadata() {
|
||||||
|
this(new Builder());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected QuantumApiMetadata(Builder builder) {
|
||||||
|
super(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Properties defaultProperties() {
|
||||||
|
Properties properties = BaseRestApiMetadata.defaultProperties();
|
||||||
|
properties.setProperty(SERVICE_TYPE, ServiceType.NETWORK);
|
||||||
|
// TODO: this doesn't actually do anything yet.
|
||||||
|
properties.setProperty(KeystoneProperties.VERSION, "2.0");
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder extends BaseRestApiMetadata.Builder {
|
||||||
|
|
||||||
|
protected Builder() {
|
||||||
|
super(QuantumClient.class, QuantumAsyncClient.class);
|
||||||
|
id("openstack-quantum")
|
||||||
|
.name("OpenStack Quantum API")
|
||||||
|
.identityName("tenantId:user")
|
||||||
|
.credentialName("password")
|
||||||
|
.documentation(URI.create("http://docs.openstack.org/api/openstack-network/1.0/content/"))
|
||||||
|
.version("1.0")
|
||||||
|
.defaultEndpoint("http://localhost:5000")
|
||||||
|
.defaultProperties(QuantumApiMetadata.defaultProperties())
|
||||||
|
.defaultModules(ImmutableSet.<Class<? extends Module>>of(QuantumRestClientModule.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public QuantumApiMetadata build() {
|
||||||
|
return new QuantumApiMetadata(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Builder fromApiMetadata(ApiMetadata in) {
|
||||||
|
super.fromApiMetadata(in);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
import org.jclouds.location.Region;
|
||||||
|
import org.jclouds.location.functions.RegionToEndpoint;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.NetworkAsyncClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.PortAsyncClient;
|
||||||
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
|
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Quantum via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @see QuantumClient
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content">api doc</a>
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
public interface QuantumAsyncClient {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the Region codes configured
|
||||||
|
*/
|
||||||
|
@Provides
|
||||||
|
@Region
|
||||||
|
Set<String> getConfiguredRegions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Network features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
NetworkAsyncClient getNetworkClientForRegion(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Port features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
@Path("/networks/{net}")
|
||||||
|
PortAsyncClient getPortClientForRegionAndNetwork(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region,
|
||||||
|
@PathParam("net") String networkId);
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
import org.jclouds.location.Region;
|
||||||
|
import org.jclouds.location.functions.RegionToEndpoint;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.NetworkClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.PortClient;
|
||||||
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
|
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to Quantum.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see QuantumAsyncClient
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content">api doc</a>
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface QuantumClient {
|
||||||
|
/**
|
||||||
|
* @return the Region codes configured
|
||||||
|
*/
|
||||||
|
@Provides
|
||||||
|
@Region
|
||||||
|
Set<String> getConfiguredRegions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to Network features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
NetworkClient getNetworkClientForRegion(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to Port features.
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
@Path("/networks/{net}")
|
||||||
|
PortClient getPortClientForRegionAndNetwork(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region,
|
||||||
|
@PathParam("net") String networkId);
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration properties and constants used in openstack Quantum connections.
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
public class QuantumProperties {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.config;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
|
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.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.QuantumAsyncClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.QuantumClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.NetworkAsyncClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.NetworkClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.PortAsyncClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.features.PortClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.handlers.QuantumErrorHandler;
|
||||||
|
import org.jclouds.rest.ConfiguresRestClient;
|
||||||
|
import org.jclouds.rest.config.RestClientModule;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the Quantum connection.
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@ConfiguresRestClient
|
||||||
|
public class QuantumRestClientModule extends RestClientModule<QuantumClient, QuantumAsyncClient> {
|
||||||
|
|
||||||
|
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()
|
||||||
|
.put(NetworkClient.class, NetworkAsyncClient.class)
|
||||||
|
.put(PortClient.class, PortAsyncClient.class)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
public QuantumRestClientModule() {
|
||||||
|
super(DELEGATE_MAP);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(DateAdapter.class).to(Iso8601DateAdapter.class);
|
||||||
|
super.configure();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void installLocations() {
|
||||||
|
// TODO: select this from KeystoneProperties.VERSION; note you select from
|
||||||
|
// a guice provided
|
||||||
|
// property, so it will have to come from somewhere else, maybe we move
|
||||||
|
// this to the the
|
||||||
|
// ContextBuilder
|
||||||
|
install(KeystoneAuthenticationModule.forRegions());
|
||||||
|
super.installLocations();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void bindErrorHandlers() {
|
||||||
|
bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(QuantumErrorHandler.class);
|
||||||
|
bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(QuantumErrorHandler.class);
|
||||||
|
bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(QuantumErrorHandler.class);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Quantum attachment
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Attachments.html">api doc</a>
|
||||||
|
*/
|
||||||
|
public class Attachment extends Reference {
|
||||||
|
|
||||||
|
public static Builder<?> builder() {
|
||||||
|
return new ConcreteBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<?> toBuilder() {
|
||||||
|
return new ConcreteBuilder().fromAttachment(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> {
|
||||||
|
protected abstract T self();
|
||||||
|
|
||||||
|
public Attachment build() {
|
||||||
|
return new Attachment(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T fromAttachment(Attachment in) {
|
||||||
|
return super.fromReference(in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||||
|
@Override
|
||||||
|
protected ConcreteBuilder self() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Attachment(Builder<?> builder) {
|
||||||
|
super(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Attachment() {
|
||||||
|
// for GSON
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.domain;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.base.Objects.ToStringHelper;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Quantum network
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
|
||||||
|
*/
|
||||||
|
public class Network extends Reference {
|
||||||
|
|
||||||
|
public static Builder<?> builder() {
|
||||||
|
return new ConcreteBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<?> toBuilder() {
|
||||||
|
return new ConcreteBuilder().fromNetwork(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> {
|
||||||
|
protected abstract T self();
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Network#getName()
|
||||||
|
*/
|
||||||
|
public T name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Network build() {
|
||||||
|
return new Network(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T fromNetwork(Network in) {
|
||||||
|
return super.fromReference(in).name(in.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||||
|
@Override
|
||||||
|
protected ConcreteBuilder self() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
protected Network(Builder<?> builder) {
|
||||||
|
super(builder);
|
||||||
|
this.name = checkNotNull(builder.name, "name");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Network() {
|
||||||
|
// for GSON
|
||||||
|
this.name = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(super.hashCode(), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass()) return false;
|
||||||
|
Network that = Network.class.cast(obj);
|
||||||
|
return super.equals(that) && Objects.equal(this.name, that.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ToStringHelper string() {
|
||||||
|
return super.string().add("name", name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.base.Objects.ToStringHelper;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Details of a Quantum network
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
|
||||||
|
*/
|
||||||
|
public class NetworkDetails extends Network {
|
||||||
|
|
||||||
|
public static Builder<?> builder() {
|
||||||
|
return new ConcreteBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<?> toBuilder() {
|
||||||
|
return new ConcreteBuilder().fromNetworkDetails(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class Builder<T extends Builder<T>> extends Network.Builder<T> {
|
||||||
|
private Set<Port> ports = ImmutableSet.of();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkDetails#getPorts()
|
||||||
|
*/
|
||||||
|
public T ports(Set<Port> ports) {
|
||||||
|
this.ports = ports;
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
|
public T ports(Port... in) {
|
||||||
|
return ports(ImmutableSet.copyOf(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
public NetworkDetails build() {
|
||||||
|
return new NetworkDetails(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T fromNetworkDetails(NetworkDetails in) {
|
||||||
|
return super.fromNetwork(in).ports(in.getPorts());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||||
|
@Override
|
||||||
|
protected ConcreteBuilder self() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Set<Port> ports;
|
||||||
|
|
||||||
|
protected NetworkDetails(Builder<?> builder) {
|
||||||
|
super(builder);
|
||||||
|
this.ports = ImmutableSet.copyOf(checkNotNull(builder.ports, "ports"));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected NetworkDetails() {
|
||||||
|
// for GSON
|
||||||
|
this.ports = ImmutableSet.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public Set<Port> getPorts() {
|
||||||
|
return Collections.unmodifiableSet(this.ports);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(ports);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass()) return false;
|
||||||
|
NetworkDetails that = NetworkDetails.class.cast(obj);
|
||||||
|
return super.equals(that) && Objects.equal(this.ports, that.ports);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ToStringHelper string() {
|
||||||
|
return super.string().add("ports", ports);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.base.Objects.ToStringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Quantum port
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a>
|
||||||
|
*/
|
||||||
|
public class Port extends Reference {
|
||||||
|
|
||||||
|
public static enum State {
|
||||||
|
ACTIVE, DOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Builder<?> builder() {
|
||||||
|
return new ConcreteBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<?> toBuilder() {
|
||||||
|
return new ConcreteBuilder().fromPort(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class Builder<T extends Builder<T>> extends Reference.Builder<T> {
|
||||||
|
protected abstract T self();
|
||||||
|
|
||||||
|
private Port.State state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Port#getState()
|
||||||
|
*/
|
||||||
|
public T state(Port.State state) {
|
||||||
|
this.state = state;
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Port build() {
|
||||||
|
return new Port(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T fromPort(Port in) {
|
||||||
|
return fromReference(in).state(in.getState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||||
|
@Override
|
||||||
|
protected ConcreteBuilder self() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Port.State state;
|
||||||
|
|
||||||
|
protected Port(Builder<?> builder) {
|
||||||
|
super(builder);
|
||||||
|
this.state = checkNotNull(builder.state, "state");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Port() {
|
||||||
|
// for GSON
|
||||||
|
this.state = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Port.State getState() {
|
||||||
|
return this.state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(super.hashCode(), state);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass()) return false;
|
||||||
|
Port that = Port.class.cast(obj);
|
||||||
|
return super.equals(that) && Objects.equal(this.state, that.state);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ToStringHelper string() {
|
||||||
|
return super.string().add("state", state);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,104 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.domain;
|
||||||
|
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.base.Objects.ToStringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Details of a Quantum Port
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a>
|
||||||
|
*/
|
||||||
|
public class PortDetails extends Port {
|
||||||
|
|
||||||
|
public static Builder<?> builder() {
|
||||||
|
return new ConcreteBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<?> toBuilder() {
|
||||||
|
return new ConcreteBuilder().fromPortDetails(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class Builder<T extends Builder<T>> extends Port.Builder<T> {
|
||||||
|
private Attachment attachment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortDetails#getAttachment()
|
||||||
|
*/
|
||||||
|
public T attachment(Attachment attachment) {
|
||||||
|
this.attachment = attachment;
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PortDetails build() {
|
||||||
|
return new PortDetails(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T fromPortDetails(PortDetails in) {
|
||||||
|
return super.fromPort(in).attachment(in.getAttachment());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||||
|
@Override
|
||||||
|
protected ConcreteBuilder self() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final Attachment attachment;
|
||||||
|
|
||||||
|
protected PortDetails(Builder<?> builder) {
|
||||||
|
super(builder);
|
||||||
|
this.attachment = builder.attachment;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected PortDetails() {
|
||||||
|
// for GSON
|
||||||
|
this.attachment = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Attachment getAttachment() {
|
||||||
|
return this.attachment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass()) return false;
|
||||||
|
PortDetails that = PortDetails.class.cast(obj);
|
||||||
|
return super.equals(that) && Objects.equal(this.attachment, that.attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ToStringHelper string() {
|
||||||
|
return super.string().add("attachment", attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,111 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.base.Objects.ToStringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A wrapper around an id in the quantum api
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
|
||||||
|
*/
|
||||||
|
public class Reference {
|
||||||
|
|
||||||
|
public static Builder<?> builder() {
|
||||||
|
return new ConcreteBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<?> toBuilder() {
|
||||||
|
return new ConcreteBuilder().fromReference(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class Builder<T extends Builder<T>> {
|
||||||
|
protected abstract T self();
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.jclouds.openstack.quantum.v1_0.domain.Reference#getId()
|
||||||
|
*/
|
||||||
|
public T id(String id) {
|
||||||
|
this.id = id;
|
||||||
|
return self();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Reference build() {
|
||||||
|
return new Reference(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T fromReference(Reference in) {
|
||||||
|
return this.id(in.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||||
|
@Override
|
||||||
|
protected ConcreteBuilder self() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
|
||||||
|
protected Reference(Builder<?> builder) {
|
||||||
|
this.id = checkNotNull(builder.id, "id");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Reference() {
|
||||||
|
// for GSON
|
||||||
|
this.id = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public String getId() {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass()) return false;
|
||||||
|
Reference that = Reference.class.cast(obj);
|
||||||
|
return Objects.equal(this.id, that.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ToStringHelper string() {
|
||||||
|
return Objects.toStringHelper("").add("id", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return string().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.DELETE;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.PUT;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.openstack.filters.AuthenticateRequest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Network;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.NetworkDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
|
import org.jclouds.rest.annotations.PayloadParam;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
import org.jclouds.rest.annotations.SkipEncoding;
|
||||||
|
import org.jclouds.rest.annotations.WrapWith;
|
||||||
|
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
|
||||||
|
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Network operations on the openstack quantum API.
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see org.jclouds.openstack.quantum.v1_0.features.NetworkClient
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
|
||||||
|
*/
|
||||||
|
@SkipEncoding({'/', '='})
|
||||||
|
@RequestFilters(AuthenticateRequest.class)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Path("/networks")
|
||||||
|
public interface NetworkAsyncClient {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkClient#listReferences
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("networks")
|
||||||
|
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Set<Reference>> listReferences();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkClient#list
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("networks")
|
||||||
|
@Path("/detail")
|
||||||
|
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Set<Network>> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkClient#get
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("network")
|
||||||
|
@Path("/{id}")
|
||||||
|
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Network> get(@PathParam("id") String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkClient#getDetails
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("network")
|
||||||
|
@Path("/{id}/detail")
|
||||||
|
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<NetworkDetails> getDetails(@PathParam("id") String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkClient#create
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@SelectJson("network")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@WrapWith("network")
|
||||||
|
ListenableFuture<Reference> create(@PayloadParam("name") String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkClient#rename
|
||||||
|
*/
|
||||||
|
@PUT
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Path("/{id}")
|
||||||
|
@WrapWith("network")
|
||||||
|
ListenableFuture<Boolean> rename(@PathParam("id") String id, @PayloadParam("name") String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkClient#delete
|
||||||
|
*/
|
||||||
|
@DELETE
|
||||||
|
@Path("/{id}")
|
||||||
|
ListenableFuture<Boolean> delete(@PathParam("id") String id);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Network;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.NetworkDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to Network operations on the openstack quantum API.
|
||||||
|
* <p/>
|
||||||
|
* Each tenant can define one or more networks. A network is a virtual isolated layer-2 broadcast domain reserved to the
|
||||||
|
* tenant. A tenant can create several ports for a network, and plug virtual interfaces into these ports.
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see org.jclouds.openstack.quantum.v1_0.features.NetworkAsyncClient
|
||||||
|
* @see <a href=
|
||||||
|
* "http://docs.openstack.org/api/openstack-network/1.0/content/Networks.html">api doc</a>
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface NetworkClient {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of all networks currently defined in Quantum for the current tenant. The list provides the unique
|
||||||
|
* identifier of each network configured for the tenant.
|
||||||
|
*/
|
||||||
|
Set<Reference> listReferences();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all networks currently defined in Quantum for the current tenant.
|
||||||
|
*/
|
||||||
|
Set<Network> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the specific network.
|
||||||
|
*/
|
||||||
|
Network get(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the details of the specific network.
|
||||||
|
*/
|
||||||
|
NetworkDetails getDetails(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new network with the specified symbolic name
|
||||||
|
*/
|
||||||
|
Reference create(String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjusts the symbolic name of a network
|
||||||
|
*
|
||||||
|
* @param id the id of the Network to modify
|
||||||
|
* @param name the new name for the Network
|
||||||
|
*/
|
||||||
|
boolean rename(String id, String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the specified network
|
||||||
|
*/
|
||||||
|
boolean delete(String id);
|
||||||
|
}
|
|
@ -0,0 +1,152 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.DELETE;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.PUT;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.openstack.filters.AuthenticateRequest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Attachment;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Port;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.PortDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
|
import org.jclouds.rest.annotations.PayloadParam;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
import org.jclouds.rest.annotations.SkipEncoding;
|
||||||
|
import org.jclouds.rest.annotations.WrapWith;
|
||||||
|
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
|
||||||
|
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides asynchronous access to Network operations on the openstack quantum API.
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see PortClient
|
||||||
|
* @see <a href="http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a>
|
||||||
|
*/
|
||||||
|
@SkipEncoding({'/', '='})
|
||||||
|
@RequestFilters(AuthenticateRequest.class)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Path("/ports")
|
||||||
|
public interface PortAsyncClient {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#listReferences
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("ports")
|
||||||
|
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Set<Reference>> listReferences();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#list
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("ports")
|
||||||
|
@Path("/detail")
|
||||||
|
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Set<Port>> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#get
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("port")
|
||||||
|
@Path("/{id}")
|
||||||
|
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Port> get(@PathParam("id") String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#getDetails
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("port")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Path("/{id}/detail")
|
||||||
|
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<PortDetails> getDetails(@PathParam("id") String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#create()
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@SelectJson("port")
|
||||||
|
ListenableFuture<Reference> create();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#create(org.jclouds.openstack.quantum.v1_0.domain.Port.State)
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@SelectJson("port")
|
||||||
|
@WrapWith("port")
|
||||||
|
ListenableFuture<Port> create(@PayloadParam("state") Port.State state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#updateState
|
||||||
|
*/
|
||||||
|
@PUT
|
||||||
|
@Path("/{id}")
|
||||||
|
@WrapWith("port")
|
||||||
|
ListenableFuture<Boolean> updateState(@PathParam("id") String id, @PayloadParam("state") Port.State state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#delete
|
||||||
|
*/
|
||||||
|
@DELETE
|
||||||
|
@Path("/{id}")
|
||||||
|
ListenableFuture<Boolean> delete(@PathParam("id") String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#showAttachment
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("attachment")
|
||||||
|
@Path("/{id}/attachment")
|
||||||
|
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Attachment> showAttachment(@PathParam("id") String portId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#plugAttachment
|
||||||
|
*/
|
||||||
|
@PUT
|
||||||
|
@Path("/{id}/attachment")
|
||||||
|
@WrapWith("attachment")
|
||||||
|
ListenableFuture<Boolean> plugAttachment(@PathParam("id") String portId,
|
||||||
|
@PayloadParam("id") String attachmentId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PortClient#unplugAttachment
|
||||||
|
*/
|
||||||
|
@DELETE
|
||||||
|
@Path("{id}/attachment")
|
||||||
|
ListenableFuture<Boolean> unplugAttachment(@PathParam("id") String portId);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Attachment;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Port;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.PortDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides synchronous access to Port operations on the openstack quantum API.
|
||||||
|
* <p/>
|
||||||
|
* A port represents a virtual switch port on a logical network switch where all the interfaces attached to a given network are connected.
|
||||||
|
* <p/>
|
||||||
|
* A port has an administrative state which is either 'DOWN' or 'ACTIVE'. Ports which are administratively down will not be able to receive/send traffic.
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
* @see PortAsyncClient
|
||||||
|
* @see <a href=
|
||||||
|
* "http://docs.openstack.org/api/openstack-network/1.0/content/Ports.html">api doc</a>
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface PortClient {
|
||||||
|
/**
|
||||||
|
* Returns the list of all ports currently defined in Quantum for the requested network
|
||||||
|
*/
|
||||||
|
Set<Reference> listReferences();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the set of ports currently defined in Quantum for the requested network.
|
||||||
|
*/
|
||||||
|
Set<Port> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a specific port.
|
||||||
|
*/
|
||||||
|
Port get(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a specific port in detail.
|
||||||
|
*/
|
||||||
|
PortDetails getDetails(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new port on the specified network
|
||||||
|
*/
|
||||||
|
Reference create();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new port on the specified network, with the requested state
|
||||||
|
*/
|
||||||
|
Reference create(Port.State state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the state of a port
|
||||||
|
*/
|
||||||
|
boolean updateState(String id, Port.State state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a port from a network
|
||||||
|
*/
|
||||||
|
boolean delete(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the attachment for the specified port.
|
||||||
|
*/
|
||||||
|
Attachment showAttachment(String portId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugs an attachment into the specified port
|
||||||
|
*/
|
||||||
|
boolean plugAttachment(String portId, String attachmentId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unplugs the attachment currently plugged into the specified port
|
||||||
|
*/
|
||||||
|
boolean unplugAttachment(String portId);
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.handlers;
|
||||||
|
|
||||||
|
import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream;
|
||||||
|
|
||||||
|
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.rest.AuthorizationException;
|
||||||
|
import org.jclouds.rest.ResourceNotFoundException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will parse and set an appropriate exception on the command object.
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// TODO: is there error spec someplace? let's type errors, etc.
|
||||||
|
@Singleton
|
||||||
|
public class QuantumErrorHandler implements HttpErrorHandler {
|
||||||
|
public void handleError(HttpCommand command, HttpResponse response) {
|
||||||
|
// it is important to always read fully and close streams
|
||||||
|
byte[] data = closeClientButKeepContentStream(response);
|
||||||
|
String message = data != null ? new String(data) : null;
|
||||||
|
|
||||||
|
Exception exception = message != null ? new HttpResponseException(command, response, message)
|
||||||
|
: new HttpResponseException(command, response);
|
||||||
|
message = message != null ? message : String.format("%s -> %s", command.getCurrentRequest().getRequestLine(),
|
||||||
|
response.getStatusLine());
|
||||||
|
switch (response.getStatusCode()) {
|
||||||
|
case 400:
|
||||||
|
break;
|
||||||
|
case 401:
|
||||||
|
case 403:
|
||||||
|
exception = new AuthorizationException(message, exception);
|
||||||
|
break;
|
||||||
|
case 404:
|
||||||
|
if (!command.getCurrentRequest().getMethod().equals("DELETE")) {
|
||||||
|
exception = new ResourceNotFoundException(message, exception);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
command.setException(exception);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
org.jclouds.openstack.quantum.v1_0.QuantumApiMetadata
|
|
@ -0,0 +1,37 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0;
|
||||||
|
|
||||||
|
import org.jclouds.View;
|
||||||
|
import org.jclouds.apis.internal.BaseApiMetadataTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.reflect.TypeToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "QuantumApiMetadataTest")
|
||||||
|
public class QuantumApiMetadataTest extends BaseApiMetadataTest {
|
||||||
|
public QuantumApiMetadataTest() {
|
||||||
|
super(new QuantumApiMetadata(), ImmutableSet.<TypeToken<? extends View>> of());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,236 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 1.1 (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-1.1
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertNull;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Network;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.NetworkDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.internal.BaseQuantumClientExpectTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.parse.ParseNetworkDetailsTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.parse.ParseNetworkTest;
|
||||||
|
import org.jclouds.rest.AuthorizationException;
|
||||||
|
import org.jclouds.rest.ResourceNotFoundException;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests parsing and Guice wiring of NetworkClient
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups="unit", testName = "NetworkClientExpectTest")
|
||||||
|
public class NetworkClientExpectTest extends BaseQuantumClientExpectTest {
|
||||||
|
|
||||||
|
public void testListReferencesReturns2xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromResourceWithContentType("/list_network_refs.json", APPLICATION_JSON)).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
Set<Reference> nets = client.listReferences();
|
||||||
|
assertEquals(nets, listOfNetworkRefs());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListReferencesReturns4xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
assertTrue(client.listReferences().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListReturns2xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/detail").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromResourceWithContentType("/list_networks.json", APPLICATION_JSON)).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
Set<Network> nets = client.list();
|
||||||
|
assertEquals(nets, listOfNetworks());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListReturns4xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/detail").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
assertTrue(client.list().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowReturns2xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromResourceWithContentType("/network.json", APPLICATION_JSON)).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
Network net = client.get("16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
assertEquals(net, new ParseNetworkTest().expected());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowReturns4xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
assertNull(client.get("16dba3bc-f3fa-4775-afdc-237e12c72f6a"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowDetailsReturns2xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/detail").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromResourceWithContentType("/network_details.json", APPLICATION_JSON)).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
NetworkDetails net = client.getDetails("16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
assertEquals(net, new ParseNetworkDetailsTest().expected());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowDetailsReturns4xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/detail").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
assertNull(client.getDetails("16dba3bc-f3fa-4775-afdc-237e12c72f6a"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreateReturns2xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks").method("POST")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"network\":{\"name\":\"another-test\"}}", MediaType.APPLICATION_JSON)).build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromStringWithContentType("{\"network\":{\"id\":\"12345\"}}", APPLICATION_JSON)).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
Reference net = client.create("another-test");
|
||||||
|
assertEquals(net, Reference.builder().id("12345").build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
|
public void testCreateReturns4xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks").method("POST")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"network\":{\"name\":\"another-test\"}}", MediaType.APPLICATION_JSON)).build(),
|
||||||
|
standardResponseBuilder(401).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
client.create("another-test");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testUpdateReturns2xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/12345").method("PUT")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"network\":{\"name\":\"another-test\"}}", MediaType.APPLICATION_JSON)).build(),
|
||||||
|
standardResponseBuilder(200).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
assertTrue(client.rename("12345", "another-test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = ResourceNotFoundException.class)
|
||||||
|
public void testUpdateReturns4xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/12345").method("PUT")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"network\":{\"name\":\"another-test\"}}", MediaType.APPLICATION_JSON)).build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
client.rename("12345", "another-test");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeleteReturns2xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/12345").method("DELETE").build(),
|
||||||
|
standardResponseBuilder(200).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
assertTrue(client.delete("12345"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
|
public void testDeleteReturns4xx() {
|
||||||
|
NetworkClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/12345").method("DELETE").build(),
|
||||||
|
standardResponseBuilder(403).build())
|
||||||
|
.getNetworkClientForRegion("region-a.geo-1");
|
||||||
|
|
||||||
|
client.delete("12345");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Set<Reference> listOfNetworkRefs() {
|
||||||
|
return ImmutableSet.of(
|
||||||
|
Reference.builder().id("16dba3bc-f3fa-4775-afdc-237e12c72f6a").build(),
|
||||||
|
Reference.builder().id("1a104cf5-cb18-4d35-9407-2fd2646d9d0b").build(),
|
||||||
|
Reference.builder().id("31083ae2-420d-48b2-ac98-9f7a4fd8dbdc").build(),
|
||||||
|
Reference.builder().id("49c6d6fa-ff2a-459d-b975-75a8d31c9a89").build(),
|
||||||
|
Reference.builder().id("5cb3d6f4-62cb-41c9-b964-ba7d9df79e4e").build(),
|
||||||
|
Reference.builder().id("5d51d012-3491-4db7-b1b5-6f254015015d").build(),
|
||||||
|
Reference.builder().id("5f9cf7dc-22ca-4097-8e49-1cc8b23faf17").build(),
|
||||||
|
Reference.builder().id("6319ecad-6bff-48b2-9b53-02ede8cb7588").build(),
|
||||||
|
Reference.builder().id("6ba4c788-661f-49ab-9bf8-5f10cbbb2f57").build(),
|
||||||
|
Reference.builder().id("74ed170b-5069-4353-ab38-9719766dc57e").build(),
|
||||||
|
Reference.builder().id("b71fcac1-e864-4031-8c5b-edbecd9ece36").build(),
|
||||||
|
Reference.builder().id("c7681895-d84d-4650-9ca0-82c72036b855").build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Set<Network> listOfNetworks() {
|
||||||
|
return ImmutableSet.of(
|
||||||
|
Network.builder().name("jclouds-port-test").id("16dba3bc-f3fa-4775-afdc-237e12c72f6a").build(),
|
||||||
|
Network.builder().name("wibble").id("1a104cf5-cb18-4d35-9407-2fd2646d9d0b").build(),
|
||||||
|
Network.builder().name("jclouds-test").id("31083ae2-420d-48b2-ac98-9f7a4fd8dbdc").build(),
|
||||||
|
Network.builder().name("jclouds-test").id("49c6d6fa-ff2a-459d-b975-75a8d31c9a89").build(),
|
||||||
|
Network.builder().name("wibble").id("5cb3d6f4-62cb-41c9-b964-ba7d9df79e4e").build(),
|
||||||
|
Network.builder().name("jclouds-port-test").id("5d51d012-3491-4db7-b1b5-6f254015015d").build(),
|
||||||
|
Network.builder().name("wibble").id("5f9cf7dc-22ca-4097-8e49-1cc8b23faf17").build(),
|
||||||
|
Network.builder().name("jclouds-test").id("6319ecad-6bff-48b2-9b53-02ede8cb7588").build(),
|
||||||
|
Network.builder().name("jclouds-port-test").id("6ba4c788-661f-49ab-9bf8-5f10cbbb2f57").build(),
|
||||||
|
Network.builder().name("jclouds-test").id("74ed170b-5069-4353-ab38-9719766dc57e").build(),
|
||||||
|
Network.builder().name("wibble").id("b71fcac1-e864-4031-8c5b-edbecd9ece36").build(),
|
||||||
|
Network.builder().name("jclouds-port-test").id("c7681895-d84d-4650-9ca0-82c72036b855").build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 1.1 (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-1.1
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertNotNull;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Network;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.NetworkDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.internal.BaseQuantumClientLiveTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests NetworkClient
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "live", testName = "NetworkClientLiveTest", singleThreaded = true)
|
||||||
|
public class NetworkClientLiveTest extends BaseQuantumClientLiveTest {
|
||||||
|
|
||||||
|
public void testListNetworks() {
|
||||||
|
for (String regionId : quantumContext.getApi().getConfiguredRegions()) {
|
||||||
|
Set<Reference> ids = quantumContext.getApi().getNetworkClientForRegion(regionId).listReferences();
|
||||||
|
Set<Network> networks = quantumContext.getApi().getNetworkClientForRegion(regionId).list();
|
||||||
|
assertNotNull(ids);
|
||||||
|
assertEquals(ids.size(), networks.size());
|
||||||
|
for (Network network : networks) {
|
||||||
|
assertNotNull(network.getName());
|
||||||
|
assertTrue(ids.contains(Reference.builder().id(network.getId()).build()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreateUpdateAndDeleteNetwork() {
|
||||||
|
for (String regionId : quantumContext.getApi().getConfiguredRegions()) {
|
||||||
|
NetworkClient client = quantumContext.getApi().getNetworkClientForRegion(regionId);
|
||||||
|
Reference net = client.create("jclouds-test");
|
||||||
|
assertNotNull(net);
|
||||||
|
|
||||||
|
Network network = client.get(net.getId());
|
||||||
|
NetworkDetails details = client.getDetails(net.getId());
|
||||||
|
|
||||||
|
for(Network checkme : ImmutableList.of(network, details)) {
|
||||||
|
assertEquals(checkme.getId(), net.getId());
|
||||||
|
assertEquals(checkme.getName(), "jclouds-test");
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(details.getPorts().isEmpty());
|
||||||
|
|
||||||
|
assertTrue(client.rename(net.getId(), "jclouds-live-test"));
|
||||||
|
|
||||||
|
// Grab the updated metadata
|
||||||
|
network = client.get(net.getId());
|
||||||
|
details = client.getDetails(net.getId());
|
||||||
|
|
||||||
|
for(Network checkme : ImmutableList.of(network, details)) {
|
||||||
|
assertEquals(checkme.getId(), net.getId());
|
||||||
|
assertEquals(checkme.getName(), "jclouds-live-test");
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(details.getPorts().isEmpty());
|
||||||
|
|
||||||
|
Reference net2 = client.create("jclouds-test2");
|
||||||
|
assertNotNull(net2);
|
||||||
|
|
||||||
|
assertTrue(client.delete(net.getId()));
|
||||||
|
assertTrue(client.delete(net2.getId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,246 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 1.1 (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-1.1
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertNull;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Attachment;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Port;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.PortDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.internal.BaseQuantumClientExpectTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.parse.ParsePortDetailsTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.parse.ParsePortTest;
|
||||||
|
import org.jclouds.rest.AuthorizationException;
|
||||||
|
import org.jclouds.rest.ResourceNotFoundException;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests parsing and Guice wiring of PortClient
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups="unit", testName = "PortClientExpectTest")
|
||||||
|
public class PortClientExpectTest extends BaseQuantumClientExpectTest {
|
||||||
|
|
||||||
|
public void testListReferencesReturns2xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/1a104cf5-cb18-4d35-9407-2fd2646d9d0b/ports").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromStringWithContentType("{\"ports\": [{\"id\": \"a6058a59-fa8c-46cc-bac8-08904e6ff0a5\"}]}", APPLICATION_JSON)).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "1a104cf5-cb18-4d35-9407-2fd2646d9d0b");
|
||||||
|
|
||||||
|
Set<Reference> nets = client.listReferences();
|
||||||
|
assertEquals(nets, ImmutableSet.of(Reference.builder().id("a6058a59-fa8c-46cc-bac8-08904e6ff0a5").build()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListReferencesReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/1a104cf5-cb18-4d35-9407-2fd2646d9d0b/ports").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "1a104cf5-cb18-4d35-9407-2fd2646d9d0b");
|
||||||
|
|
||||||
|
assertTrue(client.listReferences().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListReturns2xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/1a104cf5-cb18-4d35-9407-2fd2646d9d0b/ports/detail").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromStringWithContentType("{\"ports\": [{\"state\": \"DOWN\", \"id\": \"814ae4bb-33d9-425f-8ee2-13a5c90b1465\"}]}", APPLICATION_JSON)).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "1a104cf5-cb18-4d35-9407-2fd2646d9d0b");
|
||||||
|
|
||||||
|
Set<Port> nets = client.list();
|
||||||
|
assertEquals(nets, ImmutableSet.of(Port.builder().state(Port.State.DOWN).id("814ae4bb-33d9-425f-8ee2-13a5c90b1465").build()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/1a104cf5-cb18-4d35-9407-2fd2646d9d0b/ports/detail").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "1a104cf5-cb18-4d35-9407-2fd2646d9d0b");
|
||||||
|
|
||||||
|
assertTrue(client.list().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowReturns2xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/646c123b-871a-4124-9fa2-a94f04a582df").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromResourceWithContentType("/port.json", APPLICATION_JSON)).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
Port port = client.get("646c123b-871a-4124-9fa2-a94f04a582df");
|
||||||
|
assertEquals(port, new ParsePortTest().expected());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/646c123b-871a-4124-9fa2-a94f04a582df").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
assertNull(client.get("646c123b-871a-4124-9fa2-a94f04a582df"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowDetailsReturns2xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/646c123b-871a-4124-9fa2-a94f04a582df/detail").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromResourceWithContentType("/port_details.json", APPLICATION_JSON)).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
PortDetails net = client.getDetails("646c123b-871a-4124-9fa2-a94f04a582df");
|
||||||
|
assertEquals(net, new ParsePortDetailsTest().expected());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowDetailsReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/646c123b-871a-4124-9fa2-a94f04a582df/detail").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
assertNull(client.getDetails("646c123b-871a-4124-9fa2-a94f04a582df"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreateReturns2xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports").method("POST").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromStringWithContentType("{\"port\":{\"id\":\"12345\"}}", APPLICATION_JSON)).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
Reference port = client.create();
|
||||||
|
assertEquals(port, Reference.builder().id("12345").build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = ResourceNotFoundException.class)
|
||||||
|
public void testCreateReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports").method("POST").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
client.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testUpdateReturns2xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777").method("PUT")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"port\":{\"state\":\"ACTIVE\"}}", MediaType.APPLICATION_JSON)).build(),
|
||||||
|
standardResponseBuilder(200).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
assertTrue(client.updateState("77777", Port.State.ACTIVE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
|
public void testUpdateReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777").method("PUT")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"port\":{\"state\":\"ACTIVE\"}}", MediaType.APPLICATION_JSON)).build(),
|
||||||
|
standardResponseBuilder(401).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
client.updateState("77777", Port.State.ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowAttachment() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777/attachment").build(),
|
||||||
|
standardResponseBuilder(200).payload(payloadFromResourceWithContentType("/attachment.json", APPLICATION_JSON)).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
Attachment attachment = client.showAttachment("77777");
|
||||||
|
assertEquals(attachment, Attachment.builder().id("jclouds-live-test").build());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShowAttachmentReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777/attachment").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
assertNull(client.showAttachment("77777"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPlugAttachment() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777/attachment")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"attachment\":{\"id\":\"jclouds-live-test\"}}", MediaType.APPLICATION_JSON))
|
||||||
|
.method("PUT").build(),
|
||||||
|
standardResponseBuilder(200).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
assertTrue(client.plugAttachment("77777", "jclouds-live-test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
|
public void testPlugAttachmentReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777/attachment")
|
||||||
|
.payload(payloadFromStringWithContentType("{\"attachment\":{\"id\":\"jclouds-live-test\"}}", MediaType.APPLICATION_JSON))
|
||||||
|
.method("PUT").build(),
|
||||||
|
standardResponseBuilder(403).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
client.plugAttachment("77777", "jclouds-live-test");
|
||||||
|
}
|
||||||
|
public void testUnplugAttachment() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777/attachment").method("DELETE").build(),
|
||||||
|
standardResponseBuilder(200).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
assertTrue(client.unplugAttachment("77777"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = ResourceNotFoundException.class)
|
||||||
|
public void testUnplugAttachmentReturns4xx() {
|
||||||
|
PortClient client = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPassword, responseWithKeystoneAccess,
|
||||||
|
standardRequestBuilder(endpoint + "/tenants/3456/networks/16dba3bc-f3fa-4775-afdc-237e12c72f6a/ports/77777/attachment").method("DELETE").build(),
|
||||||
|
standardResponseBuilder(404).build())
|
||||||
|
.getPortClientForRegionAndNetwork("region-a.geo-1", "16dba3bc-f3fa-4775-afdc-237e12c72f6a");
|
||||||
|
|
||||||
|
client.unplugAttachment("77777");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,138 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 1.1 (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-1.1
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.features;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertNotNull;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Attachment;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.NetworkDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Port;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.PortDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Reference;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.internal.BaseQuantumClientLiveTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests PortClient
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "live", testName = "PortClientLiveTest", singleThreaded = true)
|
||||||
|
public class PortClientLiveTest extends BaseQuantumClientLiveTest {
|
||||||
|
|
||||||
|
public void testListPorts() {
|
||||||
|
for (String regionId : quantumContext.getApi().getConfiguredRegions()) {
|
||||||
|
NetworkClient netClient = quantumContext.getApi().getNetworkClientForRegion(regionId);
|
||||||
|
Set<Reference> nets = netClient.listReferences();
|
||||||
|
for(Reference net : nets) {
|
||||||
|
PortClient portClient = quantumContext.getApi().getPortClientForRegionAndNetwork(regionId, net.getId());
|
||||||
|
Set<Reference> portRefs = portClient.listReferences();
|
||||||
|
Set<Port> ports = portClient.list();
|
||||||
|
|
||||||
|
assertEquals(portRefs.size(), ports.size());
|
||||||
|
for (Port port : ports) {
|
||||||
|
assertTrue(portRefs.contains(Reference.builder().id(port.getId()).build()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreateUpdateAndDeletePort() {
|
||||||
|
for (String regionId : quantumContext.getApi().getConfiguredRegions()) {
|
||||||
|
NetworkClient netClient = quantumContext.getApi().getNetworkClientForRegion(regionId);
|
||||||
|
Reference net = netClient.create("jclouds-port-test");
|
||||||
|
assertNotNull(net);
|
||||||
|
PortClient portClient = quantumContext.getApi().getPortClientForRegionAndNetwork(regionId, net.getId());
|
||||||
|
|
||||||
|
Reference portRef = portClient.create();
|
||||||
|
assertNotNull(portRef);
|
||||||
|
|
||||||
|
Port port = portClient.get(portRef.getId());
|
||||||
|
PortDetails portDetails = portClient.getDetails(portRef.getId());
|
||||||
|
NetworkDetails networkDetails = netClient.getDetails(net.getId());
|
||||||
|
|
||||||
|
assertEquals(port.getState(), portDetails.getState());
|
||||||
|
|
||||||
|
for(Port checkme : ImmutableList.of(port, portDetails, Iterables.getOnlyElement(networkDetails.getPorts()))) {
|
||||||
|
assertEquals(checkme.getId(), portRef.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(portClient.updateState(portRef.getId(), Port.State.DOWN));
|
||||||
|
|
||||||
|
port = portClient.get(portRef.getId());
|
||||||
|
portDetails = portClient.getDetails(portRef.getId());
|
||||||
|
|
||||||
|
for(Port checkme : ImmutableList.of(port, portDetails)) {
|
||||||
|
assertEquals(checkme.getId(), portRef.getId());
|
||||||
|
assertEquals(checkme.getState(), Port.State.DOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(portClient.plugAttachment(port.getId(), "jclouds-live-test"));
|
||||||
|
|
||||||
|
Attachment attachment = portClient.showAttachment(port.getId());
|
||||||
|
portDetails = portClient.getDetails(portRef.getId());
|
||||||
|
|
||||||
|
for(Attachment checkme : ImmutableList.of(attachment, portDetails.getAttachment())) {
|
||||||
|
assertNotNull(checkme);
|
||||||
|
assertEquals(checkme.getId(), "jclouds-live-test");
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(portClient.unplugAttachment(port.getId()));
|
||||||
|
|
||||||
|
assertTrue(portClient.delete(portRef.getId()));
|
||||||
|
assertTrue(netClient.delete(net.getId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(enabled=false) // assuming attachmentId matters in the wild
|
||||||
|
public void testAttachAndDetachPort() {
|
||||||
|
for (String regionId : quantumContext.getApi().getConfiguredRegions()) {
|
||||||
|
NetworkClient netClient = quantumContext.getApi().getNetworkClientForRegion(regionId);
|
||||||
|
Reference net = netClient.create("jclouds-attach-test");
|
||||||
|
assertNotNull(net);
|
||||||
|
|
||||||
|
PortClient portClient = quantumContext.getApi().getPortClientForRegionAndNetwork(regionId, net.getId());
|
||||||
|
|
||||||
|
Reference port = portClient.create();
|
||||||
|
assertNotNull(port);
|
||||||
|
|
||||||
|
assertTrue(portClient.plugAttachment(port.getId(), "jclouds-live-test"));
|
||||||
|
|
||||||
|
Attachment attachment = portClient.showAttachment(port.getId());
|
||||||
|
PortDetails portDetails = portClient.getDetails(port.getId());
|
||||||
|
|
||||||
|
for(Attachment checkme : ImmutableList.of(attachment, portDetails.getAttachment())) {
|
||||||
|
assertNotNull(checkme);
|
||||||
|
assertEquals(checkme.getId(), "jclouds-live-test");
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(portClient.unplugAttachment(port.getId()));
|
||||||
|
|
||||||
|
assertTrue(portClient.delete(port.getId()));
|
||||||
|
assertTrue(netClient.delete(net.getId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.internal;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.QuantumClient;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for writing Quantum Rest Client Expect tests
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
public class BaseQuantumClientExpectTest extends BaseQuantumExpectTest<QuantumClient> {
|
||||||
|
protected String endpoint = "https://csnode.jclouds.org:9696/v1.0";
|
||||||
|
|
||||||
|
protected HttpRequest.Builder standardRequestBuilder(String endpoint) {
|
||||||
|
return HttpRequest.builder().method("GET")
|
||||||
|
.headers(ImmutableMultimap.of("Accept", MediaType.APPLICATION_JSON, "X-Auth-Token", authToken))
|
||||||
|
.endpoint(URI.create(endpoint));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HttpResponse.Builder standardResponseBuilder(int status) {
|
||||||
|
return HttpResponse.builder().statusCode(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.internal;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.jclouds.apis.BaseContextLiveTest;
|
||||||
|
import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.QuantumApiMetadata;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.QuantumAsyncClient;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.QuantumClient;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.testng.annotations.AfterGroups;
|
||||||
|
import org.testng.annotations.BeforeGroups;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.reflect.TypeToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code QuantumClient}
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "live")
|
||||||
|
public class BaseQuantumClientLiveTest extends BaseContextLiveTest<RestContext<QuantumClient, QuantumAsyncClient>> {
|
||||||
|
|
||||||
|
public BaseQuantumClientLiveTest() {
|
||||||
|
provider = "openstack-quantum";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RestContext<QuantumClient, QuantumAsyncClient> quantumContext;
|
||||||
|
|
||||||
|
@BeforeGroups(groups = { "integration", "live" })
|
||||||
|
@Override
|
||||||
|
public void setupContext() {
|
||||||
|
super.setupContext();
|
||||||
|
quantumContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Properties setupProperties() {
|
||||||
|
Properties props = super.setupProperties();
|
||||||
|
setIfTestSystemPropertyPresent(props, KeystoneProperties.CREDENTIAL_TYPE);
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterGroups(groups = "live")
|
||||||
|
protected void tearDown() {
|
||||||
|
if (quantumContext != null)
|
||||||
|
quantumContext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TypeToken<RestContext<QuantumClient, QuantumAsyncClient>> contextType() {
|
||||||
|
return QuantumApiMetadata.CONTEXT_TOKEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.internal;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.openstack.keystone.v2_0.internal.KeystoneFixture;
|
||||||
|
import org.jclouds.rest.internal.BaseRestClientExpectTest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for writing Quantum Expect tests
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
public class BaseQuantumExpectTest<T> extends BaseRestClientExpectTest<T> {
|
||||||
|
protected HttpRequest keystoneAuthWithUsernameAndPassword;
|
||||||
|
protected HttpRequest keystoneAuthWithAccessKeyAndSecretKey;
|
||||||
|
protected String authToken;
|
||||||
|
protected HttpResponse responseWithKeystoneAccess;
|
||||||
|
|
||||||
|
public BaseQuantumExpectTest() {
|
||||||
|
provider = "openstack-quantum";
|
||||||
|
keystoneAuthWithUsernameAndPassword = KeystoneFixture.INSTANCE.initialAuthWithUsernameAndPassword(identity,
|
||||||
|
credential);
|
||||||
|
keystoneAuthWithAccessKeyAndSecretKey = KeystoneFixture.INSTANCE.initialAuthWithAccessKeyAndSecretKey(identity,
|
||||||
|
credential);
|
||||||
|
|
||||||
|
authToken = KeystoneFixture.INSTANCE.getAuthToken();
|
||||||
|
responseWithKeystoneAccess = KeystoneFixture.INSTANCE.responseWithAccess();
|
||||||
|
// now, createContext arg will need tenant prefix
|
||||||
|
identity = KeystoneFixture.INSTANCE.getTenantName() + ":" + identity;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.parse;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.json.BaseItemParserTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Attachment;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "ParseAttachmentTest")
|
||||||
|
public class ParseAttachmentTest extends BaseItemParserTest<Attachment> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String resource() {
|
||||||
|
return "/attachment.json";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SelectJson("attachment")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
public Attachment expected() {
|
||||||
|
return Attachment.builder().id("jclouds-live-test").build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.parse;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.json.BaseItemParserTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.NetworkDetails;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Port;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "ParseNetworkDetailsTest")
|
||||||
|
public class ParseNetworkDetailsTest extends BaseItemParserTest<NetworkDetails> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String resource() {
|
||||||
|
return "/network_details.json";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SelectJson("network")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
public NetworkDetails expected() {
|
||||||
|
return NetworkDetails.builder().name("jclouds-port-test").id("25e3e0f8-f1f0-4850-97a3-8d5393c3385b")
|
||||||
|
.ports(ImmutableSet.of(Port.builder().state(Port.State.DOWN).id("908391f6-ef3c-4bc6-acec-46582f9b231d").build())).build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.parse;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.json.BaseItemParserTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Network;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "ParseNetworkTest")
|
||||||
|
public class ParseNetworkTest extends BaseItemParserTest<Network> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String resource() {
|
||||||
|
return "/network.json";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SelectJson("network")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
public Network expected() {
|
||||||
|
return Network.builder().name("jclouds-wibble").id("624312ff-d14b-4ba3-9834-1c78d23d574d").build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.parse;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.json.BaseItemParserTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Attachment;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Port;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.PortDetails;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "ParsePortDetailsTest")
|
||||||
|
public class ParsePortDetailsTest extends BaseItemParserTest<PortDetails> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String resource() {
|
||||||
|
return "/port_details.json";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SelectJson("port")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
public PortDetails expected() {
|
||||||
|
return PortDetails.builder().id("0ccbe514-e36b-475b-91c9-208dfd96d3ac").state(Port.State.DOWN)
|
||||||
|
.attachment(Attachment.builder().id("jclouds-live-test").build()).build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds 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
|
||||||
|
*
|
||||||
|
* 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.openstack.quantum.v1_0.parse;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.json.BaseItemParserTest;
|
||||||
|
import org.jclouds.openstack.quantum.v1_0.domain.Port;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adam Lowe
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "ParsePortTest")
|
||||||
|
public class ParsePortTest extends BaseItemParserTest<Port> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String resource() {
|
||||||
|
return "/port.json";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SelectJson("port")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
public Port expected() {
|
||||||
|
return Port.builder().id("646c123b-871a-4124-9fa2-a94f04a582df").state(Port.State.DOWN).build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
{"attachment":{"id":"jclouds-live-test"}}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{"networks": [
|
||||||
|
{"id": "16dba3bc-f3fa-4775-afdc-237e12c72f6a"},
|
||||||
|
{"id": "1a104cf5-cb18-4d35-9407-2fd2646d9d0b"},
|
||||||
|
{"id": "31083ae2-420d-48b2-ac98-9f7a4fd8dbdc"},
|
||||||
|
{"id": "49c6d6fa-ff2a-459d-b975-75a8d31c9a89"},
|
||||||
|
{"id": "5cb3d6f4-62cb-41c9-b964-ba7d9df79e4e"},
|
||||||
|
{"id": "5d51d012-3491-4db7-b1b5-6f254015015d"},
|
||||||
|
{"id": "5f9cf7dc-22ca-4097-8e49-1cc8b23faf17"},
|
||||||
|
{"id": "6319ecad-6bff-48b2-9b53-02ede8cb7588"},
|
||||||
|
{"id": "6ba4c788-661f-49ab-9bf8-5f10cbbb2f57"},
|
||||||
|
{"id": "74ed170b-5069-4353-ab38-9719766dc57e"},
|
||||||
|
{"id": "b71fcac1-e864-4031-8c5b-edbecd9ece36"},
|
||||||
|
{"id": "c7681895-d84d-4650-9ca0-82c72036b855"}
|
||||||
|
]}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{"networks": [
|
||||||
|
{"name": "jclouds-port-test", "id": "16dba3bc-f3fa-4775-afdc-237e12c72f6a"},
|
||||||
|
{"name": "wibble", "id": "1a104cf5-cb18-4d35-9407-2fd2646d9d0b"},
|
||||||
|
{"name": "jclouds-test", "id": "31083ae2-420d-48b2-ac98-9f7a4fd8dbdc"},
|
||||||
|
{"name": "jclouds-test", "id": "49c6d6fa-ff2a-459d-b975-75a8d31c9a89"},
|
||||||
|
{"name": "wibble", "id": "5cb3d6f4-62cb-41c9-b964-ba7d9df79e4e"},
|
||||||
|
{"name": "jclouds-port-test", "id": "5d51d012-3491-4db7-b1b5-6f254015015d"},
|
||||||
|
{"name": "wibble", "id": "5f9cf7dc-22ca-4097-8e49-1cc8b23faf17"},
|
||||||
|
{"name": "jclouds-test", "id": "6319ecad-6bff-48b2-9b53-02ede8cb7588"},
|
||||||
|
{"name": "jclouds-port-test", "id": "6ba4c788-661f-49ab-9bf8-5f10cbbb2f57"},
|
||||||
|
{"name": "jclouds-test", "id": "74ed170b-5069-4353-ab38-9719766dc57e"},
|
||||||
|
{"name": "wibble", "id": "b71fcac1-e864-4031-8c5b-edbecd9ece36"},
|
||||||
|
{"name": "jclouds-port-test", "id": "c7681895-d84d-4650-9ca0-82c72036b855"}
|
||||||
|
]
|
|
@ -0,0 +1,51 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<configuration scan="false">
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>target/test-data/jclouds.log</file>
|
||||||
|
|
||||||
|
<encoder>
|
||||||
|
<Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>target/test-data/jclouds-wire.log</file>
|
||||||
|
|
||||||
|
<encoder>
|
||||||
|
<Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="BLOBSTOREFILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>target/test-data/jclouds-blobstore.log</file>
|
||||||
|
|
||||||
|
<encoder>
|
||||||
|
<Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root>
|
||||||
|
<level value="warn" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<logger name="org.jclouds">
|
||||||
|
<level value="DEBUG" />
|
||||||
|
<appender-ref ref="FILE" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger name="jclouds.wire">
|
||||||
|
<level value="DEBUG" />
|
||||||
|
<appender-ref ref="WIREFILE" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger name="jclouds.headers">
|
||||||
|
<level value="DEBUG" />
|
||||||
|
<appender-ref ref="WIREFILE" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<logger name="jclouds.blobstore">
|
||||||
|
<level value="DEBUG" />
|
||||||
|
<appender-ref ref="BLOBSTOREFILE" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
</configuration>
|
|
@ -0,0 +1 @@
|
||||||
|
{"network": {"name": "jclouds-wibble", "id": "624312ff-d14b-4ba3-9834-1c78d23d574d"}}
|
|
@ -0,0 +1 @@
|
||||||
|
{"network": {"ports": [{"state": "DOWN", "id": "908391f6-ef3c-4bc6-acec-46582f9b231d"}], "name": "jclouds-port-test", "id": "25e3e0f8-f1f0-4850-97a3-8d5393c3385b"}}
|
|
@ -0,0 +1 @@
|
||||||
|
{"port": {"state": "DOWN", "id": "646c123b-871a-4124-9fa2-a94f04a582df"}}
|
|
@ -0,0 +1 @@
|
||||||
|
{"port": {"state": "DOWN", "id": "0ccbe514-e36b-475b-91c9-208dfd96d3ac", "attachment": {"id": "jclouds-live-test"}}}
|
|
@ -47,5 +47,6 @@
|
||||||
<module>openstack-glance</module>
|
<module>openstack-glance</module>
|
||||||
<module>joyent-sdc</module>
|
<module>joyent-sdc</module>
|
||||||
<module>openstack-keystone</module>
|
<module>openstack-keystone</module>
|
||||||
|
<module>openstack-quantum</module>
|
||||||
</modules>
|
</modules>
|
||||||
</project>
|
</project>
|
||||||
|
|
Loading…
Reference in New Issue