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())); + } } }
