Repository: stratos
Updated Branches:
  refs/heads/stratos-4.1.x cd18da582 -> bba650ea4


Improvements for mock IaaS. Add payload to mock member context


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

Branch: refs/heads/stratos-4.1.x
Commit: bba650ea4894cb95f1048728824b59646fa20150
Parents: 4f02149
Author: Akila Perera <[email protected]>
Authored: Wed Oct 14 16:25:58 2015 +0530
Committer: Akila Perera <[email protected]>
Committed: Wed Oct 14 16:43:04 2015 +0530

----------------------------------------------------------------------
 .../org.apache.stratos.cloud.controller/pom.xml |  1 +
 .../cloud/controller/iaases/mock/MockIaas.java  | 67 ++++++++++-----
 .../status/InstanceStatusTopicReceiver.java     | 45 +++++++---
 .../stratos/mock/iaas/api/MockIaasApi.java      | 15 ++--
 .../mock/iaas/client/MockIaasApiClient.java     | 28 +++++-
 components/org.apache.stratos.mock.iaas/pom.xml |  3 +-
 .../mock/iaas/domain/MockInstanceContext.java   | 15 +++-
 .../mock/iaas/domain/MockInstanceMetadata.java  | 16 +++-
 .../iaas/services/impl/MockIaasServiceImpl.java | 90 +++++++++++---------
 .../mock/iaas/services/impl/MockInstance.java   | 90 ++++++++++----------
 10 files changed, 247 insertions(+), 123 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.cloud.controller/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/pom.xml 
b/components/org.apache.stratos.cloud.controller/pom.xml
index e5ca7da..9bae032 100644
--- a/components/org.apache.stratos.cloud.controller/pom.xml
+++ b/components/org.apache.stratos.cloud.controller/pom.xml
@@ -54,6 +54,7 @@
                         </Private-Package>
                         <Import-Package>
                             !org.apache.stratos.cloud.controller.*,
+                            org.apache.stratos.mock.iaas.*,
                             org.apache.commons.*,
                             org.wso2.carbon.utils.*,
                             org.apache.stratos.common.*; 
version="${project.version}",

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaas.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaas.java
index fb92d27..f774afc 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaas.java
@@ -20,6 +20,8 @@
 package org.apache.stratos.cloud.controller.iaases.mock;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.domain.IaasProvider;
 import org.apache.stratos.cloud.controller.domain.MemberContext;
 import org.apache.stratos.cloud.controller.domain.Partition;
@@ -30,23 +32,30 @@ import 
org.apache.stratos.mock.iaas.client.MockIaasApiClient;
 import org.apache.stratos.mock.iaas.domain.MockInstanceContext;
 import org.apache.stratos.mock.iaas.domain.MockInstanceMetadata;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Mock IaaS client for invoking mock IaaS service.
  */
 public class MockIaas extends Iaas {
-
+    private static final Log log = LogFactory.getLog(MockIaas.class);
     private MockIaasApiClient apiClient;
     private PartitionValidator partitionValidator;
+    private Map<String, String> payloadMap;
+    private static final String PAYLOAD_PARAMETER_SEPARATOR = ",";
+    private static final String PAYLOAD_PARAMETER_NAME_VALUE_SEPARATOR = "=";
 
     public MockIaas(IaasProvider iaasProvider) {
         super(iaasProvider);
         String endpoint = iaasProvider.getProperty("api.endpoint");
         if (StringUtils.isBlank(endpoint)) {
-            throw new CloudControllerException("api.endpoint property not 
found in mock iaas provider in" +
-                    "cloud-controller.xml file");
+            throw new CloudControllerException(
+                    "api.endpoint property not found in mock iaas provider in" 
+ "cloud-controller.xml file");
         }
         apiClient = new MockIaasApiClient(endpoint);
         partitionValidator = new MockIaasPartitionValidator();
+        payloadMap = new HashMap<>();
     }
 
     @Override
@@ -54,17 +63,13 @@ public class MockIaas extends Iaas {
     }
 
     @Override
-    public MemberContext startInstance(MemberContext memberContext, byte[] 
payload) {
-        MockInstanceContext mockInstanceContext = new MockInstanceContext(
-                memberContext.getApplicationId(),
-                memberContext.getCartridgeType(),
-                memberContext.getClusterId(),
-                memberContext.getMemberId(),
-                memberContext.getClusterInstanceId(),
-                memberContext.getNetworkPartitionId(),
-                memberContext.getPartition().getId()
-        );
-        setDynamicPayload(payload);
+    public MemberContext startInstance(MemberContext memberContext, byte[] 
payloadByteArray) {
+        MockInstanceContext mockInstanceContext = new 
MockInstanceContext(memberContext.getApplicationId(),
+                memberContext.getCartridgeType(), 
memberContext.getClusterId(), memberContext.getMemberId(),
+                memberContext.getClusterInstanceId(), 
memberContext.getNetworkPartitionId(),
+                memberContext.getPartition().getId());
+        setDynamicPayload(payloadByteArray);
+        mockInstanceContext.setPayload(new String(payloadByteArray));
         MockInstanceMetadata mockInstanceMetadata = 
apiClient.startInstance(mockInstanceContext);
         memberContext.setInstanceId(mockInstanceMetadata.getInstanceId());
         return memberContext;
@@ -124,19 +129,43 @@ public class MockIaas extends Iaas {
             
memberContext.setDefaultPrivateIP(mockInstanceMetadata.getDefaultPrivateIp());
             
memberContext.setDefaultPublicIP(mockInstanceMetadata.getDefaultPublicIp());
 
-            String[] privateIPs = new 
String[]{mockInstanceMetadata.getDefaultPrivateIp()};
-            String[] publicIPs = new 
String[]{mockInstanceMetadata.getDefaultPublicIp()};
+            String[] privateIPs = new String[] { 
mockInstanceMetadata.getDefaultPrivateIp() };
+            String[] publicIPs = new String[] { 
mockInstanceMetadata.getDefaultPublicIp() };
             memberContext.setPrivateIPs(privateIPs);
             memberContext.setPublicIPs(publicIPs);
         }
     }
 
     @Override
-    public void setDynamicPayload(byte[] payload) {
+    public void setDynamicPayload(byte[] payloadByteArray) {
+        // Clear existing payloadMap parameters
+        payloadMap.clear();
+
+        if (payloadByteArray != null) {
+            String payloadString = new String(payloadByteArray);
+            String[] parameterArray = 
payloadString.split(PAYLOAD_PARAMETER_SEPARATOR);
+            if (parameterArray.length > 0) {
+                for (String parameter : parameterArray) {
+                    if (parameter != null) {
+                        String[] nameValueArray = 
parameter.split(PAYLOAD_PARAMETER_NAME_VALUE_SEPARATOR, 2);
+                        if ((nameValueArray.length == 2)) {
+                            payloadMap.put(nameValueArray[0], 
nameValueArray[1]);
+                        }
+                    }
+                }
+                if (log.isDebugEnabled()) {
+                    log.debug("Dynamic payloadMap is set: " + 
payloadMap.values());
+                }
+            }
+        }
     }
 
     @Override
-    public void terminateInstance(MemberContext memberContext) throws 
InvalidCartridgeTypeException, InvalidMemberException {
-        apiClient.terminateInstance(memberContext.getInstanceId());
+    public void terminateInstance(MemberContext memberContext)
+            throws InvalidCartridgeTypeException, InvalidMemberException {
+        boolean terminated = 
apiClient.terminateInstance(memberContext.getInstanceId());
+        if (terminated) {
+            log.info("Mock instance terminated via MockIaaSApiClient 
[member-id] " + memberContext.getMemberId());
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/instance/status/InstanceStatusTopicReceiver.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/instance/status/InstanceStatusTopicReceiver.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/instance/status/InstanceStatusTopicReceiver.java
index 2d8a275..e212fea 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/instance/status/InstanceStatusTopicReceiver.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/instance/status/InstanceStatusTopicReceiver.java
@@ -66,10 +66,15 @@ public class InstanceStatusTopicReceiver {
         statusEventReceiver.addEventListener(new 
InstanceActivatedEventListener() {
             @Override
             protected void onEvent(Event event) {
+                InstanceActivatedEvent instanceActivatedEvent = 
(InstanceActivatedEvent) event;
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Handling InstanceActivatedEvent 
for [member-id] %s",
+                            instanceActivatedEvent.getMemberId()));
+                }
                 try {
-                    
TopologyBuilder.handleMemberActivated((InstanceActivatedEvent) event);
-                } catch (RegistryException e) {
-                    log.error("Could not persist data in registry data store", 
e);
+                    
TopologyBuilder.handleMemberActivated(instanceActivatedEvent);
+                } catch (Exception e) {
+                    log.error("Failed to process InstanceActivatedEvent", e);
                 }
             }
         });
@@ -77,18 +82,33 @@ public class InstanceStatusTopicReceiver {
         statusEventReceiver.addEventListener(new 
InstanceStartedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                TopologyBuilder.handleMemberStarted((InstanceStartedEvent) 
event);
+                InstanceStartedEvent instanceStartedEvent = 
(InstanceStartedEvent) event;
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Handling InstanceStartedEvent for 
[member-id] %s",
+                            instanceStartedEvent.getMemberId()));
+                }
+                try {
+                    TopologyBuilder.handleMemberStarted(instanceStartedEvent);
+                } catch (Exception e) {
+                    log.error(String.format("Failed to process 
InstanceStartedEvent for [member-id] %s",
+                            instanceStartedEvent.getMemberId()), e);
+                }
             }
         });
 
         statusEventReceiver.addEventListener(new 
InstanceReadyToShutdownEventListener() {
             @Override
             protected void onEvent(Event event) {
+                InstanceReadyToShutdownEvent instanceReadyToShutdownEvent = 
(InstanceReadyToShutdownEvent) event;
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Handling 
InstanceReadyToShutdownEvent for [member-id] %s",
+                            instanceReadyToShutdownEvent.getMemberId()));
+                }
                 try {
-                    
TopologyBuilder.handleMemberReadyToShutdown((InstanceReadyToShutdownEvent) 
event);
+                    
TopologyBuilder.handleMemberReadyToShutdown(instanceReadyToShutdownEvent);
                 } catch (Exception e) {
-                    String error = "Failed to process the instance status 
event message";
-                    log.error(error, e);
+                    log.error(String.format("Failed to process 
InstanceReadyToShutdownEvent for [member-id] %s",
+                            instanceReadyToShutdownEvent.getMemberId()), e);
                 }
             }
         });
@@ -96,11 +116,16 @@ public class InstanceStatusTopicReceiver {
         statusEventReceiver.addEventListener(new InstanceMaintenanceListener() 
{
             @Override
             protected void onEvent(Event event) {
+                InstanceMaintenanceModeEvent instanceMaintenanceModeEvent = 
(InstanceMaintenanceModeEvent) event;
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Handling 
InstanceMaintenanceModeEvent for [member-id] %s",
+                            instanceMaintenanceModeEvent.getMemberId()));
+                }
                 try {
-                    
TopologyBuilder.handleMemberMaintenance((InstanceMaintenanceModeEvent) event);
+                    
TopologyBuilder.handleMemberMaintenance(instanceMaintenanceModeEvent);
                 } catch (Exception e) {
-                    String error = "Failed to process the instance status 
event message";
-                    log.error(error, e);
+                    log.error(String.format("Failed to process 
InstanceMaintenanceModeEvent for [member-id] %s",
+                            instanceMaintenanceModeEvent.getMemberId()), e);
                 }
             }
         });

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.mock.iaas.api/src/main/java/org/apache/stratos/mock/iaas/api/MockIaasApi.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.mock.iaas.api/src/main/java/org/apache/stratos/mock/iaas/api/MockIaasApi.java
 
b/components/org.apache.stratos.mock.iaas.api/src/main/java/org/apache/stratos/mock/iaas/api/MockIaasApi.java
index 51adad8..d3ff5d1 100644
--- 
a/components/org.apache.stratos.mock.iaas.api/src/main/java/org/apache/stratos/mock/iaas/api/MockIaasApi.java
+++ 
b/components/org.apache.stratos.mock.iaas.api/src/main/java/org/apache/stratos/mock/iaas/api/MockIaasApi.java
@@ -54,6 +54,11 @@ public class MockIaasApi {
     @Consumes("application/json")
     @Produces("application/json")
     public Response startInstance(MockInstanceContext mockInstanceContext) 
throws MockIaasApiException {
+        if (mockInstanceContext == null) {
+            String msg = "Mock instance context is null";
+            log.error(msg);
+            throw new MockIaasApiException(msg);
+        }
         try {
             // Validate mock iaas service
             validateMockIaasService();
@@ -81,8 +86,8 @@ public class MockIaasApi {
             log.debug(String.format("Get mock instances"));
 
             List<MockInstanceMetadata> mockInstanceMetadataList = 
getMockIaasService().getInstances();
-            MockInstanceMetadata[] mockInstanceMetadataArray = 
mockInstanceMetadataList.toArray(
-                    new MockInstanceMetadata[mockInstanceMetadataList.size()]);
+            MockInstanceMetadata[] mockInstanceMetadataArray = 
mockInstanceMetadataList
+                    .toArray(new 
MockInstanceMetadata[mockInstanceMetadataList.size()]);
             return Response.ok(mockInstanceMetadataArray).build();
         } catch (Exception e) {
             String message = "Could not get mock instances";
@@ -130,9 +135,9 @@ public class MockIaasApi {
                 return Response.status(Response.Status.NOT_FOUND).build();
             }
             mockInstanceMetadata = 
getMockIaasService().allocateIpAddress(instanceId);
-            log.info(String.format("IP addresses allocated: [instance-id] %s 
[default-private-ip] %s " +
-                            "[default-public-ip] %s", instanceId, 
mockInstanceMetadata.getDefaultPrivateIp(),
-                    mockInstanceMetadata.getDefaultPublicIp()));
+            log.info(String.format(
+                    "IP addresses allocated: [instance-id] %s 
[default-private-ip] %s " + "[default-public-ip] %s",
+                    instanceId, mockInstanceMetadata.getDefaultPrivateIp(), 
mockInstanceMetadata.getDefaultPublicIp()));
             return Response.ok(mockInstanceMetadata).build();
         } catch (Exception e) {
             String message = String.format("Could not allocate ip address: 
[instance-id] %s", instanceId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.mock.iaas.client/src/main/java/org/apache/stratos/mock/iaas/client/MockIaasApiClient.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.mock.iaas.client/src/main/java/org/apache/stratos/mock/iaas/client/MockIaasApiClient.java
 
b/components/org.apache.stratos.mock.iaas.client/src/main/java/org/apache/stratos/mock/iaas/client/MockIaasApiClient.java
index 47bbd17..1ec00e6 100644
--- 
a/components/org.apache.stratos.mock.iaas.client/src/main/java/org/apache/stratos/mock/iaas/client/MockIaasApiClient.java
+++ 
b/components/org.apache.stratos.mock.iaas.client/src/main/java/org/apache/stratos/mock/iaas/client/MockIaasApiClient.java
@@ -58,6 +58,9 @@ public class MockIaasApiClient {
             }
             URI uri = new URIBuilder(endpoint + INSTANCES_CONTEXT).build();
             HttpResponse response = restClient.doPost(uri, content);
+            if (log.isDebugEnabled()) {
+                log.debug("Mock start instance call response: " + 
response.getContent());
+            }
             if (response != null) {
                 if ((response.getStatusCode() >= 200) && 
(response.getStatusCode() < 300)) {
                     return gson.fromJson(response.getContent(), 
MockInstanceMetadata.class);
@@ -84,7 +87,7 @@ public class MockIaasApiClient {
             HttpResponse response = restClient.doDelete(uri);
             if (response != null) {
                 if ((response.getStatusCode() >= 200) && 
(response.getStatusCode() < 300)) {
-                    return false;
+                    return true;
                 } else {
                     GsonBuilder gsonBuilder = new GsonBuilder();
                     Gson gson = gsonBuilder.create();
@@ -127,4 +130,27 @@ public class MockIaasApiClient {
             throw new RuntimeException(message, e);
         }
     }
+
+    public MockInstanceMetadata getInstance(String instanceId) {
+        try {
+            GsonBuilder gsonBuilder = new GsonBuilder();
+            Gson gson = gsonBuilder.create();
+            URI uri = new URIBuilder(endpoint + INSTANCES_CONTEXT + 
instanceId).build();
+            HttpResponse response = restClient.doGet(uri);
+            if (response != null) {
+                if ((response.getStatusCode() >= 200) && 
(response.getStatusCode() < 300)) {
+                    return gson.fromJson(response.getContent(), 
MockInstanceMetadata.class);
+                } else {
+                    ErrorResponse errorResponse = 
gson.fromJson(response.getContent(), ErrorResponse.class);
+                    if (errorResponse != null) {
+                        throw new 
RuntimeException(errorResponse.getErrorMessage());
+                    }
+                }
+            }
+            throw new RuntimeException("An unknown error occurred");
+        } catch (Exception e) {
+            String message = "Could not start mock instance";
+            throw new RuntimeException(message, e);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.mock.iaas/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.mock.iaas/pom.xml 
b/components/org.apache.stratos.mock.iaas/pom.xml
index b0e4798..7df2cc3 100644
--- a/components/org.apache.stratos.mock.iaas/pom.xml
+++ b/components/org.apache.stratos.mock.iaas/pom.xml
@@ -81,6 +81,7 @@
                             org.apache.stratos.mock.iaas.internal;
                         </Private-Package>
                         <Import-Package>
+                            org.apache.stratos.common.*,
                             *;resolution:=optional
                         </Import-Package>
                         <DynamicImport-Package>*</DynamicImport-Package>
@@ -89,4 +90,4 @@
             </plugin>
         </plugins>
     </build>
-</project>
\ No newline at end of file
+</project>

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceContext.java
 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceContext.java
index 582ea43..7f992bd 100644
--- 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceContext.java
+++ 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceContext.java
@@ -19,8 +19,12 @@
 
 package org.apache.stratos.mock.iaas.domain;
 
+import org.apache.stratos.messaging.adapters.MapAdapter;
+
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import java.io.Serializable;
+import java.util.Map;
 
 /**
  * Mock member context.
@@ -40,12 +44,13 @@ public class MockInstanceContext implements Serializable {
     private String defaultPrivateIP;
     private String defaultPublicIP;
     private String instanceId;
+    private String payload;
 
     public MockInstanceContext() {
     }
 
     public MockInstanceContext(String applicationId, String serviceName, 
String clusterId, String memberId,
-                               String clusterInstanceId, String 
networkPartitionId, String partitionId) {
+            String clusterInstanceId, String networkPartitionId, String 
partitionId) {
         this.setApplicationId(applicationId);
         this.setServiceName(serviceName);
         this.setClusterId(clusterId);
@@ -138,4 +143,12 @@ public class MockInstanceContext implements Serializable {
     public void setInstanceId(String instanceId) {
         this.instanceId = instanceId;
     }
+
+    public String getPayload() {
+        return payload;
+    }
+
+    public void setPayload(String payload) {
+        this.payload = payload;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceMetadata.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceMetadata.java
 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceMetadata.java
index 1b67650..480d7e3 100644
--- 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceMetadata.java
+++ 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/domain/MockInstanceMetadata.java
@@ -19,20 +19,23 @@
 
 package org.apache.stratos.mock.iaas.domain;
 
+import org.apache.stratos.messaging.adapters.MapAdapter;
+
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import java.io.Serializable;
+import java.util.Map;
 
 /**
  * Mock instance metadata.
  */
 @XmlRootElement(name = "mockInstanceMetadata")
 public class MockInstanceMetadata implements Serializable {
-
     private static final long serialVersionUID = -1323605022799409426L;
-
     private String instanceId;
     private String defaultPrivateIp;
     private String defaultPublicIp;
+    private String payload;
 
     public MockInstanceMetadata() {
     }
@@ -41,6 +44,7 @@ public class MockInstanceMetadata implements Serializable {
         this.instanceId = mockInstanceContext.getInstanceId();
         this.defaultPrivateIp = mockInstanceContext.getDefaultPrivateIP();
         this.defaultPublicIp = mockInstanceContext.getDefaultPublicIP();
+        this.payload = mockInstanceContext.getPayload();
     }
 
     public String getInstanceId() {
@@ -66,4 +70,12 @@ public class MockInstanceMetadata implements Serializable {
     public void setDefaultPublicIp(String defaultPublicIp) {
         this.defaultPublicIp = defaultPublicIp;
     }
+
+    public String getPayload() {
+        return payload;
+    }
+
+    public void setPayload(String payload) {
+        this.payload = payload;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockIaasServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockIaasServiceImpl.java
 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockIaasServiceImpl.java
index 4d2ff12..2090199 100644
--- 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockIaasServiceImpl.java
+++ 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockIaasServiceImpl.java
@@ -42,7 +42,6 @@ import java.util.concurrent.ExecutorService;
 /**
  * Mock IaaS service implementation. This is a singleton class that simulates 
a standard Infrastructure as a Service
  * platform by creating mock instances and managing their lifecycle states.
- * <p/>
  * How does this work:
  * - Mock IaaS starts a Mock Member thread or each instance created
  * - A sample private IP and a public IP will be assigned to the instance
@@ -54,9 +53,8 @@ public class MockIaasServiceImpl implements MockIaasService {
 
     private static final Log log = 
LogFactory.getLog(MockIaasServiceImpl.class);
 
-    private static final ExecutorService mockMemberExecutorService =
-            
StratosThreadPool.getExecutorService(MockConstants.MOCK_MEMBER_THREAD_POOL,
-                    MockConstants.MOCK_MEMBER_THREAD_POOL_SIZE);
+    private static final ExecutorService mockMemberExecutorService = 
StratosThreadPool
+            .getExecutorService(MockConstants.MOCK_MEMBER_THREAD_POOL, 
MockConstants.MOCK_MEMBER_THREAD_POOL_SIZE);
     private static volatile MockIaasServiceImpl instance;
 
     private PersistenceManager persistenceManager;
@@ -68,8 +66,8 @@ public class MockIaasServiceImpl implements MockIaasService {
      */
     public MockIaasServiceImpl() {
         try {
-            String persistenceManagerTypeStr = 
System.getProperty(MockConstants.PERSISTENCE_MANAGER_TYPE,
-                    PersistenceManagerType.Registry.toString());
+            String persistenceManagerTypeStr = System
+                    .getProperty(MockConstants.PERSISTENCE_MANAGER_TYPE, 
PersistenceManagerType.Registry.toString());
             PersistenceManagerType persistenceManagerType = 
PersistenceManagerType.valueOf(persistenceManagerTypeStr);
             persistenceManager = 
PersistenceManagerFactory.getPersistenceManager(persistenceManagerType);
             mockIaasServiceUtil = new MockIaasServiceUtil(persistenceManager);
@@ -95,30 +93,35 @@ public class MockIaasServiceImpl implements MockIaasService 
{
      */
     @Override
     public MockInstanceMetadata startInstance(MockInstanceContext 
mockInstanceContext) throws MockIaasException {
-        synchronized (MockIaasServiceImpl.class) {
-
-            if (mockInstanceContext == null) {
-                throw new MockIaasException("Mock instance context is null");
-            }
-
-            // Generate instance id
-            String instanceId = mockInstanceContext.getMemberId();
-            mockInstanceContext.setInstanceId(instanceId);
+        if (mockInstanceContext == null) {
+            throw new MockIaasException("Mock instance context is null");
+        }
+        try {
+            synchronized (MockIaasServiceImpl.class) {
+                // Generate instance id
+                String instanceId = mockInstanceContext.getMemberId();
+                mockInstanceContext.setInstanceId(instanceId);
 
-            MockInstance mockInstance = new MockInstance(mockInstanceContext);
-            instanceIdToMockInstanceMap.put(instanceId, mockInstance);
-            mockMemberExecutorService.submit(mockInstance);
+                MockInstance mockInstance = new 
MockInstance(mockInstanceContext);
+                instanceIdToMockInstanceMap.put(instanceId, mockInstance);
+                mockMemberExecutorService.submit(mockInstance);
 
-            // Persist changes
-            mockIaasServiceUtil.persistInRegistry((ConcurrentHashMap<String, 
MockInstance>) instanceIdToMockInstanceMap);
+                // Persist changes
+                mockIaasServiceUtil
+                        .persistInRegistry((ConcurrentHashMap<String, 
MockInstance>) instanceIdToMockInstanceMap);
 
-            String serviceName = mockInstanceContext.getServiceName();
-            
MockHealthStatisticsGenerator.getInstance().scheduleStatisticsUpdaterTasks(serviceName);
+                String serviceName = mockInstanceContext.getServiceName();
+                
MockHealthStatisticsGenerator.getInstance().scheduleStatisticsUpdaterTasks(serviceName);
 
-            // Simulate instance creation time
-            sleep(2000);
+                // Simulate instance creation time
+                sleep(2000);
 
-            return new MockInstanceMetadata(mockInstanceContext);
+                return new MockInstanceMetadata(mockInstanceContext);
+            }
+        } catch (Exception e) {
+            String msg = "Could not start mock instance: " + 
mockInstanceContext.getMemberId();
+            log.error(msg, e);
+            throw new MockIaasException(msg, e);
         }
     }
 
@@ -158,7 +161,8 @@ public class MockIaasServiceImpl implements MockIaasService 
{
     @Override
     public MockInstanceMetadata getInstance(String instanceId) {
         if (instanceIdToMockInstanceMap.containsKey(instanceId)) {
-            MockInstanceContext mockInstanceContext = 
instanceIdToMockInstanceMap.get(instanceId).getMockInstanceContext();
+            MockInstanceContext mockInstanceContext = 
instanceIdToMockInstanceMap.get(instanceId)
+                    .getMockInstanceContext();
             return new MockInstanceMetadata(mockInstanceContext);
         }
         return null;
@@ -193,25 +197,31 @@ public class MockIaasServiceImpl implements 
MockIaasService {
      */
     @Override
     public void terminateInstance(String instanceId) {
-        synchronized (MockIaasServiceImpl.class) {
-            log.info(String.format("Terminating instance: [instance-id] %s", 
instanceId));
+        try {
+            synchronized (MockIaasServiceImpl.class) {
+                log.info(String.format("Terminating instance: [instance-id] 
%s", instanceId));
 
-            MockInstance mockInstance = 
instanceIdToMockInstanceMap.get(instanceId);
-            if (mockInstance != null) {
-                String serviceName = 
mockInstance.getMockInstanceContext().getServiceName();
+                MockInstance mockInstance = 
instanceIdToMockInstanceMap.get(instanceId);
+                if (mockInstance != null) {
+                    String serviceName = 
mockInstance.getMockInstanceContext().getServiceName();
 
-                mockInstance.terminate();
-                instanceIdToMockInstanceMap.remove(instanceId);
-                
mockIaasServiceUtil.persistInRegistry((ConcurrentHashMap<String, MockInstance>) 
instanceIdToMockInstanceMap);
+                    mockInstance.terminate();
+                    instanceIdToMockInstanceMap.remove(instanceId);
+                    mockIaasServiceUtil
+                            .persistInRegistry((ConcurrentHashMap<String, 
MockInstance>) instanceIdToMockInstanceMap);
 
-                if (getMemberCount(serviceName) == 0) {
-                    
MockHealthStatisticsGenerator.getInstance().stopStatisticsUpdaterTasks(serviceName);
-                }
+                    if (getMemberCount(serviceName) == 0) {
+                        
MockHealthStatisticsGenerator.getInstance().stopStatisticsUpdaterTasks(serviceName);
+                    }
 
-                log.info(String.format("Instance terminated successfully: 
[instance-id] %s", instanceId));
-            } else {
-                log.warn(String.format("Instance not found: [instance-id] %s", 
instanceId));
+                    log.info(String.format("Instance terminated successfully: 
[instance-id] %s", instanceId));
+                } else {
+                    log.warn(String.format("Instance not found: [instance-id] 
%s", instanceId));
+                }
             }
+        } catch (Exception e) {
+            String msg = "Could not terminate mock instance: " + instanceId;
+            log.error(msg, e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/bba650ea/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockInstance.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockInstance.java
 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockInstance.java
index 9f03698..a8f3bcc 100644
--- 
a/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockInstance.java
+++ 
b/components/org.apache.stratos.mock.iaas/src/main/java/org/apache/stratos/mock/iaas/services/impl/MockInstance.java
@@ -21,6 +21,7 @@ package org.apache.stratos.mock.iaas.services.impl;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.common.domain.NameValuePair;
 import org.apache.stratos.common.threading.StratosThreadPool;
 import org.apache.stratos.messaging.event.Event;
 import 
org.apache.stratos.messaging.event.instance.notifier.InstanceCleanupClusterEvent;
@@ -33,62 +34,49 @@ import 
org.apache.stratos.mock.iaas.event.publisher.MockMemberEventPublisher;
 import 
org.apache.stratos.mock.iaas.statistics.publisher.MockHealthStatisticsNotifier;
 
 import java.io.Serializable;
+import java.util.Properties;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * Mock member definition.
+ * Mock member instance definition.
  */
 public class MockInstance implements Runnable, Serializable {
-
     private static final Log log = LogFactory.getLog(MockInstance.class);
-    private static final ExecutorService eventListenerExecutorService =
-            
StratosThreadPool.getExecutorService("mock.iaas.event.listener.thread.pool", 
20);
-    private static final ScheduledExecutorService 
healthStatNotifierExecutorService =
-            
StratosThreadPool.getScheduledExecutorService("mock.iaas.health.statistics.notifier.thread.pool",
 20);
     private static final int HEALTH_STAT_INTERVAL = 15; // 15 seconds
-
-    private final MockInstanceContext mockMemberContext;
-    private boolean terminated;
+    private final MockInstanceContext mockInstanceContext;
     private transient ScheduledFuture<?> healthStatNotifierScheduledFuture;
     private transient InstanceNotifierEventReceiver 
instanceNotifierEventReceiver;
-
-    public MockInstance(MockInstanceContext mockMemberContext) {
-        this.mockMemberContext = mockMemberContext;
+    private static final ExecutorService eventListenerExecutorService = 
StratosThreadPool
+            .getExecutorService("mock.iaas.event.listener.thread.pool", 20);
+    private static final ScheduledExecutorService 
healthStatNotifierExecutorService = StratosThreadPool
+            
.getScheduledExecutorService("mock.iaas.health.statistics.notifier.thread.pool",
 20);
+    AtomicBoolean hasGracefullyShutdown = new AtomicBoolean(false);
+
+    public MockInstance(MockInstanceContext mockInstanceContext) {
+        this.mockInstanceContext = mockInstanceContext;
     }
 
     @Override
     public void run() {
         if (log.isInfoEnabled()) {
-            log.info(String.format("Mock member started: [member-id] %s", 
mockMemberContext.getMemberId()));
+            log.info(String.format("Mock member started: [member-id] %s", 
mockInstanceContext.getMemberId()));
         }
-
         sleep(5000);
-        
MockMemberEventPublisher.publishInstanceStartedEvent(mockMemberContext);
-
+        
MockMemberEventPublisher.publishInstanceStartedEvent(mockInstanceContext);
         sleep(5000);
-        
MockMemberEventPublisher.publishInstanceActivatedEvent(mockMemberContext);
-
+        
MockMemberEventPublisher.publishInstanceActivatedEvent(mockInstanceContext);
         startInstanceNotifierReceiver();
         startHealthStatisticsPublisher();
-
-        while (!terminated) {
-            sleep(1000);
-        }
-
-        stopInstanceNotifierReceiver();
-        stopHealthStatisticsPublisher();
-
-        if (log.isInfoEnabled()) {
-            log.info(String.format("Mock member terminated: [member-id] %s", 
mockMemberContext.getMemberId()));
-        }
     }
 
     private void startInstanceNotifierReceiver() {
         if (log.isDebugEnabled()) {
-            log.debug("Starting instance notifier event message receiver");
+            log.debug("Starting instance notifier event message receiver for 
mock member [member-id] "
+                            + mockInstanceContext.getMemberId());
         }
 
         instanceNotifierEventReceiver = new InstanceNotifierEventReceiver();
@@ -96,9 +84,9 @@ public class MockInstance implements Runnable, Serializable {
             @Override
             protected void onEvent(Event event) {
                 InstanceCleanupClusterEvent instanceCleanupClusterEvent = 
(InstanceCleanupClusterEvent) event;
-                if 
(mockMemberContext.getClusterId().equals(instanceCleanupClusterEvent.getClusterId())
 &&
-                        mockMemberContext.getClusterInstanceId().equals(
-                                
instanceCleanupClusterEvent.getClusterInstanceId())) {
+                if 
(mockInstanceContext.getClusterId().equals(instanceCleanupClusterEvent.getClusterId())
+                        && mockInstanceContext.getClusterInstanceId()
+                        
.equals(instanceCleanupClusterEvent.getClusterInstanceId())) {
                     handleMemberTermination();
                 }
             }
@@ -108,7 +96,7 @@ public class MockInstance implements Runnable, Serializable {
             @Override
             protected void onEvent(Event event) {
                 InstanceCleanupMemberEvent instanceCleanupMemberEvent = 
(InstanceCleanupMemberEvent) event;
-                if 
(mockMemberContext.getMemberId().equals(instanceCleanupMemberEvent.getMemberId()))
 {
+                if 
(mockInstanceContext.getMemberId().equals(instanceCleanupMemberEvent.getMemberId()))
 {
                     handleMemberTermination();
                 }
             }
@@ -127,21 +115,32 @@ public class MockInstance implements Runnable, 
Serializable {
     }
 
     private void handleMemberTermination() {
-        
MockMemberEventPublisher.publishMaintenanceModeEvent(mockMemberContext);
-        sleep(2000);
-        
MockMemberEventPublisher.publishInstanceReadyToShutdownEvent(mockMemberContext);
+        if (!hasGracefullyShutdown.get()) {
+            
MockMemberEventPublisher.publishMaintenanceModeEvent(mockInstanceContext);
+            sleep(5000);
+            
MockMemberEventPublisher.publishInstanceReadyToShutdownEvent(mockInstanceContext);
+            hasGracefullyShutdown.set(true);
+        } else {
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Mock instance is already gracefully 
shutdown [member-id] %s",
+                        mockInstanceContext.getMemberId()));
+            }
+        }
     }
 
     private void startHealthStatisticsPublisher() {
         if (log.isDebugEnabled()) {
-            log.debug(String.format("Starting health statistics notifier: 
[member-id] %s", mockMemberContext.getMemberId()));
+            log.debug(String.format("Starting health statistics notifier: 
[member-id] %s",
+                    mockInstanceContext.getMemberId()));
         }
 
-        healthStatNotifierScheduledFuture = 
healthStatNotifierExecutorService.scheduleAtFixedRate(new 
MockHealthStatisticsNotifier(mockMemberContext),
-                0, HEALTH_STAT_INTERVAL, TimeUnit.SECONDS);
+        healthStatNotifierScheduledFuture = healthStatNotifierExecutorService
+                .scheduleAtFixedRate(new 
MockHealthStatisticsNotifier(mockInstanceContext), 0, HEALTH_STAT_INTERVAL,
+                        TimeUnit.SECONDS);
 
         if (log.isDebugEnabled()) {
-            log.debug(String.format("Health statistics notifier started: 
[member-id] %s", mockMemberContext.getMemberId()));
+            log.debug(String.format("Health statistics notifier started: 
[member-id] %s",
+                    mockInstanceContext.getMemberId()));
         }
     }
 
@@ -161,15 +160,18 @@ public class MockInstance implements Runnable, 
Serializable {
         try {
             Thread.sleep(time);
         } catch (InterruptedException ignore) {
-            terminate();
         }
     }
 
     public MockInstanceContext getMockInstanceContext() {
-        return mockMemberContext;
+        return mockInstanceContext;
     }
 
     public void terminate() {
-        terminated = true;
+        stopInstanceNotifierReceiver();
+        stopHealthStatisticsPublisher();
+        if (log.isInfoEnabled()) {
+            log.info(String.format("Mock member terminated: [member-id] %s", 
mockInstanceContext.getMemberId()));
+        }
     }
 }

Reply via email to