Repository: stratos Updated Branches: refs/heads/master 089477175 -> 48c364073
Introducing logic to start mock members if present in the registry on server startup Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/48c36407 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/48c36407 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/48c36407 Branch: refs/heads/master Commit: 48c36407339cc81a835c7cf3d79a9109f2055304 Parents: 0894771 Author: Imesh Gunaratne <[email protected]> Authored: Mon Dec 8 15:58:36 2014 +0530 Committer: Imesh Gunaratne <[email protected]> Committed: Mon Dec 8 15:58:36 2014 +0530 ---------------------------------------------------------------------- .../cloud/controller/iaases/MockIaas.java | 114 +++++++++++ .../cloud/controller/iaases/mock/MockIaas.java | 182 ------------------ .../controller/iaases/mock/MockIaasService.java | 187 +++++++++++++++++++ .../CloudControllerServiceComponent.java | 4 + .../controller/registry/RegistryManager.java | 4 +- .../main/resources/conf/cloud-controller.xml | 2 +- 6 files changed, 307 insertions(+), 186 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/48c36407/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/MockIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/MockIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/MockIaas.java new file mode 100644 index 0000000..9e9273e --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/MockIaas.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.cloud.controller.iaases; + +import org.apache.stratos.cloud.controller.domain.ClusterContext; +import org.apache.stratos.cloud.controller.domain.IaasProvider; +import org.apache.stratos.cloud.controller.domain.MemberContext; +import org.apache.stratos.cloud.controller.domain.Partition; +import org.apache.stratos.cloud.controller.exception.*; +import org.apache.stratos.cloud.controller.iaases.mock.MockIaasService; +import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator; +import org.jclouds.compute.domain.NodeMetadata; + +/** + * Mock IaaS client for invoking mock IaaS service. + */ +public class MockIaas extends Iaas { + + public MockIaas(IaasProvider iaasProvider) { + super(iaasProvider); + } + + @Override + public void initialize() { + } + + @Override + public NodeMetadata createInstance(ClusterContext clusterContext, MemberContext memberContext) { + return MockIaasService.getInstance().createInstance(clusterContext, memberContext); + } + + @Override + public void releaseAddress(String ip) { + MockIaasService.getInstance().releaseAddress(ip); + } + + @Override + public boolean isValidRegion(String region) throws InvalidRegionException { + return MockIaasService.getInstance().isValidRegion(region); + } + + @Override + public boolean isValidZone(String region, String zone) throws InvalidZoneException, InvalidRegionException { + return MockIaasService.getInstance().isValidZone(region, zone); + } + + @Override + public boolean isValidHost(String zone, String host) throws InvalidHostException { + return MockIaasService.getInstance().isValidHost(zone, host); + } + + @Override + public PartitionValidator getPartitionValidator() { + return MockIaasService.getInstance().getPartitionValidator(); + } + + @Override + public String createVolume(int sizeGB, String snapshotId) { + return MockIaasService.getInstance().createVolume(sizeGB, snapshotId); + } + + @Override + public String attachVolume(String instanceId, String volumeId, String deviceName) { + return MockIaasService.getInstance().attachVolume(instanceId, volumeId, deviceName); + } + + @Override + public void detachVolume(String instanceId, String volumeId) { + MockIaasService.getInstance().detachVolume(instanceId, volumeId); + } + + @Override + public void deleteVolume(String volumeId) { + MockIaasService.getInstance().deleteVolume(volumeId); + } + + @Override + public String getIaasDevice(String device) { + return MockIaasService.getInstance().getIaasDevice(device); + } + + @Override + public void allocateIpAddress(String clusterId, MemberContext memberContext, Partition partition, + String cartridgeType, NodeMetadata node) { + MockIaasService.getInstance().allocateIpAddress(clusterId, memberContext, partition, cartridgeType, node); + } + + @Override + public void setDynamicPayload(byte[] payload) { + MockIaasService.getInstance().setDynamicPayload(payload); + } + + @Override + public void terminateInstance(MemberContext memberContext) throws InvalidCartridgeTypeException, InvalidMemberException { + MockIaasService.getInstance().terminateInstance(memberContext); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/48c36407/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 deleted file mode 100644 index bfe6306..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaas.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.stratos.cloud.controller.iaases.mock; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.domain.ClusterContext; -import org.apache.stratos.cloud.controller.domain.IaasProvider; -import org.apache.stratos.cloud.controller.domain.MemberContext; -import org.apache.stratos.cloud.controller.domain.Partition; -import org.apache.stratos.cloud.controller.exception.*; -import org.apache.stratos.cloud.controller.iaases.Iaas; -import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator; -import org.apache.stratos.cloud.controller.registry.RegistryManager; -import org.apache.stratos.common.threading.StratosThreadPool; -import org.jclouds.compute.domain.NodeMetadata; -import org.wso2.carbon.registry.core.exceptions.RegistryException; - -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; - -/** - * Mock IaaS definition. This simulates an infrastructure as a service platform by creating mock members - * and publishing member lifecycle events. Each member will publish mock statistics values after publishing - * instance started, instance activated events. - */ -public class MockIaas extends Iaas { - - private static final Log log = LogFactory.getLog(MockIaas.class); - private static final String MOCK_IAAS_MEMBERS = "/mock/iaas/members"; - - private ExecutorService executorService; - private MockPartitionValidator partitionValidator; - private ConcurrentHashMap<String, MockMember> membersMap; - - public MockIaas(IaasProvider iaasProvider) { - super(iaasProvider); - executorService = StratosThreadPool.getExecutorService("MOCK_IAAS_THREAD_EXECUTOR", 100); - partitionValidator = new MockPartitionValidator(); - membersMap = readFromRegistry(); - if(membersMap != null) { - // Start existing members - for(MockMember mockMember : membersMap.values()) { - executorService.submit(mockMember); - } - } else { - // No members found in registry, create new map - membersMap = new ConcurrentHashMap<String, MockMember>(); - } - } - - @Override - public void initialize() { - } - - @Override - public NodeMetadata createInstance(ClusterContext clusterContext, MemberContext memberContext) { - synchronized (MockIaas.class) { - // Create mock member instance - MockMemberContext mockMemberContext = new MockMemberContext(clusterContext.getCartridgeType(), - clusterContext.getClusterId(), memberContext.getMemberId(), memberContext.getNetworkPartitionId(), - memberContext.getPartition().getId(), memberContext.getInstanceId()); - MockMember mockMember = new MockMember(mockMemberContext); - membersMap.put(mockMember.getMockMemberContext().getMemberId(), mockMember); - executorService.submit(mockMember); - - // Prepare node metadata - MockNodeMetadata nodeMetadata = new MockNodeMetadata(); - nodeMetadata.setId(UUID.randomUUID().toString()); - - // Persist changes - persistInRegistry(); - - return nodeMetadata; - } - } - - private void persistInRegistry() { - try { - RegistryManager.getInstance().persist(MOCK_IAAS_MEMBERS, membersMap); - } catch (RegistryException e) { - log.error("Could not persist mock iaas members in registry", e); - }; - } - - private ConcurrentHashMap<String, MockMember> readFromRegistry() { - return (ConcurrentHashMap<String, MockMember>) RegistryManager.getInstance().read(MOCK_IAAS_MEMBERS); - } - - @Override - public void allocateIpAddress(String clusterId, MemberContext memberContext, Partition partition, - String cartridgeType, NodeMetadata node) { - // Allocate mock ip addresses - memberContext.setPrivateIpAddress(MockIPAddressPool.getInstance().getNextPrivateIpAddress()); - memberContext.setPublicIpAddress(MockIPAddressPool.getInstance().getNextPublicIpAddress()); - } - - @Override - public void releaseAddress(String ip) { - - } - - @Override - public boolean isValidRegion(String region) throws InvalidRegionException { - return true; - } - - @Override - public boolean isValidZone(String region, String zone) throws InvalidZoneException, InvalidRegionException { - return true; - } - - @Override - public boolean isValidHost(String zone, String host) throws InvalidHostException { - return true; - } - - @Override - public PartitionValidator getPartitionValidator() { - return partitionValidator; - } - - @Override - public String createVolume(int sizeGB, String snapshotId) { - return null; - } - - @Override - public String attachVolume(String instanceId, String volumeId, String deviceName) { - return null; - } - - @Override - public void detachVolume(String instanceId, String volumeId) { - - } - - @Override - public void deleteVolume(String volumeId) { - - } - - @Override - public String getIaasDevice(String device) { - return null; - } - - @Override - public void setDynamicPayload(byte[] payload) { - - } - - @Override - public void terminateInstance(MemberContext memberContext) throws InvalidCartridgeTypeException, InvalidMemberException { - synchronized (MockIaas.class) { - MockMember mockMember = membersMap.get(memberContext.getMemberId()); - if (mockMember != null) { - mockMember.terminate(); - membersMap.remove(memberContext.getMemberId()); - } - } - } -} http://git-wip-us.apache.org/repos/asf/stratos/blob/48c36407/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java new file mode 100644 index 0000000..4bf9dd4 --- /dev/null +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/mock/MockIaasService.java @@ -0,0 +1,187 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.cloud.controller.iaases.mock; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.cloud.controller.domain.ClusterContext; +import org.apache.stratos.cloud.controller.domain.MemberContext; +import org.apache.stratos.cloud.controller.domain.Partition; +import org.apache.stratos.cloud.controller.exception.*; +import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator; +import org.apache.stratos.cloud.controller.registry.RegistryManager; +import org.apache.stratos.common.threading.StratosThreadPool; +import org.jclouds.compute.domain.NodeMetadata; +import org.wso2.carbon.registry.core.exceptions.RegistryException; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +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 members and managing their lifecycle states. + * + * 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 + * - Mock Member will publish Instance Started and Instance Activated events once the thread is started + * - Afterwards it will start publishing sample health statistics values to CEP + * - If the Mock IaaS was asked to terminate an instance it will stop the relevant thread + */ +public class MockIaasService { + + private static final Log log = LogFactory.getLog(MockIaasService.class); + private static final String MOCK_IAAS_MEMBERS = "/mock/iaas/members"; + private static volatile MockIaasService instance; + + private ExecutorService executorService; + private MockPartitionValidator partitionValidator; + private ConcurrentHashMap<String, MockMember> membersMap; + + private MockIaasService() { + super(); + executorService = StratosThreadPool.getExecutorService("MOCK_IAAS_THREAD_EXECUTOR", 100); + partitionValidator = new MockPartitionValidator(); + membersMap = readFromRegistry(); + if(membersMap == null) { + // No members found in registry, create a new map + membersMap = new ConcurrentHashMap<String, MockMember>(); + } + } + + public static MockIaasService getInstance() { + if (instance == null) { + synchronized (MockIaasService.class) { + if (instance == null) { + instance = new MockIaasService(); + } + } + } + return instance; + } + + /** + * Start mock members if present in registry + */ + public static void startMockMembersIfPresentInRegistry() { + ConcurrentHashMap<String, MockMember> membersMap = readFromRegistry(); + if(membersMap != null) { + ExecutorService executorService = StratosThreadPool.getExecutorService("MOCK_IAAS_THREAD_EXECUTOR", 100); + for (MockMember mockMember : membersMap.values()) { + executorService.submit(mockMember); + } + } + } + + public NodeMetadata createInstance(ClusterContext clusterContext, MemberContext memberContext) { + synchronized (MockIaasService.class) { + // Create mock member instance + MockMemberContext mockMemberContext = new MockMemberContext(clusterContext.getCartridgeType(), + clusterContext.getClusterId(), memberContext.getMemberId(), memberContext.getNetworkPartitionId(), + memberContext.getPartition().getId(), memberContext.getInstanceId()); + MockMember mockMember = new MockMember(mockMemberContext); + membersMap.put(mockMember.getMockMemberContext().getMemberId(), mockMember); + executorService.submit(mockMember); + + // Prepare node metadata + MockNodeMetadata nodeMetadata = new MockNodeMetadata(); + nodeMetadata.setId(UUID.randomUUID().toString()); + + // Persist changes + persistInRegistry(); + + return nodeMetadata; + } + } + + private void persistInRegistry() { + try { + RegistryManager.getInstance().persist(MOCK_IAAS_MEMBERS, membersMap); + } catch (RegistryException e) { + log.error("Could not persist mock iaas members in registry", e); + }; + } + + private static ConcurrentHashMap<String, MockMember> readFromRegistry() { + return (ConcurrentHashMap<String, MockMember>) RegistryManager.getInstance().read(MOCK_IAAS_MEMBERS); + } + + public void allocateIpAddress(String clusterId, MemberContext memberContext, Partition partition, + String cartridgeType, NodeMetadata node) { + // Allocate mock ip addresses + memberContext.setPrivateIpAddress(MockIPAddressPool.getInstance().getNextPrivateIpAddress()); + memberContext.setPublicIpAddress(MockIPAddressPool.getInstance().getNextPublicIpAddress()); + } + + public void releaseAddress(String ip) { + + } + + public boolean isValidRegion(String region) throws InvalidRegionException { + return true; + } + + public boolean isValidZone(String region, String zone) throws InvalidZoneException, InvalidRegionException { + return true; + } + + public boolean isValidHost(String zone, String host) throws InvalidHostException { + return true; + } + + public PartitionValidator getPartitionValidator() { + return partitionValidator; + } + + public String createVolume(int sizeGB, String snapshotId) { + return null; + } + + public String attachVolume(String instanceId, String volumeId, String deviceName) { + return null; + } + + public void detachVolume(String instanceId, String volumeId) { + + } + + public void deleteVolume(String volumeId) { + + } + + public String getIaasDevice(String device) { + return null; + } + + public void setDynamicPayload(byte[] payload) { + + } + + public void terminateInstance(MemberContext memberContext) throws InvalidCartridgeTypeException, InvalidMemberException { + synchronized (MockIaasService.class) { + MockMember mockMember = membersMap.get(memberContext.getMemberId()); + if (mockMember != null) { + mockMember.terminate(); + membersMap.remove(memberContext.getMemberId()); + } + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/48c36407/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerServiceComponent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerServiceComponent.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerServiceComponent.java index ed1b0f5..b60021b 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerServiceComponent.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerServiceComponent.java @@ -25,6 +25,7 @@ import com.hazelcast.core.HazelcastInstance; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.context.CloudControllerContext; +import org.apache.stratos.cloud.controller.iaases.mock.MockIaasService; import org.apache.stratos.cloud.controller.messaging.receiver.application.ApplicationTopicReceiver; import org.apache.stratos.cloud.controller.messaging.receiver.cluster.status.ClusterStatusTopicReceiver; import org.apache.stratos.cloud.controller.exception.CloudControllerException; @@ -105,6 +106,9 @@ public class CloudControllerServiceComponent { } else { executeCoordinatorTasks(); } + + // Start mock members if present in registry + MockIaasService.startMockMembersIfPresentInRegistry(); } catch (Throwable e) { log.error("******* Cloud Controller Service bundle is failed to activate ****", e); } http://git-wip-us.apache.org/repos/asf/stratos/blob/48c36407/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java index bcb4e7a..20921e8 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/registry/RegistryManager.java @@ -1,4 +1,3 @@ -package org.apache.stratos.cloud.controller.registry; /* * * Licensed to the Apache Software Foundation (ASF) under one @@ -20,14 +19,13 @@ package org.apache.stratos.cloud.controller.registry; * */ +package org.apache.stratos.cloud.controller.registry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.context.CloudControllerContext; import org.apache.stratos.cloud.controller.exception.CloudControllerException; import org.apache.stratos.cloud.controller.util.CloudControllerConstants; import org.apache.stratos.cloud.controller.internal.ServiceReferenceHolder; -import org.apache.stratos.messaging.domain.topology.Topology; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.Resource; http://git-wip-us.apache.org/repos/asf/stratos/blob/48c36407/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/cloud-controller.xml ---------------------------------------------------------------------- diff --git a/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/cloud-controller.xml b/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/cloud-controller.xml index 8b6f405..c246e67 100644 --- a/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/cloud-controller.xml +++ b/features/cloud-controller/org.apache.stratos.cloud.controller.feature/src/main/resources/conf/cloud-controller.xml @@ -68,7 +68,7 @@ <credential svns:secretAlias="cloud.controller.docker.credential">credential</credential> </iaasProvider> <iaasProvider type="mock" name="Mock"> - <className>org.apache.stratos.cloud.controller.iaases.mock.MockIaas</className> + <className>org.apache.stratos.cloud.controller.iaases.MockIaas</className> <provider>mock</provider> <identity svns:secretAlias="cloud.controller.docker.identity">identity</identity> <credential svns:secretAlias="cloud.controller.docker.credential">credential</credential>
