You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/10/19 17:58:19 UTC

[13/17] Initial GCE commit

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java
new file mode 100644
index 0000000..63107e7
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java
@@ -0,0 +1,179 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.googlecomputeengine.domain.Resource.Kind;
+
+import java.beans.ConstructorProperties;
+import java.net.URI;
+import java.util.Iterator;
+
+import org.jclouds.collect.IterableWithMarker;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * The collection returned from any <code>listFirstPage()</code> method.
+ */
+public class ListPage<T> extends IterableWithMarker<T> {
+
+   private final Kind kind;
+   private final String id;
+   private final URI selfLink;
+   private final String nextPageToken;
+   private final Iterable<T> items;
+
+   @ConstructorProperties({
+           "kind", "id", "selfLink", "nextPageToken", "items"
+   })
+   protected ListPage(Kind kind, String id, URI selfLink, String nextPageToken, Iterable<T> items) {
+      this.id = checkNotNull(id, "id");
+      this.kind = checkNotNull(kind, "kind of %id", id);
+      this.selfLink = checkNotNull(selfLink, "selfLink of %id", id);
+      this.nextPageToken = nextPageToken;
+      this.items = items != null ? ImmutableSet.copyOf(items) : ImmutableSet.<T>of();
+   }
+
+   public Kind getKind() {
+      return kind;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public URI getSelfLink() {
+      return selfLink;
+   }
+
+   @Override
+   public Optional<Object> nextMarker() {
+      return Optional.<Object>fromNullable(nextPageToken);
+   }
+
+   @Override
+   public Iterator<T> iterator() {
+      return checkNotNull(items, "items").iterator();
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(kind, id);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
+      ListPage<?> that = ListPage.class.cast(obj);
+      return equal(this.kind, that.kind)
+              && equal(this.id, that.id);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return toStringHelper(this)
+              .omitNullValues()
+              .add("kind", kind)
+              .add("id", id)
+              .add("selfLink", selfLink)
+              .add("nextPageToken", nextPageToken)
+              .add("items", items);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static <T> Builder<T> builder() {
+      return new Builder<T>();
+   }
+
+   public Builder<T> toBuilder() {
+      return new Builder<T>().fromPagedList(this);
+   }
+
+   public static final class Builder<T> {
+
+      private Kind kind;
+      private String id;
+      private URI selfLink;
+      private String nextPageToken;
+      private ImmutableSet.Builder<T> items = ImmutableSet.builder();
+
+      public Builder<T> kind(Kind kind) {
+         this.kind = kind;
+         return this;
+      }
+
+      public Builder<T> id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder<T> selfLink(URI selfLink) {
+         this.selfLink = selfLink;
+         return this;
+      }
+
+      public Builder<T> addItem(T item) {
+         this.items.add(item);
+         return this;
+      }
+
+      public Builder<T> items(Iterable<T> items) {
+         this.items.addAll(items);
+         return this;
+      }
+
+      public Builder<T> nextPageToken(String nextPageToken) {
+         this.nextPageToken = nextPageToken;
+         return this;
+      }
+
+      public ListPage<T> build() {
+         return new ListPage<T>(kind, id, selfLink, nextPageToken, items.build());
+      }
+
+      public Builder<T> fromPagedList(ListPage<T> in) {
+         return this
+                 .kind(in.getKind())
+                 .id(in.getId())
+                 .selfLink(in.getSelfLink())
+                 .nextPageToken((String) in.nextMarker().orNull())
+                 .items(in);
+
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java
new file mode 100644
index 0000000..1c59ac7
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java
@@ -0,0 +1,360 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Optional.fromNullable;
+import static com.google.common.base.Preconditions.checkNotNull;
+import java.beans.ConstructorProperties;
+import java.net.URI;
+import java.util.Date;
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Represents a machine type used to host an instance.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/machineTypes"/>
+ */
+@Beta
+public final class MachineType extends Resource {
+
+   private final Integer guestCpus;
+   private final Integer memoryMb;
+   private final Integer imageSpaceGb;
+   private final List<ScratchDisk> scratchDisks;
+   private final Integer maximumPersistentDisks;
+   private final Long maximumPersistentDisksSizeGb;
+   private final String zone;
+   private final Optional<Deprecated> deprecated;
+
+   @ConstructorProperties({
+           "id", "creationTimestamp", "selfLink", "name", "description", "guestCpus", "memoryMb",
+           "imageSpaceGb", "scratchDisks", "maximumPersistentDisks", "maximumPersistentDisksSizeGb", "zone",
+           "deprecated"
+   })
+   private MachineType(String id, Date creationTimestamp, URI selfLink, String name, String description,
+                       int guestCpus, int memoryMb, int imageSpaceGb, List<ScratchDisk> scratchDisks,
+                       int maximumPersistentDisks, long maximumPersistentDisksSizeGb, String zone,
+                       @Nullable Deprecated deprecated) {
+      super(Kind.MACHINE_TYPE, id, creationTimestamp, selfLink, name, description);
+      this.guestCpus = checkNotNull(guestCpus, "guestCpus of %s", name);
+      this.memoryMb = checkNotNull(memoryMb, "memoryMb of %s", name);
+      this.imageSpaceGb = checkNotNull(imageSpaceGb, "imageSpaceGb of %s", name);
+      this.scratchDisks = scratchDisks == null ? ImmutableList.<ScratchDisk>of() : scratchDisks;
+      this.maximumPersistentDisks = checkNotNull(maximumPersistentDisks, "maximumPersistentDisks of %s", name);
+      this.maximumPersistentDisksSizeGb = maximumPersistentDisksSizeGb;
+      this.zone = checkNotNull(zone, "zone of %s", name);
+      this.deprecated = fromNullable(deprecated);
+   }
+
+   /**
+    * @return count of CPUs exposed to the instance.
+    */
+   public int getGuestCpus() {
+      return guestCpus;
+   }
+
+   /**
+    * @return physical memory assigned to the instance, defined in MB.
+    */
+   public int getMemoryMb() {
+      return memoryMb;
+   }
+
+   /**
+    * @return space allotted for the image, defined in GB.
+    */
+   public int getImageSpaceGb() {
+      return imageSpaceGb;
+   }
+
+   /**
+    * @return extended scratch disks assigned to the instance.
+    */
+   public List<ScratchDisk> getScratchDisks() {
+      return scratchDisks;
+   }
+
+   /**
+    * @return maximum persistent disks allowed.
+    */
+   public int getMaximumPersistentDisks() {
+      return maximumPersistentDisks;
+   }
+
+   /**
+    * @return maximum total persistent disks size (GB) allowed.
+    */
+   public long getMaximumPersistentDisksSizeGb() {
+      return maximumPersistentDisksSizeGb;
+   }
+
+   /**
+    * @return the zones that this machine type can run in.
+    */
+   public String getZone() {
+      return zone;
+   }
+
+   /**
+    * @return the deprecation information for this machine type
+    */
+   public Optional<Deprecated> getDeprecated() {
+      return deprecated;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
+      MachineType that = MachineType.class.cast(obj);
+      return equal(this.kind, that.kind)
+              && equal(this.name, that.name)
+              && equal(this.zone, that.zone);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return super.string()
+              .add("guestCpus", guestCpus)
+              .add("memoryMb", memoryMb)
+              .add("imageSpaceGb", imageSpaceGb)
+              .add("scratchDisks", scratchDisks)
+              .add("maximumPersistentDisks", maximumPersistentDisks)
+              .add("maximumPersistentDisksSizeGb", maximumPersistentDisksSizeGb)
+              .add("zone", zone)
+              .add("deprecated", deprecated.orNull());
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return new Builder().fromMachineType(this);
+   }
+
+   public static final class Builder extends Resource.Builder<Builder> {
+
+      private Integer guestCpus;
+      private Integer memoryMb;
+      private Integer imageSpaceGb;
+      private ImmutableList.Builder<ScratchDisk> scratchDisks = ImmutableList.builder();
+      private Integer maximumPersistentDisks;
+      private Long maximumPersistentDisksSizeGb;
+      private String zone;
+      private Deprecated deprecated;
+
+      /**
+       * @see MachineType#getGuestCpus()
+       */
+      public Builder guestCpus(int guesCpus) {
+         this.guestCpus = guesCpus;
+         return this;
+      }
+
+      /**
+       * @see MachineType#getMemoryMb()
+       */
+      public Builder memoryMb(int memoryMb) {
+         this.memoryMb = memoryMb;
+         return this;
+      }
+
+      /**
+       * @see MachineType#getImageSpaceGb()
+       */
+      public Builder imageSpaceGb(int imageSpaceGb) {
+         this.imageSpaceGb = imageSpaceGb;
+         return this;
+      }
+
+      /**
+       * @see MachineType#getScratchDisks()
+       */
+      public Builder addScratchDisk(int diskGb) {
+         this.scratchDisks.add(ScratchDisk.builder().diskGb(diskGb).build());
+         return this;
+      }
+
+      /**
+       * @see MachineType#getScratchDisks()
+       */
+      public Builder scratchDisks(List<ScratchDisk> scratchDisks) {
+         this.scratchDisks.addAll(scratchDisks);
+         return this;
+      }
+
+      /**
+       * @see MachineType#getMaximumPersistentDisks()
+       */
+      public Builder maximumPersistentDisks(int maximumPersistentDisks) {
+         this.maximumPersistentDisks = maximumPersistentDisks;
+         return this;
+      }
+
+      /**
+       * @see MachineType#getMaximumPersistentDisksSizeGb()
+       */
+      public Builder maximumPersistentDisksSizeGb(long maximumPersistentDisksSizeGb) {
+         this.maximumPersistentDisksSizeGb = maximumPersistentDisksSizeGb;
+         return this;
+      }
+
+      /**
+       * @see MachineType#getZone()
+       */
+      public Builder zone(String zone) {
+         this.zone = zone;
+         return this;
+      }
+
+      /**
+       * @see MachineType#getDeprecated()
+       */
+      public Builder deprecated(Deprecated deprecated) {
+         this.deprecated = deprecated;
+         return this;
+      }
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+
+      public MachineType build() {
+         return new MachineType(id, creationTimestamp, selfLink, name, description, guestCpus, memoryMb,
+                 imageSpaceGb, scratchDisks.build(), maximumPersistentDisks, maximumPersistentDisksSizeGb,
+                 zone, deprecated);
+      }
+
+
+      public Builder fromMachineType(MachineType in) {
+         return super.fromResource(in).memoryMb(in.getMemoryMb()).imageSpaceGb(in.getImageSpaceGb()).scratchDisks(in
+                 .getScratchDisks()).maximumPersistentDisks(in.getMaximumPersistentDisks())
+                 .maximumPersistentDisksSizeGb(in.getMaximumPersistentDisksSizeGb()).zone(in.getZone())
+                 .deprecated(in.getDeprecated().orNull());
+      }
+   }
+
+   /**
+    * An scratch disk of a MachineType
+    */
+   public static final class ScratchDisk {
+
+      private final int diskGb;
+
+      @ConstructorProperties({
+              "diskGb"
+      })
+      private ScratchDisk(int diskGb) {
+         this.diskGb = diskGb;
+      }
+
+      /**
+       * @return size of the scratch disk, defined in GB.
+       */
+      public int getDiskGb() {
+         return diskGb;
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public int hashCode() {
+         return Objects.hashCode(diskGb);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public boolean equals(Object obj) {
+         if (this == obj) return true;
+         if (obj == null || getClass() != obj.getClass()) return false;
+         ScratchDisk that = ScratchDisk.class.cast(obj);
+         return equal(this.diskGb, that.diskGb);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      protected Objects.ToStringHelper string() {
+         return toStringHelper(this)
+                 .add("diskGb", diskGb);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public String toString() {
+         return string().toString();
+      }
+
+      public static Builder builder() {
+         return new Builder();
+      }
+
+      public Builder toBuilder() {
+         return builder().fromScratchDisk(this);
+      }
+
+      public static class Builder {
+
+         private int diskGb;
+
+         /**
+          * @see org.jclouds.googlecomputeengine.domain.MachineType.ScratchDisk#getDiskGb()
+          */
+         public Builder diskGb(int diskGb) {
+            this.diskGb = diskGb;
+            return this;
+         }
+
+         public ScratchDisk build() {
+            return new ScratchDisk(diskGb);
+         }
+
+         public Builder fromScratchDisk(ScratchDisk in) {
+            return new Builder().diskGb(in.getDiskGb());
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java
new file mode 100644
index 0000000..0a4b5fb
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.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.googlecomputeengine.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+public class MachineTypeInZone extends SlashEncodedIds {
+   protected final MachineType machineType;
+
+   public MachineTypeInZone(MachineType machineType, String zoneId) {
+      super(zoneId, checkNotNull(machineType, "machineType").getName());
+      this.machineType = machineType;
+   }
+
+   public MachineType getMachineType() {
+      return machineType;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
+      MachineTypeInZone that = MachineTypeInZone.class.cast(obj);
+      return equal(this.machineType, that.machineType)
+              && equal(this.firstId, that.firstId)
+              && equal(this.secondId, that.secondId);
+   }
+
+   @Override
+   public String toString() {
+      return "[machineType=" + machineType + ", zoneId=" + firstId + "]";
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java
new file mode 100644
index 0000000..53a8cfb
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Metadata.java
@@ -0,0 +1,139 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+
+import java.beans.ConstructorProperties;
+import java.util.Map;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Metadata for an instance or project, with their fingerprint.
+ */
+public class Metadata {
+   @Nullable
+   private final String fingerprint;
+   private final Map<String, String> items;
+
+   @ConstructorProperties({"fingerprint", "items"})
+   public Metadata(@Nullable String fingerprint, @Nullable Map<String, String> items) {
+      this.fingerprint = fingerprint;
+      this.items = items == null ? ImmutableMap.<String, String>of() : items;
+   }
+
+   /**
+    * @return an optional map of metadata key/value pairs for this instance/project
+    */
+   public Map<String, String> getItems() {
+      return items;
+   }
+
+   /**
+    * Gets the fingerprint for the items - needed for updating them.
+    *
+    * @return the fingerprint string for the items.
+    */
+   public String getFingerprint() {
+      return fingerprint;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(fingerprint, items);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
+      Metadata that = Metadata.class.cast(obj);
+      return equal(this.items, that.items)
+              && equal(this.fingerprint, that.fingerprint);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return toStringHelper(this)
+              .add("items", items)
+              .add("fingerprint", fingerprint);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static final class Builder {
+
+      private ImmutableMap.Builder<String, String> items = ImmutableMap.builder();
+      private String fingerprint;
+
+      /**
+       * @see Metadata#getItems()
+       */
+      public Builder addItem(String key, String value) {
+         this.items.put(key, value);
+         return this;
+      }
+
+      /**
+       * @see Metadata#getItems()
+       */
+      public Builder items(Map<String, String> items) {
+         this.items.putAll(items);
+         return this;
+      }
+
+      /**
+       * @see org.jclouds.googlecomputeengine.domain.Metadata#getFingerprint()
+       */
+      public Builder fingerprint(String fingerprint) {
+         this.fingerprint = fingerprint;
+         return this;
+      }
+
+      public Metadata build() {
+         return new Metadata(this.fingerprint, this.items.build());
+      }
+
+      public Builder fromMetadata(Metadata in) {
+         return this.fingerprint(in.getFingerprint())
+                 .items(in.getItems());
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java
new file mode 100644
index 0000000..0919c89
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java
@@ -0,0 +1,133 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+
+import static com.google.common.base.Optional.fromNullable;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.net.URI;
+import java.util.Date;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+
+/**
+ * Represents a network used to enable instance communication.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/networks"/>
+ */
+@Beta
+public final class Network extends Resource {
+
+   private final String IPv4Range;
+   private final Optional<String> gatewayIPv4;
+
+   @ConstructorProperties({
+           "id", "creationTimestamp", "selfLink", "name", "description", "IPv4Range",
+           "gatewayIPv4"
+   })
+   protected Network(String id, Date creationTimestamp, URI selfLink, String name, String description,
+                     String IPv4Range, String gatewayIPv4) {
+      super(Kind.NETWORK, id, creationTimestamp, selfLink, name, description);
+      this.IPv4Range = checkNotNull(IPv4Range);
+      this.gatewayIPv4 = fromNullable(gatewayIPv4);
+   }
+
+   /**
+    * @return Required; The range of internal addresses that are legal on this network. This range is a CIDR
+    *         specification, for example: 192.168.0.0/16.
+    */
+   public String getIPv4Range() {
+      return IPv4Range;
+   }
+
+   /**
+    * This must be within the range specified by IPv4Range, and is typically the first usable address in that range.
+    * If not specified, the default value is the first usable address in IPv4Range.
+    *
+    * @return an optional address that is used for default routing to other networks.
+    */
+   public Optional<String> getGatewayIPv4() {
+      return gatewayIPv4;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return super.string()
+              .omitNullValues()
+              .add("IPv4Range", IPv4Range)
+              .add("gatewayIPv4", gatewayIPv4.orNull());
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return new Builder().fromNetwork(this);
+   }
+
+   public static final class Builder extends Resource.Builder<Builder> {
+
+      private String IPv4Range;
+      private String gatewayIPv4;
+
+      /**
+       * @see Network#getIPv4Range()
+       */
+      public Builder IPv4Range(String IPv4Range) {
+         this.IPv4Range = IPv4Range;
+         return this;
+      }
+
+      /**
+       * @see Network#getGatewayIPv4()
+       */
+      public Builder gatewayIPv4(String gatewayIPv4) {
+         this.gatewayIPv4 = gatewayIPv4;
+         return this;
+      }
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+
+      public Network build() {
+         return new Network(super.id, super.creationTimestamp, super.selfLink, super.name,
+                 super.description, IPv4Range, gatewayIPv4);
+      }
+
+      public Builder fromNetwork(Network in) {
+         return super.fromResource(in);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java
new file mode 100644
index 0000000..deab873
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java
@@ -0,0 +1,556 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Optional.fromNullable;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.net.URI;
+import java.util.Date;
+import java.util.List;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Describes an operation being executed on some Resource
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/operations"/>
+ */
+@Beta
+public class Operation extends Resource {
+
+   public static enum Status {
+      PENDING,
+      RUNNING,
+      DONE
+   }
+
+   private final URI targetLink;
+   private final Optional<String> targetId;
+   private final Optional<String> clientOperationId;
+   private final Status status;
+   private final Optional<String> statusMessage;
+   private final String user;
+   private final Optional<Integer> progress;
+   private final Date insertTime;
+   private final Optional<Date> startTime;
+   private final Optional<Date> endTime;
+   private final Optional<HttpResponse> httpError;
+   private final String operationType;
+   private final List<Error> errors;
+   private final Optional<URI> zone;
+   private final Optional<URI> region;
+
+   protected Operation(String id, Date creationTimestamp, URI selfLink, String name, String description,
+                       URI targetLink, String targetId, String clientOperationId, Status status,
+                       String statusMessage, String user, Integer progress, Date insertTime, Date startTime,
+                       Date endTime, Integer httpErrorStatusCode, String httpErrorMessage, String operationType,
+                       @Nullable List<Error> errors, URI region, URI zone) {
+      super(Kind.OPERATION, id, creationTimestamp, selfLink, name, description);
+      this.targetLink = checkNotNull(targetLink, "targetLink of %s", name);
+      this.targetId = fromNullable(targetId);
+      this.clientOperationId = fromNullable(clientOperationId);
+      this.status = checkNotNull(status, "status of %s", name);
+      this.statusMessage = fromNullable(statusMessage);
+      this.user = checkNotNull(user, "user of %s", name);
+      this.progress = fromNullable(progress);
+      this.insertTime = checkNotNull(insertTime, "insertTime of %s", name);
+      this.startTime = fromNullable(startTime);
+      this.endTime = fromNullable(endTime);
+      this.httpError = httpErrorStatusCode != null && httpErrorStatusCode != 0 ?
+              Optional.of(HttpResponse.builder()
+                      .statusCode(httpErrorStatusCode)
+                      .message(httpErrorMessage)
+                      .build())
+              : Optional.<HttpResponse>absent();
+      this.operationType = checkNotNull(operationType, "insertTime of %s", name);
+      this.errors = errors == null ? ImmutableList.<Error>of() : ImmutableList.copyOf(errors);
+      this.region = fromNullable(region);
+      this.zone = fromNullable(zone);
+   }
+
+   /**
+    * @return URL of the resource the operation is mutating.
+    */
+   public URI getTargetLink() {
+      return targetLink;
+   }
+
+   /**
+    * @return An optional identifier specified by the client when the mutation was initiated. Must be unique for all
+    *         operation resources in the project.
+    */
+   public Optional<String> getClientOperationId() {
+      return clientOperationId;
+   }
+
+   /**
+    * @return unique target id which identifies a particular incarnation of the target.
+    */
+   public Optional<String> getTargetId() {
+      return targetId;
+   }
+
+   /**
+    * @return region this operation is in, if any.
+    */
+   public Optional<URI> getRegion() {
+      return region;
+   }
+
+   /**
+    * @return zone this operation is in, if any.
+    */
+   public Optional<URI> getZone() {
+      return zone;
+   }
+
+   /**
+    * @return Status of the operation. Can be one of the following: PENDING, RUNNING, or DONE.
+    */
+   public Status getStatus() {
+      return status;
+   }
+
+   /**
+    * @return An optional textual description of the current status of the operation.
+    */
+   public Optional<String> getStatusMessage() {
+      return statusMessage;
+   }
+
+   /**
+    * @return User who requested the operation, for example "user@example.com".
+    */
+   public String getUser() {
+      return user;
+   }
+
+   /**
+    * @return an optional progress indicator that ranges from 0 to 100. This should not be used to guess at when the
+    *         operation will be complete. This number should be monotonically increasing as the operation progresses
+    *         (output only).
+    */
+   public Optional<Integer> getProgress() {
+      return progress;
+   }
+
+   /**
+    * @return the time that this operation was requested.
+    */
+   public Date getInsertTime() {
+      return insertTime;
+   }
+
+   /**
+    * @return the time that this operation was started by the server.
+    */
+   public Optional<Date> getStartTime() {
+      return startTime;
+   }
+
+   /**
+    * @return the time that this operation was completed.
+    */
+   public Optional<Date> getEndTime() {
+      return endTime;
+   }
+
+   /**
+    * @return if operation fails, the HttpResponse with error status code returned and the message, e.g. NOT_FOUND.
+    */
+   public Optional<HttpResponse> getHttpError() {
+      return httpError;
+   }
+
+   /**
+    * @return type of the operation. Examples include insert, update, and delete.
+    */
+   public String getOperationType() {
+      return operationType;
+   }
+
+   /**
+    * @return if error occurred during processing of this operation, this field will be populated.
+    */
+   public List<Error> getErrors() {
+      return errors;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return super.string()
+              .omitNullValues()
+              .add("targetLink", targetLink)
+              .add("targetId", targetId.orNull())
+              .add("clientOperationId", clientOperationId.orNull())
+              .add("status", status)
+              .add("statusMessage", statusMessage.orNull())
+              .add("user", user)
+              .add("progress", progress.orNull())
+              .add("insertTime", insertTime)
+              .add("startTime", startTime.orNull())
+              .add("endTime", endTime.orNull())
+              .add("httpError", httpError.orNull())
+              .add("operationType", operationType)
+              .add("errors", errors)
+              .add("region", region.orNull())
+              .add("zone", zone.orNull());
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return new Builder().fromOperation(this);
+   }
+
+   public static final class Builder extends Resource.Builder<Builder> {
+
+      private URI targetLink;
+      private String targetId;
+      private String clientOperationId;
+      private Status status;
+      private String statusMessage;
+      private String user;
+      private Integer progress;
+      private Date insertTime;
+      private Date startTime;
+      private Date endTime;
+      private Integer httpErrorStatusCode;
+      private String httpErrorMessage;
+      private String operationType;
+      private ImmutableList.Builder<Error> errors = ImmutableList.builder();
+      private URI region;
+      private URI zone;
+
+      /**
+       * @see Operation#getTargetLink()
+       */
+      public Builder targetLink(URI targetLink) {
+         this.targetLink = targetLink;
+         return self();
+      }
+
+      /**
+       * @see Operation#getRegion()
+       */
+      public Builder region(URI region) {
+         this.region = region;
+         return self();
+      }
+
+      /**
+       * @see Operation#getZone()
+       */
+      public Builder zone(URI zone) {
+         this.zone = zone;
+         return self();
+      }
+
+      /**
+       * @see Operation#getTargetId()
+       */
+      public Builder targetId(String targetId) {
+         this.targetId = targetId;
+         return self();
+      }
+
+      /**
+       * @see Operation#getClientOperationId()
+       */
+      public Builder clientOperationId(String clientOperationId) {
+         this.clientOperationId = clientOperationId;
+         return self();
+      }
+
+      /**
+       * @see Operation#getStatus()
+       */
+      public Builder status(Status status) {
+         this.status = status;
+         return self();
+      }
+
+      /**
+       * @see Operation#getStatusMessage()
+       */
+      public Builder statusMessage(String statusMessage) {
+         this.statusMessage = statusMessage;
+         return self();
+      }
+
+      /**
+       * @see Operation#getUser()
+       */
+      public Builder user(String user) {
+         this.user = user;
+         return self();
+      }
+
+      /**
+       * @see Operation#getProgress()
+       */
+      public Builder progress(Integer progress) {
+         this.progress = progress;
+         return self();
+      }
+
+      /**
+       * @see Operation#getInsertTime()
+       */
+      public Builder insertTime(Date insertTime) {
+         this.insertTime = insertTime;
+         return self();
+      }
+
+      /**
+       * @see Operation#getStartTime()
+       */
+      public Builder startTime(Date startTime) {
+         this.startTime = startTime;
+         return self();
+      }
+
+      /**
+       * @see Operation#getEndTime()
+       */
+      public Builder endTime(Date endTime) {
+         this.endTime = endTime;
+         return self();
+      }
+
+      /**
+       * @see Operation#getHttpError()
+       */
+      public Builder httpErrorStatusCode(Integer httpErrorStatusCode) {
+         this.httpErrorStatusCode = httpErrorStatusCode;
+         return self();
+      }
+
+      /**
+       * @see Operation#getHttpError()
+       */
+      public Builder httpErrorMessage(String httpErrorMessage) {
+         this.httpErrorMessage = httpErrorMessage;
+         return self();
+      }
+
+      /**
+       * @see Operation#getOperationType()
+       */
+      public Builder operationType(String operationType) {
+         this.operationType = operationType;
+         return self();
+      }
+
+      /**
+       * @see Operation#getErrors()
+       */
+      public Builder errors(Iterable<Error> errors) {
+         if (errors != null)
+            this.errors.addAll(errors);
+         return self();
+      }
+
+      /**
+       * @see Operation#getErrors()
+       */
+      public Builder addError(Error error) {
+         this.errors.add(error);
+         return self();
+      }
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+
+      public Operation build() {
+         return new Operation(super.id, super.creationTimestamp, super.selfLink, super.name,
+                 super.description, targetLink, targetId, clientOperationId, status, statusMessage, user, progress,
+                 insertTime, startTime, endTime, httpErrorStatusCode, httpErrorMessage, operationType,
+                 errors.build(), region, zone);
+      }
+
+      public Builder fromOperation(Operation in) {
+         return super.fromResource(in)
+                 .targetLink(in.getTargetLink())
+                 .targetId(in.getTargetId().orNull())
+                 .clientOperationId(in.getClientOperationId().orNull())
+                 .status(in.getStatus())
+                 .statusMessage(in.getStatusMessage().orNull())
+                 .user(in.getUser())
+                 .progress(in.getProgress().get())
+                 .insertTime(in.getInsertTime())
+                 .startTime(in.getStartTime().orNull())
+                 .endTime(in.getEndTime().orNull())
+                 .httpErrorStatusCode(in.getHttpError().isPresent() ? in.getHttpError().get().getStatusCode() : null)
+                 .httpErrorMessage(in.getHttpError().isPresent() ? in.getHttpError().get().getMessage() : null)
+                 .operationType(in.getOperationType()).errors(in.getErrors())
+                 .zone(in.getZone().orNull()).region(in.getRegion().orNull());
+      }
+   }
+
+   /**
+    * A particular error for an operation including the details.
+    */
+   public static final class Error {
+
+      private final String code;
+      private final Optional<String> location;
+      private final Optional<String> message;
+
+      @ConstructorProperties({
+              "code", "location", "message"
+      })
+      private Error(String code, String location, String message) {
+         this.code = checkNotNull(code, "code");
+         this.location = fromNullable(location);
+         this.message = fromNullable(message);
+      }
+
+      /**
+       * @return the error type identifier for this error.
+       */
+      public String getCode() {
+         return code;
+      }
+
+      /**
+       * @return indicates the field in the request which caused the error..
+       */
+      public Optional<String> getLocation() {
+         return location;
+      }
+
+      /**
+       * @return an optional, human-readable error message.
+       */
+      public Optional<String> getMessage() {
+         return message;
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public int hashCode() {
+         return Objects.hashCode(code, location, message);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public boolean equals(Object obj) {
+         if (this == obj) return true;
+         if (obj == null || getClass() != obj.getClass()) return false;
+         Error that = Error.class.cast(obj);
+         return equal(this.code, that.code)
+                 && equal(this.location, that.location)
+                 && equal(this.message, that.message);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      protected Objects.ToStringHelper string() {
+         return toStringHelper(this)
+                 .omitNullValues()
+                 .add("code", code)
+                 .add("location", location.orNull())
+                 .add("message", message.orNull());
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public String toString() {
+         return string().toString();
+      }
+
+      public static Builder builder() {
+         return new Builder();
+      }
+
+      public Builder toBuilder() {
+         return builder().fromOperationErrorDetail(this);
+      }
+
+      public static final class Builder {
+
+         private String code;
+         private String location;
+         private String message;
+
+         /**
+          * @see org.jclouds.googlecomputeengine.domain.Operation.Error#getCode()
+          */
+         public Builder code(String code) {
+            this.code = code;
+            return this;
+         }
+
+         /**
+          * @see org.jclouds.googlecomputeengine.domain.Operation.Error#getLocation()
+          */
+         public Builder location(String location) {
+            this.location = location;
+            return this;
+         }
+
+         /**
+          * @see org.jclouds.googlecomputeengine.domain.Operation.Error#getMessage()
+          */
+         public Builder message(String message) {
+            this.message = message;
+            return this;
+         }
+
+         public Error build() {
+            return new Error(code, location, message);
+         }
+
+         public Builder fromOperationErrorDetail(Error in) {
+            return new Builder().code(in.getCode()).location(in.getLocation().orNull()).message
+                    (in.getMessage().orNull());
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java
new file mode 100644
index 0000000..ac3867b
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java
@@ -0,0 +1,162 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Date;
+import java.util.Set;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A Project resource is the root collection and settings resource for all Google Compute Engine resources.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/projects"/>
+ */
+@Beta
+public class Project extends Resource {
+
+   private final Metadata commonInstanceMetadata;
+   private final Set<Quota> quotas;
+   private final Set<String> externalIpAddresses;
+
+   protected Project(String id, Date creationTimestamp, URI selfLink, String name, String description,
+                     Metadata commonInstanceMetadata, Set<Quota> quotas, Set<String> externalIpAddresses) {
+      super(Kind.PROJECT, id, creationTimestamp, selfLink, name, description);
+      this.commonInstanceMetadata = checkNotNull(commonInstanceMetadata, "commonInstanceMetadata");
+      this.quotas = quotas == null ? ImmutableSet.<Quota>of() : ImmutableSet.copyOf(quotas);
+      this.externalIpAddresses = externalIpAddresses == null ? ImmutableSet.<String>of() : ImmutableSet.copyOf
+              (externalIpAddresses);
+   }
+
+   /**
+    * @return metadata key/value pairs available to all instances contained in this project.
+    */
+   public Metadata getCommonInstanceMetadata() {
+      return commonInstanceMetadata;
+   }
+
+   /**
+    * @return quotas assigned to this project.
+    */
+   public Set<Quota> getQuotas() {
+      return quotas;
+   }
+
+   /**
+    * @return internet available IP addresses available for use in this project.
+    */
+   @Nullable
+   public Set<String> getExternalIpAddresses() {
+      return externalIpAddresses;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return super.string()
+              .add("commonInstanceMetadata", commonInstanceMetadata)
+              .add("quotas", quotas)
+              .add("externalIpAddresses", externalIpAddresses);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return new Builder().fromProject(this);
+   }
+
+   public static final class Builder extends Resource.Builder<Builder> {
+
+      private Metadata commonInstanceMetadata;
+      private ImmutableSet.Builder<Quota> quotas = ImmutableSet.builder();
+      private ImmutableSet.Builder<String> externalIpAddresses = ImmutableSet.builder();
+
+      /**
+       * @see Project#getCommonInstanceMetadata()
+       */
+      public Builder commonInstanceMetadata(Metadata commonInstanceMetadata) {
+         this.commonInstanceMetadata = commonInstanceMetadata;
+         return this;
+      }
+
+      /**
+       * @see Project#getQuotas()
+       */
+      public Builder addQuota(String metric, double usage, double limit) {
+         this.quotas.add(Quota.builder().metric(metric).usage(usage).limit(limit).build());
+         return this;
+      }
+
+      /**
+       * @see Project#getQuotas()
+       */
+      public Builder quotas(Set<Quota> quotas) {
+         this.quotas.addAll(checkNotNull(quotas));
+         return this;
+      }
+
+      /**
+       * @see Project#getExternalIpAddresses()
+       */
+      public Builder addExternalIpAddress(String externalIpAddress) {
+         this.externalIpAddresses.add(checkNotNull(externalIpAddress, "externalIpAddress"));
+         return this;
+      }
+
+      /**
+       * @see Project#getExternalIpAddresses()
+       */
+      public Builder externalIpAddresses(Set<String> externalIpAddresses) {
+         this.externalIpAddresses.addAll(checkNotNull(externalIpAddresses, "externalIpAddresses"));
+         return this;
+      }
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+
+      public Project build() {
+         return new Project(super.id, super.creationTimestamp, super.selfLink, super.name,
+                 super.description, commonInstanceMetadata, quotas.build(), externalIpAddresses.build());
+      }
+
+      public Builder fromProject(Project in) {
+         return super.fromResource(in).commonInstanceMetadata(in.getCommonInstanceMetadata()).quotas(in.getQuotas())
+                 .externalIpAddresses(in.getExternalIpAddresses());
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java
new file mode 100644
index 0000000..3c17130
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Quota.java
@@ -0,0 +1,152 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.base.Objects.ToStringHelper;
+
+/**
+ * Quotas assigned to a given project or region.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/projects#resource"/>
+ */
+@Beta
+public class Quota {
+   private String metric;
+   private double usage;
+   private double limit;
+
+   @ConstructorProperties({
+           "metric", "usage", "limit"
+   })
+   public Quota(String metric, Double usage, Double limit) {
+      this.metric = metric != null ? metric : "undefined";
+      this.usage = checkNotNull(usage, "usage");
+      this.limit = checkNotNull(limit, "limit");
+   }
+
+   /**
+    * @return name of the quota metric.
+    */
+   public String getMetric() {
+      return metric;
+   }
+
+   /**
+    * @return current usage of this metric.
+    */
+   public Double getUsage() {
+      return usage;
+   }
+
+   /**
+    * @return quota limit for this metric.
+    */
+   public Double getLimit() {
+      return limit;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(metric);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || this.getClass() != obj.getClass()) return false;
+      Quota that = Quota.class.cast(obj);
+      return Objects.equal(this.metric, that.metric);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public ToStringHelper string() {
+      return Objects.toStringHelper(this)
+              .omitNullValues()
+              .add("metric", metric)
+              .add("usage", usage)
+              .add("limit", limit);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return builder().fromQuota(this);
+   }
+
+   public static class Builder {
+
+      private String metric;
+      private Double usage;
+      private Double limit;
+
+      /**
+       * @see org.jclouds.googlecomputeengine.domain.Quota#getMetric()
+       */
+      public Builder metric(String metric) {
+         this.metric = checkNotNull(metric, "metric");
+         return this;
+      }
+
+      /**
+       * @see org.jclouds.googlecomputeengine.domain.Quota#getUsage()
+       */
+      public Builder usage(Double usage) {
+         this.usage = usage;
+         return this;
+      }
+
+      /**
+       * @see org.jclouds.googlecomputeengine.domain.Quota#getLimit()
+       */
+      public Builder limit(Double limit) {
+         this.limit = limit;
+         return this;
+      }
+
+      public Quota build() {
+         return new Quota(metric, usage, limit);
+      }
+
+      public Builder fromQuota(Quota quota) {
+         return new Builder().metric(quota.getMetric()).usage(quota.getUsage()).limit(quota.getLimit());
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java
new file mode 100644
index 0000000..aa459bf
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Region.java
@@ -0,0 +1,175 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.net.URI;
+import java.util.Date;
+import java.util.Set;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Represents a region resource.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/regions"/>
+ */
+@Beta
+public final class Region extends Resource {
+
+   public enum Status {
+      UP,
+      DOWN
+   }
+
+   private final Status status;
+   private final Set<URI> zones;
+   private final Set<Quota> quotas;
+
+   @ConstructorProperties({
+           "id", "creationTimestamp", "selfLink", "name", "description", "status",
+           "zones", "quotas"
+   })
+   private Region(String id, Date creationTimestamp, URI selfLink, String name, String description,
+                  Status status, Set<URI> zones, Set<Quota> quotas) {
+      super(Kind.REGION, id, creationTimestamp, selfLink, name, description);
+      this.status = checkNotNull(status, "status of %name", name);
+      this.zones = zones == null ? ImmutableSet.<URI>of() : ImmutableSet
+              .copyOf(zones);
+      this.quotas = quotas == null ? ImmutableSet.<Quota>of() : ImmutableSet.copyOf(quotas);
+   }
+
+   /**
+    * @return Status of the region. "UP" or "DOWN".
+    */
+   public Status getStatus() {
+      return status;
+   }
+
+   /**
+    * @return the zones that can be used in this region.
+    */
+   @Nullable
+   public Set<URI> getZones() {
+      return zones;
+   }
+
+   /**
+    * @return quotas assigned to this project.
+    */
+   public Set<Quota> getQuotas() {
+      return quotas;
+   }
+
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return super.string()
+              .add("status", status)
+              .add("zones", zones)
+              .add("quotas", quotas);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return new Builder().fromRegion(this);
+   }
+
+   public static final class Builder extends Resource.Builder<Builder> {
+
+      private Status status;
+      private ImmutableSet.Builder<URI> zones = ImmutableSet.builder();
+      private ImmutableSet.Builder<Quota> quotas = ImmutableSet.builder();
+
+      /**
+       * @see org.jclouds.googlecomputeengine.domain.Region#getStatus()
+       */
+      public Builder status(Status status) {
+         this.status = status;
+         return this;
+      }
+
+      /**
+       * @see Region#getZones()
+       */
+      public Builder zone(URI zone) {
+         this.zones.add(checkNotNull(zone, "zone"));
+         return this;
+      }
+
+      /**
+       * @see Region#getZones()
+       */
+      public Builder zones(Set<URI> zones) {
+         this.zones.addAll(checkNotNull(zones, "zones"));
+         return this;
+      }
+
+      /**
+       * @see Region#getQuotas()
+       */
+      public Builder addQuota(String metric, double usage, double limit) {
+         this.quotas.add(Quota.builder().metric(metric).usage(usage).limit(limit).build());
+         return this;
+      }
+
+      /**
+       * @see Region#getQuotas()
+       */
+      public Builder quotas(Set<Quota> quotas) {
+         this.quotas.addAll(checkNotNull(quotas));
+         return this;
+      }
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+
+      public Region build() {
+         return new Region(super.id, super.creationTimestamp, super.selfLink, super.name,
+                 super.description, status, zones.build(), quotas.build());
+      }
+
+      public Builder fromRegion(Region in) {
+         return super.fromResource(in)
+                 .status(in.getStatus())
+                 .zones(in.getZones())
+                 .quotas(in.getQuotas());
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java
new file mode 100644
index 0000000..4d0a1c8
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java
@@ -0,0 +1,283 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Objects.ToStringHelper;
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Optional.fromNullable;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.net.URI;
+import java.util.Date;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.CaseFormat;
+import com.google.common.base.Joiner;
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+
+/**
+ * Base class for Google Compute Engine resources.
+ */
+@Beta
+public class Resource {
+
+   public enum Kind {
+      ADDRESS,
+      ADDRESS_LIST,
+      DISK,
+      DISK_LIST,
+      FIREWALL,
+      FIREWALL_LIST,
+      IMAGE,
+      IMAGE_LIST,
+      OPERATION,
+      OPERATION_LIST,
+      INSTANCE,
+      INSTANCE_LIST,
+      MACHINE_TYPE,
+      MACHINE_TYPE_LIST,
+      PROJECT,
+      NETWORK,
+      NETWORK_LIST,
+      REGION,
+      REGION_LIST,
+      ROUTE,
+      ROUTE_LIST,
+      SNAPSHOT,
+      SNAPSHOT_LIST,
+      ZONE,
+      ZONE_LIST;
+
+      public String value() {
+         return Joiner.on("#").join("compute", CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()));
+      }
+
+      @Override
+      public String toString() {
+         return value();
+      }
+
+      public static Kind fromValue(String kind) {
+         return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat
+                 .UPPER_UNDERSCORE,
+                 Iterables.getLast(Splitter.on("#").split(checkNotNull(kind,
+                         "kind")))));
+      }
+   }
+
+   protected final Kind kind;
+   protected final String id;
+   protected final Optional<Date> creationTimestamp;
+   protected final URI selfLink;
+   protected final String name;
+   protected final Optional<String> description;
+
+   @ConstructorProperties({
+           "kind", "id", "creationTimestamp", "selfLink", "name", "description"
+   })
+   protected Resource(Kind kind, String id, Date creationTimestamp, URI selfLink, String name,
+                      String description) {
+      this.kind = checkNotNull(kind, "kind");
+      this.id = checkNotNull(id, "id");
+      this.creationTimestamp = fromNullable(creationTimestamp);
+      this.selfLink = checkNotNull(selfLink, "selfLink");
+      this.name = checkNotNull(name, "name");
+      this.description = fromNullable(description);
+   }
+
+   /**
+    * @return the Type of the resource
+    */
+   public Kind getKind() {
+      return kind;
+   }
+
+   /**
+    * @return unique identifier for the resource; defined by the server.
+    */
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return creation timestamp in RFC3339 text format.
+    */
+   public Optional<Date> getCreationTimestamp() {
+      return creationTimestamp;
+   }
+
+   /**
+    * @return server defined URL for the resource.
+    */
+   public URI getSelfLink() {
+      return selfLink;
+   }
+
+   /**
+    * @return name of the resource.
+    */
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @return an optional textual description of the resource.
+    */
+   @Nullable
+   public Optional<String> getDescription() {
+      return description;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(kind, name);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
+      Resource that = Resource.class.cast(obj);
+      return equal(this.kind, that.kind)
+              && equal(this.name, that.name);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected ToStringHelper string() {
+      return toStringHelper(this)
+              .omitNullValues()
+              .add("kind", kind)
+              .add("id", id)
+              .add("name", name)
+              .add("creationTimestamp", creationTimestamp.orNull())
+              .add("selfLink", selfLink)
+              .add("name", name)
+              .add("description", description.orNull());
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder<?> builder() {
+      return new ConcreteBuilder();
+   }
+
+   public Builder<?> toBuilder() {
+      return new ConcreteBuilder().fromResource(this);
+   }
+
+   public abstract static class Builder<T extends Builder<T>> {
+
+      protected abstract T self();
+
+      protected Kind kind;
+      protected String id;
+      protected Date creationTimestamp;
+      protected URI selfLink;
+      protected String name;
+      protected String description;
+
+      /**
+       * @see Resource#getKind()
+       */
+      protected T kind(Kind kind) {
+         this.kind = kind;
+         return self();
+      }
+
+      /**
+       * @see Resource#getId()
+       */
+      public T id(String id) {
+         this.id = id;
+         return self();
+      }
+
+      /**
+       * @see Resource#getCreationTimestamp()
+       */
+      public T creationTimestamp(Date creationTimestamp) {
+         this.creationTimestamp = creationTimestamp;
+         return self();
+      }
+
+      /**
+       * @see Resource#getSelfLink()
+       */
+      public T selfLink(URI selfLink) {
+         this.selfLink = selfLink;
+         return self();
+      }
+
+      /**
+       * @see Resource#getName()
+       */
+      public T name(String name) {
+         this.name = name;
+         return self();
+      }
+
+      /**
+       * @see Resource#getDescription()
+       */
+      public T description(String description) {
+         this.description = description;
+         return self();
+      }
+
+      public Resource build() {
+         return new Resource(kind, id, creationTimestamp, selfLink, name, description);
+      }
+
+      public T fromResource(Resource in) {
+         return this
+                 .kind(in.getKind())
+                 .id(in.getId())
+                 .creationTimestamp(in.getCreationTimestamp().orNull())
+                 .selfLink(in.getSelfLink())
+                 .name(in.getName())
+                 .description(in.getDescription().orNull());
+      }
+   }
+
+   private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
+      @Override
+      protected ConcreteBuilder self() {
+         return this;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java
new file mode 100644
index 0000000..df5bb1d
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/Route.java
@@ -0,0 +1,433 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.Optional.fromNullable;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.net.URI;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Represents a route resource.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/routes"/>
+ */
+@Beta
+public final class Route extends Resource {
+
+   private final URI network;
+   private final Set<String> tags;
+   private final String destRange;
+   private final Integer priority;
+   private final Optional<URI> nextHopInstance;
+   private final Optional<String> nextHopIp;
+   private final Optional<URI> nextHopNetwork;
+   private final Optional<URI> nextHopGateway;
+   private final Set<Warning> warnings;
+
+   @ConstructorProperties({
+           "id", "creationTimestamp", "selfLink", "name", "description", "network", "tags",
+           "destRange", "priority", "nextHopInstance", "nextHopIp", "nextHopNetwork",
+           "nextHopGateway", "warnings"
+   })
+   private Route(String id, Date creationTimestamp, URI selfLink, String name, String description,
+                 URI network, Set<String> tags, String destRange, Integer priority,
+                 URI nextHopInstance, String nextHopIp, URI nextHopNetwork,
+                 URI nextHopGateway, Set<Warning> warnings) {
+      super(Kind.ROUTE, id, creationTimestamp, selfLink, name, description);
+      this.network = checkNotNull(network, "network for %name", name);
+      this.tags = tags == null ? ImmutableSet.<String>of() : tags;
+      this.destRange = checkNotNull(destRange, "destination range for %name", name);
+      this.priority = checkNotNull(priority, "priority of %name", name);
+      this.nextHopInstance = fromNullable(nextHopInstance);
+      this.nextHopIp = fromNullable(nextHopIp);
+      this.nextHopNetwork = fromNullable(nextHopNetwork);
+      this.nextHopGateway = fromNullable(nextHopGateway);
+      this.warnings = warnings == null ? ImmutableSet.<Warning>of() : warnings;
+   }
+
+   /**
+    * @return Network for this Route.
+    */
+   public URI getNetwork() {
+      return network;
+   }
+
+   /**
+    * @return The set of instance items to which this route applies.
+    */
+   public Set<String> getTags() {
+      return tags;
+   }
+
+   /**
+    * @return The destination range of outgoing packets that this route applies to.
+    */
+   public String getDestRange() {
+      return destRange;
+   }
+
+   /**
+    * @return The priority of this route. Priority is used to break ties in the case
+    *    where there is more than one matching route of maximum length. A lower value
+    *    is higher priority; a priority of 100 is higher than 200.
+    */
+   public Integer getPriority() {
+      return priority;
+   }
+
+   /**
+    * @return The fully-qualified URL to an instance that should handle matching packets.
+    */
+   public Optional<URI> getNextHopInstance() {
+      return nextHopInstance;
+   }
+
+   /**
+    * @return The network IP address of an instance that should handle matching packets.
+    */
+   public Optional<String> getNextHopIp() {
+      return nextHopIp;
+   }
+
+   /**
+    * @return The URL of the local network if it should handle matching packets.
+    */
+   public Optional<URI> getNextHopNetwork() {
+      return nextHopNetwork;
+   }
+
+   /**
+    * @return The URL to a gateway that should handle matching packets. Currently, this is only the internet gateway.
+    */
+   public Optional<URI> getNextHopGateway() {
+      return nextHopGateway;
+   }
+
+   /**
+    * @return If potential misconfigurations are detected for this route, this field will be populated with warning messages.
+    */
+   public Set<Warning> getWarnings() {
+      return warnings;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   protected Objects.ToStringHelper string() {
+      return super.string()
+              .add("network", network)
+              .add("tags", tags)
+              .add("destRange", destRange)
+              .add("priority", priority)
+              .add("nextHopInstance", nextHopInstance.orNull())
+              .add("nextHopIp", nextHopIp.orNull())
+              .add("nextHopNetwork", nextHopNetwork.orNull())
+              .add("nextHopGateway", nextHopGateway.orNull())
+              .add("warnings", warnings);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return new Builder().fromRoute(this);
+   }
+
+   public static final class Builder extends Resource.Builder<Builder> {
+
+      private URI network;
+      private ImmutableSet.Builder<String> tags = ImmutableSet.builder();
+      private String destRange;
+      private Integer priority;
+      private URI nextHopInstance;
+      private String nextHopIp;
+      private URI nextHopNetwork;
+      private URI nextHopGateway;
+      private ImmutableSet.Builder<Warning> warnings = ImmutableSet.builder();
+
+
+      /**
+       * @see Route#getNetwork()
+       */
+      public Builder network(URI network) {
+         this.network = network;
+         return this;
+      }
+
+      /**
+       * @see Route#getTags()
+       */
+      public Builder addTag(String tag) {
+         this.tags.add(tag);
+         return this;
+      }
+
+      /**
+       * @see Route#getTags()
+       */
+      public Builder tags(Set<String> tags) {
+         this.tags.addAll(tags);
+         return this;
+      }
+
+      /**
+       * @see Route#getDestRange()
+       */
+      public Builder destRange(String destRange) {
+         this.destRange = destRange;
+         return this;
+      }
+
+      /**
+       * @see Route#getPriority()
+       */
+      public Builder priority(Integer priority) {
+         this.priority = priority;
+         return this;
+      }
+
+      /**
+       * @see Route#getNextHopInstance()
+       */
+      public Builder nextHopInstance(URI nextHopInstance) {
+         this.nextHopInstance = nextHopInstance;
+         return this;
+      }
+
+      /**
+       * @see Route#getNextHopIp()
+       */
+      public Builder nextHopIp(String nextHopIp) {
+         this.nextHopIp = nextHopIp;
+         return this;
+      }
+
+      /**
+       * @see Route#getNextHopNetwork()
+       */
+      public Builder nextHopNetwork(URI nextHopNetwork) {
+         this.nextHopNetwork = nextHopNetwork;
+         return this;
+      }
+
+      /**
+       * @see Route#getNextHopGateway()
+       */
+      public Builder nextHopGateway(URI nextHopGateway) {
+         this.nextHopGateway = nextHopGateway;
+         return this;
+      }
+
+      /**
+       * @see Route#getWarnings()
+       */
+      public Builder addWarning(Warning warning) {
+         this.warnings.add(warning);
+         return this;
+      }
+
+      /**
+       * @see Route#getWarnings()
+       */
+      public Builder warnings(Set<Warning> warnings) {
+         this.warnings.addAll(warnings);
+         return this;
+      }
+
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+
+      public Route build() {
+         return new Route(super.id, super.creationTimestamp, super.selfLink, super.name,
+                 super.description, network, tags.build(), destRange, priority,
+                 nextHopInstance, nextHopIp, nextHopNetwork, nextHopGateway,
+                 warnings.build());
+      }
+
+      public Builder fromRoute(Route in) {
+         return super.fromResource(in)
+                 .network(in.getNetwork())
+                 .tags(in.getTags())
+                 .destRange(in.getDestRange())
+                 .priority(in.getPriority())
+                 .nextHopInstance(in.getNextHopInstance().orNull())
+                 .nextHopIp(in.getNextHopIp().orNull())
+                 .nextHopNetwork(in.getNextHopNetwork().orNull())
+                 .nextHopGateway(in.getNextHopGateway().orNull())
+                 .warnings(in.getWarnings());
+      }
+   }
+
+   /**
+    * If potential misconfigurations are detected for this route, this field will be populated with warning messages.
+    */
+   public static class Warning {
+      private final String code;
+      private final Optional<String> message;
+      private final Map<String, String> data;
+
+      @ConstructorProperties({
+              "code", "message", "data"
+      })
+      public Warning(String code, String message, Map<String, String> data) {
+         this.code = checkNotNull(code, "code");
+         this.message = fromNullable(message);
+         this.data = data == null ? ImmutableMap.<String, String>of() : data;
+      }
+
+      /**
+       * @return The warning type identifier for this warning.
+       */
+      public String getCode() {
+         return code;
+      }
+
+      /**
+       * @return Optional human-readable details for this warning.
+       */
+      public Optional<String> getMessage() {
+         return message;
+      }
+
+      /**
+       * @return Metadata for this warning
+       */
+      public Map<String, String> getData() {
+         return data;
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public int hashCode() {
+         return Objects.hashCode(code, message, data);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public boolean equals(Object obj) {
+         if (this == obj) return true;
+         if (obj == null || getClass() != obj.getClass()) return false;
+         Warning that = Warning.class.cast(obj);
+         return equal(this.code, that.code)
+                 && equal(this.message, that.message)
+                 && equal(this.data, that.data);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      protected Objects.ToStringHelper string() {
+         return toStringHelper(this)
+                 .add("code", code)
+                 .add("message", message)
+                 .add("data", data);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      @Override
+      public String toString() {
+         return string().toString();
+      }
+
+      public static Builder builder() {
+         return new Builder();
+      }
+
+      public Builder toBuilder() {
+         return builder().fromWarning(this);
+      }
+
+      public static final class Builder {
+         private String code;
+         private String message;
+         private ImmutableMap.Builder<String, String> data = ImmutableMap.builder();
+
+         /**
+          * @see Warning#getCode()
+          */
+         public Builder code(String code) {
+            this.code = code;
+            return this;
+         }
+
+         /**
+          * @see Warning#getMessage()
+          */
+         public Builder message(String message) {
+            this.message = message;
+            return this;
+         }
+
+         /**
+          * @see Warning#getData()
+          */
+         public Builder data(Map<String, String> data) {
+            this.data = new ImmutableMap.Builder<String, String>().putAll(data);
+            return this;
+         }
+
+         /**
+          * @see Warning#getData()
+          */
+         public Builder addData(String key, String value) {
+            this.data.put(checkNotNull(key, "key"), checkNotNull(value, "value of %s", key));
+            return this;
+         }
+
+         public Warning build() {
+            return new Warning(code, message, data.build());
+         }
+
+         public Builder fromWarning(Warning in) {
+            return this.code(in.getCode())
+                    .message(in.getMessage().orNull())
+                    .data(in.getData());
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/4203d59b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java
new file mode 100644
index 0000000..0080b29
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.0-stratos/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java
@@ -0,0 +1,83 @@
+/*
+ * 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.googlecomputeengine.domain;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+
+public class SlashEncodedIds {
+   public static SlashEncodedIds fromSlashEncoded(String id) {
+      Iterable<String> parts = Splitter.on('/').split(checkNotNull(id, "id"));
+      checkArgument(Iterables.size(parts) == 2, "id must be in format firstId/secondId");
+      return new SlashEncodedIds(Iterables.get(parts, 0), Iterables.get(parts, 1));
+   }
+
+   public static SlashEncodedIds fromTwoIds(String firstId, String secondId) {
+      return new SlashEncodedIds(firstId, secondId);
+   }
+
+   private static String slashEncodeTwoIds(String firstId, String secondId) {
+      return checkNotNull(firstId, "firstId") + "/" + checkNotNull(secondId, "secondId");
+   }
+
+   public String slashEncode() {
+      return slashEncodeTwoIds(firstId, secondId);
+   }
+
+   protected final String firstId;
+   protected final String secondId;
+
+   protected SlashEncodedIds(String firstId, String secondId) {
+      this.firstId = checkNotNull(firstId, "firstId");
+      this.secondId = checkNotNull(secondId, "secondId");
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(firstId, secondId);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      SlashEncodedIds other = (SlashEncodedIds) obj;
+      return Objects.equal(firstId, other.firstId) && Objects.equal(secondId, other.secondId);
+   }
+
+   public String getFirstId() {
+      return firstId;
+   }
+
+   public String getSecondId() {
+      return secondId;
+   }
+
+   @Override
+   public String toString() {
+      return "[firstId=" + firstId + ", secondId=" + secondId + "]";
+   }
+
+}