Repository: stratos
Updated Branches:
refs/heads/stratos-4.1.x 246c83418 -> c9115e4db
fixing for updating configurations/definitions not getting picked
Conflicts:
components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/60c1a14d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/60c1a14d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/60c1a14d
Branch: refs/heads/stratos-4.1.x
Commit: 60c1a14d2cb8edbe5b49737bd0489d64af8f3c16
Parents: 246c834
Author: Isuru Haththotuwa <[email protected]>
Authored: Tue Nov 17 10:37:27 2015 +0530
Committer: Isuru Haththotuwa <[email protected]>
Committed: Tue Nov 17 15:31:45 2015 +0530
----------------------------------------------------------------------
.../context/CloudControllerContext.java | 116 ++++++++--
.../cloud/controller/domain/IaasProvider.java | 68 ++++--
.../controller/domain/NetworkInterface.java | 16 ++
.../cloud/controller/iaases/ec2/EC2Iaas.java | 12 +
.../impl/CloudControllerServiceImpl.java | 14 +-
.../controller/util/CloudControllerUtil.java | 217 ++++++++++++++-----
6 files changed, 352 insertions(+), 91 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/60c1a14d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
index b935ffc..2c87707 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
@@ -22,16 +22,20 @@ import org.apache.axis2.engine.AxisConfiguration;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cloud.controller.config.CloudControllerConfig;
import org.apache.stratos.cloud.controller.domain.*;
import org.apache.stratos.cloud.controller.domain.kubernetes.KubernetesCluster;
import
org.apache.stratos.cloud.controller.domain.kubernetes.KubernetesClusterContext;
import org.apache.stratos.cloud.controller.domain.kubernetes.KubernetesHost;
import org.apache.stratos.cloud.controller.domain.kubernetes.KubernetesMaster;
+import
org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
import
org.apache.stratos.cloud.controller.exception.NonExistingKubernetesClusterException;
import
org.apache.stratos.cloud.controller.exception.NonExistingKubernetesHostException;
+import org.apache.stratos.cloud.controller.iaases.Iaas;
import org.apache.stratos.cloud.controller.internal.ServiceReferenceHolder;
import org.apache.stratos.cloud.controller.registry.RegistryManager;
import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
+import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
import org.apache.stratos.common.services.DistributedObjectProvider;
import org.apache.stratos.common.threading.StratosThreadPool;
import org.wso2.carbon.databridge.agent.thrift.AsyncDataPublisher;
@@ -69,6 +73,8 @@ public class CloudControllerContext implements Serializable {
private static final String CC_CARTRIDGE_TYPE_TO_IAAS_PROVIDER_MAP =
"CC_CARTRIDGE_TYPE_TO_IAAS_PROVIDER_MAP";
private static final String
CC_APPLICATION_ID_TO_CLUSTER_ID_TO_PORT_MAPPING_MAP
= "CC_APPLICATION_ID_TO_CLUSTER_ID_TO_PORT_MAPPING_MAP";
+ private static final String CC_PARTITION_ID_TO_PARTITION_MAP =
+ "CC_PARTITION_ID_TO_PARTITION_MAP";
private static final String CC_CLUSTER_CTX_WRITE_LOCK =
"CC_CLUSTER_CTX_WRITE_LOCK";
private static final String CC_MEMBER_CTX_WRITE_LOCK =
"CC_MEMBER_CTX_WRITE_LOCK";
@@ -149,6 +155,13 @@ public class CloudControllerContext implements
Serializable {
private Map<String, ServiceGroup> serviceGroupNameToServiceGroupMap;
/**
+ * Map of partitions
+ * Key - partition id
+ * Value partition
+ */
+ private Map<String, Partition> partitionIdToPartitionMap;
+
+ /**
* Map of network partitions
* Key - network partition id
* Value network partition
@@ -210,6 +223,7 @@ public class CloudControllerContext implements Serializable
{
cartridgeTypeToIaasProviders =
distributedObjectProvider.getMap(CC_CARTRIDGE_TYPE_TO_IAAS_PROVIDER_MAP);
applicationIdToClusterIdToPortMappings = distributedObjectProvider
.getMap(CC_APPLICATION_ID_TO_CLUSTER_ID_TO_PORT_MAPPING_MAP);
+ partitionIdToPartitionMap =
distributedObjectProvider.getMap(CC_PARTITION_ID_TO_PARTITION_MAP);
if (!unitTest) {
// Update context from the registry
@@ -718,6 +732,7 @@ public class CloudControllerContext implements Serializable
{
copyMap(serializedObj.cartridgeTypeToIaasProviders,
cartridgeTypeToIaasProviders);
copyMap(serializedObj.applicationIdToClusterIdToPortMappings,
applicationIdToClusterIdToPortMappings);
+ copyMap(serializedObj.partitionIdToPartitionMap,
partitionIdToPartitionMap);
if (log.isDebugEnabled()) {
log.debug("Cloud controller context is read from
the registry");
@@ -748,18 +763,16 @@ public class CloudControllerContext implements
Serializable {
}
}
- public Map<String, Map<String, IaasProvider>>
getPartitionToIaasProviderByCartridge() {
- return partitionToIaasProviderByCartridge;
- }
-
- public void setPartitionToIaasProvider(Map<String, Map<String,
IaasProvider>> partitionToIaasProviderByCartridge) {
- this.partitionToIaasProviderByCartridge =
partitionToIaasProviderByCartridge;
- }
-
public void addIaasProvider(String cartridgeType, String partitionId,
IaasProvider iaasProvider) {
- Map<String, IaasProvider> partitionToIaasProvider = new
ConcurrentHashMap<String, IaasProvider>();
- partitionToIaasProvider.put(partitionId, iaasProvider);
- partitionToIaasProviderByCartridge.put(cartridgeType,
partitionToIaasProvider);
+ Map<String, IaasProvider> partitionToIaasProviders;
+ if (partitionToIaasProviderByCartridge.get(cartridgeType) != null) {
+ partitionToIaasProviders =
partitionToIaasProviderByCartridge.get(cartridgeType);
+ } else {
+ partitionToIaasProviders = new ConcurrentHashMap<String,
IaasProvider>();
+ }
+
+ partitionToIaasProviders.put(partitionId, iaasProvider);
+ partitionToIaasProviderByCartridge.put(cartridgeType,
partitionToIaasProviders);
}
public void addIaasProviders(String cartridgeType, Map<String,
IaasProvider> partitionToIaasProvidersMap) {
@@ -783,23 +796,63 @@ public class CloudControllerContext implements
Serializable {
}
public IaasProvider getIaasProviderOfPartition(String cartridgeType,
String partitionId) {
- if (log.isDebugEnabled()) {
- log.debug("Retrieving partition: " + partitionId + " for the
Cartridge: " + this.hashCode() + ". "
- + "Current Partition List: " +
getPartitionToIaasProvider(cartridgeType).keySet().toString());
+
+ IaasProvider cachedIaasProvider =
getPartitionToIaasProvider(cartridgeType).get(partitionId);
+
+ // get relevant partition
+ Partition partition = partitionIdToPartitionMap.get(partitionId);
+ if (partition == null) {
+ log.warn("No partition found with partition id " + partitionId +
", will not " +
+ "re-build the IaasProvider");
+ // can't rebuild, return the previously cached IaasProvider object
+ return cachedIaasProvider;
}
- return getPartitionToIaasProvider(cartridgeType).get(partitionId);
- }
- public Map<String, IaasProvider> getPartitionToIaasProvider(String
cartridgeType) {
- return this.partitionToIaasProviderByCartridge.get(cartridgeType);
- }
+ // get the relevant Cartridge
+ Cartridge cartridge = cartridgeTypeToCartridgeMap.get(cartridgeType);
+ if (cartridge == null) {
+ log.warn("No Cartridge definition found for cartridge type " +
cartridgeType
+ + ", will not re-build the IaasProvider");
+ // can't rebuild, return the previously cached IaasProvider object
+ return cachedIaasProvider;
+ }
+
+ IaasProvider newIaasProvider = null;
+ try {
+ newIaasProvider =
CloudControllerUtil.getUpdatedIaasProviderInstance(cartridge, partition);
+
+ } catch (InvalidIaasProviderException e) {
+ log.error("Error in rebuilding the IaasProvider ", e);
+ // can't rebuild, return the previously cached IaasProvider object
+ return cachedIaasProvider;
+ }
+
+ // if the two objects are equal, no need to build again
+ if (cachedIaasProvider.equals(newIaasProvider)) {
+ log.info("New IaaSProvider object is equal to the cached one, no
need to re-build");
+ return cachedIaasProvider;
+ }
+
+ // build
+ newIaasProvider.buildIaas();
+ log.info("Successfully built new IaasProvider object: " +
newIaasProvider.toString());
+ // cache the new IaasProvider object
+ addIaasProvider(cartridgeType, partitionId, newIaasProvider);
+ addIaasProvider(cartridgeType, newIaasProvider);
+
+ // persist
+ try {
+ CloudControllerContext.getInstance().persist();
+ } catch (RegistryException e) {
+ log.error("Error in persisting changes for new IaasProvider
object: " + newIaasProvider
+ .toString(), e);
+ }
- public Map<String, List<IaasProvider>> getCartridgeTypeToIaasProviders() {
- return this.cartridgeTypeToIaasProviders;
+ return newIaasProvider;
}
- public void setCartridgeTypeToIaasProviders(Map<String,
List<IaasProvider>> cartridgeTypeToIaasProviders) {
- this.cartridgeTypeToIaasProviders = cartridgeTypeToIaasProviders;
+ public Map<String, IaasProvider> getPartitionToIaasProvider(String
cartridgeType) {
+ return this.partitionToIaasProviderByCartridge.get(cartridgeType);
}
public void addIaasProvider(String cartridgeType, IaasProvider
iaasProvider) {
@@ -896,4 +949,21 @@ public class CloudControllerContext implements
Serializable {
applicationIdToClusterIdToPortMappings.remove(applicationId);
}
}
+
+ public void addPartition (Partition partition) {
+
+ partitionIdToPartitionMap.put(partition.getId(), partition);
+ log.info("Cached partition " + partition.toString() + " in
partitionIdToPartitionMap");
+ }
+
+ public Partition getPartition (String partitionId) {
+
+ return partitionIdToPartitionMap.get(partitionId);
+ }
+
+ public void removePartition (String partitionId) {
+
+ partitionIdToPartitionMap.remove(partitionId);
+ log.info("Removed partition " + partitionId + " from
partitionIdToPartitionMap");
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/60c1a14d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
index 49bc65d..917ca21 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
@@ -27,6 +27,7 @@ import org.jclouds.compute.ComputeService;
import org.jclouds.compute.domain.Template;
import java.io.Serializable;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -58,7 +59,60 @@ public class IaasProvider implements Serializable {
*/
private Map<String, String> properties = new HashMap<String, String>();
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ IaasProvider that = (IaasProvider) o;
+
+ if (type != null ? !type.equals(that.type) : that.type != null) {
+ return false;
+ }
+ if (className != null ? !className.equals(that.className) :
that.className != null) {
+ return false;
+ }
+ if (name != null ? !name.equals(that.name) : that.name != null) {
+ return false;
+ }
+ if (properties != null ? !properties.equals(that.properties) :
that.properties != null) {
+ return false;
+ }
+ if (!Arrays.equals(networkInterfaces, that.networkInterfaces)) {
+ return false;
+ }
+ if (image != null ? !image.equals(that.image) : that.image != null) {
+ return false;
+ }
+ if (provider != null ? !provider.equals(that.provider) : that.provider
!= null) {
+ return false;
+ }
+ if (identity != null ? !identity.equals(that.identity) : that.identity
!= null) {
+ return false;
+ }
+ return !(credential != null ? !credential.equals(that.credential) :
that.credential != null);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = type != null ? type.hashCode() : 0;
+ result = 31 * result + (className != null ? className.hashCode() : 0);
+ result = 31 * result + (name != null ? name.hashCode() : 0);
+ result = 31 * result + (properties != null ? properties.hashCode() :
0);
+ result = 31 * result + (networkInterfaces != null ?
Arrays.hashCode(networkInterfaces) : 0);
+ result = 31 * result + (image != null ? image.hashCode() : 0);
+ result = 31 * result + (provider != null ? provider.hashCode() : 0);
+ result = 31 * result + (identity != null ? identity.hashCode() : 0);
+ result = 31 * result + (credential != null ? credential.hashCode() :
0);
+ return result;
+ }
+
/**
+
* Network Interfaces Configuration
*/
private NetworkInterface[] networkInterfaces;
@@ -187,20 +241,6 @@ public class IaasProvider implements Serializable {
this.template = template;
}
- public boolean equals(Object o) {
- if (o instanceof IaasProvider) {
- return ((IaasProvider) o).getType().equals(this.getType());
- }
-
- return false;
- }
-
- public int hashCode() {
- return new HashCodeBuilder(17, 31). // two randomly chosen prime
numbers
- append(type).
- toHashCode();
- }
-
public IaasProvider copy() {
return new IaasProvider(this);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/60c1a14d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkInterface.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkInterface.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkInterface.java
index 43add4a..1747c47 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkInterface.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/NetworkInterface.java
@@ -114,4 +114,20 @@ public class NetworkInterface implements Serializable {
sb.append('}');
return sb.toString();
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ NetworkInterface that = (NetworkInterface) o;
+
+ return !(networkUuid != null ? !networkUuid.equals(that.networkUuid) :
that.networkUuid != null);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return networkUuid != null ? networkUuid.hashCode() : 0;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/60c1a14d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/ec2/EC2Iaas.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/ec2/EC2Iaas.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/ec2/EC2Iaas.java
index ab1a31e..62fe0db 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/ec2/EC2Iaas.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/ec2/EC2Iaas.java
@@ -97,6 +97,18 @@ public class EC2Iaas extends JcloudsIaas {
break;
}
}
+ } else if (iaasInfo.getProperty(CloudControllerConstants.ZONE_ELEMENT)
!= null) {
+ Set<? extends Location> locations =
iaasInfo.getComputeService().listAssignableLocations();
+ for (Location location : locations) {
+ if
(location.getScope().toString().equalsIgnoreCase(CloudControllerConstants.ZONE_ELEMENT)
&& location
+
.getId().equals(iaasInfo.getProperty(CloudControllerConstants.ZONE_ELEMENT))) {
+ templateBuilder.locationId(location.getId());
+ log.info("ZONE has been set as " + iaasInfo.getProperty
+ (CloudControllerConstants.ZONE_ELEMENT)
+ + " with id: " + location.getId());
+ break;
+ }
+ }
}
if (iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE) !=
null) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/60c1a14d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
index c841a81..4fde614 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
@@ -38,11 +38,10 @@ import org.apache.stratos.common.Property;
import org.apache.stratos.common.domain.LoadBalancingIPType;
import org.apache.stratos.common.threading.StratosThreadPool;
import org.apache.stratos.messaging.domain.topology.*;
-import org.wso2.carbon.registry.core.exceptions.RegistryException;
import java.util.*;
import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.locks.Lock;
@@ -1588,6 +1587,8 @@ public class CloudControllerServiceImpl implements
CloudControllerService {
partition.setProvider(networkPartition.getProvider());
try {
validatePartition(partition);
+ // add Partition to partition map
+
CloudControllerContext.getInstance().addPartition(partition);
} catch (InvalidPartitionException e) {
//Following message is shown to the end user in all
the the API clients(GUI/CLI/Rest API)
throw new
InvalidNetworkPartitionException(String.format(
@@ -1638,6 +1639,13 @@ public class CloudControllerServiceImpl implements
CloudControllerService {
log.error(message);
throw new NetworkPartitionNotExistsException(message);
}
+
+ // remove partitions from the partition map
+ for (Partition partition :
cloudControllerContext.getNetworkPartition(networkPartitionId)
+ .getPartitions()) {
+
CloudControllerContext.getInstance().removePartition(partition.getId());
+ }
+
// removing from CC-Context
CloudControllerContext.getInstance().removeNetworkPartition(networkPartitionId);
// persisting CC-Context
@@ -1682,6 +1690,8 @@ public class CloudControllerServiceImpl implements
CloudControllerService {
// Overwrites partition provider with network
partition provider
partition.setProvider(networkPartition.getProvider());
validatePartition(partition);
+ // add Partition to partition map
+
CloudControllerContext.getInstance().addPartition(partition);
if (log.isInfoEnabled()) {
log.info(String.format("Partition validated
successfully: [network-partition-id] %s "
+ "[partition-id] %s",
networkPartition.getId(), partition.getId()));
http://git-wip-us.apache.org/repos/asf/stratos/blob/60c1a14d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
----------------------------------------------------------------------
diff --git
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
index 2133ef0..e5af849 100644
---
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
+++
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerUtil.java
@@ -37,11 +37,11 @@ import
org.apache.stratos.cloud.controller.registry.RegistryManager;
import org.apache.stratos.common.Property;
import org.apache.stratos.common.domain.LoadBalancingIPType;
import org.apache.stratos.messaging.domain.topology.Topology;
-import org.wso2.carbon.registry.core.exceptions.RegistryException;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
@@ -64,7 +64,7 @@ public class CloudControllerUtil {
}
}
- public static void extractIaaSProvidersFromCartridge(Cartridge cartridge) {
+ public static void extractIaaSProvidersFromCartridge(Cartridge cartridge)
throws InvalidIaasProviderException {
if (cartridge == null) {
return;
}
@@ -75,67 +75,23 @@ public class CloudControllerUtil {
if (iaasConfigs != null) {
for (IaasConfig iaasConfig : iaasConfigs) {
if (iaasConfig != null) {
- IaasProvider iaasProvider = null;
+ IaasProvider matchingIaasProviderInCC = null;
if (iaases != null) {
// check whether this is a reference to a predefined
IaaS.
for (IaasProvider iaas : iaases) {
if (iaas.getType().equals(iaasConfig.getType())) {
- iaasProvider = new IaasProvider(iaas);
+ matchingIaasProviderInCC = iaas;
break;
}
}
}
- if (iaasProvider == null) {
- iaasProvider = new IaasProvider();
- iaasProvider.setType(iaasConfig.getType());
+ if (matchingIaasProviderInCC == null) {
+ matchingIaasProviderInCC = new IaasProvider();
+ matchingIaasProviderInCC.setType(iaasConfig.getType());
}
- String className = iaasConfig.getClassName();
- if (className != null) {
- iaasProvider.setClassName(className);
- }
-
- String name = iaasConfig.getName();
- if (name != null) {
- iaasProvider.setName(name);
- }
-
- String identity = iaasConfig.getIdentity();
- if (identity != null) {
- iaasProvider.setIdentity(identity);
- }
-
- String credential = iaasConfig.getCredential();
- if (credential != null) {
- iaasProvider.setCredential(credential);
- }
-
- String provider = iaasConfig.getProvider();
- if (provider != null) {
- iaasProvider.setProvider(provider);
- }
- String imageId = iaasConfig.getImageId();
- if (imageId != null) {
- iaasProvider.setImage(imageId);
- }
-
- byte[] payload = iaasConfig.getPayload();
- if (payload != null) {
- iaasProvider.setPayload(payload);
- }
-
- org.apache.stratos.common.Properties props1 =
iaasConfig.getProperties();
- if (props1 != null) {
- for (Property prop : props1.getProperties()) {
- iaasProvider.addProperty(prop.getName(),
String.valueOf(prop.getValue()));
- }
- }
-
- NetworkInterfaces networkInterfaces =
iaasConfig.getNetworkInterfaces();
- if (networkInterfaces != null &&
networkInterfaces.getNetworkInterfaces() != null) {
-
iaasProvider.setNetworkInterfaces(networkInterfaces.getNetworkInterfaces());
- }
+ IaasProvider iaasProvider =
createUpdatedIaasProviderObject(iaasConfig, matchingIaasProviderInCC);
CloudControllerContext.getInstance().addIaasProvider(cartridge.getType(),
iaasProvider);
}
@@ -334,4 +290,161 @@ public class CloudControllerUtil {
public static String getAliasFromClusterId(String clusterId) {
return
StringUtils.substringBefore(StringUtils.substringAfter(clusterId, "."), ".");
}
+
+ public static IaasProvider getUpdatedIaasProviderInstance (Cartridge
cartridge, Partition partition)
+ throws InvalidIaasProviderException {
+
+ IaasConfig cartridgeIaasConfig = null;
+ for (IaasConfig anIaasConfig : cartridge.getIaasConfigs()) {
+ if (anIaasConfig.getType().equals(partition.getProvider())) {
+ cartridgeIaasConfig = anIaasConfig;
+ }
+ }
+
+ // get the correct IaaS Provider config from cloud-controller.xml
+ IaasProvider ccIaasProvider =
CloudControllerConfig.getInstance().getIaasProvider(partition
+ .getProvider());
+
+ if (ccIaasProvider == null) {
+ String errorMsg = "No Iaas Provider configuration found in
cloud-controller.xml for " +
+ "type " + partition.getProvider();
+ log.error(errorMsg);
+ throw new InvalidIaasProviderException(errorMsg);
+ }
+
+ IaasProvider iaasProvider = null;
+ // update with new cloud-controller.xml and cartridge definition
changes
+ if (cartridgeIaasConfig == null) {
+ iaasProvider = ccIaasProvider;
+ } else {
+ iaasProvider =
createUpdatedIaasProviderObject(cartridgeIaasConfig, ccIaasProvider);
+ }
+
+ // update with Partition properties
+ if (partition.getProperties() != null &&
partition.getProperties().getProperties() != null) {
+ for (Property property :
partition.getProperties().getProperties()) {
+ iaasProvider.addProperty(property.getName(),
property.getValue());
+ }
+ }
+
+ //TODO: make debug
+ logProperties(iaasProvider.getType(), iaasProvider.getProperties(),
cartridge.getType(),
+ partition.getId());
+
+ //TODO: make debug
+ logNetworkInterfaces(iaasProvider.getType(),
iaasProvider.getNetworkInterfaces());
+
+ return iaasProvider;
+ }
+
+ private static IaasProvider createUpdatedIaasProviderObject (IaasConfig
cartridgeIaasConfig,
+ IaasProvider
ccIaasProvider)
+ throws InvalidIaasProviderException {
+
+ // create a deep copy of the IaaSProvider, not a reference
+ IaasProvider newIaasProvider = new IaasProvider(ccIaasProvider);
+
+ // priority order
+ // 1. cartridge definition
+ // 2. cloud-controller.xml
+ newIaasProvider.setClassName(selectAttribute("className",
cartridgeIaasConfig.getClassName(),
+ ccIaasProvider.getClassName(), true));
+
+ // should not log identity details even in debug logs
+ newIaasProvider.setIdentity(selectAttribute("identity",
cartridgeIaasConfig.getIdentity(),
+ ccIaasProvider.getIdentity(), false));
+
+ // should not log credentials details even in debug logs
+ newIaasProvider.setCredential(selectAttribute("credential",
cartridgeIaasConfig.getCredential(),
+ ccIaasProvider.getCredential(), false));
+
+ newIaasProvider.setProvider(selectAttribute("provider",
cartridgeIaasConfig.getProvider(),
+ ccIaasProvider.getProvider(), true));
+
+ newIaasProvider.setImage(selectAttribute("imageId",
cartridgeIaasConfig.getImageId(),
+ ccIaasProvider.getImage(), true));
+
+ byte[] payload = cartridgeIaasConfig.getPayload();
+ if (payload != null) {
+ newIaasProvider.setPayload(payload);
+ }
+
+ Map<String, String> ccIaasProperties = ccIaasProvider.getProperties();
+ if (ccIaasProperties != null) {
+ for (Map.Entry<String, String> ccIaasProperty :
ccIaasProperties.entrySet()) {
+ newIaasProvider.addProperty(ccIaasProperty.getKey(),
ccIaasProperty.getValue());
+ }
+ }
+
+ // add properties defined in Cartridge and cloud-controller.xml
+ org.apache.stratos.common.Properties cartridgeIaasProperties =
cartridgeIaasConfig.getProperties();
+ if (cartridgeIaasProperties != null) {
+ for (Property prop : cartridgeIaasProperties.getProperties()) {
+ newIaasProvider.addProperty(prop.getName(),
String.valueOf(prop.getValue()));
+ }
+ }
+
+ NetworkInterfaces networkInterfacesInCartridge =
cartridgeIaasConfig.getNetworkInterfaces();
+ NetworkInterface[] networkInterfacesInCC =
ccIaasProvider.getNetworkInterfaces();
+ if (networkInterfacesInCartridge != null &&
networkInterfacesInCartridge.getNetworkInterfaces().length > 0) {
+ newIaasProvider.setNetworkInterfaces(networkInterfacesInCartridge
+ .getNetworkInterfaces());
+ } else if (networkInterfacesInCC != null &&
networkInterfacesInCC.length > 0) {
+ newIaasProvider.setNetworkInterfaces(networkInterfacesInCC);
+ } else {
+ log.debug("No network interface definition set for IaaS provider "
+ newIaasProvider.getType());
+ }
+
+ return newIaasProvider;
+ }
+
+ private static String selectAttribute(String attributeName, String
attributeDefinedInCartridge,
+ String attributeDefinedInCC, boolean
logInfo) throws InvalidIaasProviderException {
+
+ if (attributeDefinedInCartridge != null) {
+ // TODO: make debug
+ if (logInfo) {
+ log.info("Selected " + attributeName + "=" +
+ attributeDefinedInCartridge + " from Cartridge
Definition");
+ }
+ return attributeDefinedInCartridge;
+ } else if (attributeDefinedInCC != null) {
+ // TODO: make debug
+ if (logInfo) {
+ log.info("Selected " + attributeName + "=" +
+ attributeDefinedInCC + " from cloud-controller.xml
configuration");
+ }
+ return attributeDefinedInCC;
+ } else {
+ String errorMsg = "Iaas Provider attribute " + attributeName + "
not set in " +
+ "either cartridge definition of cloud-controller.xml";
+ log.error(errorMsg);
+ throw new InvalidIaasProviderException(errorMsg);
+ }
+ }
+
+ private static void logNetworkInterfaces (String iaasProviderType,
NetworkInterface[] networkInterfaces) {
+
+ if (networkInterfaces != null) {
+ log.info("All Network interfaces in IaasProvider object for type:
" +
+ iaasProviderType);
+ for (NetworkInterface nwInterface : networkInterfaces) {
+ log.info("Interface " + nwInterface.toString());
+ }
+ }
+ }
+
+ private static void logProperties(String iaasProviderType, Map<String,
String> properties,
+ String cartridgeType, String
partitionId) {
+
+ if (properties != null) {
+ log.info("Properties defined in IaasProvider object for type: " +
+ iaasProviderType + ", cartridge type: " + cartridgeType +
", partition: " +
+ partitionId);
+ for (Map.Entry<String, String> property : properties.entrySet()) {
+ log.info("Property key: " + property.getKey() + ", value: " +
+ property.getValue());
+ }
+ }
+ }
}