Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Openshift templates with array parameters

Tags:

openshift

I am trying to create an Openshift template for a Job that passes the job's command line arguments in a template parameter using the following template:

apiVersion: v1
kind: Template
metadata:
  name: test-template
objects:
  - apiVersion: batch/v2alpha1
    kind: Job
    metadata:
      name: "${JOB_NAME}"
    spec:
      parallelism: 1
      completions: 1
      autoSelector: true
      template:
        metadata:
          name: "${JOB_NAME}"
        spec:
          containers:
            - name: "app"
              image: "batch-poc/sample-job:latest"
              args: "${{JOB_ARGS}}"
parameters:
  - name: JOB_NAME
    description: "Job Name"
    required: true
  - name: JOB_ARGS
    description: "Job command line parameters"

Because the 'args' need to be an array, I am trying to set the template parameter using JSON syntax, e.g. from the command line:

oc process -o=yaml test-template -v=JOB_NAME=myjob,JOB_ARGS='["A","B"]'

or programmatically through the Spring Cloud Launcher OpenShift Client:

OpenShiftClient client;
Map<String,String> templateParameters = new HashMap<String,String>();
templateParameters.put("JOB_NAME", jobId);
templateParameters.put("JOB_ARGS", "[ \"A\", \"B\", \"C\" ]");
KubernetesList processed = client.templates()
   .inNamespace(client.getNamespace())
   .withName("test-template")
   .process(templateParameters);

In both cases, it seems to fail because Openshift is interpreting the comma after the first array element as a delimiter and not parsing the remainder of the string.

The oc process command sets the parameter value to '["A"' and reports an error: "invalid parameter assignment in "test-template": "\"B\"]"".

The Java version throws an exception:

          Error executing: GET at: https://kubernetes.default.svc/oapi/v1/namespaces/batch-poc/templates/test-template. Cause: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token\n at [Source: N/A; line: -1, column: -1] (through reference chain: io.fabric8.openshift.api.model.Template[\"objects\"]->java.util.ArrayList[0]->io.fabric8.kubernetes.api.model.Job[\"spec\"]->io.fabric8.kubernetes.api.model.JobSpec[\"template\"]->io.fabric8.kubernetes.api.model.PodTemplateSpec[\"spec\"]->io.fabric8.kubernetes.api.model.PodSpec[\"containers\"]->java.util.ArrayList[0]->io.fabric8.kubernetes.api.model.Container[\"args\"])

I believe this is due to a known Openshift issue.

I was wondering if anyone has a workaround or an alternative way of setting the job's parameters?

Interestingly, if I go to the OpenShift web console, click 'Add to Project' and choose test-template, it prompts me to enter a value for the JOB_ARGS parameter. If I enter a literal JSON array there, it works, so I figure there must be a way to do this programmatically.

like image 732
Eric Avatar asked Oct 17 '25 15:10

Eric


1 Answers

We worked out how to do it; template snippet:

    spec:
    securityContext:
     supplementalGroups: "${{SUPPLEMENTAL_GROUPS}}"
parameters:
- description: Supplemental linux groups
  name: SUPPLEMENTAL_GROUPS
  value: "[14051, 14052, 48, 65533, 9050]"
like image 146
Alastair Munro Avatar answered Oct 20 '25 17:10

Alastair Munro