You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ev...@apache.org on 2013/10/21 16:13:12 UTC
git commit: JCLOUDS-348 list quotas for cinder + expected and live
tests
Updated Branches:
refs/heads/master 725b7c5c2 -> 1c9d1676c
JCLOUDS-348
list quotas for cinder + expected and live tests
Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/1c9d1676
Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/1c9d1676
Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/1c9d1676
Branch: refs/heads/master
Commit: 1c9d1676cd7cc1ad3fe8b37b7f1ebf63d4efd81e
Parents: 725b7c5
Author: istolber <in...@alcatel-lucent.com>
Authored: Wed Oct 16 07:14:40 2013 +0200
Committer: Everett Toews <ev...@rackspace.com>
Committed: Mon Oct 21 09:12:53 2013 -0500
----------------------------------------------------------------------
.../jclouds/openstack/cinder/v1/CinderApi.java | 12 +-
.../openstack/cinder/v1/domain/VolumeQuota.java | 167 +++++++++++++++++++
.../openstack/cinder/v1/features/QuotaApi.java | 55 ++++++
.../cinder/v1/features/QuotasApiExpectTest.java | 55 ++++++
.../cinder/v1/features/QuotasApiLiveTest.java | 58 +++++++
.../src/test/resources/quotas.json | 6 +
6 files changed, 351 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1c9d1676/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
index 3de7f27..8cfb40b 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
@@ -21,6 +21,7 @@ import java.util.Set;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.Zone;
import org.jclouds.location.functions.ZoneToEndpoint;
+import org.jclouds.openstack.cinder.v1.features.QuotaApi;
import org.jclouds.openstack.cinder.v1.features.SnapshotApi;
import org.jclouds.openstack.cinder.v1.features.VolumeApi;
import org.jclouds.openstack.cinder.v1.features.VolumeTypeApi;
@@ -32,8 +33,7 @@ import com.google.inject.Provides;
/**
* Provides synchronous access to Cinder.
- *
- * @see CinderAsyncApi
+ *
* @see <a href="http://api.openstack.org/">API Doc</a>
* @author Everett Toews
*/
@@ -72,4 +72,12 @@ public interface CinderApi extends Closeable {
@Delegate
SnapshotApi getSnapshotApiForZone(
@EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+
+ /**
+ * Provides synchronous access to quotas features.
+ */
+ @Delegate
+ QuotaApi getQuotaApi(
+ @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+
}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1c9d1676/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/domain/VolumeQuota.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/domain/VolumeQuota.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/domain/VolumeQuota.java
new file mode 100644
index 0000000..31436b3
--- /dev/null
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/domain/VolumeQuota.java
@@ -0,0 +1,167 @@
+/**
+ * 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.cinder.v1.domain;
+
+import com.google.common.base.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * @author Inbar Stolberg
+ */
+public class VolumeQuota {
+
+ private final String id;
+ private final int volumes;
+ private final int gigabytes;
+ private final int snapshots;
+
+ protected VolumeQuota(String id, int volumes, int gigabytes, int snapshots) {
+ this.id = checkNotNull(id, "id");
+ this.volumes = volumes;
+ this.gigabytes = gigabytes;
+ this.snapshots = snapshots;
+ }
+
+ /**
+ * The id of the tenant this set of limits applies to
+ */
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The limit of the number of volumes that can be created for the tenant
+ */
+ public int getVolumes() {
+ return this.volumes;
+ }
+
+ /**
+ * The limit of the total size of all volumes for the tenant
+ */
+ public int getGigabytes() {
+ return this.gigabytes;
+ }
+
+ /**
+ * The limit of the number of snapshots that can be used by the tenant
+ */
+ public int getSnapshots() {
+ return this.snapshots;
+ }
+
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(id, volumes, gigabytes, snapshots);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null || getClass() != obj.getClass()) return false;
+ VolumeQuota that = VolumeQuota.class.cast(obj);
+ return Objects.equal(this.id, that.id)
+ && Objects.equal(this.volumes, that.volumes)
+ && Objects.equal(this.gigabytes, that.gigabytes)
+ && Objects.equal(this.snapshots, that.snapshots);
+ }
+
+ protected Objects.ToStringHelper string() {
+ return Objects.toStringHelper(this)
+ .add("id", id).add("volumes", volumes).add("gigabytes", gigabytes).add("snapshots", snapshots);
+ }
+
+ @Override
+ public String toString() {
+ return string().toString();
+ }
+
+ public static Builder<?> builder() {
+ return new ConcreteBuilder();
+ }
+
+ public Builder<?> toBuilder() {
+ return new ConcreteBuilder().fromVolumeQuota(this);
+ }
+
+ public static abstract class Builder<T extends Builder<T>> {
+ protected abstract T self();
+
+ protected String id;
+ protected int volumes;
+ protected int gigabytes;
+ protected int snapshots;
+
+
+ /**
+ * @see VolumeQuota#getId()
+ */
+ public T id(String id) {
+ this.id = id;
+ return self();
+ }
+
+ /**
+ * @see VolumeQuota#getVolumes()
+ */
+ public T volumes(int volumes) {
+ this.volumes = volumes;
+ return self();
+ }
+
+ /**
+ * @see VolumeQuota#getGigabytes()
+ */
+ public T gigabytes(int gigabytes) {
+ this.gigabytes = gigabytes;
+ return self();
+ }
+
+ /**
+ * @see VolumeQuota#getSnapshots()
+ */
+ public T snapshots(int snapshots) {
+ this.snapshots = snapshots;
+ return self();
+ }
+
+
+ public VolumeQuota build() {
+ return new VolumeQuota(id, volumes, gigabytes, snapshots);
+ }
+
+ public T fromVolumeQuota(VolumeQuota in) {
+ return this
+ .id(in.getId())
+ .volumes(in.getVolumes())
+ .gigabytes(in.getGigabytes())
+ .snapshots(in.getSnapshots());
+
+ }
+ }
+
+ private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
+ @Override
+ protected ConcreteBuilder self() {
+ return this;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1c9d1676/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java
new file mode 100644
index 0000000..476d1f1
--- /dev/null
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java
@@ -0,0 +1,55 @@
+/**
+ * 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.cinder.v1.features;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.openstack.cinder.v1.domain.VolumeQuota;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.annotations.SkipEncoding;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * Provides asynchronous access to Quota via their REST API.
+ *
+ * @author Inbar Stolberg
+ * @see QuotaApi
+ * @see <a href="http://api.openstack.org/">API Doc</a>
+ */
+@SkipEncoding({'/', '='})
+@RequestFilters(AuthenticateRequest.class)
+@Path("/os-quota-sets")
+public interface QuotaApi {
+
+
+ @GET
+ @SelectJson("quota_set")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Path("/{tenant_id}")
+ @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+ VolumeQuota getByTenant(@PathParam("tenant_id") String tenantId);
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1c9d1676/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java
new file mode 100644
index 0000000..dd7d435
--- /dev/null
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java
@@ -0,0 +1,55 @@
+/**
+ * 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.cinder.v1.features;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.cinder.v1.domain.VolumeQuota;
+import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiExpectTest;
+import org.testng.annotations.Test;
+
+import java.net.URI;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ * @author inbar stolberg
+ */
+@Test(groups = "unit", testName = "QuotaApiExpectTest")
+public class QuotasApiExpectTest extends BaseCinderApiExpectTest {
+
+ public void testGetQuotas() throws Exception {
+ URI endpoint = URI.create("http://172.16.0.1:8776/v1/50cdb4c60374463198695d9f798fa34d/os-quota-sets/demo");
+ QuotaApi api = requestsSendResponses(
+ keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess,
+ authenticatedGET().endpoint(endpoint).build(),
+ HttpResponse.builder().statusCode(200).payload(payloadFromResource("/quotas.json")).build()
+ ).getQuotaApi("RegionOne");
+
+ assertEquals(api.getByTenant("demo"), getTestQuotas());
+ }
+
+ public static VolumeQuota getTestQuotas() {
+ return VolumeQuota.builder()
+ .gigabytes(1000)
+ .volumes(10)
+ .snapshots(20)
+ .id("demo").build();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1c9d1676/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java
new file mode 100644
index 0000000..c316a5d
--- /dev/null
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java
@@ -0,0 +1,58 @@
+/**
+ * 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.cinder.v1.features;
+
+import com.google.common.collect.Iterables;
+import org.jclouds.openstack.cinder.v1.domain.VolumeQuota;
+import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiLiveTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.concurrent.ExecutionException;
+
+import static org.testng.Assert.assertTrue;
+
+/**
+ * @author inbar stolberg
+ */
+@Test(groups = "live", testName = "QuotasApiLiveTest", singleThreaded = true)
+public class QuotasApiLiveTest extends BaseCinderApiLiveTest {
+
+ private QuotaApi quotaApi;
+
+ public QuotasApiLiveTest() {
+ super();
+ provider = "openstack-cinder";
+ }
+
+ @BeforeClass(groups = {"integration", "live"})
+ public void setupContext() {
+ super.setup();
+ String zone = Iterables.getFirst(api.getConfiguredZones(), "nova");
+ quotaApi = api.getQuotaApi(zone);
+ }
+
+ public void testGetStorageQuotas() throws ExecutionException, InterruptedException {
+ VolumeQuota volumeQuota = quotaApi.getByTenant("demo");
+
+ assertTrue(volumeQuota.getGigabytes() >= 0);
+ assertTrue(volumeQuota.getVolumes() >= 0);
+ assertTrue(volumeQuota.getSnapshots() >= 0);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/1c9d1676/apis/openstack-cinder/src/test/resources/quotas.json
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/resources/quotas.json b/apis/openstack-cinder/src/test/resources/quotas.json
new file mode 100644
index 0000000..a50b8b5
--- /dev/null
+++ b/apis/openstack-cinder/src/test/resources/quotas.json
@@ -0,0 +1,6 @@
+{"quota_set": {
+ "gigabytes": 1000,
+ "volumes": 10,
+ "snapshots": 20,
+ "id": "demo"
+}}