mirror of https://github.com/apache/jclouds.git
cinder availability zones api + list call implemented
This commit is contained in:
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.Volume;
|
||||
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.SnapshotApi;
|
||||
import org.jclouds.openstack.cinder.v1.features.VolumeApi;
|
||||
|
@ -77,6 +79,13 @@ public interface CinderApi extends Closeable {
|
|||
@Delegate
|
||||
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
|
||||
* @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
|
||||
SnapshotApi getSnapshotApiForZone(
|
||||
@EndpointParam(parser = RegionToEndpoint.class) String zone);
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}]
|
||||
}
|
Loading…
Reference in New Issue