mirror of
https://github.com/apache/jclouds.git
synced 2026-09-01 00:44:28 +00:00
cinder availability zones api + list call implemented
This commit is contained in:
committed by
Andrew Phillips
parent
c85453503e
commit
1205010cfa
@@ -24,6 +24,8 @@ import org.jclouds.location.functions.RegionToEndpoint;
|
|||||||
import org.jclouds.openstack.cinder.v1.domain.Snapshot;
|
import org.jclouds.openstack.cinder.v1.domain.Snapshot;
|
||||||
import org.jclouds.openstack.cinder.v1.domain.Volume;
|
import org.jclouds.openstack.cinder.v1.domain.Volume;
|
||||||
import org.jclouds.openstack.cinder.v1.domain.VolumeType;
|
import org.jclouds.openstack.cinder.v1.domain.VolumeType;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
import org.jclouds.openstack.cinder.v1.extensions.AvailabilityZoneApi;
|
||||||
import org.jclouds.openstack.cinder.v1.features.QuotaApi;
|
import org.jclouds.openstack.cinder.v1.features.QuotaApi;
|
||||||
import org.jclouds.openstack.cinder.v1.features.SnapshotApi;
|
import org.jclouds.openstack.cinder.v1.features.SnapshotApi;
|
||||||
import org.jclouds.openstack.cinder.v1.features.VolumeApi;
|
import org.jclouds.openstack.cinder.v1.features.VolumeApi;
|
||||||
@@ -77,6 +79,13 @@ public interface CinderApi extends Closeable {
|
|||||||
@Delegate
|
@Delegate
|
||||||
QuotaApi getQuotaApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
|
QuotaApi getQuotaApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to Availability Zone features
|
||||||
|
*/
|
||||||
|
@Delegate
|
||||||
|
AvailabilityZoneApi getAvailabilityZoneApi(
|
||||||
|
@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the Zone codes configured
|
* @return the Zone codes configured
|
||||||
* @deprecated Please use {@link #getConfiguredRegions()} as this method will be removed in jclouds 3.0.
|
* @deprecated Please use {@link #getConfiguredRegions()} as this method will be removed in jclouds 3.0.
|
||||||
@@ -125,5 +134,4 @@ public interface CinderApi extends Closeable {
|
|||||||
@Delegate
|
@Delegate
|
||||||
SnapshotApi getSnapshotApiForZone(
|
SnapshotApi getSnapshotApiForZone(
|
||||||
@EndpointParam(parser = RegionToEndpoint.class) String zone);
|
@EndpointParam(parser = RegionToEndpoint.class) String zone);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+111
@@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* 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.cinder.v1.domain;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import java.beans.ConstructorProperties;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* availability zone for cinder
|
||||||
|
*/
|
||||||
|
public class AvailabilityZone {
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return new Builder().fromAvailabilityZone(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
|
||||||
|
protected boolean available;
|
||||||
|
protected String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AvailabilityZone#getName()
|
||||||
|
*/
|
||||||
|
public Builder name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see AvailabilityZone#getZoneState()
|
||||||
|
*/
|
||||||
|
public Builder available(boolean available) {
|
||||||
|
this.available = available;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public AvailabilityZone build() {
|
||||||
|
return new AvailabilityZone(name, new ZoneState(available));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromAvailabilityZone(AvailabilityZone in) {
|
||||||
|
return this
|
||||||
|
.name(in.getName())
|
||||||
|
.available(in.getZoneState().available());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final ZoneState state;
|
||||||
|
|
||||||
|
@ConstructorProperties({"zoneName", "zoneState"})
|
||||||
|
protected AvailabilityZone(String name, ZoneState zoneState) {
|
||||||
|
this.name = checkNotNull(name);
|
||||||
|
this.state = checkNotNull(zoneState);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZoneState getZoneState() {
|
||||||
|
return this.state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(name, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass()) return false;
|
||||||
|
AvailabilityZone that = AvailabilityZone.class.cast(obj);
|
||||||
|
return Objects.equal(this.name, that.name) && Objects.equal(this.state, that.state);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Objects.ToStringHelper string() {
|
||||||
|
return Objects.toStringHelper(this)
|
||||||
|
.add("name", name)
|
||||||
|
.add("state", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return string().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+92
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* 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.cinder.v1.domain;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
|
||||||
|
import java.beans.ConstructorProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zone state for availability zones
|
||||||
|
*/
|
||||||
|
public class ZoneState {
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return new Builder().fromZoneState(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
|
||||||
|
protected boolean available;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ZoneState#available() ()
|
||||||
|
*/
|
||||||
|
public Builder available(Boolean available) {
|
||||||
|
this.available = available;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZoneState build() {
|
||||||
|
return new ZoneState(available);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromZoneState(ZoneState in) {
|
||||||
|
return this
|
||||||
|
.available(in.available());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Boolean available;
|
||||||
|
|
||||||
|
@ConstructorProperties({"available"})
|
||||||
|
protected ZoneState(Boolean available) {
|
||||||
|
this.available = available;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean available() {
|
||||||
|
return this.available;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(available);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass()) return false;
|
||||||
|
ZoneState that = ZoneState.class.cast(obj);
|
||||||
|
return Objects.equal(this.available, that.available);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Objects.ToStringHelper string() {
|
||||||
|
return Objects.toStringHelper(this)
|
||||||
|
.add("available", available);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return string().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* 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.cinder.v1.extensions;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.collect.FluentIterable;
|
||||||
|
import org.jclouds.Fallbacks;
|
||||||
|
import org.jclouds.openstack.cinder.v1.domain.AvailabilityZone;
|
||||||
|
import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
|
||||||
|
import org.jclouds.openstack.v2_0.ServiceType;
|
||||||
|
import org.jclouds.openstack.v2_0.services.Extension;
|
||||||
|
import org.jclouds.rest.annotations.Fallback;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.SelectJson;
|
||||||
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to the OpenStack Block Storage (Cinder) Availability Zone Extension API.
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
@Extension(of = ServiceType.BLOCK_STORAGE, namespace = ExtensionNamespaces.ADMIN_ACTIONS)
|
||||||
|
@RequestFilters(AuthenticateRequest.class)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Path("/os-availability-zone")
|
||||||
|
public interface AvailabilityZoneApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lists all availability zones
|
||||||
|
*
|
||||||
|
* @return all availability zones
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@SelectJson("availabilityZoneInfo")
|
||||||
|
@Fallback(Fallbacks.EmptyFluentIterableOnNotFoundOr404.class)
|
||||||
|
FluentIterable<AvailabilityZone> list();
|
||||||
|
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* 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.cinder.v1.extensions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension namespaces
|
||||||
|
*/
|
||||||
|
public final class ExtensionNamespaces {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Admin Action extension
|
||||||
|
*/
|
||||||
|
public static final String ADMIN_ACTIONS = "http://docs.openstack.org/ext/admin-actions/api/v1.1";
|
||||||
|
|
||||||
|
private ExtensionNamespaces() {
|
||||||
|
throw new AssertionError("intentionally unimplemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
+71
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* 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.cinder.v1.features;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.openstack.cinder.v1.domain.AvailabilityZone;
|
||||||
|
import org.jclouds.openstack.cinder.v1.extensions.AvailabilityZoneApi;
|
||||||
|
import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiExpectTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertNotNull;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
@Test(groups = "unit", testName = "AvailabilityZoneApiExpectTest")
|
||||||
|
public class AvailabilityZoneApiExpectTest extends BaseCinderApiExpectTest {
|
||||||
|
|
||||||
|
public void testListAvailabilityZones() throws Exception {
|
||||||
|
URI endpoint = URI.create("http://172.16.0.1:8776/v1/50cdb4c60374463198695d9f798fa34d/os-availability-zone");
|
||||||
|
AvailabilityZoneApi api = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPasswordAndTenantName,
|
||||||
|
responseWithKeystoneAccess,
|
||||||
|
authenticatedGET().endpoint(endpoint).build(),
|
||||||
|
HttpResponse.builder().statusCode(200).payload(payloadFromResource("/availability_zones_list.json")).build()
|
||||||
|
).getAvailabilityZoneApi("RegionOne");
|
||||||
|
|
||||||
|
AvailabilityZone availabilityZoneActual = Iterables.getFirst(api.list(), null);
|
||||||
|
AvailabilityZone availabilityZoneExpected = getTestAvailabilityZone();
|
||||||
|
|
||||||
|
assertNotNull(availabilityZoneActual);
|
||||||
|
assertEquals(availabilityZoneActual, availabilityZoneExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListAvailabilityZonesFail() throws Exception {
|
||||||
|
URI endpoint = URI.create("http://172.16.0.1:8776/v1/50cdb4c60374463198695d9f798fa34d/os-availability-zone");
|
||||||
|
AvailabilityZoneApi api = requestsSendResponses(
|
||||||
|
keystoneAuthWithUsernameAndPasswordAndTenantName,
|
||||||
|
responseWithKeystoneAccess,
|
||||||
|
authenticatedGET().endpoint(endpoint).build(),
|
||||||
|
HttpResponse.builder().statusCode(404).build()
|
||||||
|
).getAvailabilityZoneApi("RegionOne");
|
||||||
|
|
||||||
|
Set<? extends AvailabilityZone> availabilityZones = api.list().toSet();
|
||||||
|
assertTrue(availabilityZones.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AvailabilityZone getTestAvailabilityZone() {
|
||||||
|
return AvailabilityZone.builder()
|
||||||
|
.name("nova")
|
||||||
|
.available(true)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* 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.cinder.v1.features;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import org.jclouds.openstack.cinder.v1.domain.AvailabilityZone;
|
||||||
|
import org.jclouds.openstack.cinder.v1.extensions.AvailabilityZoneApi;
|
||||||
|
import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiLiveTest;
|
||||||
|
import org.testng.annotations.BeforeClass;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
@Test(groups = "live", testName = "AvailabilityZoneApiLiveTest", singleThreaded = true)
|
||||||
|
public class AvailabilityZoneApiLiveTest extends BaseCinderApiLiveTest {
|
||||||
|
|
||||||
|
private AvailabilityZoneApi availabilityZoneApi;
|
||||||
|
|
||||||
|
public AvailabilityZoneApiLiveTest() {
|
||||||
|
super();
|
||||||
|
provider = "openstack-cinder";
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass(groups = {"integration", "live"})
|
||||||
|
public void setupContext() {
|
||||||
|
super.setup();
|
||||||
|
String zone = Iterables.getFirst(api.getConfiguredZones(), "regionOne");
|
||||||
|
availabilityZoneApi = api.getAvailabilityZoneApi(zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListAvailabilityZones() {
|
||||||
|
ImmutableList<? extends AvailabilityZone> cinderZones = availabilityZoneApi.list().toList();
|
||||||
|
|
||||||
|
assertTrue(!cinderZones.isEmpty());
|
||||||
|
for (AvailabilityZone zone : cinderZones) {
|
||||||
|
assertTrue(!Strings.isNullOrEmpty(zone.getName()));
|
||||||
|
assertTrue(zone.getZoneState().available());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"availabilityZoneInfo": [{
|
||||||
|
"zoneState": {
|
||||||
|
"available": true
|
||||||
|
},
|
||||||
|
"zoneName": "nova"
|
||||||
|
}]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user