From f90eadd40f4f660d251d7d3c722740d4951741dc Mon Sep 17 00:00:00 2001 From: fuchanghai <33984497+fuchanghai@users.noreply.github.com> Date: Thu, 28 Sep 2023 11:06:35 +0800 Subject: [PATCH] [feature-#14449] add secret in k8s Task (#14930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feature-#14449] add secret * [feature-#14449] upgrade UT and rename parameter ```secret``` * [feature-#14449] fix UT * [feature-#14449] fix UT * [feature-#14449] improvement * [feature-#14449] format --------- Co-authored-by: fuchanghai <‘2875334588@qq.com’> --- .../task/api/k8s/K8sTaskMainParameters.java | 1 + .../plugin/task/api/k8s/impl/K8sTaskExecutor.java | 15 ++++++++++----- .../task/api/parameters/K8sTaskParameters.java | 1 + .../plugin/task/api/k8s/K8sTaskExecutorTest.java | 3 ++- .../dolphinscheduler/plugin/task/k8s/K8sTask.java | 1 + .../plugin/task/k8s/K8sTaskTest.java | 7 +++++-- dolphinscheduler-ui/src/locales/en_US/project.ts | 2 ++ dolphinscheduler-ui/src/locales/zh_CN/project.ts | 2 ++ .../task/components/node/fields/use-k8s.ts | 8 ++++++++ .../projects/task/components/node/format-data.ts | 1 + .../views/projects/task/components/node/types.ts | 1 + 11 files changed, 34 insertions(+), 8 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskMainParameters.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskMainParameters.java index d70cf11a22..a6c4703f10 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskMainParameters.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskMainParameters.java @@ -32,6 +32,7 @@ public class K8sTaskMainParameters { private String image; private String command; private String args; + private String pullSecret; private String namespaceName; private String clusterName; private String imagePullPolicy; diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/impl/K8sTaskExecutor.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/impl/K8sTaskExecutor.java index ae78c66459..f973f5bd1b 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/impl/K8sTaskExecutor.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/impl/K8sTaskExecutor.java @@ -17,6 +17,7 @@ package org.apache.dolphinscheduler.plugin.task.api.k8s.impl; +import static java.util.Collections.singletonList; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.API_VERSION; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.CPU; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.EXIT_CODE_FAILURE; @@ -67,6 +68,7 @@ import org.slf4j.Logger; import io.fabric8.kubernetes.api.model.Affinity; import io.fabric8.kubernetes.api.model.AffinityBuilder; import io.fabric8.kubernetes.api.model.EnvVar; +import io.fabric8.kubernetes.api.model.LocalObjectReference; import io.fabric8.kubernetes.api.model.NodeSelectorTerm; import io.fabric8.kubernetes.api.model.Quantity; import io.fabric8.kubernetes.api.model.ResourceRequirements; @@ -91,10 +93,11 @@ public class K8sTaskExecutor extends AbstractK8sTaskExecutor { super(logger, taskRequest); } - public Job buildK8sJob(K8sTaskMainParameters k8STaskMainParameters) { + public void buildK8sJob(K8sTaskMainParameters k8STaskMainParameters) { String taskInstanceId = String.valueOf(taskRequest.getTaskInstanceId()); String taskName = taskRequest.getTaskName().toLowerCase(Locale.ROOT); String image = k8STaskMainParameters.getImage(); + String pullSecret = k8STaskMainParameters.getPullSecret(); String namespaceName = k8STaskMainParameters.getNamespaceName(); String imagePullPolicy = k8STaskMainParameters.getImagePullPolicy(); Map otherParams = k8STaskMainParameters.getParamsMap(); @@ -155,7 +158,7 @@ public class K8sTaskExecutor extends AbstractK8sTaskExecutor { .endRequiredDuringSchedulingIgnoredDuringExecution() .endNodeAffinity().build(); - JobBuilder jobBuilder = new JobBuilder() + job = new JobBuilder() .withApiVersion(API_VERSION) .withNewMetadata() .withName(k8sJobName) @@ -178,14 +181,16 @@ public class K8sTaskExecutor extends AbstractK8sTaskExecutor { .withResources(new ResourceRequirements(limitRes, reqRes)) .withEnv(envVars) .endContainer() + .withImagePullSecrets( + StringUtils.isEmpty(pullSecret) ? null : singletonList(new LocalObjectReference(pullSecret))) .withRestartPolicy(RESTART_POLICY) .withAffinity(affinity) .endSpec() .endTemplate() .withBackoffLimit(retryNum) - .endSpec(); + .endSpec() + .build(); - return jobBuilder.build(); } public void registerBatchJobWatcher(Job job, String taskInstanceId, TaskResponse taskResponse) { @@ -322,7 +327,7 @@ public class K8sTaskExecutor extends AbstractK8sTaskExecutor { JSONUtils.parseObject(k8sParameterStr, K8sTaskMainParameters.class); try { log.info("[K8sJobExecutor-{}-{}] start to submit job", taskName, taskInstanceId); - job = buildK8sJob(k8STaskMainParameters); + buildK8sJob(k8STaskMainParameters); stopJobOnK8s(k8sParameterStr); String namespaceName = k8STaskMainParameters.getNamespaceName(); k8sUtils.createJob(namespaceName, job); diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parameters/K8sTaskParameters.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parameters/K8sTaskParameters.java index fd738fe736..ba9f6498af 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parameters/K8sTaskParameters.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/parameters/K8sTaskParameters.java @@ -38,6 +38,7 @@ public class K8sTaskParameters extends AbstractParameters { private String namespace; private String command; private String args; + private String pullSecret; private String imagePullPolicy; private double minCpuCores; private double minMemorySpace; diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskExecutorTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskExecutorTest.java index 46b226268c..fac9a6292f 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskExecutorTest.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/k8s/K8sTaskExecutorTest.java @@ -81,7 +81,8 @@ public class K8sTaskExecutorTest { k8sTaskMainParameters.setCommand("[\"perl\" ,\"-Mbignum=bpi\", \"-wle\", \"print bpi(2000)\"]"); k8sTaskMainParameters.setLabelMap(labelMap); k8sTaskMainParameters.setNodeSelectorRequirements(Arrays.asList(requirement)); - job = k8sTaskExecutor.buildK8sJob(k8sTaskMainParameters); + k8sTaskExecutor.buildK8sJob(k8sTaskMainParameters); + job = k8sTaskExecutor.getJob(); } @Test public void testGetK8sJobStatusNormal() { diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/main/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTask.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/main/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTask.java index 9c5e249b06..39ce7343d8 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/main/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTask.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/main/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTask.java @@ -87,6 +87,7 @@ public class K8sTask extends AbstractK8sTask { String namespaceName = namespace.get(NAMESPACE_NAME); String clusterName = namespace.get(CLUSTER); k8sTaskMainParameters.setImage(k8sTaskParameters.getImage()); + k8sTaskMainParameters.setPullSecret(k8sTaskParameters.getPullSecret()); k8sTaskMainParameters.setNamespaceName(namespaceName); k8sTaskMainParameters.setClusterName(clusterName); k8sTaskMainParameters.setMinCpuCores(k8sTaskParameters.getMinCpuCores()); diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/test/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTaskTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/test/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTaskTest.java index 93b6f85e5a..3416d0288c 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/test/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTaskTest.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-k8s/src/test/java/org/apache/dolphinscheduler/plugin/task/k8s/K8sTaskTest.java @@ -46,6 +46,8 @@ public class K8sTaskTest { private final String image = "ds-dev"; private final String imagePullPolicy = "IfNotPresent"; + private final String pullSecret = "ds-secret"; + private final String namespace = "{\"name\":\"default\",\"cluster\":\"lab\"}"; private final double minCpuCores = 2; @@ -74,6 +76,7 @@ public class K8sTaskTest { k8sTaskParameters.setArgs(args); k8sTaskParameters.setCustomizedLabels(labels); k8sTaskParameters.setNodeSelectors(nodeSelectorExpressions); + k8sTaskParameters.setPullSecret(pullSecret); TaskExecutionContext taskRequest = new TaskExecutionContext(); taskRequest.setTaskInstanceId(taskInstanceId); taskRequest.setTaskName(taskName); @@ -99,7 +102,7 @@ public class K8sTaskTest { @Test public void testBuildCommandNormal() { String expectedStr = - "{\"image\":\"ds-dev\",\"command\":\"[\\\"/bin/bash\\\", \\\"-c\\\"]\",\"args\":\"[\\\"echo hello world\\\"]\",\"namespaceName\":\"default\",\"clusterName\":\"lab\",\"imagePullPolicy\":\"IfNotPresent\",\"minCpuCores\":2.0,\"minMemorySpace\":10.0,\"paramsMap\":{\"day\":\"20220507\"},\"labelMap\":{\"test\":\"1234\"},\"nodeSelectorRequirements\":[{\"key\":\"node-label\",\"operator\":\"In\",\"values\":[\"1234\",\"12345\"]}]}"; + "{\"image\":\"ds-dev\",\"command\":\"[\\\"/bin/bash\\\", \\\"-c\\\"]\",\"args\":\"[\\\"echo hello world\\\"]\",\"pullSecret\":\"ds-secret\",\"namespaceName\":\"default\",\"clusterName\":\"lab\",\"imagePullPolicy\":\"IfNotPresent\",\"minCpuCores\":2.0,\"minMemorySpace\":10.0,\"paramsMap\":{\"day\":\"20220507\"},\"labelMap\":{\"test\":\"1234\"},\"nodeSelectorRequirements\":[{\"key\":\"node-label\",\"operator\":\"In\",\"values\":[\"1234\",\"12345\"]}]}"; String commandStr = k8sTask.buildCommand(); Assertions.assertEquals(expectedStr, commandStr); } @@ -107,7 +110,7 @@ public class K8sTaskTest { @Test public void testGetParametersNormal() { String expectedStr = - "K8sTaskParameters(image=ds-dev, namespace={\"name\":\"default\",\"cluster\":\"lab\"}, command=[\"/bin/bash\", \"-c\"], args=[\"echo hello world\"], imagePullPolicy=IfNotPresent, minCpuCores=2.0, minMemorySpace=10.0, customizedLabels=[Label(label=test, value=1234)], nodeSelectors=[NodeSelectorExpression(key=node-label, operator=In, values=1234,12345)])"; + "K8sTaskParameters(image=ds-dev, namespace={\"name\":\"default\",\"cluster\":\"lab\"}, command=[\"/bin/bash\", \"-c\"], args=[\"echo hello world\"], pullSecret=ds-secret, imagePullPolicy=IfNotPresent, minCpuCores=2.0, minMemorySpace=10.0, customizedLabels=[Label(label=test, value=1234)], nodeSelectors=[NodeSelectorExpression(key=node-label, operator=In, values=1234,12345)])"; String result = k8sTask.getParameters().toString(); Assertions.assertEquals(expectedStr, result); } diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts b/dolphinscheduler-ui/src/locales/en_US/project.ts index 1f146b6772..ee33434ad2 100644 --- a/dolphinscheduler-ui/src/locales/en_US/project.ts +++ b/dolphinscheduler-ui/src/locales/en_US/project.ts @@ -397,6 +397,8 @@ export default { image_tips: 'Please enter image', image_pull_policy: 'Image pull policy', image_pull_policy_tips: 'Please select a image pull policy (required)', + pull_secret: 'Pull secret', + pull_secret_tips: 'Please enter pull secret', command: 'Command', command_tips: 'Please enter the container execution command, for example: ["printenv"]', diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts b/dolphinscheduler-ui/src/locales/zh_CN/project.ts index 16f205accf..1470c6154e 100644 --- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts +++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts @@ -394,6 +394,8 @@ export default { image_tips: '请输入镜像', image_pull_policy: '镜像拉取策略', image_pull_policy_tips: '请选择镜像拉取策略(必选)', + pull_secret: '仓库密钥', + pull_secret_tips: '请输入仓库密钥', command: '容器执行命令', command_tips: '请输入容器执行命令,例如:["printenv"]', args: '执行命令参数', diff --git a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-k8s.ts b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-k8s.ts index 2002dcb260..66be87dfeb 100644 --- a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-k8s.ts +++ b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-k8s.ts @@ -79,6 +79,14 @@ export function useK8s(model: { [field: string]: any }): IJsonItem[] { }, value: 'IfNotPresent' }, + { + type: 'input', + field: 'pullSecret', + name: t('project.node.pull_secret'), + props: { + placeholder: t('project.node.pull_secret_tips') + } + }, { type: 'input', field: 'command', diff --git a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts index 2d03ea45d7..31398f98e6 100644 --- a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts +++ b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts @@ -359,6 +359,7 @@ export function formatParams(data: INodeData): { taskParams.args = data.args taskParams.customizedLabels = data.customizedLabels taskParams.nodeSelectors = data.nodeSelectors + taskParams.pullSecret = data.pullSecret } if (data.taskType === 'JUPYTER') { diff --git a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts index 3f12a9e245..86eec11682 100644 --- a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts +++ b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts @@ -378,6 +378,7 @@ interface ITaskParams { minMemorySpace?: string image?: string imagePullPolicy?: string + pullSecret?: string command?: string args?: string customizedLabels?: ILabel[]