spinnaker: Patch deployment fails: Cannot deserialize instance of com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest

Issue Summary:

A patch deployment stage in a pipeline fails with this error shown in the Spinnaker UI:

Exception ( Monitor Patch )
Cannot deserialize instance of com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest out of START_ARRAY token at [Source: UNKNOWN; line: -1, column: -1]

And here’s the clouddriver log output:

2019-01-04 10:45:55.889 ERROR 1 --- [ool-6-thread-35] c.n.s.c.o.DefaultOrchestrationProcessor  : java.lang.IllegalArgumentException: Cannot deserialize instance of `com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest` out of START_ARRAY token
 at [Source: UNKNOWN; line: -1, column: -1]
	at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3750)
	at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3668)
	at com.netflix.spinnaker.clouddriver.kubernetes.v2.op.manifest.KubernetesPatchManifestOperation.replaceArtifacts(KubernetesPatchManifestOperation.java:109)
	at com.netflix.spinnaker.clouddriver.kubernetes.v2.op.manifest.KubernetesPatchManifestOperation.operate(KubernetesPatchManifestOperation.java:88)
	at com.netflix.spinnaker.clouddriver.kubernetes.v2.op.manifest.KubernetesPatchManifestOperation.operate(KubernetesPatchManifestOperation.java:45)
	at com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation$operate.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation$operate.call(Unknown Source)
	at com.netflix.spinnaker.clouddriver.orchestration.DefaultOrchestrationProcessor$_process_closure1$_closure2.doCall(DefaultOrchestrationProcessor.groovy:89)
	at com.netflix.spinnaker.clouddriver.orchestration.DefaultOrchestrationProcessor$_process_closure1$_closure2.doCall(DefaultOrchestrationProcessor.groovy)
	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 org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
	at groovy.lang.Closure.call(Closure.java:418)
	at groovy.lang.Closure.call(Closure.java:412)
	at com.netflix.spinnaker.clouddriver.metrics.TimedCallable$ClosureWrapper.call(TimedCallable.groovy:55)
	at com.netflix.spinnaker.clouddriver.metrics.TimedCallable.call(TimedCallable.groovy:82)
	at java_util_concurrent_Callable$call.call(Unknown Source)
	at com.netflix.spinnaker.clouddriver.orchestration.DefaultOrchestrationProcessor$_process_closure1.doCall(DefaultOrchestrationProcessor.groovy:88)
	at com.netflix.spinnaker.clouddriver.orchestration.DefaultOrchestrationProcessor$_process_closure1.doCall(DefaultOrchestrationProcessor.groovy)
	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 org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
	at groovy.lang.Closure.call(Closure.java:418)
	at groovy.lang.Closure.call(Closure.java:412)
	at com.netflix.spinnaker.security.AuthenticatedRequest.lambda$propagate$0(AuthenticatedRequest.java:97)
	at com.netflix.spinnaker.clouddriver.metrics.TimedCallable.call(TimedCallable.groovy:82)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest` out of START_ARRAY token
 at [Source: UNKNOWN; line: -1, column: -1]
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromEmpty(StdDeserializer.java:600)
	at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:360)
	at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29)
	at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3745)
	... 40 more

Cloud Provider(s):

Kubernetes.

Environment:

Spinnaker installed by Helm Chart version 1.9.1.

Here’s the container image tags:

spin-clouddriver:  gcr.io/spinnaker-marketplace/clouddriver:4.1.0-20181211134536, gcr.io/spinnaker-marketplace/monitoring-daemon:0.10.0-20181207032510,
spin-deck:  gcr.io/spinnaker-marketplace/deck:2.6.0-20181213100452,
spin-echo:  gcr.io/spinnaker-marketplace/echo:2.2.1-20181217192627, gcr.io/spinnaker-marketplace/monitoring-daemon:0.10.0-20181207032510,
spin-front50:  gcr.io/spinnaker-marketplace/front50:0.14.0-20181207134351, gcr.io/spinnaker-marketplace/monitoring-daemon:0.10.0-20181207032510,
spin-gate:  gcr.io/spinnaker-marketplace/gate:1.4.0-20181217192627, gcr.io/spinnaker-marketplace/monitoring-daemon:0.10.0-20181207032510,
spin-igor:  gcr.io/spinnaker-marketplace/igor:1.0.0-20181207134351, gcr.io/spinnaker-marketplace/monitoring-daemon:0.10.0-20181207032510,
spin-orca:  gcr.io/spinnaker-marketplace/orca:2.0.0-20181212160734, gcr.io/spinnaker-marketplace/monitoring-daemon:0.10.0-20181207032510,
spin-rosco:  gcr.io/spinnaker-marketplace/rosco:0.8.1-20181207134351, gcr.io/spinnaker-marketplace/monitoring-daemon:0.10.0-20181207032510,

Feature Area:

Kuberntes, deployments, etc

Steps to Reproduce:

Trigger our deployment pipeline and wait for that stage to fail. This pipeline simply patches a deployment with a new docker image tag.

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 21 (7 by maintainers)

Most upvoted comments

OK did a little more digging. Editing just the image line is enough to inject []s around the patchBody block in the pipeline JSON. There is no way to undo this in the GUI, when you come back to the stage in the GUI spec is now prefixed with - and there is no way to remove it, you can’t save the changes. You have to edit as JSON to fix.