Dear all,
I am adding an API to CloudStack which utilizes Whirr to launch various
clusters on CloudStack. Now I am facing a dependency conflicting issue.
Whirr 0.8.2 requires gson 2.2.2 while CloudStack API requires gson
1.7.1. If I use gson 1.7.1 for Whirr, the following error will happen:
com.google.common.util.concurrent.ExecutionError:
java.lang.NoClassDefFoundError: com/google/gson/TypeAdapter
This TypeAdapter class can be found inside gson-2.2.2.jar. However if I
modify CloudStack to use gson 2.2.2 CloudStack will not build
successfully due to the following test error.
[INFO] Building Apache CloudStack Core 4.1.1
[INFO]
------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ cloud-core
---
[INFO] Deleting /home/meng/cloudstack/core/target
[INFO]
[INFO] --- maven-remote-resources-plugin:1.3:process (default) @
cloud-core ---
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @
cloud-core ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory
/home/meng/cloudstack/core/src/main/resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @
cloud-core ---
[INFO] Compiling 156 source files to
/home/meng/cloudstack/core/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.5:testResources
(default-testResources) @ cloud-core ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory
/home/meng/cloudstack/core/src/test/resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:testCompile
(default-testCompile) @ cloud-core ---
[INFO] Compiling 1 source file to
/home/meng/cloudstack/core/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12:test (default-test) @ cloud-core
---
[INFO] Surefire report directory:
/home/meng/cloudstack/core/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.cloud.agent.transport.RequestTest
log4j:WARN No appenders could be found for logger
(com.cloud.agent.transport.RequestTest).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig
for more info.
Tests run: 4, Failures: 1, Errors: 1, Skipped: 0, Time elapsed: 3.054
sec <<< FAILURE!
Results :
Failed tests: testSerDeser(com.cloud.agent.transport.RequestTest)
Tests in error:
testLogging(com.cloud.agent.transport.RequestTest)
Tests run: 4, Failures: 1, Errors: 1, Skipped: 0
I ran "mvn -P developer clean install -DskipTests" , the CloudStack
building process went through. But when I issued an API --launchCluster
to CloudStack, the following error related to gson popped up on
CloudStack Management Server:
ERROR [agent.transport.Request] (AgentManager-Handler-2:) Caught
problem with
[{"StartupRoutingCommand":{"cpus":2,"speed":3000,"memory":3844370432,"dom0MinMemory":384437043,"poolSync":false,"vms":{"v-2-VM":{"state":"Running"},"s-1-VM":{"state":"Running"},"r-4-VM":{"state":"Running"}},"caps":"hvm,snapshot","pool":"/root","hypervisorType":"KVM","hostDetails":{"com.cloud.network.Networks.RouterPrivateIpStrategy":"HostLocal","Host.OS":"CentOS","Host.OS.Kernel.Version":"2.6.32-358.el6.x86_64","Host.OS.Version":"6.4"},"type":"Routing","dataCenter":"1","pod":"1","cluster":"1","guid":"a7320748-6346-3c9a-975e-90ac4ae4a986-LibvirtComputingResource","name":"meng.acis.ufl.edu","id":2,"version":"4.1.1","publicIpAddress":"10.244.18.55","publicNetmask":"255.0.0.0","publicMacAddress":"00:23:ae:94:f7:22","privateIpAddress":"10.244.18.55","privateMacAddress":"00:23:ae:94:f7:22","privateNetmask":"255.0.0.0","storageIpAddress":"10.244.18.55","storageNetmask":"255.0.0.0","storageMacAddress":"00:23:ae:94:f7:22","resourceName":"LibvirtComputingResource","gatewayIpAddress":"!
10.244.18
.1","contextMap":{},"wait":0}},{"StartupStorageCommand":{"totalSize":0,"poolInfo":{"uuid":"9447c0b1-cc3f-439f-85f6-13d35539a9ed","host":"10.244.18.55","localPath":"/var/lib/libvirt/images/","hostPath":"/var/lib/libvirt/images/","poolType":"Filesystem","capacityBytes":52844687360,"availableBytes":41535332352},"resourceType":"STORAGE_POOL","hostDetails":{},"type":"Storage","dataCenter":"1","pod":"1","guid":"a7320748-6346-3c9a-975e-90ac4ae4a986-LibvirtComputingResource","name":"meng.acis.ufl.edu","id":2,"version":"4.1.1","resourceName":"LibvirtComputingResource","contextMap":{},"wait":0}}]
java.lang.ClassCastException:
com.google.gson.internal.$Gson$Types$GenericArrayTypeImpl cannot be cast
to java.lang.Class
at
com.cloud.agent.transport.ArrayTypeAdaptor.deserialize(ArrayTypeAdaptor.java:84)
at
com.cloud.agent.transport.ArrayTypeAdaptor.deserialize(ArrayTypeAdaptor.java:37)
at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
at com.google.gson.Gson.fromJson(Gson.java:795)
at com.cloud.agent.transport.Request.getCommands(Request.java:235)
at
com.cloud.agent.manager.AgentManagerImpl$AgentHandler.processRequest(AgentManagerImpl.java:1221)
at
com.cloud.agent.manager.AgentManagerImpl$AgentHandler.doTask(AgentManagerImpl.java:1374)
at
com.cloud.agent.manager.ClusteredAgentManagerImpl$ClusteredAgentHandler.doTask(ClusteredAgentManagerImpl.java:659)
at com.cloud.utils.nio.Task.run(Task.java:83)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
WARN [utils.nio.Task] (AgentManager-Handler-2:) Caught the following
exception but pushing on
On the CS Managment console I can see the cluster was started then
quickly died.
Running on provider cloudstack using identity
h3DKHC9AVlhKnUhpyThMuLhC119QfNQQ8xhyjbf_rnu5ZL1QeOWdw7aZRGXVO1VApG6q0aK-A-tQRQsZFwnOXQ
INFO [whirr.actions.BootstrapClusterAction]
(729061754@qtp-385354117-0:) Bootstrapping cluster
INFO [whirr.compute.BootstrapTemplate] (729061754@qtp-385354117-0:)
Configuring template for bootstrap-hadoop-datanode_hadoop-tasktracker
INFO [whirr.compute.BootstrapTemplate] (729061754@qtp-385354117-0:)
Configuring template for bootstrap-hadoop-namenode_hadoop-jobtracker
INFO [whirr.compute.NodeStarter] (pool-4-thread-2:) Starting 1 node(s)
with roles [hadoop-datanode, hadoop-tasktracker]
INFO [whirr.compute.NodeStarter] (pool-4-thread-4:) Starting 1 node(s)
with roles [hadoop-namenode, hadoop-jobtracker]
...
INFO [whirr.actions.DestroyClusterAction] (729061754@qtp-385354117-0:)
Cluster hadoop destroyed
I attached the debuging log to this email.
The launchCluster API is simple, it calls the LaunchClusterCommand in
Whirr to launch a cluster.
LaunchClusterResponse response = new LaunchClusterResponse();
response.setObjectName("launchCluster");
LaunchClusterCommand command = null;
try {
command = new LaunchClusterCommand();
} catch (Exception ex) {
Logger.getLogger(LaunchClusterCmd.class.getName()).log(Level.SEVERE,
null, ex);
}
String[] args = new String[2];
args[0] = "--config";
args[1] = config;
try {
command.run(System.in, System.out, System.err,
Arrays.asList(args));
} catch (Exception ex) {
Logger.getLogger(LaunchClusterCmd.class.getName()).log(Level.SEVERE,
null, ex);
}
response.setResponseName(getCommandName());
output = "successfully launched the cluster.";
response.setOutPut(output);
response.setAsync(Boolean.FALSE);
this.setResponseObject(response);
Could someone help me out here? What would be a proper gson version for
CloudStack and Whirr to run at the same time?
Thanks loads.
Best Regards,
Meng