After much searching I found the two lines of code I needed to get it to serialize right. I'll keep looking and see if I find other snags. Maybe we can just move to jackson.... we'll see, haven't tried to deserialize yet.
Darren > On Sep 19, 2013, at 4:25 PM, Alex Huang <alex.hu...@citrix.com> wrote: > > Darren, > > When I looked into updating to the latest gson, the problem, IIRC, is things > that weren't considered cyclical dependencies are suddenly considered > cyclical with the latest. I don't recall where though. > > --Alex > >> -----Original Message----- >> From: Darren Shepherd [mailto:darren.s.sheph...@gmail.com] >> Sent: Thursday, September 19, 2013 1:33 PM >> To: dev@cloudstack.apache.org >> Subject: Re: conflicting dependencies between CloudStack and Whirr >> >> Alright, I looked into this and it will take a bit more work to switch to >> Jackson. >> The snag I hit was how we serialize commands for the agents. We use a >> customer typeadatper in gson to produce a format like { "org.MyClass" >> : {...} }. In jackson I don't see producing a similar format as being so >> straight >> forward. I'm sure there's an elegant solution, but I didn't immediately >> find it. >> The problem is if you use a custom serializer in jackson and do >> writeObjectField(x.getClass().getName(), x), you'll get stuck in a loop >> because it will call your serializer again. So if somebody can figure out >> how to >> do this format easily in jackson, the rest looks simple enough. >> >> So, being that it is not an obvious switch to using jackson, what is the >> impact >> of moving to the latest gson? What were the issue encountered when >> people tried it before? >> >> Darren >> >> >> On Wed, Sep 18, 2013 at 4:42 PM, Darren Shepherd < >> darren.s.sheph...@gmail.com> wrote: >> >>> I can do some analysis on this. I'm always up for a terribly painful >>> refactor :) >>> >>> Darren >>> >>> >>>> On Wed, Sep 18, 2013 at 4:06 PM, Alex Huang <alex.hu...@citrix.com> >>> wrote: >>> >>>> I actually did a quick try to update cloudstack to use newest gson >>>> version about 3 months back. Had to roll it back but I didn't try >>>> very hard though. Part of the reason why I decided to rollback is >>>> due to gson is used differently by various components in CloudStack >>>> and I didn't have time to get into each component to see if I break >>>> anything. The other is also I thought using Jackson would be much >>>> better and thought our next attempt should be with Jackson. >>>> >>>> Not that any of these helps you. Just know updating CloudStack to >>>> latest gson is not simple. >>>> >>>> --Alex >>>> >>>>> -----Original Message----- >>>>> From: Andrei Savu [mailto:savu.and...@gmail.com] >>>>> Sent: Wednesday, September 18, 2013 10:53 AM >>>>> To: d...@whirr.apache.org >>>>> Cc: dev@cloudstack.apache.org >>>>> Subject: Re: conflicting dependencies between CloudStack and Whirr >>>>> >>>>> It's easy to usr jclouds and whirr inside an OSGi container - just >>>>> add >>>> the >>>>> feature url. Bonus: you can also use jclouds shell interface (part >>>>> of >>>> jclouds cli). >>>>> >>>>> Another option is to upgrade the CloudStack API to use the new version. >>>>>> On Sep 18, 2013 5:14 AM, "Han,Meng" <meng...@ufl.edu> wrote: >>>>>> >>>>>> 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< >>>> http://logging.apa >>>>> che.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 >> h3DKHC9AVlhKnUhpyThMuLhC119QfN**QQ8xhyjbf_**rnu5ZL1QeOWdw7a >>>>> ZRGXVO1VApG >>>>>> 6q0a >>>>>> **K-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.SE >>>>> VER >>>>>> E, >>>>>> 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.SE >>>>> VER >>>>>> E, >>>>>> 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 >>> >>>