You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by la...@apache.org on 2013/12/24 10:06:41 UTC

git commit: Changing start instance service call to return after instance spawned before ips assigned

Updated Branches:
  refs/heads/master e91610407 -> 7b5746a0b


Changing start instance service call to return after instance spawned before ips assigned


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

Branch: refs/heads/master
Commit: 7b5746a0bfca16df56de3dc7c3f31852764b53d3
Parents: e916104
Author: Lahiru Sandaruwan <la...@apache.org>
Authored: Tue Dec 24 14:41:00 2013 +0530
Committer: Lahiru Sandaruwan <la...@apache.org>
Committed: Tue Dec 24 14:41:00 2013 +0530

----------------------------------------------------------------------
 .../impl/CloudControllerServiceImpl.java        | 197 +++++++++++--------
 1 file changed, 113 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/7b5746a0/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
index 3c5e792..090e5c3 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
@@ -22,33 +22,21 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.concurrent.ThreadExecutor;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.apache.stratos.cloud.controller.exception.CloudControllerException;
-import org.apache.stratos.cloud.controller.exception.InvalidCartridgeDefinitionException;
-import org.apache.stratos.cloud.controller.exception.InvalidCartridgeTypeException;
-import org.apache.stratos.cloud.controller.exception.InvalidClusterException;
-import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
-import org.apache.stratos.cloud.controller.exception.InvalidMemberException;
-import org.apache.stratos.cloud.controller.exception.InvalidPartitionException;
-import org.apache.stratos.cloud.controller.exception.UnregisteredCartridgeException;
-import org.apache.stratos.cloud.controller.exception.UnregisteredClusterException;
+import org.apache.stratos.cloud.controller.exception.*;
 import org.apache.stratos.cloud.controller.interfaces.CloudControllerService;
 import org.apache.stratos.cloud.controller.interfaces.Iaas;
 import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil;
 import org.apache.stratos.cloud.controller.persist.Deserializer;
-import org.apache.stratos.cloud.controller.pojo.Cartridge;
-import org.apache.stratos.cloud.controller.pojo.CartridgeConfig;
-import org.apache.stratos.cloud.controller.pojo.CartridgeInfo;
-import org.apache.stratos.cloud.controller.pojo.ClusterContext;
-import org.apache.stratos.cloud.controller.pojo.IaasProvider;
-import org.apache.stratos.cloud.controller.pojo.MemberContext;
-import org.apache.stratos.cloud.controller.pojo.Registrant;
+import org.apache.stratos.cloud.controller.pojo.*;
 import org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublisherTask;
 import org.apache.stratos.cloud.controller.registry.RegistryManager;
 import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
 import org.apache.stratos.cloud.controller.topic.TopologySynchronizerTask;
 import org.apache.stratos.cloud.controller.topology.TopologyBuilder;
 import org.apache.stratos.cloud.controller.topology.TopologyEventMessageDelegator;
-import org.apache.stratos.cloud.controller.util.*;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.cloud.controller.util.ServiceReferenceHolder;
 import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.NodeMetadata;
@@ -62,8 +50,6 @@ import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * Cloud Controller Service is responsible for starting up new server instances,
@@ -373,7 +359,6 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
         memberContext.setCartridgeType(cartridgeType);
 
-        final Lock lock = new ReentrantLock(true);
 
         IaasProvider iaasProvider = cartridge.getIaasProviderOfPartition(partitionId);
         if (iaasProvider == null) {
@@ -441,86 +426,35 @@ public class CloudControllerServiceImpl implements CloudControllerService {
             // Should have a length between 3-15
             String str = clusterId.substring(0, 10);
             String group = str.replaceAll("[^a-z0-9-]", "");
-
             NodeMetadata node;
 
-            // create and start a node
+//            create and start a node
             Set<? extends NodeMetadata> nodes =
                                                 computeService.createNodesInGroup(group, 1,
                                                                                   template);
 
             node = nodes.iterator().next();
+            //Start allocating ip as a new job
 
-            String autoAssignIpProp =
-                                      iaasProvider.getProperty(CloudControllerConstants.AUTO_ASSIGN_IP_PROPERTY);
-
-            // acquire the lock
-            lock.lock();
+            ThreadExecutor exec = ThreadExecutor.getInstance();
+            exec.execute(new IpAllocator(memberContext, computeService, template, iaasProvider, cartridgeType, node));
 
-            try {
-                // node id
-                String nodeId = node.getId();
-                if (nodeId == null) {
-                    String msg = "Node id of the starting instance is null.\n" + memberContext.toString();
-                    log.fatal(msg);
-                    throw new CloudControllerException(msg);
-                }
 
+            // node id
+            String nodeId = node.getId();
+            if (nodeId == null) {
+                String msg = "Node id of the starting instance is null.\n" + memberContext.toString();
+                log.fatal(msg);
+                throw new CloudControllerException(msg);
+            }
                 memberContext.setNodeId(nodeId);
-                
                 if(log.isDebugEnabled()) {
                     log.debug("Node id was set. "+memberContext.toString());
                 }
 
-                // reset ip
-                String ip = "";
-                // default behavior is autoIpAssign=false
-                if (autoAssignIpProp == null ||
-                    (autoAssignIpProp != null && autoAssignIpProp.equals("false"))) {
-                    // allocate an IP address - manual IP assigning mode
-                    ip = iaas.associateAddress(iaasProvider, node);
-                    memberContext.setAllocatedIpAddress(ip);
-                    log.info("Allocated an ip address: " + memberContext.toString());
-                }
-
-                // public ip
-                if (node.getPublicAddresses() != null &&
-                    node.getPublicAddresses().iterator().hasNext()) {
-                    ip = node.getPublicAddresses().iterator().next();
-                    memberContext.setPublicIpAddress(ip);
-                    log.info("Public ip address: " + memberContext.toString());
-                }
-
-                // private IP
-                if (node.getPrivateAddresses() != null &&
-                    node.getPrivateAddresses().iterator().hasNext()) {
-                    ip = node.getPrivateAddresses().iterator().next();
-                    memberContext.setPrivateIpAddress(ip);
-                    log.info("Private ip address: " + memberContext.toString());
-                }
-
-                dataHolder.addMemberContext(memberContext);
-
-                // persist in registry
-                persist();
-
-                // trigger topology
-                TopologyBuilder.handleMemberSpawned(memberID, cartridgeType, clusterId, memberContext.getNetworkPartitionId(), partition.getId(), ip, memberContext.getLbClusterId());
-
-                // update the topology with the newly spawned member
-                // publish data
-                if (log.isDebugEnabled()) {
-                    log.debug("Node details: \n" + node.toString() + "\n***************\n");
-                }
-
-                log.info("Instance is successfully starting up. "+memberContext.toString());
-
-                return memberContext;
+            log.info("Instance is successfully starting up. "+memberContext.toString());
 
-            } finally {
-                // release the lock
-                lock.unlock();
-            }
+            return memberContext;
 
         } catch (Exception e) {
             String msg = "Failed to start an instance. " + memberContext.toString();
@@ -640,6 +574,100 @@ public class CloudControllerServiceImpl implements CloudControllerService {
         }
     }
 
+    private class IpAllocator implements Runnable {
+
+        private MemberContext memberContext;
+        private ComputeService computeService;
+        private Template template;
+        private IaasProvider iaasProvider;
+        private String cartridgeType;
+        NodeMetadata node;
+
+        public IpAllocator(MemberContext memberContext, ComputeService computeService, Template template,
+                           IaasProvider iaasProvider, String cartridgeType, NodeMetadata node) {
+            this.memberContext = memberContext;
+            this.computeService = computeService;
+            this.template = template;
+            this.iaasProvider = iaasProvider;
+            this.cartridgeType = cartridgeType;
+            this.node = node;
+        }
+
+        @Override
+        public void run() {
+
+
+            String clusterId = memberContext.getClusterId();
+            Partition partition = memberContext.getPartition();
+
+            // generate the group id from domain name and sub domain
+            // name.
+            // Should have lower-case ASCII letters, numbers, or dashes.
+            // Should have a length between 3-15
+            String str = clusterId.substring(0, 10);
+            String group = str.replaceAll("[^a-z0-9-]", "");
+
+            try{
+
+                String autoAssignIpProp =
+                                          iaasProvider.getProperty(CloudControllerConstants.AUTO_ASSIGN_IP_PROPERTY);
+
+                    // reset ip
+                    String ip = "";
+                    // default behavior is autoIpAssign=false
+                    if (autoAssignIpProp == null ||
+                        (autoAssignIpProp != null && autoAssignIpProp.equals("false"))) {
+
+                        Iaas iaas = iaasProvider.getIaas();
+                        // allocate an IP address - manual IP assigning mode
+                        ip = iaas.associateAddress(iaasProvider, node);
+                        memberContext.setAllocatedIpAddress(ip);
+                        log.info("Allocated an ip address: " + memberContext.toString());
+                    }
+
+                    // public ip
+                    if (node.getPublicAddresses() != null &&
+                        node.getPublicAddresses().iterator().hasNext()) {
+                        ip = node.getPublicAddresses().iterator().next();
+                        memberContext.setPublicIpAddress(ip);
+                        log.info("Public ip address: " + memberContext.toString());
+                    }
+
+                    // private IP
+                    if (node.getPrivateAddresses() != null &&
+                        node.getPrivateAddresses().iterator().hasNext()) {
+                        ip = node.getPrivateAddresses().iterator().next();
+                        memberContext.setPrivateIpAddress(ip);
+                        log.info("Private ip address: " + memberContext.toString());
+                    }
+
+                    dataHolder.addMemberContext(memberContext);
+
+                    // persist in registry
+                    persist();
+
+                    String memberID = memberContext.getMemberId();
+
+                    // trigger topology
+                    TopologyBuilder.handleMemberSpawned(memberID, cartridgeType, clusterId, memberContext.getNetworkPartitionId(),
+                            partition.getId(), ip, memberContext.getLbClusterId());
+
+                    // update the topology with the newly spawned member
+                    // publish data
+                    if (log.isDebugEnabled()) {
+                        log.debug("Node details: \n" + node.toString() + "\n***************\n");
+                    }
+
+            } catch (Exception e) {
+                String msg = "Error occurred while allocating an ip address. " + memberContext.toString();
+                log.error(msg, e);
+                throw new CloudControllerException(msg, e);
+            }
+
+
+        }
+    }
+
 //    private
 //        void
 //        terminateInstance(MemberContext ctxt) throws InvalidCartridgeTypeException,
@@ -1071,3 +1099,4 @@ public class CloudControllerServiceImpl implements CloudControllerService {
     }
 
 }
+