Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation) #5466

Closed
pellea opened this issue Sep 19, 2023 · 5 comments · Fixed by #5468
Closed

'\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation) #5466

pellea opened this issue Sep 19, 2023 · 5 comments · Fixed by #5468
Assignees
Labels
Milestone

Comments

@pellea
Copy link

pellea commented Sep 19, 2023

Describe the bug

After upgrading to the newest version of the plugin kubernetes-plugin for Jenkins; the following error occurred: "'\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation)"

https://github.com/jenkinsci
(kubernetes-plugin](https://github.com/jenkinsci/kubernetes-plugin)

Fabric8 Kubernetes Client version

6.8.1

Steps to reproduce

Running a pipeline with

 agent {
    kubernetes {
      defaultContainer 'shell'
      namespace "${context.global_k8s_cicd_namespace}"
      yaml "..."
    }
  }

It starts a pod dynamically with a podTemplate.

Expected behavior

No error, the builder pod is starting correctly

Runtime

Kubernetes (vanilla), other (please specify in additional context)

Kubernetes API Server version

other (please specify in additional context)

Environment

other (please specify in additional context)

Fabric8 Kubernetes Client Logs

Error in provisioning; agent=KubernetesSlave name: myproject-16-g8j9g-c03rk-88sjm, template=PodTemplate{id='5d364b73-f351-4c2d-8752-848a61ce45ab', name='myproject_16-g8j9g-c03rk', namespace='jenkins-developers-cicd', label='myproject_16-g8j9g', annotations=[PodAnnotation{key='buildUrl', value='http://host.docker.internal:8090/job/myproject/16/'}, PodAnnotation{key='runUrl', value='job/myproject/16/'}]}
while scanning for the next token
found character '\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation)
 in reader, line 2, column 1:
    	<head>
    ^

	at org.snakeyaml.engine.v2.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:417)
	at org.snakeyaml.engine.v2.scanner.ScannerImpl.peekToken(ScannerImpl.java:216)
	at org.snakeyaml.engine.v2.parser.ParserImpl$ParseDocumentEnd.produce(ParserImpl.java:533)
	at org.snakeyaml.engine.v2.parser.ParserImpl.lambda$produce$1(ParserImpl.java:232)
	at java.base/java.util.Optional.ifPresent(Optional.java:183)
	at org.snakeyaml.engine.v2.parser.ParserImpl.produce(ParserImpl.java:232)
	at org.snakeyaml.engine.v2.parser.ParserImpl.peekEvent(ParserImpl.java:206)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:135)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:115)
	at org.snakeyaml.engine.v2.composer.Composer.composeScalarNode(Composer.java:244)
	at org.snakeyaml.engine.v2.composer.Composer.composeNode(Composer.java:206)
	at org.snakeyaml.engine.v2.composer.Composer.next(Composer.java:162)
	at org.snakeyaml.engine.v2.api.Load$YamlIterator.next(Load.java:234)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.parseYaml(KubernetesSerialization.java:271)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:252)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:342)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:327)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.createStatus(OperationSupport.java:612)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.assertResponseCode(OperationSupport.java:589)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.lambda$handleResponse$0(OperationSupport.java:549)
Caused: io.fabric8.kubernetes.client.KubernetesClientException: Error executing: POST at: https://kubernetes.docker.internal:6443/api/v1/namespaces/jenkins-developers-cicd/pods. Cause
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.requestException(OperationSupport.java:673)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.requestException(OperationSupport.java:677)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.lambda$handleResponse$0(OperationSupport.java:558)
	at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:642)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at io.fabric8.kubernetes.client.http.StandardHttpClient.lambda$completeOrCancel$10(StandardHttpClient.java:140)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at io.fabric8.kubernetes.client.http.ByteArrayBodyHandler.onBodyDone(ByteArrayBodyHandler.java:52)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at io.fabric8.kubernetes.client.okhttp.OkHttpClientImpl$OkHttpAsyncBody.doConsume(OkHttpClientImpl.java:137)
Caused: io.fabric8.kubernetes.client.KubernetesClientException: Error executing: POST at: https://kubernetes.docker.internal:6443/api/v1/namespaces/jenkins-developers-cicd/pods. Cause: while scanning for the next token
found character '\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation)
 in reader, line 2, column 1:
    	<head>
    ^

	at io.fabric8.kubernetes.client.KubernetesClientException.copyAsCause(KubernetesClientException.java:238)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.waitForResult(OperationSupport.java:507)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleResponse(OperationSupport.java:524)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleCreate(OperationSupport.java:340)
	at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.handleCreate(BaseOperation.java:703)
	at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.handleCreate(BaseOperation.java:92)
	at io.fabric8.kubernetes.client.dsl.internal.CreateOnlyResourceOperation.create(CreateOnlyResourceOperation.java:42)
	at org.csanchez.jenkins.plugins.kubernetes.KubernetesLauncher.launch(KubernetesLauncher.java:133)
	at hudson.slaves.SlaveComputer.lambda$_connect$0(SlaveComputer.java:297)
	at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
	at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:80)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

Sep 19, 2023 1:16:49 PM INFO org.csanchez.jenkins.plugins.kubernetes.KubernetesSlave _terminate
Terminating Kubernetes instance for agent myproject-16-g8j9g-c03rk-88sjm
Sep 19, 2023 1:16:49 PM WARNING org.csanchez.jenkins.plugins.kubernetes.KubernetesLauncher launch
Kubernetes returned unhandled HTTP code -1 null
Sep 19, 2023 1:16:49 PM WARNING org.csanchez.jenkins.plugins.kubernetes.KubernetesLauncher launch
Error in provisioning; agent=KubernetesSlave name: myproject-16-ld4m1-nt54z-dr53j, template=PodTemplate{id='19a99159-a380-4c03-bb8f-07478c159ad4', name='myproject_16-ld4m1-nt54z', namespace='jenkins-developers-cicd', label='myproject_16-ld4m1', annotations=[PodAnnotation{key='buildUrl', value='http://host.docker.internal:8090/job/myproject/16/'}, PodAnnotation{key='runUrl', value='job/myproject/16/'}]}
while scanning for the next token
found character '\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation)
 in reader, line 2, column 1:
    	<head>
    ^

	at org.snakeyaml.engine.v2.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:417)
	at org.snakeyaml.engine.v2.scanner.ScannerImpl.peekToken(ScannerImpl.java:216)
	at org.snakeyaml.engine.v2.parser.ParserImpl$ParseDocumentEnd.produce(ParserImpl.java:533)
	at org.snakeyaml.engine.v2.parser.ParserImpl.lambda$produce$1(ParserImpl.java:232)
	at java.base/java.util.Optional.ifPresent(Optional.java:183)
	at org.snakeyaml.engine.v2.parser.ParserImpl.produce(ParserImpl.java:232)
	at org.snakeyaml.engine.v2.parser.ParserImpl.peekEvent(ParserImpl.java:206)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:135)
	at org.snakeyaml.engine.v2.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:115)
	at org.snakeyaml.engine.v2.composer.Composer.composeScalarNode(Composer.java:244)
	at org.snakeyaml.engine.v2.composer.Composer.composeNode(Composer.java:206)
	at org.snakeyaml.engine.v2.composer.Composer.next(Composer.java:162)
	at org.snakeyaml.engine.v2.api.Load$YamlIterator.next(Load.java:234)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.parseYaml(KubernetesSerialization.java:271)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:252)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:342)
	at io.fabric8.kubernetes.client.utils.KubernetesSerialization.unmarshal(KubernetesSerialization.java:327)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.createStatus(OperationSupport.java:612)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.assertResponseCode(OperationSupport.java:589)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.lambda$handleResponse$0(OperationSupport.java:549)
Caused: io.fabric8.kubernetes.client.KubernetesClientException: Error executing: POST at: https://kubernetes.docker.internal:6443/api/v1/namespaces/jenkins-developers-cicd/pods. Cause
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.requestException(OperationSupport.java:673)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.requestException(OperationSupport.java:677)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.lambda$handleResponse$0(OperationSupport.java:558)
	at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:642)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at io.fabric8.kubernetes.client.http.StandardHttpClient.lambda$completeOrCancel$10(StandardHttpClient.java:140)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at io.fabric8.kubernetes.client.http.ByteArrayBodyHandler.onBodyDone(ByteArrayBodyHandler.java:52)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at io.fabric8.kubernetes.client.okhttp.OkHttpClientImpl$OkHttpAsyncBody.doConsume(OkHttpClientImpl.java:137)
Caused: io.fabric8.kubernetes.client.KubernetesClientException: Error executing: POST at: https://kubernetes.docker.internal:6443/api/v1/namespaces/jenkins-developers-cicd/pods. Cause: while scanning for the next token
found character '\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation)
 in reader, line 2, column 1:
    	<head>
    ^

	at io.fabric8.kubernetes.client.KubernetesClientException.copyAsCause(KubernetesClientException.java:238)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.waitForResult(OperationSupport.java:507)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleResponse(OperationSupport.java:524)
	at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleCreate(OperationSupport.java:340)
	at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.handleCreate(BaseOperation.java:703)
	at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.handleCreate(BaseOperation.java:92)
	at io.fabric8.kubernetes.client.dsl.internal.CreateOnlyResourceOperation.create(CreateOnlyResourceOperation.java:42)
	at org.csanchez.jenkins.plugins.kubernetes.KubernetesLauncher.launch(KubernetesLauncher.java:133)
	at hudson.slaves.SlaveComputer.lambda$_connect$0(SlaveComputer.java:297)
	at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
	at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:80)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

Additional context

Kubernetes enabled with Docker for desktop (v4.21.1) on Windows 11 (with WSL2)

kubectl version --short

Client Version: v1.27.2
Kustomize Version: v5.0.1
Server Version: v1.25.4
@shawkins
Copy link
Contributor

Are you saying that invalid yaml was accepted by an older version of the kubernetes client, but now is not?

@pellea
Copy link
Author

pellea commented Sep 19, 2023

I think so, yes.

I only updated the plugin between pipeline run. Same pipeline, same code.

@shawkins
Copy link
Contributor

The likely difference is we now are making direct usage of snakeyaml for the yaml parsing, whereas older versions were using snakeyaml via jackson. This seems to be the official position on tabs http://yaml.org/faq.html - are you able to fix your yaml?

@pellea
Copy link
Author

pellea commented Sep 19, 2023

There are no tabs in my yaml files.

There are no "" either. This seems to come from a bad result of an HTTP call. And therfore it's obviously not in Yaml but Html, hence the error I guess.

@shawkins
Copy link
Contributor

shawkins commented Sep 19, 2023

This seems to come from a bad result of an HTTP call. And therfore it's obviously not in Yaml but Html, hence the error I guess.

Ah, sorry for not following the stacktrace completely. Yes there is an assumption that the body of an error response could be a Status. That attempt to parse is catching serveral exception types, but not YamlEngineException or generally RuntimeException that would catch this. We'll need to catch and convert this and likely add some catch all handling in OperationSupport to address this.

UPDATE: In checking with older versions I don't think low-level parsing path has changed. What's different wrt yaml is actually the production, not the parsing. Higher up in OpperationSupport though we used to work directly against a json mapper, rather than a general deserialization method. In this case passing something that is not valid json will be attempted as yaml, which then gives the exception you are seeing.

I'll have a fix shortly.

shawkins added a commit to shawkins/kubernetes-client that referenced this issue Sep 20, 2023
@shawkins shawkins self-assigned this Sep 20, 2023
@manusa manusa added this to the 6.9.0 milestone Sep 20, 2023
@manusa manusa added the bug label Sep 20, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants