diff --git a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/actions/CamelKubernetesDeleteAction.java b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/actions/CamelKubernetesDeleteAction.java index f8a336e363..45c239b0cb 100644 --- a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/actions/CamelKubernetesDeleteAction.java +++ b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/actions/CamelKubernetesDeleteAction.java @@ -38,6 +38,9 @@ public class CamelKubernetesDeleteAction extends AbstractCamelJBangAction { /** Camel integration name */ private final String integrationName; + /** Camel Jbang cluster type target */ + private final String clusterType; + /** Project directory */ private final String workingDir; @@ -52,6 +55,7 @@ public CamelKubernetesDeleteAction(Builder builder) { this.integrationResource = builder.integrationResource; this.integrationName = builder.integrationName; + this.clusterType = builder.clusterType; this.workingDir = builder.workingDir; this.namespace = builder.namespace; @@ -65,15 +69,19 @@ public void doExecute(TestContext context) { if (integrationResource != null) { fullArgs.add(integrationResource.getFile().toPath().toAbsolutePath().toString()); } - if (integrationName != null){ + if (integrationName != null) { fullArgs.add("--name"); fullArgs.add(integrationName); } - if (workingDir != null){ + if (clusterType != null) { + fullArgs.add("--cluster-type"); + fullArgs.add(clusterType); + } + if (workingDir != null) { fullArgs.add("--working-dir"); fullArgs.add(workingDir); } - if (namespace != null){ + if (namespace != null) { fullArgs.add("--namespace"); fullArgs.add(namespace); } @@ -89,6 +97,10 @@ public String getIntegrationName() { return integrationName; } + public String getClusterType() { + return clusterType; + } + public String getWorkingDir() { return workingDir; } @@ -104,6 +116,7 @@ public static final class Builder extends AbstractCamelJBangAction.Builder buildProperties; + /** Camel Jbang command properties */ + private final List properties; + /** Camel Jbang command traits */ private final List traits; /** Camel Jbang command arguments */ private final List args; + /** Wait for integration pod to be in Running state */ + private final boolean waitForRunningState; + /** * Default constructor. */ @@ -63,11 +75,15 @@ public CamelKubernetesRunIntegrationAction(CamelKubernetesRunIntegrationAction.B super("run-integration-kubernetes", builder); this.integrationResource = builder.integrationResource; - this.buildProperties = builder.buildProperties; + this.runtime = builder.runtime; this.imageBuilder = builder.imageBuilder; this.imageRegistry = builder.imageRegistry; + this.clusterType = builder.clusterType; + this.buildProperties = builder.buildProperties; + this.properties = builder.properties; this.traits = builder.traits; this.args = builder.args; + this.waitForRunningState = builder.waitForRunningState; } @Override public void doExecute(TestContext context) { @@ -82,23 +98,38 @@ public void doExecute(TestContext context) { List fullArgs = new ArrayList<>(); fullArgs.add("run"); fullArgs.add(integrationFile.toAbsolutePath().toString()); + if (runtime != null){ + fullArgs.add("--runtime"); + fullArgs.add(runtime); + } if (imageBuilder != null){ fullArgs.add("--image-builder"); fullArgs.add(imageBuilder); } - if (imageRegistry != null){ + if (imageRegistry != null) { fullArgs.add("--image-registry"); fullArgs.add(imageRegistry); } + if (clusterType != null) { + fullArgs.add("--cluster-type"); + fullArgs.add(clusterType); + } - if (buildProperties != null){ + if (buildProperties != null) { for (String property : buildProperties) { fullArgs.add("--build-property"); fullArgs.add(property); } } - if (traits != null){ + if (properties != null) { + for (String property : properties) { + fullArgs.add("--property"); + fullArgs.add(property); + } + } + + if (traits != null) { for (String trait : traits) { fullArgs.add("--trait"); fullArgs.add(trait); @@ -109,13 +140,11 @@ public void doExecute(TestContext context) { fullArgs.addAll(args); } - // TODO manage this better and maybe use --wait - ProcessAndOutput pao = camelJBang().camelApp().run("kubernetes", fullArgs.toArray(String[]::new)); - while (pao.getProcess().isAlive()) { - continue; + if (waitForRunningState) { + fullArgs.add("--wait"); } - // TODO add a printLog ? + ProcessAndOutput pao = camelJBang().camelApp().run("kubernetes", fullArgs.toArray(String[]::new)); logger.info(pao.getOutput()); if (pao.getProcess().exitValue() != 0) { throw new CitrusRuntimeException(String.format("Failed to start Camel integration in kubernetes - exit code %s", pao.getProcess().exitValue())); @@ -128,6 +157,10 @@ public Resource getIntegrationResource() { return integrationResource; } + public String getRuntime() { + return runtime; + } + public String getImageBuilder() { return imageBuilder; } @@ -140,6 +173,10 @@ public List getBuildProperties() { return buildProperties; } + public List getProperties() { + return properties; + } + public List getTraits() { return traits; } @@ -155,13 +192,17 @@ public static final class Builder extends AbstractCamelJBangAction.Builder buildProperties = new ArrayList<>(); + private final List properties = new ArrayList<>(); private final List traits = new ArrayList<>(); private final List args = new ArrayList<>(); + private boolean waitForRunningState = CamelJBangSettings.isWaitForRunningState(); /** * Export given Camel integration resource. @@ -173,6 +214,16 @@ public Builder integration(Resource resource) { return this; } + /** + * Define runtime. + * @param runtime + * @return + */ + public Builder runtime(String runtime) { + this.runtime = runtime; + return this; + } + /** * Define container image builder type. * @param imageBuilder @@ -193,6 +244,16 @@ public Builder imageRegistry(String imageRegistry) { return this; } + /** + * Set cluster type target. + * @param clusterType + * @return + */ + public Builder clusterType(String clusterType) { + this.clusterType = clusterType; + return this; + } + /** * Adds a command build property. * @param property @@ -213,6 +274,25 @@ public Builder withBuildProperties(String... properties) { return this; } + /** + * Adds a command property. + * @param property + * @return + */ + public Builder withProperty(String property) { + this.properties.add(property); + return this; + } + + /** + * Adds command properties. + * @param properties + * @return + */ + public Builder withProperties(String... properties) { + this.properties.addAll(Arrays.asList(properties)); + return this; + } /** * Adds a command trait. * @param trait @@ -266,6 +346,12 @@ public Builder withArgs(String... args) { return this; } + + public Builder waitForRunningState(boolean enabled) { + this.waitForRunningState = enabled; + return this; + } + @Override public CamelKubernetesRunIntegrationAction build() { return new CamelKubernetesRunIntegrationAction(this); diff --git a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/Camel.java b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/Camel.java index 920592e891..4287866274 100644 --- a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/Camel.java +++ b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/Camel.java @@ -270,14 +270,21 @@ public Camel setJBang(JBang jbang) { builder.integration(Resources.create(jbang.getPlugin().getKubernetes().getRun().getIntegration().getFile())); } - builder.imageBuilder(jbang.getPlugin().getKubernetes().getRun().getImageBuilder()) - .imageRegistry(jbang.getPlugin().getKubernetes().getRun().getImageRegistry()); + builder.runtime(jbang.getPlugin().getKubernetes().getRun().getRuntime()) + .imageBuilder(jbang.getPlugin().getKubernetes().getRun().getImageBuilder()) + .imageRegistry(jbang.getPlugin().getKubernetes().getRun().getImageRegistry()) + .clusterType(jbang.getPlugin().getKubernetes().getRun().getClusterType()); if (jbang.getPlugin().getKubernetes().getRun().getBuildProperties() != null) { jbang.getPlugin().getKubernetes().getRun().getBuildProperties() .getProperties() .forEach(property -> builder.withBuildProperties(property.getName()+"="+property.getValue())); } + if (jbang.getPlugin().getKubernetes().getRun().getProperties() != null) { + jbang.getPlugin().getKubernetes().getRun().getProperties() + .getProperties() + .forEach(property -> builder.withProperties(property.getName()+"="+property.getValue())); + } if (jbang.getPlugin().getKubernetes().getRun().getTraits() != null) { jbang.getPlugin().getKubernetes().getRun().getTraits() .getTraits() @@ -287,6 +294,9 @@ public Camel setJBang(JBang jbang) { builder.withArgs(jbang.getPlugin().getKubernetes().getRun().getArgs().getArgs().toArray(String[]::new)); } + + builder.waitForRunningState(jbang.getPlugin().getKubernetes().getRun().isWaitForRunningState()); + this.builder = builder; } else if (jbang.getPlugin().getKubernetes().getVerify() != null) { CamelKubernetesVerifyAction.Builder builder = new CamelKubernetesVerifyAction.Builder(); @@ -315,7 +325,8 @@ public Camel setJBang(JBang jbang) { builder.integration(jbang.getPlugin().getKubernetes().getDelete().getIntegration().getName()); } } - builder.namespace(jbang.getPlugin().getKubernetes().getDelete().getNamespace()) + builder.clusterType(jbang.getPlugin().getKubernetes().getDelete().getClusterType()) + .namespace(jbang.getPlugin().getKubernetes().getDelete().getNamespace()) .workingDir(jbang.getPlugin().getKubernetes().getDelete().getWorkingDir()); this.builder = builder; } diff --git a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/JBang.java b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/JBang.java index 763d7c2fe9..55212410ff 100644 --- a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/JBang.java +++ b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/xml/JBang.java @@ -596,15 +596,25 @@ public static class Run { @XmlElement(required = true) private Integration integration; + @XmlElement(name = "runtime") + protected String runtime; + @XmlElement(name = "image-registry") protected String imageRegistry; @XmlElement(name = "image-builder") protected String imageBuilder; + @XmlElement(name = "cluster-type") + protected String clusterType; + @XmlElement(name = "build-properties") - protected BuildProperties buildProperties; + protected Properties buildProperties; + + + @XmlElement(name = "properties") + protected Properties properties; @XmlElement(name = "traits") protected Traits traits; @@ -612,6 +622,9 @@ public static class Run { @XmlElement(name = "args") protected Args args; + @XmlAttribute(name = "wait-for-running-state") + protected boolean waitForRunningState = CamelJBangSettings.isWaitForRunningState(); + public Integration getIntegration() { return integration; } @@ -620,6 +633,14 @@ public void setIntegration(Integration integration) { this.integration = integration; } + public String getRuntime() { + return runtime; + } + + public void setRuntime(String runtime) { + this.runtime = runtime; + } + public String getImageRegistry() { return imageRegistry; } @@ -636,14 +657,30 @@ public void setImageBuilder(String imageBuilder) { this.imageBuilder = imageBuilder; } - public BuildProperties getBuildProperties() { + public String getClusterType() { + return clusterType; + } + + public void setClusterType(String clusterType) { + this.clusterType = clusterType; + } + + public Properties getBuildProperties() { return buildProperties; } - public void setBuildProperties(BuildProperties buildProperties) { + public void setBuildProperties(Properties buildProperties) { this.buildProperties = buildProperties; } + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + public Traits getTraits() { return traits; } @@ -652,7 +689,6 @@ public void setTraits(Traits traits) { this.traits = traits; } - public Args getArgs() { return args; } @@ -661,6 +697,15 @@ public void setArgs(Args args) { this.args = args; } + + public boolean isWaitForRunningState() { + return waitForRunningState; + } + + public void setWaitForRunningState(boolean waitForRunningState) { + this.waitForRunningState = waitForRunningState; + } + @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "") public static class Integration { @@ -679,7 +724,7 @@ public void setFile(String file) { @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "") - public static class BuildProperties { + public static class Properties { @XmlElement(name = "property") protected List properties; @@ -904,6 +949,9 @@ public static class Delete { @XmlElement(required = true) private Integration integration; + + @XmlAttribute(name = "cluster-type") + protected String clusterType; @XmlAttribute(name = "working-dir") protected String workingDir; @XmlAttribute(name = "namespace") @@ -917,6 +965,14 @@ public void setIntegration(Integration integration) { this.integration = integration; } + public String getClusterType() { + return clusterType; + } + + public void setClusterType(String clusterType) { + this.clusterType = clusterType; + } + public String getWorkingDir() { return workingDir; } diff --git a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/yaml/JBang.java b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/yaml/JBang.java index 0d875236d4..cf4ea357d4 100644 --- a/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/yaml/JBang.java +++ b/endpoints/citrus-camel/src/main/java/org/citrusframework/camel/yaml/JBang.java @@ -29,6 +29,7 @@ import org.citrusframework.camel.actions.CamelKubernetesDeleteAction; import org.citrusframework.camel.actions.CamelKubernetesRunIntegrationAction; import org.citrusframework.camel.actions.CamelKubernetesVerifyAction; +import org.citrusframework.camel.jbang.CamelJBangSettings; import org.citrusframework.exceptions.CitrusRuntimeException; import org.citrusframework.spi.Resources; @@ -381,17 +382,23 @@ public void setKubernetes(Kubernetes kubernetes) { if (kubernetes.getRun().getIntegration().getFile() != null) { builder.integration(Resources.create(kubernetes.getRun().getIntegration().getFile())); } - builder.imageRegistry(kubernetes.getRun().getImageRegistry()) - .imageBuilder(kubernetes.getRun().getImageBuilder()); + builder.runtime(kubernetes.getRun().getRuntime()) + .imageRegistry(kubernetes.getRun().getImageRegistry()) + .imageBuilder(kubernetes.getRun().getImageBuilder()) + .clusterType(kubernetes.getRun().getClusterType()); if (kubernetes.getRun().getBuildProperties() != null && kubernetes.getRun().getBuildProperties().size() > 0) { kubernetes.getRun().getBuildProperties().forEach(property -> builder.withBuildProperty(property)); } + if (kubernetes.getRun().getProperties() != null && kubernetes.getRun().getProperties().size() > 0) { + kubernetes.getRun().getProperties().forEach(property -> builder.withProperty(property)); + } if (kubernetes.getRun().getTraits() != null && kubernetes.getRun().getTraits().size() > 0) { kubernetes.getRun().getTraits().forEach(trait -> builder.withTrait(trait)); } if (kubernetes.getRun().getArgs() != null && kubernetes.getRun().getArgs().size() > 0) { kubernetes.getRun().getArgs().forEach(arg -> builder.withArg(arg)); } + builder.waitForRunningState(kubernetes.getRun().isWaitForRunningState()); this.builder.kubernetesRunIntegrationAction(builder.build()); } else if(kubernetes.getVerify() != null) { CamelKubernetesVerifyAction.Builder builder = new CamelKubernetesVerifyAction.Builder(); @@ -408,7 +415,9 @@ public void setKubernetes(Kubernetes kubernetes) { this.builder.verifyKubernetesIntegrationAction(builder.build()); } else if (kubernetes.getDelete() != null) { CamelKubernetesDeleteAction.Builder builder = new CamelKubernetesDeleteAction.Builder(); - builder.workingDir(kubernetes.getDelete().getWorkingDir()).namespace(kubernetes.getDelete().getNamespace()); + builder.clusterType(kubernetes.getDelete().getClusterType()) + .workingDir(kubernetes.getDelete().getWorkingDir()) + .namespace(kubernetes.getDelete().getNamespace()); if (kubernetes.getDelete().getIntegration().getFile() != null) { builder.integration(Resources.create(kubernetes.getDelete().getIntegration().getFile())); } if (kubernetes.getDelete().getIntegration().getName() != null) { @@ -481,13 +490,18 @@ public void setDelete(Delete delete) { public static class Run { protected Integration integration; + protected String runtime; protected String imageRegistry; protected String imageBuilder; + protected String clusterType; protected List buildProperties; + protected List properties; protected List traits; protected List args; + private boolean waitForRunningState = CamelJBangSettings.isWaitForRunningState(); + public Integration getIntegration() { return integration; } @@ -496,6 +510,14 @@ public void setIntegration(Integration integration) { this.integration = integration; } + public String getRuntime() { + return runtime; + } + + public void setRuntime(String runtime) { + this.runtime = runtime; + } + public String getImageRegistry() { return imageRegistry; } @@ -512,6 +534,13 @@ public void setImageBuilder(String imageBuilder) { this.imageBuilder = imageBuilder; } + public String getClusterType() { + return clusterType; + } + + public void setClusterType(String clusterType) { + this.clusterType = clusterType; + } public List getBuildProperties() { if (buildProperties == null) { @@ -524,6 +553,17 @@ public void setBuildProperties(List buildProperties) { this.buildProperties = buildProperties; } + public List getProperties() { + if (properties == null) { + properties = new ArrayList<>(); + } + return this.properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + public void setTraits(List traits) { this.traits = traits; } @@ -547,6 +587,14 @@ public void setArgs(List args) { this.args = args; } + public boolean isWaitForRunningState() { + return waitForRunningState; + } + + public void setWaitForRunningState(boolean enabled) { + this.waitForRunningState = enabled; + } + public static class Integration { protected String file; @@ -641,9 +689,18 @@ public List getArgs() { public static class Delete { protected Integration integration; + protected String clusterType; protected String workingDir; protected String namespace; + public String getClusterType() { + return clusterType; + } + + public void setClusterType(String clusterType) { + this.clusterType = clusterType; + } + public String getWorkingDir() { return workingDir; } diff --git a/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd b/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd index 9bf6a0b1df..99de04f7c9 100644 --- a/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd +++ b/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd @@ -1076,8 +1076,10 @@ + + @@ -1090,6 +1092,18 @@ + + + + + + + + + + + + @@ -1110,6 +1124,7 @@ + @@ -1148,6 +1163,7 @@ +