Repository: jclouds
Updated Branches:
  refs/heads/1.9.x 3445f00a8 -> 5d21b3e05


Adding missing "hosts" field to OpenStack Nova AvailabilityZone


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/5d21b3e0
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/5d21b3e0
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/5d21b3e0

Branch: refs/heads/1.9.x
Commit: 5d21b3e0563cfa62da8588622f3fbad30ed1a2d9
Parents: 3445f00
Author: Arvind Nadendla <[email protected]>
Authored: Fri Jul 10 02:32:21 2015 -0700
Committer: Zack Shoylev <[email protected]>
Committed: Tue Jul 14 18:56:00 2015 -0500

----------------------------------------------------------------------
 .../domain/regionscoped/AvailabilityZone.java   | 116 +++++++++++++++++++
 .../v2_0/domain/regionscoped/ZoneState.java     |  52 +++++++++
 .../domain/zonescoped/AvailabilityZone.java     |   9 +-
 .../nova/v2_0/domain/zonescoped/ZoneState.java  |   5 +
 .../v2_0/extensions/AvailabilityZoneApi.java    |  31 +++--
 .../AvailabilityZoneApiExpectTest.java          |  26 ++++-
 .../AvailabilityZonesApiLiveTest.java           |  25 ++--
 ...DeprecatedAvailabilityZoneApiExpectTest.java |  60 ++++++++++
 .../DeprecatedAvailabilityZonesApiLiveTest.java |  44 +++++++
 .../test/resources/listAvailabilityZones.json   |  47 +++++++-
 10 files changed, 389 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/AvailabilityZone.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/AvailabilityZone.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/AvailabilityZone.java
new file mode 100644
index 0000000..9010e3c
--- /dev/null
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/AvailabilityZone.java
@@ -0,0 +1,116 @@
+/*
+ * 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.nova.v2_0.domain.regionscoped;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+import com.google.gson.annotations.SerializedName;
+
+import java.beans.ConstructorProperties;
+import java.util.Date;
+import java.util.Map;
+
+public class AvailabilityZone {
+
+   public static final class HostService {
+
+      private final boolean available;
+      private final boolean active;
+      @SerializedName("updated_at")
+      private final Date updated;
+
+      @ConstructorProperties({"available", "active", "updated_at"})
+      protected HostService(boolean available, boolean active, Date updated) {
+         this.available = available;
+         this.active = active;
+         this.updated = updated;
+      }
+
+      public boolean isAvailable() { return available; }
+
+      public boolean isActive() { return active; }
+
+      public Date getUpdated() { return updated; }
+
+      protected Objects.ToStringHelper string() {
+         return Objects.toStringHelper(this)
+               .add("available", available)
+               .add("active", active)
+               .add("updated", updated);
+      }
+
+      @Override
+      public String toString() {
+         return string().toString();
+      }
+   }
+
+   @SerializedName("zoneName")
+   private final String name;
+   private final ZoneState state;
+   private final Map<String, Map<String, HostService>> hosts;
+
+   @ConstructorProperties({"zoneName" , "zoneState", "hosts"})
+   protected AvailabilityZone(String name, ZoneState state, Map<String, 
Map<String, HostService>> hosts) {
+      this.name = name;
+      this.state = state;
+      this.hosts = hosts == null ? ImmutableMap.<String, Map<String, 
HostService>>of() : ImmutableMap.copyOf(hosts);
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public ZoneState getState() {
+      return state;
+   }
+
+   /**
+    * @return returns a map of host name and Host service objects
+    */
+   public Map<String, Map<String, HostService>> getHosts() {
+      return this.hosts;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(name, state, hosts);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this != obj)
+         return false;
+      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) && Objects.equal(this.hosts,
+            that.hosts);
+   }
+
+   protected Objects.ToStringHelper string() {
+      return Objects.toStringHelper(this)
+            .add("name", name)
+            .add("state", state)
+            .add("Hosts", hosts);
+   }
+
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/ZoneState.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/ZoneState.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/ZoneState.java
new file mode 100644
index 0000000..e8eaef9
--- /dev/null
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/regionscoped/ZoneState.java
@@ -0,0 +1,52 @@
+/*
+ * 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.nova.v2_0.domain.regionscoped;
+
+import com.google.common.base.Objects;
+
+public class ZoneState {
+
+   private final boolean available;
+
+   protected ZoneState(boolean available) { this.available = available; }
+
+   public boolean isAvailable() { return this.available; }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(available);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this != obj) return false;
+      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();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/AvailabilityZone.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/AvailabilityZone.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/AvailabilityZone.java
index 283aa15..3f79755 100644
--- 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/AvailabilityZone.java
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/AvailabilityZone.java
@@ -16,11 +16,16 @@
  */
 package org.jclouds.openstack.nova.v2_0.domain.zonescoped;
 
-import java.beans.ConstructorProperties;
-
 import com.google.common.base.Objects;
 import com.google.gson.annotations.SerializedName;
 
+import java.beans.ConstructorProperties;
+
+/**
+ * @deprecated This package has been replaced with {@link 
org.jclouds.openstack.nova.v2_0.domain.regionscoped}.
+ *             Please use {@link 
org.jclouds.openstack.nova.v2_0.domain.regionscoped.AvailabilityZone 
AvailabilityZone}
+ *             instead. To be removed in jclouds 2.0.
+ */
 public class AvailabilityZone {
 
    @SerializedName("zoneName")

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/ZoneState.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/ZoneState.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/ZoneState.java
index d32c368..f55871b 100644
--- 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/ZoneState.java
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/zonescoped/ZoneState.java
@@ -18,6 +18,11 @@ package org.jclouds.openstack.nova.v2_0.domain.zonescoped;
 
 import com.google.common.base.Objects;
 
+/**
+ * @deprecated This package has been replaced with {@link 
org.jclouds.openstack.nova.v2_0.domain.regionscoped}.
+ *             Please use {@link 
org.jclouds.openstack.nova.v2_0.domain.regionscoped.ZoneState ZoneState}
+ *             instead. To be removed in jclouds 2.0.
+ */
 public class ZoneState {
 
    private final boolean available;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
index 7b894fb..4f8aa99 100644
--- 
a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
+++ 
b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
@@ -16,23 +16,22 @@
  */
 package org.jclouds.openstack.nova.v2_0.extensions;
 
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.MediaType;
-
+import com.google.common.annotations.Beta;
+import com.google.common.collect.FluentIterable;
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
-import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
+import org.jclouds.openstack.nova.v2_0.domain.regionscoped.AvailabilityZone;
 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 com.google.common.annotations.Beta;
-import com.google.common.collect.FluentIterable;
+import javax.inject.Named;
+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 Compute (Nova) Availability Zone Extension 
API.
@@ -43,6 +42,18 @@ import com.google.common.collect.FluentIterable;
 @Consumes(MediaType.APPLICATION_JSON)
 @Path("/os-availability-zone")
 public interface AvailabilityZoneApi {
+
+   /**
+    * @return all availability zones
+    * @deprecated Please use {@link #listAvailabilityZones()} instead. To be 
removed in jclouds 2.0.
+    */
+   @Deprecated
+   @Named("availabilityZone:list")
+   @GET
+   @SelectJson("availabilityZoneInfo")
+   @Fallback(EmptyFluentIterableOnNotFoundOr404.class)
+   
FluentIterable<org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone>
 list();
+
    /**
     * @return all availability zones
     */
@@ -50,5 +61,5 @@ public interface AvailabilityZoneApi {
    @GET
    @SelectJson("availabilityZoneInfo")
    @Fallback(EmptyFluentIterableOnNotFoundOr404.class)
-   FluentIterable<AvailabilityZone> list();
+   FluentIterable<AvailabilityZone> listAvailabilityZones();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
index e2e31bd..348133d 100644
--- 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApiExpectTest.java
@@ -19,14 +19,15 @@ package org.jclouds.openstack.nova.v2_0.extensions;
 import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableSet;
-
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.openstack.nova.v2_0.NovaApi;
-import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
+import org.jclouds.openstack.nova.v2_0.domain.regionscoped.AvailabilityZone;
 import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
 import org.testng.annotations.Test;
 
+import java.util.Date;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
@@ -49,12 +50,27 @@ public class AvailabilityZoneApiExpectTest extends 
BaseNovaApiExpectTest {
 
       assertEquals(availabilityZonesApi.getConfiguredRegions(), 
ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", 
"az-3.region-a.geo-1"));
 
-      FluentIterable<? extends AvailabilityZone> zones = 
availabilityZonesApi.getAvailabilityZoneApi("az-1.region-a.geo-1").get().list();
+      FluentIterable<? extends AvailabilityZone> zones = 
availabilityZonesApi.getAvailabilityZoneApi("az-1.region-a.geo-1").get().listAvailabilityZones();
 
       Optional<? extends AvailabilityZone> zone = zones.first();
 
       assertTrue(zone.isPresent(), "Couldn't find zone");
-      assertEquals(zone.get().getName(), "nova", "Expected zone name to be 
nova but it was: " + zone.get().getName());
-      assertTrue(zone.get().getState().available(), "Zone: " + 
zone.get().getName() + " is not available.");
+      assertEquals(zone.get()
+            .getName(), "internal", "Expected zone name to be internal but it 
was: " + zone.get()
+            .getName());
+      assertTrue(zone.get()
+            .getState()
+            .isAvailable(), "Zone: " + zone.get()
+            .getName() + " is not available.");
+      String hostName = zone.get().getHosts().keySet().iterator().next();
+      assertEquals(hostName, "os-controller", "Expected host name to be 
os-controller but it was: " + hostName);
+      String hostServiceName = 
zone.get().getHosts().get(hostName).keySet().iterator().next();
+      assertEquals(hostServiceName, "nova-conductor",
+            "Expected host service name to be nova-conductor but it was: " + 
hostServiceName);
+      AvailabilityZone.HostService hostService = 
zone.get().getHosts().get(hostName).get(hostServiceName);
+      assertTrue(hostService.isAvailable(), "Couldn't find host service 
availability");
+      assertTrue(hostService.isActive(), "Couldn't find host service state");
+      assertEquals(hostService.getUpdated(), new Date(1436509815000L),
+            "Expected Updated time: " + new Date(1436509815000L) + " does 
match Updated time : " + hostService.getUpdated());
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
index 25ff002..4c78bca 100644
--- 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZonesApiLiveTest.java
@@ -16,15 +16,14 @@
  */
 package org.jclouds.openstack.nova.v2_0.extensions;
 
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
+import com.google.common.base.Optional;
+import com.google.common.collect.FluentIterable;
+import org.jclouds.openstack.nova.v2_0.domain.regionscoped.AvailabilityZone;
 import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Optional;
-import com.google.common.collect.FluentIterable;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
 
 @Test(groups = "live", testName = "AvailabilityZonesApiLiveTest")
 public class AvailabilityZonesApiLiveTest extends BaseNovaApiLiveTest {
@@ -34,11 +33,21 @@ public class AvailabilityZonesApiLiveTest extends 
BaseNovaApiLiveTest {
 
       Optional<? extends AvailabilityZoneApi> availabilityZoneApi = 
api.getAvailabilityZoneApi("RegionOne");
       if (availabilityZoneApi.isPresent()) {
-         FluentIterable<? extends AvailabilityZone> zones = 
availabilityZoneApi.get().list();
+         FluentIterable<? extends AvailabilityZone> zones = 
availabilityZoneApi.get().listAvailabilityZones();
 
          for (AvailabilityZone zone : zones) {
             assertNotNull(zone.getName());
-            assertTrue(zone.getState().available(), "zone: " + zone.getName() 
+ " is not available.");
+            assertTrue(zone.getState()
+                  .isAvailable(), "zone: " + zone.getName() + " is not 
available.");
+            String hostName = zone.getHosts().keySet().iterator().next();
+            assertNotNull(hostName, "Expected host name to be not null");
+            String hostServiceName = 
zone.getHosts().get(hostName).keySet().iterator().next();
+            assertNotNull(hostServiceName, "Expected host service name to be 
not null");
+            AvailabilityZone.HostService hostService = 
zone.getHosts().get(hostName).get(hostServiceName);
+            assertTrue(hostService.isAvailable(), "Couldn't find host service 
availability");
+            assertTrue(hostService.isActive(), "Couldn't find host service 
state");
+            assertNotNull(hostService.getUpdated(), "Expected Updated time, 
but none received ");
+
          }
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZoneApiExpectTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZoneApiExpectTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZoneApiExpectTest.java
new file mode 100644
index 0000000..c4dc5d6
--- /dev/null
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZoneApiExpectTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.nova.v2_0.extensions;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableSet;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+@Test(groups = "unit", testName = "DeprecatedAvailabilityZoneApiExpectTest")
+public class DeprecatedAvailabilityZoneApiExpectTest extends 
BaseNovaApiExpectTest {
+
+   public void testAvailabilityZonesList() throws Exception {
+      HttpRequest list = HttpRequest
+            .builder()
+            .method("GET")
+            
.endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/os-availability-zone";)
+            .addHeader("Accept", "application/json")
+            .addHeader("X-Auth-Token", authToken).build();
+
+      HttpResponse listResponse = HttpResponse.builder().statusCode(200)
+            
.payload(payloadFromResource("/listAvailabilityZones.json")).build();
+
+      NovaApi availabilityZonesApi = 
requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+            responseWithKeystoneAccess, extensionsOfNovaRequest, 
extensionsOfNovaResponse, list, listResponse);
+
+      assertEquals(availabilityZonesApi.getConfiguredRegions(), 
ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", 
"az-3.region-a.geo-1"));
+
+      FluentIterable<? extends AvailabilityZone> zones = 
availabilityZonesApi.getAvailabilityZoneApi("az-1.region-a.geo-1").get().list();
+
+      Optional<? extends AvailabilityZone> zone = zones.first();
+
+      assertTrue(zone.isPresent(), "Couldn't find zone");
+      assertEquals(zone.get().getName(), "internal",
+            "Expected zone name to be internal but it was: " + 
zone.get().getName());
+      assertTrue(zone.get().getState().available(), "Zone: " + 
zone.get().getName() + " is not available.");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZonesApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZonesApiLiveTest.java
 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZonesApiLiveTest.java
new file mode 100644
index 0000000..f3baa69
--- /dev/null
+++ 
b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/DeprecatedAvailabilityZonesApiLiveTest.java
@@ -0,0 +1,44 @@
+/*
+ * 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.nova.v2_0.extensions;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.FluentIterable;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+@Test(groups = "live", testName = "DeprecatedAvailabilityZonesApiLiveTest")
+public class DeprecatedAvailabilityZonesApiLiveTest extends 
BaseNovaApiLiveTest {
+
+   @Test
+   public void testListAvailabilityZones() throws Exception {
+
+      Optional<? extends AvailabilityZoneApi> availabilityZoneApi = 
api.getAvailabilityZoneApi("RegionOne");
+      if (availabilityZoneApi.isPresent()) {
+         FluentIterable<? extends AvailabilityZone> zones = 
availabilityZoneApi.get().list();
+
+         for (AvailabilityZone zone : zones) {
+            assertNotNull(zone.getName());
+            assertTrue(zone.getState().available(), "zone: " + zone.getName() 
+ " is not available.");
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d21b3e0/apis/openstack-nova/src/test/resources/listAvailabilityZones.json
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/resources/listAvailabilityZones.json 
b/apis/openstack-nova/src/test/resources/listAvailabilityZones.json
index 2d4ad78..b984888 100644
--- a/apis/openstack-nova/src/test/resources/listAvailabilityZones.json
+++ b/apis/openstack-nova/src/test/resources/listAvailabilityZones.json
@@ -4,7 +4,52 @@
             "zoneState": {
                 "available": true
             },
-            "hosts": null,
+            "hosts": {
+                "os-controller": {
+                    "nova-conductor": {
+                        "available": true,
+                        "active": true,
+                        "updated_at": "2015-07-10T06:30:15.000000"
+                    },
+                    "nova-consoleauth": {
+                        "available": true,
+                        "active": true,
+                        "updated_at": "2015-07-10T06:30:20.000000"
+                    },
+                    "nova-cert": {
+                        "available": true,
+                        "active": true,
+                        "updated_at": "2015-07-10T06:30:19.000000"
+                    },
+                    "nova-scheduler": {
+                        "available": true,
+                        "active": true,
+                        "updated_at": "2015-07-10T06:30:12.000000"
+                    }
+                }
+            },
+            "zoneName": "internal"
+        },
+        {
+            "zoneState": {
+                "available": true
+            },
+            "hosts": {
+                "os-compute02": {
+                    "nova-compute": {
+                        "available": true,
+                        "active": true,
+                        "updated_at": "2015-07-10T06:30:16.000000"
+                    }
+                },
+                "os-compute01": {
+                    "nova-compute": {
+                        "available": true,
+                        "active": true,
+                        "updated_at": "2015-07-10T06:30:12.000000"
+                    }
+                }
+            },
             "zoneName": "nova"
         }
     ]

Reply via email to