cloudfoundry-community/bosh-cloudstack-cpi-release

Need to update findZoneId() in CacheableCloudstackConnector to deal with multiplte zones

Closed this issue · 4 comments

We're having a cloudstack deployment with 2 zones.

We want one of the bosh to use the second zone.

The current implementation of findZoneId() does not deal with multiple zones on callback (as said in line 96), it does not iterate over responses.

Differents implementations are possible, with java stream api or a simple iterator, both working.

Seems evident but just in case :

12:18:52.099 [hystrix-CPIImpl-1] DEBUG wire - << "{"listzonesresponse":{"count":2,"zone":[{"id":"976547d9-fcb6-4e94-9521-f051897064ea","name":"SPH-IAAS", [....]  ,"enable.dynamic.scale.vm":"true"}},{"id":"8f994078-cb27-4362-9626-f536d8fb1ea8","name":"SPH-2", [....] "enable.dynamic.scale.vm":"true"}}]}}"
12:18:52.154 [http-nio-8080-exec-2] ERROR CPIAdapterImpl - Caught Exception {}, converted to CPI response.
java.lang.IllegalArgumentException: Zone not found SPH-2
        at org.springframework.util.Assert.isTrue(Assert.java:68)
        at com.orange.oss.cloudfoundry.cspi.cloudstack.CacheableCloudstackConnector.findZoneId(CacheableCloudstackConnector.java:103)
        at com.orange.oss.cloudfoundry.cspi.cloudstack.CacheableCloudstackConnector$$FastClassBySpringCGLIB$$a9a66b7c.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.cache.interceptor.CacheInterceptor$1.invoke(CacheInterceptor.java:52)
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:345)
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:408)
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:327)
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
        at com.orange.oss.cloudfoundry.cspi.cloudstack.CacheableCloudstackConnector$$EnhancerBySpringCGLIB$$c951ab11.findZoneId(<generated>)
        at com.orange.oss.cloudfoundry.cscpi.logic.CPIImpl.create_stemcell(CPIImpl.java:496)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.netflix.hystrix.contrib.javanica.command.MethodExecutionAction.execute(MethodExecutionAction.java:116)
        at com.netflix.hystrix.contrib.javanica.command.MethodExecutionAction.executeWithArgs(MethodExecutionAction.java:93)
        at com.netflix.hystrix.contrib.javanica.command.MethodExecutionAction.execute(MethodExecutionAction.java:78)
        at com.netflix.hystrix.contrib.javanica.command.GenericCommand$1.execute(GenericCommand.java:47)
        at com.netflix.hystrix.contrib.javanica.command.AbstractHystrixCommand.process(AbstractHystrixCommand.java:145)
        at com.netflix.hystrix.contrib.javanica.command.GenericCommand.run(GenericCommand.java:44)
        at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:301)
        at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:297)
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
        at rx.Observable.unsafeSubscribe(Observable.java:10211)
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
        at rx.Observable.unsafeSubscribe(Observable.java:10211)
        at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
        at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
        at rx.Observable.unsafeSubscribe(Observable.java:10211)
        at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
        at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56)
        at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47)
        at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69)
        at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

With very little change (tested right now on CS 4.8.0.1)

zones.forEach( zone -> {
			if(zone.getName().equals(this.cloudstackConfig.default_zone)) {
				return zone.getId();
			}
			});
		
                       Assert.isTrue(zone.getName().equals(this.cloudstackConfig.default_zone),
				"Zone not found " + this.cloudstackConfig.default_zone);

Callback payload correctly handled :

01:57:59.072 [main] DEBUG jclouds.wire - << "{"listzonesresponse":{"count":2,"zone":[{"id":"af26e363-dbe9-40e6-9768-7628957ee0a9","name":"Test","networktype":"Advanced","securitygroupsenabled":false,"allocationstate":"Enabled","zonetoken":"e5b87077-3e68-31de-ab80-36897c0bfc00","dhcpprovider":"VirtualRouter","localstorageenabled":true,"tags":[],"resourcedetails":{"system.vm.use.local.storage":"true"}},{"id":"ad1373ba-f97c-443f-ab77-b90b1dfd6ee1","name":"TEST-API","networktype":"Advanced","securitygroupsenabled":false,"allocationstate":"Enabled","zonetoken":"b334a518-cc92-3834-a6ea-155318fc459e","dhcpprovider":"VirtualRouter","localstorageenabled":false,"tags":[]}]}}"

@f-guichard yes, it is a bug. As a workaround, you can adjust the cloudstack bosh account to reduce its visibility to single zone.

fixed by cpi v19