You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by io...@apache.org on 2013/05/21 20:58:19 UTC

[2/4] Add jclouds-representations project

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/pom.xml
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/pom.xml b/jclouds-representations/representations-core/pom.xml
new file mode 100644
index 0000000..b1152b6
--- /dev/null
+++ b/jclouds-representations/representations-core/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache.jclouds.labs</groupId>
+        <artifactId>jclouds-represetations</artifactId>
+        <version>1.6.1-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.apache.jclouds.labs.representations</groupId>
+    <artifactId>representations-core</artifactId>
+    <name>jclouds :: representations :: core</name>
+    <packaging>bundle</packaging>
+
+    <properties>
+        <jclouds.osgi.import>*</jclouds.osgi.import>
+        <jclouds.osgi.export>
+            org.jclouds*;version=${project.version};-noimport:=true
+        </jclouds.osgi.export>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>14.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.2.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/Blob.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/Blob.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/Blob.java
new file mode 100644
index 0000000..2926263
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/Blob.java
@@ -0,0 +1,84 @@
+/*
+ * 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.blobstore.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Map;
+
+public class Blob implements Serializable {
+
+   private static final long serialVersionUID = 6035812193926955340L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private Map<String, Collection<String>> allHeaders;
+      private BlobMetadata blobMetadata;
+
+      public Builder allHeaders(final Map<String, Collection<String>> allHeaders) {
+         this.allHeaders = allHeaders;
+         return this;
+      }
+
+      public Builder blobMetadata(final BlobMetadata blobMetadata) {
+         this.blobMetadata = blobMetadata;
+         return this;
+      }
+
+      public Blob build() {
+         return new Blob(allHeaders, blobMetadata);
+      }
+   }
+
+   private final Map<String, Collection<String>> allHeaders;
+   private final BlobMetadata blobMetadata;
+
+   public Blob(Map<String, Collection<String>> allHeaders, BlobMetadata blobMetadata) {
+      this.allHeaders = allHeaders;
+      this.blobMetadata = blobMetadata;
+   }
+
+   public Map<String, Collection<String>> getAllHeaders() {
+      return allHeaders;
+   }
+
+   public BlobMetadata getBlobMetadata() {
+      return blobMetadata;
+   }
+
+   public int hashCode() {
+      return Objects.hashCode(blobMetadata, allHeaders);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("blobMetadata", blobMetadata).add("allHeaders", allHeaders)
+              .toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobMetadata.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobMetadata.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobMetadata.java
new file mode 100644
index 0000000..25e6e8a
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobMetadata.java
@@ -0,0 +1,216 @@
+/*
+ * 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.blobstore.representations;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+
+import java.io.Serializable;
+import java.net.URI;
+import java.util.Date;
+import java.util.Map;
+
+import static org.jclouds.representations.Representations.dateFormat;
+
+public class BlobMetadata implements Serializable {
+
+   private static final long serialVersionUID = 1348620321325703530L;
+
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String publicUri;
+      private ContentMetadata content;
+      private String type;
+      private String providerId;
+      private String name;
+      private String uri;
+      private Map<String, String> userMetadata = ImmutableMap.of();
+      private String eTag;
+      private String creationDate;
+      private String lastModifiedDate;
+
+      public Builder type(final String type) {
+         this.type = type;
+         return this;
+      }
+
+      public Builder providerId(final String providerId) {
+         this.providerId = providerId;
+         return this;
+      }
+
+      public Builder name(final String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder uri(final URI uri) {
+         if (uri != null) {
+            this.uri = uri.toString();
+         }
+         return this;
+      }
+
+      public Builder uri(final String uri) {
+         this.uri = uri;
+         return this;
+      }
+
+      public Builder userMetadata(final Map<String, String> userMetadata) {
+         this.userMetadata = ImmutableMap.copyOf(userMetadata);
+         return this;
+      }
+
+      public Builder eTag(final String eTag) {
+         this.eTag = eTag;
+         return this;
+      }
+
+      public Builder creationDate(final Date creationDate) {
+         this.creationDate = dateFormat(creationDate);
+         return this;
+      }
+
+      public Builder creationDate(final String creationDate) {
+         this.creationDate = creationDate;
+         return this;
+      }
+
+      public Builder lastModifiedDate(final Date lastModifiedDate) {
+         this.lastModifiedDate = dateFormat(lastModifiedDate);
+         return this;
+      }
+
+      public Builder lastModifiedDate(final String lastModifiedDate) {
+         this.lastModifiedDate = lastModifiedDate;
+         return this;
+      }
+
+      public Builder publicUri(final URI publicUri) {
+         if (publicUri != null) {
+            this.publicUri = publicUri.toString();
+         }
+         return this;
+      }
+
+      public Builder publicUri(final String publicUri) {
+         this.publicUri = publicUri;
+         return this;
+      }
+
+      public Builder content(final ContentMetadata content) {
+         this.content = content;
+         return this;
+      }
+
+      public BlobMetadata build() {
+         return new BlobMetadata(type, providerId, name, uri, userMetadata, eTag, creationDate, lastModifiedDate,
+                 publicUri, content);
+      }
+   }
+
+   private final String type;
+   private final String providerId;
+   private final String name;
+   private final String uri;
+   private final Map<String, String> userMetadata;
+   private final String eTag;
+   private final String creationDate;
+   private final String lastModifiedDate;
+   private final String publicUri;
+   private final ContentMetadata contentMetadata;
+
+   public BlobMetadata(String type, String providerId, String name, String uri, Map<String, String> userMetadata,
+                       String eTag, String creationDate, String lastModifiedDate, String publicUri,
+                       ContentMetadata contentMetadata) {
+      this.type = type;
+      this.providerId = providerId;
+      this.name = name;
+      this.uri = uri;
+      this.userMetadata = userMetadata;
+      this.eTag = eTag;
+      this.creationDate = creationDate;
+      this.lastModifiedDate = lastModifiedDate;
+      this.publicUri = publicUri;
+      this.contentMetadata = contentMetadata;
+   }
+
+   public String getPublicUri() {
+      return publicUri;
+   }
+
+   public ContentMetadata getContentMetadata() {
+      return contentMetadata;
+   }
+
+
+   public String getType() {
+      return type;
+   }
+
+   public String getProviderId() {
+      return providerId;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getUri() {
+      return uri;
+   }
+
+   public Map<String, String> getUserMetadata() {
+      return userMetadata;
+   }
+
+   public String geteTag() {
+      return eTag;
+   }
+
+   public String getCreationDate() {
+      return creationDate;
+   }
+
+   public String getLastModifiedDate() {
+      return lastModifiedDate;
+   }
+
+   public int hashCode() {
+      return Objects.hashCode(publicUri);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("type", type).add("providerId", providerId).add("name", name)
+              .add("userMetadata", userMetadata).add("eTag", eTag).add("creationDate", creationDate)
+              .add("lastModifiedDate", lastModifiedDate).add("publicUri", publicUri).add("contentMetadata", contentMetadata)
+              .toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobStore.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobStore.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobStore.java
new file mode 100644
index 0000000..77a49dc
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/BlobStore.java
@@ -0,0 +1,186 @@
+/*
+ * 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.blobstore.representations;
+
+import org.jclouds.representations.Location;
+
+import java.util.Set;
+
+public interface BlobStore {
+
+   /**
+    * The get locations command returns all the valid locations for containers. A location has a
+    * scope, which is typically region or zone. A region is a general area, like eu-west, where a
+    * zone is similar to a datacenter. If a location has a parent, that implies it is within that
+    * location. For example a location can be a rack, whose parent is likely to be a zone.
+    */
+   Set<Location> listAssignableLocations();
+
+   /**
+    * Lists all root-level resources available to the identity.
+    */
+   Set<StorageMetadata> list();
+
+   /**
+    * Lists all resources in a container non-recursive.
+    *
+    * @param container
+    *           what to list
+    * @return a list that may be incomplete, depending on whether PageSet#getNextMarker is set
+    */
+   Set<StorageMetadata> list(String container);
+
+   /**
+    * Lists all resources in a containers directory non-recursive.
+    *
+    * @param container what to list
+    * @param directory the directory to list
+    * @return a list that may be incomplete, depending on whether PageSet#getNextMarker is set
+    */
+   public Set<StorageMetadata> list(String container, String directory);
+
+   /**
+    * Retrieves the metadata of a {@code Blob} at location {@code container/name}
+    *
+    * @param container
+    *           container where this exists.
+    * @param name
+    *           fully qualified name relative to the container.
+    * @return null if name isn't present or the blob you intended to receive.
+    * @throws org.jclouds.blobstore.ContainerNotFoundException
+    *            if the container doesn't exist
+    */
+   BlobMetadata blobMetadata(String container, String name);
+
+   /**
+    * Retrieves a {@code Blob} representing the data at location {@code container/name}
+    *
+    *
+    * @param container
+    *           container where this exists.
+    * @param name
+    *           fully qualified name relative to the container.
+    * @return the blob you intended to receive or null, if it doesn't exist.
+    * @throws org.jclouds.blobstore.ContainerNotFoundException
+    *            if the container doesn't exist
+    */
+   Blob getBlob(String container, String name);
+
+
+   /**
+    * determines if a service-level container exists
+    */
+   boolean containerExists(String container);
+
+   /**
+    * Creates a namespace for your blobs
+    * <p/>
+    *
+    * A container is a namespace for your objects. Depending on the service, the scope can be
+    * global, identity, or sub-identity scoped. For example, in Amazon S3, containers are called
+    * buckets, and they must be uniquely named such that no-one else in the world conflicts. In
+    * other blobstores, the naming convention of the container is less strict. All blobstores allow
+    * you to list your containers and also the contents within them. These contents can either be
+    * blobs, folders, or virtual paths.
+    *
+    * @param location
+    *           some blobstores allow you to specify a location, such as US-EAST, for where this
+    *           container will exist. null will choose a default location
+    * @param container
+    *           namespace. Typically constrained to lowercase alpha-numeric and hyphens.
+    * @return true if the container was created, false if it already existed.
+    */
+   boolean createContainerInLocation(String location, String container);
+
+
+   /**
+    * This will delete the contents of a container at its root path without deleting the container
+    *
+    * @param container
+    *           what to clear
+    */
+   void clearContainer(String container);
+
+
+   /**
+    * This will delete everything inside a container recursively.
+    *
+    * @param container
+    *           what to delete
+    */
+   void deleteContainer(String container);
+
+   /**
+    * Determines if a directory exists
+    *
+    * @param container
+    *           container where the directory resides
+    * @param directory
+    *           full path to the directory
+    */
+   boolean directoryExists(String container, String directory);
+
+   /**
+    * Creates a folder or a directory marker depending on the service
+    *
+    * @param container
+    *           container to create the directory in
+    * @param directory
+    *           full path to the directory
+    */
+   void createDirectory(String container, String directory);
+
+   /**
+    * Deletes a folder or a directory marker depending on the service
+    *
+    * @param container
+    *           container to delete the directory from
+    * @param directory
+    *           full path to the directory to delete
+    */
+   void deleteDirectory(String containerName, String name);
+
+   /**
+    * Determines if a blob exists
+    *
+    * @param container
+    *           container where the blob resides
+    * @param directory
+    *           full path to the blob
+    */
+   boolean blobExists(String container, String name);
+
+
+   /**
+    * Deletes a {@code Blob} representing the data at location {@code container/name}
+    *
+    * @param container
+    *           container where this exists.
+    * @param name
+    *           fully qualified name relative to the container.
+    * @throws org.jclouds.blobstore.ContainerNotFoundException
+    *            if the container doesn't exist
+    */
+   void removeBlob(String container, String name);
+
+   /**
+    * @return a count of all blobs in the container, excluding directory markers
+    */
+   long countBlobs(String container);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/ContentMetadata.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/ContentMetadata.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/ContentMetadata.java
new file mode 100644
index 0000000..b3cbc00
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/ContentMetadata.java
@@ -0,0 +1,153 @@
+/*
+ * 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.blobstore.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import static org.jclouds.representations.Representations.dateFormat;
+
+
+public class ContentMetadata implements Serializable {
+
+   private static final long serialVersionUID = 4047812866269918734L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private Long length;
+      private String disposition;
+      private String encoding;
+      private String type;
+      private byte[] md5;
+      private String language;
+      private String expires;
+
+      public Builder length(final Long length) {
+         this.length = length;
+         return this;
+      }
+
+      public Builder disposition(final String disposition) {
+         this.disposition = disposition;
+         return this;
+      }
+
+      public Builder encoding(final String encoding) {
+         this.encoding = encoding;
+         return this;
+      }
+
+      public Builder type(final String type) {
+         this.type = type;
+         return this;
+      }
+
+      public Builder md5(final byte[] md5) {
+         this.md5 = md5;
+         return this;
+      }
+
+      public Builder language(final String language) {
+         this.language = language;
+         return this;
+      }
+
+      public Builder expires(final String expires) {
+         this.expires = expires;
+         return this;
+      }
+
+      public Builder expires(final Date expires) {
+         this.expires = dateFormat(expires);
+         return this;
+      }
+
+      public ContentMetadata build() {
+         return new ContentMetadata(length, disposition, encoding, type, md5, language, expires);
+      }
+   }
+
+   private final Long length;
+   private final String disposition;
+   private final String encoding;
+   private final String type;
+   private final byte[] md5;
+   private final String language;
+   private final String expires;
+
+   public ContentMetadata(Long length, String disposition, String encoding, String type, byte[] md5, String language, String expires) {
+      this.length = length;
+      this.disposition = disposition;
+      this.encoding = encoding;
+      this.type = type;
+      this.md5 = md5;
+      this.language = language;
+      this.expires = expires;
+   }
+
+   public Long getLength() {
+      return length;
+   }
+
+   public String getDisposition() {
+      return disposition;
+   }
+
+   public String getEncoding() {
+      return encoding;
+   }
+
+   public String getType() {
+      return type;
+   }
+
+   public byte[] getMd5() {
+      return md5;
+   }
+
+   public String getLanguage() {
+      return language;
+   }
+
+   public String getExpires() {
+      return expires;
+   }
+
+   public int hashCode() {
+      return Objects.hashCode(length, disposition, encoding, type, md5, language, expires);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("length", language).add("disposition", disposition).add("encoding", encoding)
+              .add("type", type).add("md5", md5).add("language", language)
+              .add("expires", expires).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/StorageMetadata.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/StorageMetadata.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/StorageMetadata.java
new file mode 100644
index 0000000..5045b96
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/blobstore/representations/StorageMetadata.java
@@ -0,0 +1,181 @@
+/*
+ * 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.blobstore.representations;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+
+import java.io.Serializable;
+import java.net.URI;
+import java.util.Date;
+import java.util.Map;
+
+import static org.jclouds.representations.Representations.dateFormat;
+
+public class StorageMetadata implements Serializable {
+
+   private static final long serialVersionUID = -162484731217251198L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String type;
+      private String providerId;
+      private String name;
+      private String uri;
+      private Map<String, String> userMetadata = ImmutableMap.of();
+      private String eTag;
+      private String creationDate;
+      private String lastModifiedDate;
+
+      public Builder type(final String type) {
+         this.type = type;
+         return this;
+      }
+
+      public Builder providerId(final String providerId) {
+         this.providerId = providerId;
+         return this;
+      }
+
+      public Builder name(final String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder uri(final URI uri) {
+         if (uri != null) {
+            this.uri = uri.toString();
+         }
+         return this;
+      }
+
+      public Builder uri(final String uri) {
+         this.uri = uri;
+         return this;
+      }
+
+      public Builder userMetadata(final Map<String, String> userMetadata) {
+         this.userMetadata = ImmutableMap.copyOf(userMetadata);
+         return this;
+      }
+
+      public Builder eTag(final String eTag) {
+         this.eTag = eTag;
+         return this;
+      }
+
+      public Builder creationDate(final Date creationDate) {
+         this.creationDate = dateFormat(creationDate);
+         return this;
+      }
+
+      public Builder creationDate(final String creationDate) {
+         this.creationDate = creationDate;
+         return this;
+      }
+
+      public Builder lastModifiedDate(final Date lastModifiedDate) {
+         this.lastModifiedDate = dateFormat(lastModifiedDate);
+         return this;
+      }
+
+      public Builder lastModifiedDate(final String lastModifiedDate) {
+         this.lastModifiedDate = lastModifiedDate;
+         return this;
+      }
+
+      public StorageMetadata build() {
+         return new StorageMetadata(type, providerId, name, uri, userMetadata, eTag, creationDate, lastModifiedDate);
+      }
+
+   }
+
+   private final String type;
+   private final String providerId;
+   private final String name;
+   private final String uri;
+   private final Map<String, String> userMetadata;
+   private final String eTag;
+   private final String creationDate;
+   private final String lastModifiedDate;
+
+   public StorageMetadata(String type, String providerId, String name, String uri, Map<String, String> userMetadata,
+                          String eTag, String creationDate, String lastModifiedDate) {
+      this.type = type;
+      this.providerId = providerId;
+      this.name = name;
+      this.uri = uri;
+      this.userMetadata = userMetadata;
+      this.eTag = eTag;
+      this.creationDate = creationDate;
+      this.lastModifiedDate = lastModifiedDate;
+   }
+
+   public String getType() {
+      return type;
+   }
+
+   public String getProviderId() {
+      return providerId;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getUri() {
+      return uri;
+   }
+
+   public Map<String, String> getUserMetadata() {
+      return userMetadata;
+   }
+
+   public String geteTag() {
+      return eTag;
+   }
+
+   public String getCreationDate() {
+      return creationDate;
+   }
+
+   public String getLastModifiedDate() {
+      return lastModifiedDate;
+   }
+
+   public int hashCode() {
+      return Objects.hashCode(uri);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("type", type).add("providerId", providerId).add("name", name)
+              .add("userMetadata", userMetadata).add("eTag", eTag).add("creationDate", creationDate)
+              .add("lastModifiedDate", lastModifiedDate).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ComputeService.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ComputeService.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ComputeService.java
new file mode 100644
index 0000000..b77d475
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ComputeService.java
@@ -0,0 +1,123 @@
+/*
+ * 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.compute.representations;
+
+import org.jclouds.representations.Location;
+
+import java.util.Set;
+
+public interface ComputeService {
+   /**
+    * The list hardware profiles command shows you the options including virtual cpu count, memory,
+    * and disks. cpu count is not a portable quantity across clouds, as they are measured
+    * differently. However, it is a good indicator of relative speed within a cloud. memory is
+    * measured in megabytes and disks in gigabytes.
+    * <p/>
+    * <h3>note</h3>
+    * <p/>
+    * This is a cached collection
+    */
+   Set<Hardware> listHardwareProfiles();
+
+   /**
+    * Images define the operating system and metadata related to a node. In some clouds, Images are
+    * bound to a specific region, and their identifiers are different across these regions. For this
+    * reason, you should consider matching image requirements like operating system family with
+    * TemplateBuilder as opposed to choosing an image explicitly.
+    * <p/>
+    * <h3>note</h3>
+    * <p/>
+    * This is a cached collection
+    */
+   Set<Image> listImages();
+
+
+   /**
+    * all nodes available to the current user by id. If possible, the returned set will include
+    * {@link NodeMetadata} objects.
+    */
+   Set<NodeMetadata> listNodes();
+
+   /**
+    * The list locations command returns all the valid locations for nodes. A location has a scope,
+    * which is typically region or zone. A region is a general area, like eu-west, where a zone is
+    * similar to a datacenter. If a location has a parent, that implies it is within that location.
+    * For example a location can be a rack, whose parent is likely to be a zone.
+    * <p/>
+    * <h3>note</h3>
+    * <p/>
+    * This is a cached collection
+    */
+   Set<Location> listAssignableLocations();
+
+   /**
+    * Find an image by its id.
+    * <p/>
+    * <h3>note</h3>
+    * <p/>
+    * This is an uncached call to the backend service
+    */
+   Image getImage(String id);
+
+   /**
+    * Find a node by its id.
+    */
+   NodeMetadata getNode(String id);
+
+
+   /**
+    * @see #runScriptOnNode(String, String)
+    */
+   ExecResponse runScriptOnNode(String id, String runScript);
+
+
+   /**
+    * resume the node from suspended state,
+    * given its id.
+    *
+    * <h4>note</h4>
+    *
+    * affected nodes may not resume with the same IP address(es)
+    */
+   void resumeNode(String id);
+
+   /**
+    * suspend the node, given its id. This will result in suspended state.
+    *
+    * <h4>note</h4>
+    *
+    * affected nodes may not resume with the same IP address(es)
+    *
+    * @throws UnsupportedOperationException
+    *            if the underlying provider doesn't support suspend/resume
+    */
+   void suspendNode(String id);
+
+
+   /**
+    * destroy the node, given its id. If it is the only node in a tag set, the dependent resources
+    * will also be destroyed.
+    */
+   void destroyNode(String id);
+
+
+   /**
+    * reboot the node, given its id.
+    */
+   void rebootNode(String id);
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ExecResponse.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ExecResponse.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ExecResponse.java
new file mode 100644
index 0000000..fd74de4
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/ExecResponse.java
@@ -0,0 +1,95 @@
+/*
+ * 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.compute.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+
+public class ExecResponse implements Serializable {
+
+   private static final long serialVersionUID = -3552310550261335525L;
+
+   private final java.lang.String output;
+   private final java.lang.String error;
+   private final int exitStatus;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private java.lang.String output;
+      private java.lang.String error;
+      private int exitStatus;
+
+      public Builder output(final String output) {
+         this.output = output;
+         return this;
+      }
+
+      public Builder error(final String error) {
+         this.error = error;
+         return this;
+      }
+
+      public Builder exitStatus(final int exitStatus) {
+         this.exitStatus = exitStatus;
+         return this;
+      }
+
+      public ExecResponse build() {
+         return new ExecResponse(output, error, exitStatus);
+      }
+   }
+
+   public ExecResponse(String output, String error, int exitStatus) {
+      this.output = output;
+      this.error = error;
+      this.exitStatus = exitStatus;
+   }
+
+   public String getOutput() {
+      return output;
+   }
+
+   public String getError() {
+      return error;
+   }
+
+   public int getExitStatus() {
+      return exitStatus;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(output, error, exitStatus);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("out", output).add("error", error).add("exitStatus", exitStatus).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Hardware.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Hardware.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Hardware.java
new file mode 100644
index 0000000..ff01481
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Hardware.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.compute.representations;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+public class Hardware implements Serializable {
+
+   private static final long serialVersionUID = -5052972144323758255L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String id;
+      private String name;
+      private Set<String> tags = ImmutableSet.of();
+      private List<Processor> processors = ImmutableList.of();
+      private int ram;
+      private List<Volume> volumes = ImmutableList.of();
+      private String hypervisor;
+
+      public Builder id(final String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(final String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder tags(final Set<String> tags) {
+         this.tags = ImmutableSet.copyOf(tags);
+         return this;
+      }
+
+      public Builder processors(final List<Processor> processors) {
+         this.processors = ImmutableList.copyOf(processors);
+         return this;
+      }
+
+      public Builder ram(final int ram) {
+         this.ram = ram;
+         return this;
+      }
+
+      public Builder volumes(final List<Volume> volumes) {
+         this.volumes = ImmutableList.copyOf(volumes);
+         return this;
+      }
+
+      public Builder hypervisor(final String hypervisor) {
+         this.hypervisor = hypervisor;
+         return this;
+      }
+
+      public Hardware build() {
+         return new Hardware(id, name, tags, processors, ram, volumes, hypervisor);
+      }
+   }
+
+   private final String id;
+   private final String name;
+   private final Set<String> tags;
+   private final List<Processor> processors;
+   private final int ram;
+   private final List<Volume> volumes;
+   private final String hypervisor;
+
+
+   public Hardware(String id, String name, Set<String> tags, List<Processor> processors, int ram, List<Volume> volumes, String hypervisor) {
+      this.id = id;
+      this.name = name;
+      this.tags = tags;
+      this.processors = processors;
+      this.ram = ram;
+      this.volumes = volumes;
+      this.hypervisor = hypervisor;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public Set<String> getTags() {
+      return tags;
+   }
+
+   public List<Processor> getProcessors() {
+      return processors;
+   }
+
+   public int getRam() {
+      return ram;
+   }
+
+   public List<Volume> getVolumes() {
+      return volumes;
+   }
+
+   public String getHypervisor() {
+      return hypervisor;
+   }
+
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("id", id).add("name", name)
+              .add("processors", processors).add("ram", ram).add("volums", volumes).add("hypervisor", hypervisor)
+              .toString();
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Image.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Image.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Image.java
new file mode 100644
index 0000000..d371a94
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Image.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.compute.representations;
+
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+
+import java.io.Serializable;
+import java.util.Set;
+
+public class Image implements Serializable {
+
+   private static final long serialVersionUID = 1332541821219215234L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String id;
+      private String name;
+      private String status;
+      private String version;
+      private String description;
+      private OperatingSystem operatingSystem;
+      private LoginCredentials defaultCredentials;
+      private Set<String> tags = ImmutableSet.of();
+
+      public Builder id(final String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(final String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder status(final String status) {
+         this.status = status;
+         return this;
+      }
+
+      public Builder tags(final Set<String> tags) {
+         this.tags = ImmutableSet.copyOf(tags);
+         return this;
+      }
+
+      public Builder operatingSystem(final OperatingSystem operatingSystem) {
+         this.operatingSystem = operatingSystem;
+         return this;
+      }
+
+      public Builder version(final String version) {
+         this.version = version;
+         return this;
+      }
+
+      public Builder description(final String description) {
+         this.description = description;
+         return this;
+      }
+
+      public Builder defaultCredentials(final LoginCredentials defaultCredentials) {
+         this.defaultCredentials = defaultCredentials;
+         return this;
+      }
+
+      public Image build() {
+         return new Image(id, name, version, description, status, operatingSystem, defaultCredentials, tags);
+      }
+
+   }
+
+   private final String id;
+   private final String name;
+   private final String version;
+   private final String description;
+   private final String status;
+   private final OperatingSystem operatingSystem;
+   private final LoginCredentials defaultCredentials;
+   private final Set<String> tags;
+
+   public Image(String id, String name, String version, String description, String status, OperatingSystem operatingSystem, LoginCredentials defaultCredentials, Set<String> tags) {
+      this.id = id;
+      this.name = name;
+      this.version = version;
+      this.description = description;
+      this.status = status;
+      this.operatingSystem = operatingSystem;
+      this.defaultCredentials = defaultCredentials;
+      this.tags = tags;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getStatus() {
+      return status;
+   }
+
+   public Set<String> getTags() {
+      return tags;
+   }
+
+   public OperatingSystem getOperatingSystem() {
+      return operatingSystem;
+   }
+
+   public String getVersion() {
+      return version;
+   }
+
+   public String getDescription() {
+      return description;
+   }
+
+   public LoginCredentials getDefaultCredentials() {
+      return defaultCredentials;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("id", id).add("name", name).add("status", status)
+              .add("description", description)
+              .add("tags", tags).add("os", operatingSystem).add("version", version)
+              .add("defaultCredentials", defaultCredentials).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/LoginCredentials.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/LoginCredentials.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/LoginCredentials.java
new file mode 100644
index 0000000..6437809
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/LoginCredentials.java
@@ -0,0 +1,129 @@
+/*
+ * 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.compute.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+import java.net.URI;
+
+public class LoginCredentials implements Serializable {
+
+   private static final long serialVersionUID = -4665781183795990721L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String username;
+      private String password;
+      private String privateKey;
+      private String credentialUrl;
+      private boolean authenticateSudo;
+
+      public Builder username(final String username) {
+         this.username = username;
+         return this;
+      }
+
+      public Builder password(final String password) {
+         this.password = password;
+         return this;
+      }
+
+      public Builder privateKey(final String privateKey) {
+         this.privateKey = privateKey;
+         return this;
+      }
+
+      public Builder credentialUrl(final URI credentialUrl) {
+         if (credentialUrl != null) {
+            this.credentialUrl = credentialUrl.toString();
+         }
+         return this;
+      }
+
+      public Builder credentialUrl(final String credentialUrl) {
+         this.credentialUrl = credentialUrl;
+         return this;
+      }
+
+      public Builder authenticateSudo(final boolean authenticateSudo) {
+         this.authenticateSudo = authenticateSudo;
+         return this;
+      }
+
+      public LoginCredentials build() {
+         return new LoginCredentials(username, password, privateKey, credentialUrl, authenticateSudo);
+      }
+
+   }
+
+   private final String username;
+   private final String password;
+   private final String privateKey;
+   private final String credentialUrl;
+   private final boolean authenticateSudo;
+
+   public LoginCredentials(String username, String password, String privateKey, String credentialUrl, boolean authenticateSudo) {
+      this.username = username;
+      this.password = password;
+      this.privateKey = privateKey;
+      this.credentialUrl = credentialUrl;
+      this.authenticateSudo = authenticateSudo;
+   }
+
+   public String getUsername() {
+      return username;
+   }
+
+   public String getPassword() {
+      return password;
+   }
+
+   public String getCredentialUrl() {
+      return credentialUrl;
+   }
+
+   public boolean isAuthenticatedSudo() {
+      return authenticateSudo;
+   }
+
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(username, password, credentialUrl, authenticateSudo);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this)
+              .add("username", username)
+              .add("hasPassword", password != null || credentialUrl != null)
+              .add("hasPrivateKey", privateKey != null)
+              .add("hasSudoPassword", authenticateSudo).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/NodeMetadata.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/NodeMetadata.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/NodeMetadata.java
new file mode 100644
index 0000000..6667f72
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/NodeMetadata.java
@@ -0,0 +1,224 @@
+/*
+ * 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.compute.representations;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Adrian Cole
+ */
+public class NodeMetadata implements Serializable {
+
+   private static final long serialVersionUID = 948372788993429243L;
+
+   private static final int DEFAULT_SSH_PORT = 22;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String id;
+      private String name;
+      private String description;
+      private String status;
+      private String hostname;
+      private String imageId;
+      private String locationId;
+      private int loginPort = DEFAULT_SSH_PORT;
+      private String group;
+      private Set<String> tags = ImmutableSet.of();
+      private Map<String, String> metadata = ImmutableMap.<String, String>of();
+      private LoginCredentials defaultCredentials;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder description(String description) {
+         this.description = description;
+         return this;
+      }
+
+      public Builder hostname(String hostname) {
+         this.hostname = hostname;
+         return this;
+      }
+
+      public Builder status(final String status) {
+         this.status = status;
+         return this;
+      }
+
+
+      public Builder loginPort(int loginPort) {
+         this.loginPort = loginPort;
+         return this;
+      }
+
+      public Builder locationId(String locationId) {
+         this.locationId = locationId;
+         return this;
+      }
+
+      public Builder imageId(final String imageId) {
+         this.imageId = imageId;
+         return this;
+      }
+
+      public Builder group(String group) {
+         this.group = group;
+         return this;
+      }
+
+      public Builder tags(Iterable<String> tags) {
+         this.tags = ImmutableSet.copyOf(tags);
+         return this;
+      }
+
+      public Builder metadata(Map<String, String> metadata) {
+         this.metadata = ImmutableMap.copyOf(metadata);
+         return this;
+      }
+
+      public Builder defaultCredentials(final LoginCredentials defaultCredentials) {
+         this.defaultCredentials = defaultCredentials;
+         return this;
+      }
+
+      public NodeMetadata build() {
+         return new NodeMetadata(id, name, description, status, hostname, locationId, imageId, loginPort, group, tags,
+                 metadata, defaultCredentials);
+      }
+   }
+
+   public NodeMetadata(String id, String name, String description, String status, String hostname, String locationId,
+                       String imageId, int loginPort, String group, Set<String> tags,
+                       Map<String, String> metadata, LoginCredentials defaultCredentials) {
+      this.id = id;
+      this.name = name;
+      this.description = description;
+      this.status = status;
+      this.hostname = hostname;
+      this.locationId = locationId;
+      this.imageId = imageId;
+      this.loginPort = loginPort;
+      this.group = group;
+      this.tags = tags;
+      this.metadata = metadata;
+      this.defaultCredentials = defaultCredentials;
+   }
+
+   private final String id;
+   private final String name;
+   private final String description;
+   private final String status;
+   private final String hostname;
+   private final String locationId;
+   private final String imageId;
+   private final int loginPort;
+   private final String group;
+   private final Set<String> tags;
+   private final Map<String, String> metadata;
+   private final LoginCredentials defaultCredentials;
+
+   public String getId() {
+      return id;
+   }
+
+   public String getLocationId() {
+      return locationId;
+   }
+
+   public String getImageId() {
+      return imageId;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getDescription() {
+      return description;
+   }
+
+   public String getGroup() {
+      return group;
+   }
+
+   public String getHostname() {
+      return hostname;
+   }
+
+   public String getStatus() {
+      return status;
+   }
+
+   public int getLoginPort() {
+      return loginPort;
+   }
+
+   public Set<String> getTags() {
+      Set<String> tagSet = Sets.newHashSet();
+      for (String tag : tags) {
+         tagSet.add(tag);
+      }
+      return tagSet;
+   }
+
+   public Map<String, String> getMetadata() {
+      return Maps.newLinkedHashMap(this.metadata);
+   }
+
+   public LoginCredentials getDefaultCredentials() {
+      return defaultCredentials;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("id", id).add("name", name).add("description", description).add("status", status)
+              .add("locationId", locationId).add("imageId", imageId).add("hostname", hostname)
+              .add("group", group).add("loginPort", loginPort).add("tags", tags).add("metadata", metadata)
+              .add("defaultCredentials", defaultCredentials).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/OperatingSystem.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/OperatingSystem.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/OperatingSystem.java
new file mode 100644
index 0000000..4425d81
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/OperatingSystem.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.compute.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+
+public class OperatingSystem implements Serializable {
+
+   private static final long serialVersionUID = 5789055455232061970L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String family;
+      private String name;
+      private String arch;
+      private String version;
+      private String description;
+      private boolean is64Bit;
+
+      public Builder family(final String family) {
+         this.family = family;
+         return this;
+      }
+
+      public Builder name(final String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder arch(final String arch) {
+         this.arch = arch;
+         return this;
+      }
+
+      public Builder version(final String version) {
+         this.version = version;
+         return this;
+      }
+
+      public Builder description(final String description) {
+         this.description = description;
+         return this;
+      }
+
+      public Builder is64Bit(final boolean is64Bit) {
+         this.is64Bit = is64Bit;
+         return this;
+      }
+
+      public OperatingSystem build() {
+         return new OperatingSystem(family, name, arch, version, description, is64Bit);
+      }
+   }
+
+   private final String family;
+   private final String name;
+   private final String arch;
+   private final String version;
+   private final String description;
+   private final boolean is64Bit;
+
+
+   public OperatingSystem(String family, String name, String arch, String version, String description, boolean is64Bit) {
+      this.family = family;
+      this.name = name;
+      this.arch = arch;
+      this.version = version;
+      this.description = description;
+      this.is64Bit = is64Bit;
+   }
+
+   public String getFamily() {
+      return family;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getArch() {
+      return arch;
+   }
+
+   public String getVersion() {
+      return version;
+   }
+
+   public String getDescription() {
+      return description;
+   }
+
+   public boolean isIs64Bit() {
+      return is64Bit;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(family, version, arch, is64Bit);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("family", family).add("name", name).add("arch", arch)
+              .add("version", version).add("description", description).add("is64bit", is64Bit).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Processor.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Processor.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Processor.java
new file mode 100644
index 0000000..3eef1ad
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Processor.java
@@ -0,0 +1,84 @@
+/*
+ * 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.compute.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+
+public class Processor implements Serializable {
+
+   private static final long serialVersionUID = -2621055948006358603L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private double cores;
+      private double speed;
+
+      public Builder cores(final double cores) {
+         this.cores = cores;
+         return this;
+      }
+
+      public Builder speed(final double speed) {
+         this.speed = speed;
+         return this;
+      }
+
+      public Processor build() {
+         return new Processor(cores, speed);
+      }
+
+   }
+
+   private final double cores;
+   private final double speed;
+
+   public Processor(double cores, double speed) {
+      this.cores = cores;
+      this.speed = speed;
+   }
+
+   public double getCores() {
+      return cores;
+   }
+
+   public double getSpeed() {
+      return speed;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(cores, speed);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("cores", cores).add("spped", speed).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Volume.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Volume.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Volume.java
new file mode 100644
index 0000000..018e3ac
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/compute/representations/Volume.java
@@ -0,0 +1,134 @@
+/*
+ * 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.compute.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+
+public class Volume implements Serializable {
+
+   private static final long serialVersionUID = -4171587668537155633L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String id;
+      private String type;
+      private Float size;
+      private String device;
+      private boolean durable;
+      private boolean bootDevice;
+
+      public Builder id(final String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder type(final String type) {
+         this.type = type;
+         return this;
+      }
+
+      public Builder size(final Float size) {
+         this.size = size;
+         return this;
+      }
+
+      public Builder device(final String device) {
+         this.device = device;
+         return this;
+      }
+
+      public Builder durable(final boolean durable) {
+         this.durable = durable;
+         return this;
+      }
+
+      public Builder bootDevice(final boolean bootDevice) {
+         this.bootDevice = bootDevice;
+         return this;
+      }
+
+      public Volume build() {
+         return new Volume(id, type, size, device, durable, bootDevice);
+      }
+
+   }
+
+   private final String id;
+   private final String type;
+   private final Float size;
+   private final String device;
+   private final boolean durable;
+   private final boolean bootDevice;
+
+   public Volume(String id, String type, Float size, String device, boolean durable, boolean bootDevice) {
+      this.id = id;
+      this.type = type;
+      this.size = size;
+      this.device = device;
+      this.durable = durable;
+      this.bootDevice = bootDevice;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public String getType() {
+      return type;
+   }
+
+   public Float getSize() {
+      return size;
+   }
+
+   public String getDevice() {
+      return device;
+   }
+
+   public boolean isDurable() {
+      return durable;
+   }
+
+   public boolean isBootDevice() {
+      return bootDevice;
+   }
+
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("id", id).add("type", type).add("size", size)
+              .add("device", device).add("isDurable", durable).add("bootDevice", bootDevice).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/ApiMetadata.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/ApiMetadata.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/ApiMetadata.java
new file mode 100644
index 0000000..1f3d278
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/ApiMetadata.java
@@ -0,0 +1,257 @@
+/*
+ * 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.representations;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+
+import java.io.Serializable;
+import java.net.URI;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+public class ApiMetadata implements Serializable {
+
+   private static final long serialVersionUID = 3475663463134958705L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String id;
+      private String name;
+      private String endpointName;
+      private String identityName;
+      private String credentialName;
+      private String version;
+      private String defaultEndpoint;
+      private String defaultIdentity;
+      private String defaultCredential;
+      private Map<String, String> defaultProperties = ImmutableMap.of();
+      private Set<String> defaultModules = ImmutableSet.of();
+      private String documentation;
+      private String context;
+      private Set<String> views = ImmutableSet.of();
+
+      public Builder id(final String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(final String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder endpointName(final String endpointName) {
+         this.endpointName = endpointName;
+         return this;
+      }
+
+      public Builder identityName(final String identityName) {
+         this.identityName = identityName;
+         return this;
+      }
+
+      public Builder credentialName(final String credentialName) {
+         this.credentialName = credentialName;
+         return this;
+      }
+
+      public Builder version(final String version) {
+         this.version = version;
+         return this;
+      }
+
+      public Builder defaultEndpoint(final String defaultEndpoint) {
+         this.defaultEndpoint = defaultEndpoint;
+         return this;
+      }
+
+      public Builder defaultIdentity(final String defaultIdentity) {
+         this.defaultIdentity = defaultIdentity;
+         return this;
+      }
+
+      public Builder defaultCredential(final String defaultCredential) {
+         this.defaultCredential = defaultCredential;
+         return this;
+      }
+
+      public Builder defaultProperties(final Properties defaultProperties) {
+         if (defaultProperties != null) {
+            this.defaultProperties = Maps.fromProperties(defaultProperties);
+         }
+         return this;
+      }
+
+      public Builder defaultProperties(final Map<String, String> defaultProperties) {
+         this.defaultProperties = defaultProperties;
+         return this;
+      }
+
+      public Builder defaultModules(final Set<String> defaultModules) {
+         this.defaultModules = defaultModules;
+         return this;
+      }
+
+      public Builder documentation(final URI documentation) {
+         if (documentation != null) {
+            this.documentation = documentation.toString();
+         }
+         return this;
+      }
+
+      public Builder documentation(final String documentation) {
+         this.documentation = documentation;
+         return this;
+      }
+
+      public Builder context(final String context) {
+         this.context = context;
+         return this;
+      }
+
+      public Builder views(final Set<String> views) {
+         this.views = ImmutableSet.copyOf(views);
+         return this;
+      }
+
+      public ApiMetadata build() {
+         return new ApiMetadata(id, name, endpointName, identityName, credentialName, version, defaultEndpoint,
+                 defaultIdentity, defaultCredential, defaultProperties, defaultModules, documentation, context, views);
+      }
+   }
+
+   private final String id;
+   private final String name;
+   private final String endpointName;
+   private final String identityName;
+   private final String credentialName;
+   private final String version;
+   private final String defaultEndpoint;
+   private final String defaultIdentity;
+   private final String defaultCredential;
+   private final Map<String, String> defaultProperties;
+   private final Set<String> defaultModules;
+   private final String documentation;
+   private final String context;
+   private final Set<String> views;
+
+   public ApiMetadata(String id, String name, String endpointName, String identityName, String credentialName, String version,
+                      String defaultEndpoint, String defaultIdentity, String defaultCredential,
+                      Map<String, String> defaultProperties, Set<String> defaultModules, String documentation, String context,
+                      Set<String> views) {
+
+      this.id = id;
+      this.name = name;
+      this.endpointName = endpointName;
+      this.identityName = identityName;
+      this.credentialName = credentialName;
+      this.version = version;
+      this.defaultEndpoint = defaultEndpoint;
+      this.defaultIdentity = defaultIdentity;
+      this.defaultCredential = defaultCredential;
+      this.defaultProperties = defaultProperties;
+      this.defaultModules = defaultModules;
+      this.documentation = documentation;
+      this.context = context;
+      this.views = views;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getEndpointName() {
+      return endpointName;
+   }
+
+   public String getIdentityName() {
+      return identityName;
+   }
+
+   public String getCredentialName() {
+      return credentialName;
+   }
+
+   public String getVersion() {
+      return version;
+   }
+
+   public String getDefaultEndpoint() {
+      return defaultEndpoint;
+   }
+
+   public String getDefaultIdentity() {
+      return defaultIdentity;
+   }
+
+   public String getDefaultCredential() {
+      return defaultCredential;
+   }
+
+   public Map<String, String> getDefaultProperties() {
+      return defaultProperties;
+   }
+
+   public Set<String> getDefaultModules() {
+      return defaultModules;
+   }
+
+   public String getDocumentation() {
+      return documentation;
+   }
+
+   public String getContext() {
+      return context;
+   }
+
+   public Set<String> getViews() {
+      return views;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("id", id).add("name", name).add("endpointName", endpointName)
+              .add("identityName", identityName).add("credentialName", credentialName).add("version", version)
+              .add("defaultEndpoint", defaultEndpoint).add("defaultIdentity", defaultIdentity)
+              .add("defaultCredential", defaultCredential).add("defaultProperties", defaultProperties).add("defaultModules", defaultModules)
+              .add("documentation", documentation).add("context", context).add("views", views).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Context.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Context.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Context.java
new file mode 100644
index 0000000..187c26c
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Context.java
@@ -0,0 +1,96 @@
+/*
+ * 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.representations;
+
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+
+public class Context implements Serializable {
+
+   private static final long serialVersionUID = -6490025246295140657L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String name;
+      private String providerId;
+      private String identity;
+
+      public Builder name(final String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder providerId(final String providerId) {
+         this.providerId = providerId;
+         return this;
+      }
+
+      public Builder identity(final String identity) {
+         this.identity = identity;
+         return this;
+      }
+
+      public Context build() {
+         return new Context(name, providerId, identity);
+      }
+   }
+
+   private final String name;
+   private final String providerId;
+   private final String identity;
+
+
+   public Context(String name, String providerId, String identity) {
+      this.name = name;
+      this.providerId = providerId;
+      this.identity = identity;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getProviderId() {
+      return providerId;
+   }
+
+   public String getIdentity() {
+      return identity;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(name);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("name", name).add("providerId", providerId).add("identity", identity).toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/7cac0ef1/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Location.java
----------------------------------------------------------------------
diff --git a/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Location.java b/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Location.java
new file mode 100644
index 0000000..6f488ff
--- /dev/null
+++ b/jclouds-representations/representations-core/src/main/java/org/jclouds/representations/Location.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.representations;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.Set;
+
+public class Location implements Serializable {
+
+   private static final long serialVersionUID = -3061687522880229207L;
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String id;
+      private String scope;
+      private String description;
+      private String parentId;
+      private Set<String> iso3166Codes = ImmutableSet.of();
+
+      public Builder id(final String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder scope(final String scope) {
+         this.scope = scope;
+         return this;
+      }
+
+      public Builder description(final String description) {
+         this.description = description;
+         return this;
+      }
+
+      public Builder parentId(final String parentId) {
+         this.parentId = parentId;
+         return this;
+      }
+
+      public Builder iso3166Codes(final Set<String> iso3166Codes) {
+         this.iso3166Codes = ImmutableSet.copyOf(iso3166Codes);
+         return this;
+      }
+
+      public Location build() {
+         return new Location(id, scope, description, parentId, iso3166Codes);
+      }
+
+   }
+
+   private final String id;
+   private final String scope;
+   private final String description;
+   private final String parentId;
+   private final Set<String> iso3166Codes;
+
+
+   private Location(String id, String scope, String description, String parentId, Set<String> iso3166Codes) {
+      this.id = id;
+      this.scope = scope;
+      this.description = description;
+      this.parentId = parentId;
+      this.iso3166Codes = iso3166Codes;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public String getScope() {
+      return scope;
+   }
+
+   public String getDescription() {
+      return description;
+   }
+
+   public String getParentId() {
+      return parentId;
+   }
+
+   public Set<String> getIso3166Codes() {
+      return iso3166Codes;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id);
+   }
+
+   @Override
+   public boolean equals(Object that) {
+      if (that == null)
+         return false;
+      return Objects.equal(this.toString(), that.toString());
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).add("id", id).add("scope", scope).add("description", description)
+              .add("perentId", parentId).add("iso3166Codes", iso3166Codes).toString();
+   }
+}