diff --git a/.gitignore b/.gitignore
index 3eaf4eebb..5a3aac784 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
.classpath
.project
.settings/
+*.json
target/
bin/logs/
@@ -17,4 +18,4 @@ openstack-ui/src/main/webapp/WEB-INF/lib/
openstack-ui/.gwt/
openstack-ui/deploy.sh
test-output/
-bin
\ No newline at end of file
+bin
diff --git a/glance-model/src/main/java/org/openstack/glance/model/Image.java b/glance-model/src/main/java/org/openstack/glance/model/Image.java
index a05f1f0de..1915f0935 100644
--- a/glance-model/src/main/java/org/openstack/glance/model/Image.java
+++ b/glance-model/src/main/java/org/openstack/glance/model/Image.java
@@ -10,7 +10,6 @@
@JsonRootName("image")
public class Image implements Serializable {
-
private String id;
private String uri;
diff --git a/heat-client/pom.xml b/heat-client/pom.xml
new file mode 100644
index 000000000..fd04b7c5f
--- /dev/null
+++ b/heat-client/pom.xml
@@ -0,0 +1,24 @@
+
+ 4.0.0
+
+ org.openstack
+ openstack-java-sdk
+ 2.0.0-SNAPSHOT
+
+ heat-client
+ OpenStack Heat Client
+ OpenStack Heat Client
+
+
+ org.openstack
+ openstack-client
+ 2.0.0-SNAPSHOT
+
+
+ org.openstack
+ heat-model
+ 2.0.0-SNAPSHOT
+
+
+
\ No newline at end of file
diff --git a/heat-client/src/main/java/org/openstack/heat/client/HeatClient.java b/heat-client/src/main/java/org/openstack/heat/client/HeatClient.java
new file mode 100644
index 000000000..fd67ba3d6
--- /dev/null
+++ b/heat-client/src/main/java/org/openstack/heat/client/HeatClient.java
@@ -0,0 +1,21 @@
+package org.openstack.heat.client;
+
+import javax.ws.rs.client.WebTarget;
+
+import org.openstack.OpenStack;
+import org.openstack.common.client.AbstractOpenStackClient;
+
+public class HeatClient extends AbstractOpenStackClient{
+
+ public HeatClient(String endpointURL, String token) {
+ super(endpointURL, token);
+ }
+
+ public R execute(HeatCommand command) {
+ WebTarget endpoint = OpenStack.CLIENT.target(endpointURL);
+ if(token != null) {
+ endpoint.register(tokenFilter);
+ }
+ return command.execute(endpoint);
+ }
+}
diff --git a/heat-client/src/main/java/org/openstack/heat/client/HeatCommand.java b/heat-client/src/main/java/org/openstack/heat/client/HeatCommand.java
new file mode 100644
index 000000000..928fa6619
--- /dev/null
+++ b/heat-client/src/main/java/org/openstack/heat/client/HeatCommand.java
@@ -0,0 +1,8 @@
+package org.openstack.heat.client;
+
+import javax.ws.rs.client.WebTarget;
+
+public interface HeatCommand{
+
+ R execute(WebTarget endpoint);
+}
diff --git a/heat-client/src/main/java/org/openstack/heat/client/HeatResourcesPath.java b/heat-client/src/main/java/org/openstack/heat/client/HeatResourcesPath.java
new file mode 100644
index 000000000..a4fbc3b69
--- /dev/null
+++ b/heat-client/src/main/java/org/openstack/heat/client/HeatResourcesPath.java
@@ -0,0 +1,7 @@
+package org.openstack.heat.client;
+
+public interface HeatResourcesPath {
+ String stackPath = "stacks";
+ String resourcePath = "resources";
+ String eventPath = "events";
+}
diff --git a/heat-client/src/main/java/org/openstack/heat/client/api/EventsCore.java b/heat-client/src/main/java/org/openstack/heat/client/api/EventsCore.java
new file mode 100644
index 000000000..9de73a0e1
--- /dev/null
+++ b/heat-client/src/main/java/org/openstack/heat/client/api/EventsCore.java
@@ -0,0 +1,88 @@
+package org.openstack.heat.client.api;
+
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+
+import org.openstack.heat.client.HeatCommand;
+import org.openstack.heat.client.HeatResourcesPath;
+import org.openstack.heat.model.Event;
+import org.openstack.heat.model.Events;
+
+public class EventsCore {
+
+ private static class ListStackEvents implements HeatCommand{
+ private String stackID;
+ private String stackName;
+
+ public ListStackEvents(String stackID, String stackName) {
+ super();
+ this.stackID = stackID;
+ this.stackName = stackName;
+ }
+
+ @Override
+ public Events execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).path(stackName).path(stackID).path(HeatResourcesPath.eventPath)
+ .request(MediaType.APPLICATION_JSON).get(Events.class);
+ }
+
+ }
+
+ private static class ListResourceEvents implements HeatCommand{
+ private String stackID;
+ private String stackName;
+ private String resourceName;
+
+ public ListResourceEvents(String stackID, String stackName,
+ String resourceName) {
+ super();
+ this.stackID = stackID;
+ this.stackName = stackName;
+ this.resourceName = resourceName;
+ }
+
+ @Override
+ public Events execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).path(stackName).path(stackID).
+ path(HeatResourcesPath.resourcePath).path(resourceName).path(HeatResourcesPath.eventPath)
+ .request(MediaType.APPLICATION_JSON).get(Events.class);
+ }
+
+ }
+
+ private static class ShowEvent implements HeatCommand{
+ private String stackID;
+ private String stackName;
+ private String resourceName;
+ private String eventID;
+
+ public ShowEvent(String stackID, String stackName,
+ String resourceName, String eventID) {
+ super();
+ this.stackID = stackID;
+ this.stackName = stackName;
+ this.resourceName = resourceName;
+ this.eventID = eventID;
+ }
+
+ @Override
+ public Event execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).path(stackName).path(stackID).
+ path(HeatResourcesPath.resourcePath).path(resourceName).
+ path(HeatResourcesPath.eventPath).path(eventID)
+ .request(MediaType.APPLICATION_JSON).get(Event.class);
+ }
+ }
+
+ public static HeatCommand listStackEvents(String stackID, String stackName){
+ return new ListStackEvents(stackID, stackName);
+ }
+
+ public static HeatCommand listResourceEvents(String stackID, String stackName, String resourceName){
+ return new ListResourceEvents(stackID, stackName ,resourceName);
+ }
+
+ public static HeatCommand showEvent(String stackID, String stackName, String resourceName, String eventID){
+ return new ShowEvent(stackID, stackName ,resourceName, eventID);
+ }
+}
diff --git a/heat-client/src/main/java/org/openstack/heat/client/api/ResourcesCore.java b/heat-client/src/main/java/org/openstack/heat/client/api/ResourcesCore.java
new file mode 100644
index 000000000..1e75959e4
--- /dev/null
+++ b/heat-client/src/main/java/org/openstack/heat/client/api/ResourcesCore.java
@@ -0,0 +1,51 @@
+package org.openstack.heat.client.api;
+
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+
+import org.openstack.heat.client.HeatCommand;
+import org.openstack.heat.model.Resource;
+import org.openstack.heat.model.Resources;
+
+public class ResourcesCore {
+ private static final String stackPath = "stacks";
+ private static final String resourcePath = "resources";
+
+ private static class ListResources implements HeatCommand{
+ private String stackID;
+
+ public ListResources(String stackID){
+ this.stackID = stackID;
+ }
+ @Override
+ public Resources execute(WebTarget endpoint) {
+ return endpoint.path(stackPath).path(stackID).path(resourcePath)
+ .request(MediaType.APPLICATION_JSON).get(Resources.class);
+ }
+ }
+
+ private static class ShowResource implements HeatCommand{
+ private String stackID;
+ private String stackName;
+ private String resourceName;
+
+ public ShowResource(String stackID ,String stackName, String resourceName){
+ this.stackID = stackID;
+ this.stackName = stackName;
+ this.resourceName = resourceName;
+ }
+ @Override
+ public Resource execute(WebTarget endpoint) {
+ return endpoint.path(stackPath).path(stackName).path(stackID).path(resourcePath).path(resourceName)
+ .request(MediaType.APPLICATION_JSON).get(Resource.class);
+ }
+ }
+
+ public static HeatCommand listResources(String stackID){
+ return new ListResources(stackID);
+ }
+
+ public static HeatCommand showResource(String stackID , String stackName, String resourceName){
+ return new ShowResource(stackID, stackName, resourceName);
+ }
+}
diff --git a/heat-client/src/main/java/org/openstack/heat/client/api/StacksCore.java b/heat-client/src/main/java/org/openstack/heat/client/api/StacksCore.java
new file mode 100644
index 000000000..e630a2d81
--- /dev/null
+++ b/heat-client/src/main/java/org/openstack/heat/client/api/StacksCore.java
@@ -0,0 +1,112 @@
+package org.openstack.heat.client.api;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.openstack.heat.client.HeatCommand;
+import org.openstack.heat.client.HeatResourcesPath;
+import org.openstack.heat.model.Stack;
+import org.openstack.heat.model.StackForCreate;
+import org.openstack.heat.model.Stacks;
+
+public class StacksCore {
+
+ private static class ListStacks implements HeatCommand{
+
+ @Override
+ public Stacks execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).request(MediaType.APPLICATION_JSON).get(Stacks.class);
+ }
+
+ }
+
+ private static class ShowStack implements HeatCommand{
+ private String id;
+
+ public ShowStack(String id){
+ this.id = id;
+ }
+
+ @Override
+ public Stack execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).path(id).request(MediaType.APPLICATION_JSON).get(Stack.class);
+ }
+ }
+
+ private static class CreateStack implements HeatCommand{
+ private StackForCreate stackForCreate;
+
+ public CreateStack(StackForCreate stackForCreate) {
+ super();
+ this.stackForCreate = stackForCreate;
+ }
+
+ @Override
+ public Response execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).request(MediaType.TEXT_PLAIN)
+ .post(Entity.json(stackForCreate));
+ }
+
+ }
+
+ private static class UpdateStack implements HeatCommand{
+ private String stackName;
+ private String stackID;
+ private StackForCreate stackForCreate;
+
+ public UpdateStack(String stackName, String stackID,
+ StackForCreate stackForCreate) {
+ super();
+ this.stackName = stackName;
+ this.stackID = stackID;
+ this.stackForCreate = stackForCreate;
+ }
+
+
+
+ @Override
+ public Response execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).path(stackName).path(stackID)
+ .request(MediaType.TEXT_PLAIN).put(Entity.json(stackForCreate));
+ }
+
+ }
+
+ private static class DeleteStack implements HeatCommand{
+ private String id;
+
+ public DeleteStack(String id) {
+ super();
+ this.id = id;
+ }
+
+ @Override
+ public Response execute(WebTarget endpoint) {
+ return endpoint.path(HeatResourcesPath.stackPath).path(id).request(MediaType.TEXT_PLAIN).delete();
+ }
+
+ }
+
+ public static HeatCommand listStacks(){
+ return new ListStacks();
+ }
+
+ public static HeatCommand showStack(String id){
+ return new ShowStack(id);
+ }
+
+ public static HeatCommand createStack(StackForCreate stackForCreate){
+ return new CreateStack(stackForCreate);
+ }
+
+ public static HeatCommand updateStack(String stackName, String stackID,
+ StackForCreate stackForCreate){
+ return new UpdateStack(stackName,stackID,stackForCreate);
+ }
+
+ public static HeatCommand deleteStack(String id){
+ return new DeleteStack(id);
+ }
+}
diff --git a/heat-model/pom.xml b/heat-model/pom.xml
new file mode 100644
index 000000000..c59dda365
--- /dev/null
+++ b/heat-model/pom.xml
@@ -0,0 +1,12 @@
+
+ 4.0.0
+
+ org.openstack
+ openstack-java-sdk
+ 2.0.0-SNAPSHOT
+
+ heat-model
+ OpenStack Heat Model
+ OpenStack Heat Model
+
diff --git a/heat-model/src/main/java/org/openstack/heat/model/Event.java b/heat-model/src/main/java/org/openstack/heat/model/Event.java
new file mode 100644
index 000000000..57ad8514f
--- /dev/null
+++ b/heat-model/src/main/java/org/openstack/heat/model/Event.java
@@ -0,0 +1,91 @@
+package org.openstack.heat.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+@JsonRootName("event")
+public class Event implements Serializable{
+ private static final long serialVersionUID = 7779947747496478239L;
+ private String id;
+ @JsonProperty("resource_type")
+ private String resourceType;
+ @JsonProperty("physical_resource_id")
+ private String resourceID;
+ @JsonProperty("logical_resource_id")
+ private String resourceName;
+ @JsonProperty("resource_status")
+ private String resourceStatus;
+ @JsonProperty("resource_status_reason")
+ private String resourceStatusReason;
+ private List links;
+ @JsonProperty("event_time")
+ private String time;
+ @JsonProperty("resource_properties")
+ private Map resourceProperties;
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getResourceType() {
+ return resourceType;
+ }
+ public void setResourceType(String resourceType) {
+ this.resourceType = resourceType;
+ }
+ public String getResourceID() {
+ return resourceID;
+ }
+ public void setResourceID(String resourceID) {
+ this.resourceID = resourceID;
+ }
+ public String getResourceName() {
+ return resourceName;
+ }
+ public void setResourceName(String resourceName) {
+ this.resourceName = resourceName;
+ }
+ public String getResourceStatus() {
+ return resourceStatus;
+ }
+ public void setResourceStatus(String resourceStatus) {
+ this.resourceStatus = resourceStatus;
+ }
+ public String getResourceStatusReason() {
+ return resourceStatusReason;
+ }
+ public void setResourceStatusReason(String resourceStatusReason) {
+ this.resourceStatusReason = resourceStatusReason;
+ }
+ public List getLinks() {
+ return links;
+ }
+ public void setLinks(List links) {
+ this.links = links;
+ }
+ public String getTime() {
+ return time;
+ }
+ public void setTime(String time) {
+ this.time = time;
+ }
+ public Map getResourceProperties() {
+ return resourceProperties;
+ }
+ public void setResourceProperties(Map resourceProperties) {
+ this.resourceProperties = resourceProperties;
+ }
+ @Override
+ public String toString() {
+ return "event:{id=" + id + ", resourceType=" + resourceType
+ + ", resourceID=" + resourceID + ", resourceName="
+ + resourceName + ", resourceStatus=" + resourceStatus
+ + ", resourceStatusReason=" + resourceStatusReason + ", links="
+ + links + ", time=" + time + ", resourceProperties="
+ + resourceProperties + "}";
+ }
+}
diff --git a/heat-model/src/main/java/org/openstack/heat/model/Events.java b/heat-model/src/main/java/org/openstack/heat/model/Events.java
new file mode 100644
index 000000000..49f60e765
--- /dev/null
+++ b/heat-model/src/main/java/org/openstack/heat/model/Events.java
@@ -0,0 +1,26 @@
+package org.openstack.heat.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+public class Events implements Iterable, Serializable{
+ private static final long serialVersionUID = 2292730044135837499L;
+ private List events;
+
+
+ public List getEvents() {
+ return events;
+ }
+
+ @Override
+ public Iterator iterator() {
+ return events.iterator();
+ }
+
+ @Override
+ public String toString() {
+ return "events:[" + events + "]";
+ }
+
+}
diff --git a/heat-model/src/main/java/org/openstack/heat/model/Link.java b/heat-model/src/main/java/org/openstack/heat/model/Link.java
new file mode 100644
index 000000000..5a3b72ab1
--- /dev/null
+++ b/heat-model/src/main/java/org/openstack/heat/model/Link.java
@@ -0,0 +1,42 @@
+package org.openstack.heat.model;
+
+import java.io.Serializable;
+
+public class Link implements Serializable {
+
+ private String rel;
+
+ private String href;
+
+ private String type;
+
+ /**
+ * @return the rel
+ */
+ public String getRel() {
+ return rel;
+ }
+
+ /**
+ * @return the href
+ */
+ public String getHref() {
+ return href;
+ }
+
+ /**
+ * @return the type
+ */
+ public String getType() {
+ return type;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "Link:{rel=" + rel + ", href=" + href + ", type=" + type + "}";
+ }
+
+}
diff --git a/heat-model/src/main/java/org/openstack/heat/model/Resource.java b/heat-model/src/main/java/org/openstack/heat/model/Resource.java
new file mode 100644
index 000000000..913e23b3b
--- /dev/null
+++ b/heat-model/src/main/java/org/openstack/heat/model/Resource.java
@@ -0,0 +1,80 @@
+package org.openstack.heat.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+@JsonRootName("resource")
+public class Resource implements Serializable {
+ private static final long serialVersionUID = 2242093632995902190L;
+ @JsonProperty("physical_resource_id")
+ private String id;
+ @JsonProperty("logical_resource_id")
+ private String name;
+ @JsonProperty("resource_status")
+ private String status;
+ @JsonProperty("resource_status_reason")
+ private String statusReason;
+ @JsonProperty("resource_type")
+ private String type;
+ @JsonProperty("updated_time")
+ private String updatedAt;
+ private String description;
+ private List links;
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getStatus() {
+ return status;
+ }
+ public void setStatus(String status) {
+ this.status = status;
+ }
+ public String getStatusReason() {
+ return statusReason;
+ }
+ public void setStatusReason(String statusReason) {
+ this.statusReason = statusReason;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+ public String getUpdatedAt() {
+ return updatedAt;
+ }
+ public void setUpdatedAt(String updatedAt) {
+ this.updatedAt = updatedAt;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public List getLinks() {
+ return links;
+ }
+ public void setLinks(List links) {
+ this.links = links;
+ }
+ @Override
+ public String toString() {
+ return "resource:{" + id + ", name=" + name + ", status=" + status
+ + ", statusReason=" + statusReason + ", type=" + type
+ + ", updatedAt=" + updatedAt + ", description=" + description
+ + ", links=" + links + "}";
+ }
+}
diff --git a/heat-model/src/main/java/org/openstack/heat/model/Resources.java b/heat-model/src/main/java/org/openstack/heat/model/Resources.java
new file mode 100644
index 000000000..69d141776
--- /dev/null
+++ b/heat-model/src/main/java/org/openstack/heat/model/Resources.java
@@ -0,0 +1,25 @@
+package org.openstack.heat.model;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+public class Resources implements Iterable, Serializable{
+ private static final long serialVersionUID = 8535374527228144691L;
+ private List resources;
+
+
+ public List getResources() {
+ return resources;
+ }
+
+ @Override
+ public Iterator iterator() {
+ return resources.iterator();
+ }
+
+ @Override
+ public String toString() {
+ return "resources:" + resources;
+ }
+}
diff --git a/heat-model/src/main/java/org/openstack/heat/model/Stack.java b/heat-model/src/main/java/org/openstack/heat/model/Stack.java
new file mode 100644
index 000000000..74d9ca917
--- /dev/null
+++ b/heat-model/src/main/java/org/openstack/heat/model/Stack.java
@@ -0,0 +1,139 @@
+package org.openstack.heat.model;
+
+import java.util.List;
+import java.util.Map;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonRootName;
+@JsonRootName("stack")
+public class Stack {
+ private String id;
+ @JsonProperty("stack_name")
+ private String name;
+ @JsonProperty("creation_time")
+ private String createdAt;
+ @JsonProperty("updated_time")
+ private String updatedAt;
+ @JsonProperty("stack_status")
+ private String status;
+ private List links;
+ @JsonProperty("stack_status_reason")
+ private String statusReason;
+ private String description;
+
+ @JsonProperty("disable_rollback")
+ private boolean disableRollback;
+ private Map parameters;
+ private List