Skip to content

Commit aa5bd22

Browse files
committed
Add driver module and CLI to control it
1 parent 34a2cc4 commit aa5bd22

File tree

16 files changed

+1069
-1
lines changed

16 files changed

+1069
-1
lines changed

java-components/cli/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
<groupId>io.github.redhat-appstudio.jvmbuild</groupId>
2525
<artifactId>hacbs-resource-model</artifactId>
2626
</dependency>
27+
28+
<dependency>
29+
<groupId>io.github.redhat-appstudio.jvmbuild</groupId>
30+
<artifactId>driver</artifactId>
31+
</dependency>
32+
2733
<dependency>
2834
<groupId>info.picocli</groupId>
2935
<artifactId>picocli-shell-jline2</artifactId>

java-components/cli/src/main/java/com/redhat/hacbs/cli/MainCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import com.redhat.hacbs.cli.artifacts.ArtifactCommand;
88
import com.redhat.hacbs.cli.builds.BuildCommand;
9+
import com.redhat.hacbs.cli.driver.DriverCommand;
910
import com.redhat.hacbs.cli.rebuilt.RebuiltCommand;
1011
import com.redhat.hacbs.cli.settings.SetupCommand;
1112

@@ -20,7 +21,8 @@
2021
ArtifactCommand.class,
2122
RebuiltCommand.class,
2223
SetupCommand.class,
23-
DiagnosticCommand.class
24+
DiagnosticCommand.class,
25+
DriverCommand.class
2426
})
2527
@Vetoed
2628
public class MainCommand {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.redhat.hacbs.cli.driver;
2+
3+
import java.util.Optional;
4+
5+
import org.eclipse.microprofile.config.inject.ConfigProperty;
6+
7+
import picocli.CommandLine;
8+
9+
public abstract class Base {
10+
@CommandLine.Option(names = "-n", description = "Namespace", defaultValue = "pnc-devel-tenant")
11+
String namespace;
12+
13+
@CommandLine.Option(names = "-u", description = "URL", required = true)
14+
String url;
15+
16+
@CommandLine.Option(names = "-r", description = "Revision", required = true)
17+
String revision;
18+
19+
@CommandLine.Option(names = "-t", description = "Build Tool", required = true)
20+
String buildTool;
21+
22+
@CommandLine.Option(names = "--tool-version", description = "Tool Version", required = true)
23+
String buildToolVersion;
24+
25+
@CommandLine.Option(names = "-j", description = "Java Version", required = true)
26+
String javaVersion;
27+
28+
@CommandLine.Option(names = "-s", description = "Build Script", required = true)
29+
String buildScript;
30+
31+
@CommandLine.Option(names = "-d", description = "Deploy URL", required = true)
32+
String deploy;
33+
34+
@ConfigProperty(name = "access.token")
35+
Optional<String> accessToken;
36+
37+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.redhat.hacbs.cli.driver;
2+
3+
import picocli.CommandLine;
4+
5+
@CommandLine.Command(name = "driver", subcommands = {
6+
Fabric8.class, Pipeline.class }, mixinStandardHelpOptions = true)
7+
public class DriverCommand {
8+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package com.redhat.hacbs.cli.driver;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
import io.fabric8.kubernetes.api.model.Quantity;
8+
import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;
9+
import io.fabric8.kubernetes.client.KubernetesClient;
10+
import io.fabric8.tekton.client.TektonClient;
11+
import io.fabric8.tekton.pipeline.v1.Param;
12+
import io.fabric8.tekton.pipeline.v1.ParamBuilder;
13+
import io.fabric8.tekton.pipeline.v1.PipelineRun;
14+
import io.fabric8.tekton.pipeline.v1.PipelineRunBuilder;
15+
import io.fabric8.tekton.pipeline.v1.PipelineTaskRunSpec;
16+
import io.fabric8.tekton.pipeline.v1.PipelineTaskRunSpecBuilder;
17+
import io.fabric8.tekton.pipeline.v1.TaskRunStepSpecBuilder;
18+
import io.fabric8.tekton.pipeline.v1.WorkspaceBinding;
19+
import io.fabric8.tekton.pipeline.v1.WorkspaceBindingBuilder;
20+
import io.quarkus.arc.Arc;
21+
import io.quarkus.arc.InstanceHandle;
22+
import picocli.CommandLine;
23+
24+
/**
25+
* Experiment only - see if Fabric8 can be used to create the entire pipelinerun object rather
26+
* than reading a definition from yaml.
27+
*/
28+
@Deprecated
29+
@CommandLine.Command(name = "fabric8", mixinStandardHelpOptions = true, description = "Creates a pipeline")
30+
public class Fabric8 extends Base implements Runnable {
31+
32+
@Override
33+
public void run() {
34+
35+
PipelineRun run;
36+
37+
try (InstanceHandle<TektonClient> instanceHandle = Arc.container().instance(TektonClient.class)) {
38+
39+
// Experiment with creating gitlab project-ncl/konflux-integration/-/blob/main/deploy/mw-pipeline-run-v0.1.yaml
40+
PipelineRunBuilder pipelineRunBuilder = new PipelineRunBuilder()
41+
.withNewMetadata().withGenerateName("hacbs-pipeline-").endMetadata()
42+
.withNewSpec()
43+
.withNewPipelineRef().withResolver("git").withParams(getGitParams()).endPipelineRef()
44+
.withWorkspaces(getWorkspace())
45+
.withParams(embedParams())
46+
.withTaskRunSpecs(configureTaskRunSpecs())
47+
.endSpec();
48+
run = pipelineRunBuilder.build();
49+
}
50+
try (InstanceHandle<KubernetesClient> instanceHandle = Arc.container().instance(KubernetesClient.class)) {
51+
PipelineRun created = instanceHandle.get().resource(run).create();
52+
System.err.println("### run created : " + created);
53+
// final CountDownLatch closeLatch = new CountDownLatch(1);
54+
// instanceHandle.get().resource(run).watch(new Watcher<>() {
55+
// @Override
56+
// public void eventReceived(Action action, PipelineRun resource) {
57+
// System.out.println("### event action " + action.name());
58+
// switch (action.name()) {
59+
// case "ADDED":
60+
// System.out.println("### added " + resource.getMetadata().getName());
61+
// break;
62+
// case "DELETED":
63+
// break;
64+
// case "MODIFIED":
65+
// System.out.println(
66+
// "### added " + resource.getMetadata().getName() + " and status " + resource.getStatus()
67+
// .getResults());
68+
// break;
69+
// // default:
70+
// }
71+
// }
72+
//
73+
// @Override
74+
// public void onClose(WatcherException cause) {
75+
// System.out.println("### close " + cause);
76+
// closeLatch.countDown();
77+
// }
78+
// });
79+
// closeLatch.await();
80+
// } catch (InterruptedException e) {
81+
// throw new RuntimeException(e);
82+
83+
// created.getStatus()
84+
}
85+
}
86+
87+
private List<Param> embedParams() {
88+
List<Param> result = new ArrayList<>();
89+
// The actual parameters to be customized...
90+
result.add(new ParamBuilder().withName("URL").withNewValue(url).build());
91+
result.add(new ParamBuilder().withName("REVISION").withNewValue(revision).build());
92+
result.add(new ParamBuilder().withName("BUILD_TOOL").withNewValue(buildTool).build());
93+
result.add(new ParamBuilder().withName("BUILD_TOOL_VERSION").withNewValue(buildToolVersion).build());
94+
result.add(new ParamBuilder().withName("JAVA_VERSION").withNewValue(javaVersion).build());
95+
result.add(new ParamBuilder().withName("BUILD_SCRIPT").withNewValue(buildScript).build());
96+
if (accessToken.isPresent()) {
97+
result.add(new ParamBuilder().withName("ACCESS_TOKEN").withNewValue(accessToken.get()).build());
98+
} else {
99+
System.err.println("Access token not set");
100+
}
101+
// TODO: Hard code these per now, same as in pipelinerun yaml
102+
result.add(new ParamBuilder().withName("MVN_REPO_DEPLOY_URL").withNewValue(deploy)
103+
.build());
104+
result.add(new ParamBuilder().withName("MVN_REPO_DEPENDENCIES_URL").withNewValue(deploy)
105+
.build());
106+
result.add(new ParamBuilder().withName("BUILD_ID").withNewValue("test-maven-konflux-int-0001").build());
107+
108+
return result;
109+
}
110+
111+
// TODO: The memory settings in this function should be customizable for different build sizes
112+
private List<PipelineTaskRunSpec> configureTaskRunSpecs() {
113+
var stepSpec = new PipelineTaskRunSpecBuilder().withPipelineTaskName("buildah-oci-ta")
114+
.withStepSpecs(new TaskRunStepSpecBuilder()
115+
.withName("build")
116+
.withComputeResources(new ResourceRequirementsBuilder()
117+
.withLimits(Collections.singletonMap("memory", new Quantity("5Gi")))
118+
.withRequests(Collections.singletonMap("memory", new Quantity("5Gi"))).build())
119+
.build())
120+
.build();
121+
return Collections.singletonList(stepSpec);
122+
}
123+
124+
private List<Param> getGitParams() {
125+
List<Param> result = new ArrayList<>();
126+
result.add(new ParamBuilder().withName("url")
127+
.withNewValue("https://gitlab.cee.redhat.com/project-ncl/konflux-integration.git").build());
128+
result.add(new ParamBuilder().withName("revision").withNewValue("main").build());
129+
result.add(new ParamBuilder().withName("pathInRepo").withNewValue(".tekton/mw-pipeline-v0.1.yaml").build());
130+
return result;
131+
}
132+
133+
private WorkspaceBinding getWorkspace() {
134+
return new WorkspaceBindingBuilder().withName("source").withNewVolumeClaimTemplate()
135+
.withNewSpec()
136+
.addToAccessModes("ReadWriteOnce")
137+
.withNewResources().withRequests(Collections.singletonMap("storage", new Quantity("1Gi"))).endResources()
138+
.endSpec()
139+
.endVolumeClaimTemplate()
140+
.build();
141+
}
142+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.redhat.hacbs.cli.driver;
2+
3+
import java.io.IOException;
4+
5+
import jakarta.enterprise.context.control.ActivateRequestContext;
6+
import jakarta.inject.Inject;
7+
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import com.redhat.hacbs.driver.Driver;
12+
import com.redhat.hacbs.driver.dto.BuildRequest;
13+
14+
import picocli.CommandLine;
15+
16+
@CommandLine.Command(name = "pipeline", mixinStandardHelpOptions = true, description = "Creates a pipeline")
17+
public class Pipeline extends Base implements Runnable {
18+
19+
private static final Logger logger = LoggerFactory.getLogger(Pipeline.class);
20+
21+
@Inject
22+
Driver driver;
23+
24+
@ActivateRequestContext // https://github.com/quarkusio/quarkus/issues/8758
25+
@Override
26+
public void run() {
27+
logger.info("### in here with driver {}", driver);
28+
driver.addAccessToken(accessToken.orElse("NO_TOKEN"));
29+
30+
BuildRequest request = BuildRequest.builder()
31+
.namespace(namespace)
32+
.scmUrl(url)
33+
.scmRevision(revision)
34+
.buildTool(buildTool)
35+
.buildToolVersion(buildToolVersion)
36+
.javaVersion(javaVersion)
37+
.buildScript(buildScript)
38+
.repositoryDeployUrl(deploy)
39+
.repositoryDependencyUrl(deploy)
40+
.repositoryBuildContentId("test-maven-konflux-int-0001")
41+
.build();
42+
try {
43+
driver.create(request);
44+
} catch (IOException e) {
45+
throw new RuntimeException(e);
46+
}
47+
48+
}
49+
}

0 commit comments

Comments
 (0)