You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2015/08/20 11:36:28 UTC

[42/51] [abbrv] [partial] stratos git commit: Revert "Upgrading to jclouds 1.9.1"

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java
new file mode 100644
index 0000000..28cc443
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java
@@ -0,0 +1,65 @@
+/*
+ * 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.functions.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecomputeengine.domain.Operation;
+import org.jclouds.googlecomputeengine.options.ListOptions;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+
+import com.google.common.base.Function;
+import com.google.inject.TypeLiteral;
+
+public class ParseZoneOperations extends ParseJson<ListPage<Operation>> {
+
+   @Inject
+   public ParseZoneOperations(Json json) {
+      super(json, new TypeLiteral<ListPage<Operation>>() {
+      });
+   }
+
+   public static class ToPagedIterable extends BaseWithZoneToPagedIterable<Operation, ToPagedIterable> {
+
+      private final GoogleComputeEngineApi api;
+
+      @Inject
+      protected ToPagedIterable(GoogleComputeEngineApi api) {
+         this.api = checkNotNull(api, "api");
+      }
+
+      @Override
+      protected Function<Object, IterableWithMarker<Operation>> fetchNextPage(final String projectName,
+                                                                              final String zoneName,
+                                                                              final ListOptions options) {
+         return new Function<Object, IterableWithMarker<Operation>>() {
+
+            @Override
+            public IterableWithMarker<Operation> apply(Object input) {
+               return api.getZoneOperationApiForProject(projectName)
+                       .listAtMarkerInZone(zoneName, input.toString(), options);
+            }
+         };
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java
new file mode 100644
index 0000000..f3e54ea
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java
@@ -0,0 +1,63 @@
+/*
+ * 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.functions.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecomputeengine.domain.Zone;
+import org.jclouds.googlecomputeengine.options.ListOptions;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+
+import com.google.common.base.Function;
+import com.google.inject.TypeLiteral;
+
+public class ParseZones extends ParseJson<ListPage<Zone>> {
+
+   @Inject
+   public ParseZones(Json json) {
+      super(json, new TypeLiteral<ListPage<Zone>>() {
+      });
+   }
+
+   public static class ToPagedIterable extends BaseToPagedIterable<Zone, ToPagedIterable> {
+
+      private final GoogleComputeEngineApi api;
+
+      @Inject
+      protected ToPagedIterable(GoogleComputeEngineApi api) {
+         this.api = checkNotNull(api, "api");
+      }
+
+      @Override
+      protected Function<Object, IterableWithMarker<Zone>> fetchNextPage(final String projectName,
+                                                                         final ListOptions options) {
+         return new Function<Object, IterableWithMarker<Zone>>() {
+
+            @Override
+            public IterableWithMarker<Zone> apply(Object input) {
+               return api.getZoneApiForProject(projectName).listAtMarker(input.toString(), options);
+            }
+         };
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java
new file mode 100644
index 0000000..b5ce22e
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.googlecomputeengine.handlers;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.googlecomputeengine.options.FirewallOptions;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+public class FirewallBinder implements MapBinder {
+
+   @Inject
+   private BindToJsonPayload jsonBinder;
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) {
+      FirewallOptions options = (FirewallOptions) checkNotNull(postParams.get("options"), "firewallOptions");
+      String name = (String) checkNotNull(postParams.get("name"), "name");
+      URI network = (URI) checkNotNull(postParams.get("network"), "network");
+      options.name(name);
+      options.network(network);
+      return bindToRequest(request, options);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      return jsonBinder.bindToRequest(request, input);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java
new file mode 100644
index 0000000..109b050
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java
@@ -0,0 +1,62 @@
+/*
+ * 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.handlers;
+
+import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream;
+
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpCommand;
+import org.jclouds.http.HttpErrorHandler;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.HttpResponseException;
+import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.ResourceNotFoundException;
+
+/**
+ * This will parse and set an appropriate exception on the command object.
+ */
+@Singleton
+public class GoogleComputeEngineErrorHandler implements HttpErrorHandler {
+   public void handleError(HttpCommand command, HttpResponse response) {
+      // it is important to always read fully and close streams
+      byte[] data = closeClientButKeepContentStream(response);
+      String message = data != null ? new String(data) : null;
+
+      Exception exception = message != null ? new HttpResponseException(command, response, message)
+              : new HttpResponseException(command, response);
+      message = message != null ? message : String.format("%s -> %s", command.getCurrentRequest().getRequestLine(),
+              response.getStatusLine());
+      switch (response.getStatusCode()) {
+         case 400:
+            break;
+         case 401:
+         case 403:
+            exception = new AuthorizationException(message, exception);
+            break;
+         case 404:
+            if (!command.getCurrentRequest().getMethod().equals("DELETE")) {
+               exception = new ResourceNotFoundException(message, exception);
+            }
+            break;
+         case 409:
+            exception = new IllegalStateException(message, exception);
+            break;
+      }
+      command.setException(exception);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java
new file mode 100644
index 0000000..2559ede
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java
@@ -0,0 +1,65 @@
+/*
+ * 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.handlers;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.jclouds.googlecomputeengine.domain.InstanceTemplate;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+import com.google.common.base.Function;
+
+public class InstanceBinder implements MapBinder {
+
+   @Inject
+   private BindToJsonPayload jsonBinder;
+
+   @Inject
+   @Named("machineTypeToURI")
+   Function<String, URI> machineTypesToURI;
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) {
+      InstanceTemplate template = (InstanceTemplate) checkNotNull(postParams.get("template"), "template");
+      template.name(checkNotNull(postParams.get("name"), "name").toString());
+
+      if (template.getMachineTypeName() != null) {
+         template.machineType(machineTypesToURI.apply(template.getMachineTypeName()));
+      }
+      template.machineType((String) null);
+      return bindToRequest(request, template);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      return jsonBinder.bindToRequest(request, input);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java
new file mode 100644
index 0000000..b96afb4
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.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.googlecomputeengine.handlers;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.googlecomputeengine.domain.Metadata;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+import com.google.common.collect.ImmutableMap;
+
+public class MetadataBinder implements MapBinder {
+
+   @Inject
+   private BindToJsonPayload jsonBinder;
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) {
+      Map<String, String> items =
+            ImmutableMap.copyOf((Map<String, String>) checkNotNull(postParams.get("items"), "item"));
+      String fingerprint = (String) checkNotNull(postParams.get("fingerprint"), "fingerprint");
+      Metadata metadata = Metadata.builder()
+              .fingerprint(fingerprint)
+              .items(items)
+              .build();
+      return bindToRequest(request, metadata);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      return jsonBinder.bindToRequest(request, input);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/RouteBinder.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/RouteBinder.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/RouteBinder.java
new file mode 100644
index 0000000..2863b44
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/handlers/RouteBinder.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.googlecomputeengine.handlers;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.googlecomputeengine.options.RouteOptions;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+public class RouteBinder implements MapBinder {
+
+   @Inject
+   private BindToJsonPayload jsonBinder;
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) {
+      RouteOptions options = (RouteOptions) checkNotNull(postParams.get("options"), "routeOptions");
+      String name = (String) checkNotNull(postParams.get("name"), "name");
+      URI network = (URI) checkNotNull(postParams.get("network"), "network");
+      options.name(name);
+      options.network(network);
+      return bindToRequest(request, options);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      return jsonBinder.bindToRequest(request, input);
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java
new file mode 100644
index 0000000..5ad2846
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java
@@ -0,0 +1,128 @@
+/*
+ * 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.options;
+
+import java.net.URI;
+
+/**
+ * Options for attaching disks to instances.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/latest/instances/attachDisk"/>
+ */
+public class AttachDiskOptions {
+
+   public enum DiskType {
+      SCRATCH,
+      PERSISTENT
+   }
+
+   public enum DiskMode {
+      READ_WRITE,
+      READ_ONLY
+   }
+
+   private DiskType type;
+   private DiskMode mode;
+   private URI source;
+   private String deviceName;
+   private boolean boot;
+
+   /**
+    * The disk type
+    *
+    * @return the disk type.
+    */
+   public DiskType getType() {
+      return type;
+   }
+
+   /**
+    * The disk mode
+    *
+    * @return the disk mode
+    */
+   public DiskMode getMode() {
+      return mode;
+   }
+
+   /**
+    * The URI of the source disk - optional, if DiskType.SCRATCH is used.
+    *
+    * @return the URI
+    */
+   public URI getSource() {
+      return source;
+   }
+
+   /**
+    * The device name on the instance - optional.
+    *
+    * @return the device name
+    */
+   public String getDeviceName() {
+      return deviceName;
+   }
+
+   /**
+    * Indicates that this is a boot disk. VM will use the first partition of the disk for its root filesystem.
+    *
+    * @return true if this is a boot disk, false otherwise
+    */
+   public boolean getBoot() {
+      return boot;
+   }
+
+   /**
+    * @see AttachDiskOptions#getType()
+    */
+   public AttachDiskOptions type(DiskType type) {
+      this.type = type;
+      return this;
+   }
+
+   /**
+    * @see AttachDiskOptions#getMode()
+    */
+   public AttachDiskOptions mode(DiskMode mode) {
+      this.mode = mode;
+      return this;
+   }
+
+   /**
+    * @see AttachDiskOptions#getSource()
+    */
+   public AttachDiskOptions source(URI source) {
+      this.source = source;
+      return this;
+   }
+
+   /**
+    * @see AttachDiskOptions#getDeviceName()
+    */
+   public AttachDiskOptions deviceName(String deviceName) {
+      this.deviceName = deviceName;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.options.AttachDiskOptions#getBoot()
+    */
+   public AttachDiskOptions boot(boolean boot) {
+      this.boot = boot;
+      return this;
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/DeprecateOptions.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/DeprecateOptions.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/DeprecateOptions.java
new file mode 100644
index 0000000..382bf71
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/DeprecateOptions.java
@@ -0,0 +1,126 @@
+/*
+ * 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.options;
+
+import java.net.URI;
+import java.util.Date;
+
+/**
+ * Options to set the deprecation status of a resource. Currently only for images.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/latest/images/deprecate" />
+ */
+public class DeprecateOptions {
+
+   public enum State {
+      DEPRECATED,
+      OBSOLETE,
+      DELETED
+   }
+
+   private State state;
+   private URI replacement;
+   private Date deprecated;
+   private Date obsolete;
+   private Date deleted;
+
+   /**
+    * The new deprecation state.
+    *
+    * @return the new deprecation state.
+    */
+   public State getState() {
+      return state;
+   }
+
+   /**
+    * Optional URL for replacement of deprecated resource.
+    *
+    * @return the URL
+    */
+   public URI getReplacement() {
+      return replacement;
+   }
+
+   /**
+    * Optional RFC3339 timestamp for when the deprecation state was changed to DEPRECATED.
+    *
+    * @return the timestamp
+    */
+   public Date getDeprecated() {
+      return deprecated;
+   }
+
+   /**
+    * Optional RFC3339 timestamp for when the deprecation state was changed to OBSOLETE.
+    *
+    * @return the timestamp
+    */
+   public Date getObsolete() {
+      return obsolete;
+   }
+
+   /**
+    * Optional RFC3339 timestamp for when the deprecation state was changed to DELETED.
+    *
+    * @return the timestamp
+    */
+   public Date getDeleted() {
+      return deleted;
+   }
+
+   /**
+    * @see DeprecateOptions#getState()
+    */
+   public DeprecateOptions state(State state) {
+      this.state = state;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.options.DeprecateOptions#getReplacement()
+    */
+   public DeprecateOptions replacement(URI replacement) {
+      this.replacement = replacement;
+      return this;
+   }
+
+   /**
+    * @see DeprecateOptions#getDeprecated()
+    */
+   public DeprecateOptions deprecated(Date deprecated) {
+      this.deprecated = deprecated;
+      return this;
+   }
+
+   /**
+    * @see DeprecateOptions#getObsolete()
+    */
+   public DeprecateOptions obsolete(Date obsolete) {
+      this.obsolete = obsolete;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.options.DeprecateOptions#getDeleted()
+    */
+   public DeprecateOptions deleted(Date deleted) {
+      this.deleted = deleted;
+      return this;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java
new file mode 100644
index 0000000..d70d4d0
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java
@@ -0,0 +1,166 @@
+/*
+ * 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.options;
+
+import java.net.URI;
+import java.util.Set;
+
+import org.jclouds.googlecomputeengine.domain.Firewall;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Options to create a firewall.
+ *
+ * @see Firewall
+ */
+public class FirewallOptions {
+
+   private String name;
+   private URI network;
+   private ImmutableSet.Builder<String> sourceRanges = ImmutableSet.builder();
+   private ImmutableSet.Builder<String> sourceTags = ImmutableSet.builder();
+   private ImmutableSet.Builder<String> targetTags = ImmutableSet.builder();
+   private ImmutableSet.Builder<Firewall.Rule> allowed = ImmutableSet.builder();
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getAllowed()
+    */
+   public Set<Firewall.Rule> getAllowed() {
+      return allowed.build();
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getAllowed()
+    */
+   public FirewallOptions addAllowedRule(Firewall.Rule allowedRule) {
+      this.allowed.add(allowedRule);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getAllowed()
+    */
+   public FirewallOptions allowedRules(Set<Firewall.Rule> allowedRules) {
+      this.allowed = ImmutableSet.builder();
+      this.allowed.addAll(allowedRules);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getName()
+    */
+   public FirewallOptions name(String name) {
+      this.name = name;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getName()
+    */
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getNetwork()
+    */
+   public FirewallOptions network(URI network) {
+      this.network = network;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getNetwork()
+    */
+   public URI getNetwork() {
+      return network;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getSourceRanges()
+    */
+   public Set<String> getSourceRanges() {
+      return sourceRanges.build();
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getSourceRanges()
+    */
+   public FirewallOptions addSourceRange(String sourceRange) {
+      this.sourceRanges.add(sourceRange);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getSourceRanges()
+    */
+   public FirewallOptions sourceRanges(Set<String> sourceRanges) {
+      this.sourceRanges = ImmutableSet.builder();
+      this.sourceRanges.addAll(sourceRanges);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getSourceTags()
+    */
+   public Set<String> getSourceTags() {
+      return sourceTags.build();
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getSourceTags()
+    */
+   public FirewallOptions addSourceTag(String sourceTag) {
+      this.sourceTags.add(sourceTag);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getSourceTags()
+    */
+   public FirewallOptions sourceTags(Set<String> sourceTags) {
+      this.sourceTags = ImmutableSet.builder();
+      this.sourceTags.addAll(sourceTags);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getTargetTags()
+    */
+   public Set<String> getTargetTags() {
+      return targetTags.build();
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getTargetTags()
+    */
+   public FirewallOptions addTargetTag(String targetTag) {
+      this.targetTags.add(targetTag);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Firewall#getTargetTags()
+    */
+   public FirewallOptions targetTags(Set<String> targetTags) {
+      this.targetTags = ImmutableSet.builder();
+      this.targetTags.addAll(targetTags);
+      return this;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
new file mode 100644
index 0000000..9a3e88e
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
@@ -0,0 +1,91 @@
+/*
+ * 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.options;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.http.options.BaseHttpRequestOptions;
+
+/**
+ * Allows to optionally specify a filter, max results and a page token for <code>listFirstPage()</code> REST methods.
+ *
+ * @see <a href="https://developers.google.com/compute/docs/reference/v1/operations/listFirstPage"/>
+ */
+public class ListOptions extends BaseHttpRequestOptions {
+
+   /**
+    * Optional. Filter expression for filtering listed resources, in the form filter={expression}. Your {expression}
+    * must contain the following:
+    * <p/>
+    * {@code <field_name> <comparison_string> <literal_string>}
+    * <ul>
+    * <li>{@code <field_name>}:  The name of the field you want to compare. The field name must be valid for the
+    * type of resource being filtered. Only atomic field types are supported (string, number,
+    * boolean). Array and object fields are not currently supported.</li>
+    * <li>{@code <comparison_string>}: The comparison string, either eq (equals) or ne (not equals).</li>
+    * <li>{@code <literal_string>}: The literal string value to filter to. The literal value must be valid
+    * for the type of field (string, number, boolean). For string fields, the literal value is interpreted as a
+    * regular expression using RE2 syntax. The literal value must match the entire field. For example,
+    * when filtering instances, name eq my_instance won't work, but name eq .*my_instance will work.</li>
+    * </ul>
+    * <p/>
+    * For example:
+    * <p/>
+    * {@code filter=status ne RUNNING}
+    * <p/>
+    * The above filter returns only results whose status field does not equal RUNNING. You can also enclose your
+    * literal string in single, double, or no quotes. For example, all three of the following would be valid
+    * expressions:
+    * <p/>
+    * {@code filter=status ne "RUNNING"}<br/>
+    * {@code filter=status ne 'RUNNING'}<br/>
+    * {@code filter=status ne RUNNING}<br/>
+    * <p/>
+    * Complex regular expressions can also be used, like the following:
+    * {@code name eq '."my_instance_[0-9]+'}
+    */
+   public ListOptions filter(String filter) {
+      this.queryParameters.put("filter", checkNotNull(filter, "filter"));
+      return this;
+   }
+
+   /**
+    * Sets Maximum count of results to be returned. Maximum and default value is 100. Acceptable items are 0 to
+    * 100, inclusive. (Default: 100)
+    */
+   public ListOptions maxResults(Integer maxResults) {
+      this.queryParameters.put("maxResults", checkNotNull(maxResults, "maxResults") + "");
+      return this;
+   }
+
+   public static class Builder {
+
+      /**
+       * @see ListOptions#filter(String)
+       */
+      public ListOptions filter(String filter) {
+         return new ListOptions().filter(filter);
+      }
+
+      /**
+       * @see ListOptions#maxResults(Integer)
+       */
+      public ListOptions maxResults(Integer maxResults) {
+         return new ListOptions().maxResults(maxResults);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/RouteOptions.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/RouteOptions.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/RouteOptions.java
new file mode 100644
index 0000000..ec891ce
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/options/RouteOptions.java
@@ -0,0 +1,202 @@
+/*
+ * 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.options;
+
+import java.net.URI;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Options to create a route.
+ *
+ * @see org.jclouds.googlecomputeengine.domain.Route
+ */
+public class RouteOptions {
+
+   private String name;
+   private URI network;
+   private String destRange;
+   private URI nextHopInstance;
+   private String nextHopIp;
+   private URI nextHopNetwork;
+   private URI nextHopGateway;
+   private String description;
+   private Integer priority;
+
+   private ImmutableSet.Builder<String> tags = ImmutableSet.builder();
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getName()
+    */
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getName()
+    */
+   public RouteOptions name(String name) {
+      this.name = name;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getDescription()
+    */
+   public String getDescription() {
+      return description;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getDescription()
+    */
+   public RouteOptions description(String description) {
+      this.description = description;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getDestRange()
+    */
+   public String getDestRange() {
+      return destRange;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getDestRange()
+    */
+   public RouteOptions destRange(String destRange) {
+      this.destRange = destRange;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopIp()
+    */
+   public String getNextHopIp() {
+      return nextHopIp;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopIp()
+    */
+   public RouteOptions nextHopIp(String nextHopIp) {
+      this.nextHopIp = nextHopIp;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getPriority()
+    */
+   public Integer getPriority() {
+      return priority;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getPriority()
+    */
+   public RouteOptions priority(Integer priority) {
+      this.priority = priority;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNetwork()
+    */
+   public RouteOptions network(URI network) {
+      this.network = network;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNetwork()
+    */
+   public URI getNetwork() {
+      return network;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopInstance()
+    */
+   public RouteOptions nextHopInstance(URI nextHopInstance) {
+      this.nextHopInstance = nextHopInstance;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopInstance()
+    */
+   public URI getNextHopInstance() {
+      return nextHopInstance;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopNetwork()
+    */
+   public RouteOptions nextHopNetwork(URI nextHopNetwork) {
+      this.nextHopNetwork = nextHopNetwork;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopNetwork()
+    */
+   public URI getNextHopNetwork() {
+      return nextHopNetwork;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopGateway()
+    */
+   public RouteOptions nextHopGateway(URI nextHopGateway) {
+      this.nextHopGateway = nextHopGateway;
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getNextHopGateway()
+    */
+   public URI getNextHopGateway() {
+      return nextHopGateway;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getTags()
+    */
+   public Set<String> getTags() {
+      return tags.build();
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getTags()
+    */
+   public RouteOptions addTag(String tag) {
+      this.tags.add(tag);
+      return this;
+   }
+
+   /**
+    * @see org.jclouds.googlecomputeengine.domain.Route#getTags()
+    */
+   public RouteOptions tags(Set<String> tags) {
+      this.tags = ImmutableSet.builder();
+      this.tags.addAll(tags);
+      return this;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/GlobalOperationDonePredicate.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/GlobalOperationDonePredicate.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/GlobalOperationDonePredicate.java
new file mode 100644
index 0000000..ac34bcc
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/GlobalOperationDonePredicate.java
@@ -0,0 +1,59 @@
+/*
+ * 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.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.config.UserProject;
+import org.jclouds.googlecomputeengine.domain.Operation;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.inject.Inject;
+
+/**
+ * Tests that a Global Operation is done, returning the completed Operation when it is.
+ */
+public class GlobalOperationDonePredicate implements Predicate<AtomicReference<Operation>> {
+
+   private final GoogleComputeEngineApi api;
+   private final Supplier<String> project;
+
+   @Inject
+   public GlobalOperationDonePredicate(GoogleComputeEngineApi api, @UserProject Supplier<String> project) {
+      this.api = api;
+      this.project = project;
+   }
+
+   @Override
+   public boolean apply(AtomicReference<Operation> input) {
+      checkNotNull(input, "input");
+      Operation current = api.getGlobalOperationApiForProject(project.get()).get(input.get().getName());
+      switch (current.getStatus()) {
+         case DONE:
+            input.set(current);
+            return true;
+         case PENDING:
+         case RUNNING:
+         default:
+            return false;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/InstancePredicates.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/InstancePredicates.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/InstancePredicates.java
new file mode 100644
index 0000000..8cde680
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/InstancePredicates.java
@@ -0,0 +1,33 @@
+/*
+ * 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.predicates;
+
+import org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk;
+
+import com.google.common.base.Predicate;
+
+public class InstancePredicates {
+
+   public static Predicate<PersistentDisk> isBootDisk() {
+      return new Predicate<PersistentDisk>() {
+         @Override
+         public boolean apply(PersistentDisk input) {
+            return input.isBoot();
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/NetworkFirewallPredicates.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/NetworkFirewallPredicates.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/NetworkFirewallPredicates.java
new file mode 100644
index 0000000..63d2767
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/NetworkFirewallPredicates.java
@@ -0,0 +1,121 @@
+/*
+ * 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.predicates;
+
+import org.jclouds.googlecomputeengine.domain.Firewall;
+import org.jclouds.googlecomputeengine.domain.Firewall.Rule;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Range;
+import com.google.common.collect.Sets;
+
+public class NetworkFirewallPredicates {
+
+   public static Predicate<Firewall> hasProtocol(final IpProtocol protocol) {
+      return new Predicate<Firewall>() {
+
+         @Override
+         public boolean apply(Firewall fw) {
+            for (Rule rule : fw.getAllowed()) {
+               if (rule.getIpProtocol().equals(protocol)) {
+                  return true;
+               }
+            }
+
+            return false;
+         }
+      };
+   }
+
+   public static Predicate<Firewall> hasPortRange(final Range<Integer> portRange) {
+      return new Predicate<Firewall>() {
+
+         @Override
+         public boolean apply(Firewall fw) {
+            return Iterables.any(fw.getAllowed(), new Predicate<Rule>() {
+               @Override
+               public boolean apply(Rule input) {
+                  return input.getPorts().encloses(portRange);
+               }
+            });
+         }
+      };
+   }
+
+   public static Predicate<Firewall> hasSourceTag(final String sourceTag) {
+      return new Predicate<Firewall>() {
+         @Override
+         public boolean apply(Firewall input) {
+            return input.getSourceTags() != null && input.getSourceTags().contains(sourceTag);
+         }
+      };
+   }
+
+   public static Predicate<Firewall> hasSourceRange(final String sourceRange) {
+      return new Predicate<Firewall>() {
+         @Override
+         public boolean apply(Firewall input) {
+            return input.getSourceRanges() != null && input.getSourceRanges().contains(sourceRange);
+         }
+      };
+   }
+
+   public static Predicate<Firewall> equalsIpPermission(final IpPermission permission) {
+      return new Predicate<Firewall>() {
+         @Override
+         public boolean apply(Firewall input) {
+            return Iterables.elementsEqual(permission.getGroupIds(), input.getSourceTags())
+                      && Iterables.elementsEqual(permission.getCidrBlocks(), input.getSourceRanges())
+                      && (input.getAllowed().size() == 1
+                             && ruleEqualsIpPermission(permission).apply(Iterables.getOnlyElement(input.getAllowed())));
+         }
+      };
+   }
+
+   public static Predicate<Firewall> providesIpPermission(final IpPermission permission) {
+      return new Predicate<Firewall>() {
+         @Override
+         public boolean apply(Firewall input) {
+            boolean groupsMatchTags = (permission.getGroupIds().isEmpty() && input.getSourceTags().isEmpty())
+                    || !Sets.intersection(permission.getGroupIds(), input.getSourceTags()).isEmpty();
+            boolean cidrsMatchRanges = (permission.getCidrBlocks().isEmpty() && input.getSourceRanges().isEmpty())
+                    || !Sets.intersection(permission.getCidrBlocks(), input.getSourceRanges()).isEmpty();
+            boolean firewallHasPorts = hasProtocol(permission.getIpProtocol()).apply(input)
+                    && ((permission.getFromPort() == 0 && permission.getToPort() == 0)
+                    || hasPortRange(Range.closed(permission.getFromPort(), permission.getToPort())).apply(input));
+
+            return groupsMatchTags && cidrsMatchRanges && firewallHasPorts;
+         }
+      };
+   }
+
+   private static Predicate<Firewall.Rule> ruleEqualsIpPermission(final IpPermission permission) {
+      return new Predicate<Rule>() {
+         @Override
+         public boolean apply(Firewall.Rule input) {
+            return permission.getIpProtocol().equals(input.getIpProtocol())
+                      && ((input.getPorts().isEmpty() && permission.getFromPort() == 0 && permission.getToPort() == 0)
+                             || (input.getPorts().asRanges().size() == 1
+                                    && permission.getFromPort() == Iterables.getOnlyElement(input.getPorts().asRanges()).lowerEndpoint()
+                                    && permission.getToPort() == Iterables.getOnlyElement(input.getPorts().asRanges()).upperEndpoint()));
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/RegionOperationDonePredicate.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/RegionOperationDonePredicate.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/RegionOperationDonePredicate.java
new file mode 100644
index 0000000..1f3dee6
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/RegionOperationDonePredicate.java
@@ -0,0 +1,69 @@
+/*
+ * 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.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.jclouds.collect.Memoized;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.config.UserProject;
+import org.jclouds.googlecomputeengine.domain.Operation;
+import org.jclouds.googlecomputeengine.domain.Region;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.inject.Inject;
+
+/**
+ * Tests that a Global Operation is done, returning the completed Operation when it is.
+ */
+public class RegionOperationDonePredicate implements Predicate<AtomicReference<Operation>> {
+
+   private final GoogleComputeEngineApi api;
+   private final Supplier<String> project;
+   private final Supplier<Map<URI, Region>> regions;
+
+   @Inject
+   RegionOperationDonePredicate(GoogleComputeEngineApi api, @UserProject Supplier<String> project,
+                                @Memoized Supplier<Map<URI, Region>> regions) {
+      this.api = api;
+      this.project = project;
+      this.regions = regions;
+   }
+
+   @Override
+   public boolean apply(AtomicReference<Operation> input) {
+      checkNotNull(input, "input");
+
+      Operation current = api.getRegionOperationApiForProject(project.get())
+              .getInRegion(regions.get().get(input.get().getRegion().get()).getName(),
+              input.get().getName());
+      switch (current.getStatus()) {
+         case DONE:
+            input.set(current);
+            return true;
+         case PENDING:
+         case RUNNING:
+         default:
+            return false;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java
new file mode 100644
index 0000000..c63c6f3
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java
@@ -0,0 +1,68 @@
+/*
+ * 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.predicates;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.jclouds.collect.Memoized;
+import org.jclouds.domain.Location;
+import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.config.UserProject;
+import org.jclouds.googlecomputeengine.domain.Operation;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.inject.Inject;
+
+/**
+ * Tests that a Zone Operation is done, returning the completed Operation when it is.
+ */
+public class ZoneOperationDonePredicate implements Predicate<AtomicReference<Operation>> {
+
+   private final GoogleComputeEngineApi api;
+   private final Supplier<String> project;
+   private final Supplier<Map<URI, ? extends Location>> zones;
+
+   @Inject
+   ZoneOperationDonePredicate(GoogleComputeEngineApi api, @UserProject Supplier<String> project,
+                              @Memoized Supplier<Map<URI, ? extends Location>> zones) {
+      this.api = api;
+      this.project = project;
+      this.zones = zones;
+   }
+
+   @Override
+   public boolean apply(AtomicReference<Operation> input) {
+      checkNotNull(input, "input");
+      Operation current = api.getZoneOperationApiForProject(project.get())
+              .getInZone(zones.get().get(input.get().getZone().get()).getId(),
+                      input.get().getName());
+      switch (current.getStatus()) {
+         case DONE:
+            input.set(current);
+            return true;
+         case PENDING:
+         case RUNNING:
+         default:
+            return false;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApi.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApi.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApi.java
new file mode 100644
index 0000000..1b20734
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApi.java
@@ -0,0 +1,61 @@
+/*
+ * 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.oauth.v2;
+
+import java.io.Closeable;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.oauth.v2.config.Authentication;
+import org.jclouds.oauth.v2.domain.Token;
+import org.jclouds.oauth.v2.domain.TokenRequest;
+import org.jclouds.oauth.v2.handlers.OAuthTokenBinder;
+import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.Endpoint;
+
+/**
+ * Provides access to OAuth via REST api.
+ * <p/>
+ * Usually this is not directly used by a client, which instead specifies
+ * OAuthAuthenticator as a request filter, which in turn uses this class to
+ * perform token requests.
+ */
+@Endpoint(Authentication.class)
+public interface OAuthApi extends Closeable {
+
+   /**
+    * Authenticates/Authorizes access to a resource defined in TokenRequest
+    * against an OAuth v2 authentication/authorization server.
+    * 
+    * @param tokenRequest
+    *           specified the principal and the required permissions
+    * @return a Token object with the token required to access the resource
+    *         along with its expiration time
+    * @throws AuthorizationException
+    *            if the principal cannot be authenticated or has no permissions
+    *            for the specifed resources.
+    */
+   @Named("authenticate")
+   @POST
+   @Consumes(MediaType.APPLICATION_JSON)
+   Token authenticate(@BinderParam(OAuthTokenBinder.class) TokenRequest tokenRequest) throws AuthorizationException;
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java
new file mode 100644
index 0000000..3ef26e6
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java
@@ -0,0 +1,80 @@
+/*
+ * 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.oauth.v2;
+
+import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
+import static org.jclouds.oauth.v2.config.OAuthProperties.SIGNATURE_OR_MAC_ALGORITHM;
+
+import java.net.URI;
+import java.util.Properties;
+
+import org.jclouds.oauth.v2.config.OAuthHttpApiModule;
+import org.jclouds.oauth.v2.config.OAuthModule;
+import org.jclouds.rest.internal.BaseHttpApiMetadata;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+
+/**
+ * Implementation of {@link ApiMetadata} for OAuth 2 API
+ */
+public class OAuthApiMetadata extends BaseHttpApiMetadata<OAuthApi> {
+
+   @Override
+   public Builder toBuilder() {
+      return new Builder().fromApiMetadata(this);
+   }
+
+   public OAuthApiMetadata() {
+      this(new Builder());
+   }
+
+   protected OAuthApiMetadata(Builder builder) {
+      super(builder);
+   }
+
+   public static Properties defaultProperties() {
+      Properties properties = BaseHttpApiMetadata.defaultProperties();
+      properties.put(SIGNATURE_OR_MAC_ALGORITHM, "RS256");
+      properties.put(PROPERTY_SESSION_INTERVAL, 3600);
+      return properties;
+   }
+
+   public static class Builder extends BaseHttpApiMetadata.Builder<OAuthApi, Builder> {
+
+      protected Builder() {
+         id("oauth")
+         .name("OAuth API")
+         .identityName("service_account")
+         .credentialName("service_key")
+         .documentation(URI.create("TODO"))
+         .version("2")
+         .defaultProperties(OAuthApiMetadata.defaultProperties())
+         .defaultModules(ImmutableSet.<Class<? extends Module>>of(OAuthModule.class, OAuthHttpApiModule.class));
+      }
+
+      @Override
+      public OAuthApiMetadata build() {
+         return new OAuthApiMetadata(this);
+      }
+
+      @Override
+      protected Builder self() {
+         return this;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthConstants.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthConstants.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthConstants.java
new file mode 100644
index 0000000..9b140d4
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/OAuthConstants.java
@@ -0,0 +1,78 @@
+/*
+ * 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.oauth.v2;
+
+import com.google.common.collect.ImmutableMap;
+
+import java.util.Map;
+
+/**
+ * The constants for OAuth \
+ */
+public final class OAuthConstants {
+
+   /**
+    * Selected algorithm when a signature or mac isn't required.
+    */
+   public static final String NO_ALGORITHM = "none";
+
+   /**
+    * Static mapping between the oauth algorithm name and the Crypto provider signature algorithm name.
+    *
+    * @see <a href="http://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-06#section-3.1">doc</a>
+    * @see org.jclouds.oauth.v2.json.JWTTokenRequestFormat
+    */
+   public static final Map<String, String> OAUTH_ALGORITHM_NAMES_TO_SIGNATURE_ALGORITHM_NAMES = ImmutableMap
+           .<String, String>builder()
+           .put("RS256", "SHA256withRSA")
+           .put("RS384", "SHA384withRSA")
+           .put("RS512", "SHA512withRSA")
+           .put("HS256", "HmacSHA256")
+           .put("HS384", "HmacSHA384")
+           .put("HS512", "HmacSHA512")
+           .put("ES256", "SHA256withECDSA")
+           .put("ES384", "SHA384withECDSA")
+           .put("ES512", "SHA512withECDSA")
+           .put(NO_ALGORITHM, NO_ALGORITHM).build();
+
+   /**
+    * Static mapping between the oauth algorithm name and the Crypto provider KeyFactory algorithm name.
+    *
+    * @see <a href="http://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-06#section-3.1">doc</a>
+    */
+   public static final Map<String, String> OAUTH_ALGORITHM_NAMES_TO_KEYFACTORY_ALGORITHM_NAMES = ImmutableMap
+           .<String, String>builder()
+           .put("RS256", "RSA")
+           .put("RS384", "RSA")
+           .put("RS512", "RSA")
+           .put("HS256", "DiffieHellman")
+           .put("HS384", "DiffieHellman")
+           .put("HS512", "DiffieHellman")
+           .put("ES256", "EC")
+           .put("ES384", "EC")
+           .put("ES512", "EC")
+           .put(NO_ALGORITHM, NO_ALGORITHM).build();
+
+   /**
+    * The (optional) set of additional claims to use, provided in Map<String,String> form
+    */
+   public static final String ADDITIONAL_CLAIMS = "jclouds.oauth.additional-claims";
+
+   private OAuthConstants() {
+      throw new AssertionError("intentionally unimplemented");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/Authentication.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/Authentication.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/Authentication.java
new file mode 100644
index 0000000..24f6851
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/Authentication.java
@@ -0,0 +1,35 @@
+/*
+ * 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.oauth.v2.config;
+
+
+import javax.inject.Qualifier;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Qualifies OAuth related resources, such as Endpoint.
+ *
+ * @see org.jclouds.oauth.v2.OAuthApi
+ */
+@Retention(value = RetentionPolicy.RUNTIME)
+@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
+@Qualifier
+public @interface Authentication {
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/CredentialType.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/CredentialType.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/CredentialType.java
new file mode 100644
index 0000000..24a658b
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/CredentialType.java
@@ -0,0 +1,42 @@
+/*
+ * 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.oauth.v2.config;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.base.CaseFormat;
+
+/**
+ * Decides what type of credentials createContext is supplied with.
+ */
+public enum CredentialType {
+
+   BEARER_TOKEN_CREDENTIALS,
+
+   SERVICE_ACCOUNT_CREDENTIALS;
+
+   @Override
+   public String toString() {
+      return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name());
+   }
+
+   public static CredentialType fromValue(String credentialType) {
+      return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(credentialType,
+            "credentialType")));
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthAuthenticationModule.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthAuthenticationModule.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthAuthenticationModule.java
new file mode 100644
index 0000000..fb2d413
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthAuthenticationModule.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.oauth.v2.config;
+
+import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
+
+import java.net.URI;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.oauth.v2.OAuthApi;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+
+/**
+ * An OAuth module to be used form other providers.
+ */
+public class OAuthAuthenticationModule extends AbstractModule {
+
+   @Override
+   protected void configure() {
+      bindHttpApi(binder(), OAuthApi.class);
+   }
+
+   /**
+    * When oauth is used as a module the oauth endpoint is a normal property
+    */
+   @Provides
+   @Singleton
+   @Authentication
+   protected Supplier<URI> provideAuthenticationEndpoint(@Named("oauth.endpoint") String endpoint) {
+      return Suppliers.ofInstance(URI.create(endpoint));
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java
new file mode 100644
index 0000000..6b4fdf9
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java
@@ -0,0 +1,45 @@
+/*
+ * 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.oauth.v2.config;
+
+import java.net.URI;
+
+import javax.inject.Singleton;
+
+import org.jclouds.oauth.v2.OAuthApi;
+import org.jclouds.providers.ProviderMetadata;
+import org.jclouds.rest.ConfiguresHttpApi;
+import org.jclouds.rest.config.HttpApiModule;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.inject.Provides;
+
+/**
+ * OAuth module to when accessing OAuth stand-alone.
+ */
+@ConfiguresHttpApi
+public class OAuthHttpApiModule extends HttpApiModule<OAuthApi> {
+
+   @Provides
+   @Singleton
+   @Authentication
+   protected Supplier<URI> provideAuthenticationEndpoint(ProviderMetadata providerMetadata) {
+      return Suppliers.ofInstance(URI.create(providerMetadata.getEndpoint()));
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/b45ae00e/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java
new file mode 100644
index 0000000..1041c07
--- /dev/null
+++ b/dependencies/jclouds/apis/gce/1.8.1-stratos/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java
@@ -0,0 +1,119 @@
+/*
+ * 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.oauth.v2.config;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import org.jclouds.oauth.v2.domain.ClaimSet;
+import org.jclouds.oauth.v2.domain.Header;
+import org.jclouds.oauth.v2.domain.OAuthCredentials;
+import org.jclouds.oauth.v2.domain.Token;
+import org.jclouds.oauth.v2.domain.TokenRequest;
+import org.jclouds.oauth.v2.filters.BearerTokenAuthenticator;
+import org.jclouds.oauth.v2.filters.OAuthAuthenticationFilter;
+import org.jclouds.oauth.v2.filters.OAuthAuthenticator;
+import org.jclouds.oauth.v2.functions.BuildTokenRequest;
+import org.jclouds.oauth.v2.functions.FetchToken;
+import org.jclouds.oauth.v2.functions.OAuthCredentialsSupplier;
+import org.jclouds.oauth.v2.functions.SignOrProduceMacForToken;
+import org.jclouds.oauth.v2.json.ClaimSetTypeAdapter;
+import org.jclouds.oauth.v2.json.HeaderTypeAdapter;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
+
+/**
+ * Base OAuth module
+ */
+public class OAuthModule extends AbstractModule {
+
+
+   @Override
+   protected void configure() {
+      bind(new TypeLiteral<Function<byte[], byte[]>>() {}).to(SignOrProduceMacForToken.class);
+      bind(new TypeLiteral<Map<Type, Object>>() {}).toInstance(ImmutableMap.<Type, Object>of(
+            Header.class, new HeaderTypeAdapter(),
+            ClaimSet.class, new ClaimSetTypeAdapter()));
+      bind(CredentialType.class).toProvider(CredentialTypeFromPropertyOrDefault.class);
+      bind(new TypeLiteral<Supplier<OAuthCredentials>>() {}).to(OAuthCredentialsSupplier.class);
+      bind(new TypeLiteral<Function<GeneratedHttpRequest, TokenRequest>>() {}).to(BuildTokenRequest.class);
+      bind(new TypeLiteral<Function<TokenRequest, Token>>() {}).to(FetchToken.class);
+   }
+
+   /**
+    * Provides a cache for tokens. Cache is time based and by default expires after 59 minutes 
+    * (the maximum time a token is valid is 60 minutes).
+    * This cache and expiry period is system-wide and does not attend to per-instance expiry time
+    * (e.g. "expires_in" from Google Compute -- which is set to the standard 3600 seconds).
+    */
+   // NB: If per-instance expiry time is required, significant refactoring will be needed.
+   @Provides
+   @Singleton
+   public LoadingCache<TokenRequest, Token> provideAccessCache(Function<TokenRequest, Token> getAccess,
+                                                               @Named(PROPERTY_SESSION_INTERVAL) long
+                                                                       sessionIntervalInSeconds) {
+      // since the session interval is also the token expiration time requested to the server make the token expire a
+      // bit before the deadline to make sure there aren't session expiration exceptions
+      sessionIntervalInSeconds = sessionIntervalInSeconds > 30 ? sessionIntervalInSeconds - 30 :
+              sessionIntervalInSeconds;
+      return CacheBuilder.newBuilder().expireAfterWrite(sessionIntervalInSeconds, TimeUnit.SECONDS).build(CacheLoader
+              .from(getAccess));
+   }
+
+   @Singleton
+   public static class CredentialTypeFromPropertyOrDefault implements Provider<CredentialType> {
+      @Inject(optional = true)
+      @Named(OAuthProperties.CREDENTIAL_TYPE)
+      String credentialType = CredentialType.SERVICE_ACCOUNT_CREDENTIALS.toString();
+
+      @Override
+      public CredentialType get() {
+         return CredentialType.fromValue(credentialType);
+      }
+   }
+
+   @Provides
+   @Singleton
+   protected OAuthAuthenticationFilter authenticationFilterForCredentialType(CredentialType credentialType,
+                                                                             OAuthAuthenticator serviceAccountAuth,
+                                                                             BearerTokenAuthenticator bearerTokenAuth) {
+      switch (credentialType) {
+         case SERVICE_ACCOUNT_CREDENTIALS:
+            return serviceAccountAuth;
+         case BEARER_TOKEN_CREDENTIALS:
+            return bearerTokenAuth;
+         default:
+            throw new IllegalArgumentException("Unsupported credential type: " + credentialType);
+      }
+   }
+
+}