cloudfoundry-community / bosh-cloudstack-cpi-release

a bosh external CPI Provider for CloudStack Iaas
Apache License 2.0
5 stars 7 forks source link

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

Closed f-guichard closed 7 years ago

f-guichard commented 7 years ago

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.

f-guichard commented 7 years ago

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)
f-guichard commented 7 years ago

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":[]}]}}"
poblin-orange commented 7 years ago

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

poblin-orange commented 7 years ago

fixed by cpi v19