diff --git a/pom.xml b/pom.xml index 7fe8a2b..1641b36 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,10 @@ io.quarkus quarkus-resteasy-reactive-jackson + + org.apache.commons + commons-lang3 + io.quarkus quarkus-junit5 @@ -71,6 +75,19 @@ + + io.smallrye + jandex-maven-plugin + 3.1.1 + + + make-index + + jandex + + + + ${quarkus.platform.group-id} quarkus-maven-plugin diff --git a/src/main/java/com/redhat/pctsec/model/Scan.java b/src/main/java/com/redhat/pctsec/model/Scan.java index 632dddb..530b10a 100644 --- a/src/main/java/com/redhat/pctsec/model/Scan.java +++ b/src/main/java/com/redhat/pctsec/model/Scan.java @@ -1,2 +1,41 @@ -package com.redhat.pctsec.model;public class Scan { +package com.redhat.pctsec.model; + +import com.redhat.pctsec.tekton.brewTaskRun; +import com.redhat.pctsec.tekton.scmUrlPipelineRun; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +import java.util.HashMap; +@ApplicationScoped +public class Scan { + + private HashMap metadata; + private HashMap oshScanOptions; + private String brewBuild; + private HashMap scmurl; + + @Inject + brewTaskRun btr; + + @Inject + scmUrlPipelineRun plr; + + public Scan(String brewBuildId) + { + this.brewBuild = brewBuildId; + } + + public Scan(String repo, String ref) + { + this.scmurl = new HashMap<>(); + this.scmurl.put("repo", repo); + this.scmurl.put("ref", repo); + } + public void executeScan(){ + if(this.brewBuild != null && !this.brewBuild.trim().isEmpty()){ + btr = new brewTaskRun(); + btr.invokeScanTask(this.brewBuild); + } + } } diff --git a/src/main/java/com/redhat/pctsec/model/ScanCollection.java b/src/main/java/com/redhat/pctsec/model/ScanCollection.java index a6bc80a..6d443d8 100644 --- a/src/main/java/com/redhat/pctsec/model/ScanCollection.java +++ b/src/main/java/com/redhat/pctsec/model/ScanCollection.java @@ -1,4 +1,34 @@ package com.redhat.pctsec.model; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +@ApplicationScoped public class ScanCollection { + + // + private Set scans = new HashSet<>(); + private HashMap globalScanProperties; + + public ScanCollection(pssaas pssaas){ + //Iterate scan payload and create scans + } + + public ScanCollection(String repo, String rev){ + //shortcut for single scans + scans.add(new Scan(repo, rev)); + } + + public ScanCollection(String brewBuildId){ + scans.add(new Scan(brewBuildId)); + } + + //Create tekton pipeline/taskrun + public void execute(){ + for(Scan s : scans){ + s.executeScan(); + } + } } diff --git a/src/main/java/com/redhat/pctsec/model/scanchain.java b/src/main/java/com/redhat/pctsec/model/scanChain.java similarity index 59% rename from src/main/java/com/redhat/pctsec/model/scanchain.java rename to src/main/java/com/redhat/pctsec/model/scanChain.java index 9c4dcde..7cad38a 100644 --- a/src/main/java/com/redhat/pctsec/model/scanchain.java +++ b/src/main/java/com/redhat/pctsec/model/scanChain.java @@ -1,4 +1,4 @@ package com.redhat.pctsec.model; -public class scanchain { +public class scanChain { } diff --git a/src/main/java/com/redhat/pctsec/rest/v1alpha1/Kerberos.java b/src/main/java/com/redhat/pctsec/rest/v1alpha1/Kerberos.java index ea27f19..0f337e3 100644 --- a/src/main/java/com/redhat/pctsec/rest/v1alpha1/Kerberos.java +++ b/src/main/java/com/redhat/pctsec/rest/v1alpha1/Kerberos.java @@ -1,6 +1,7 @@ package com.redhat.pctsec.rest.v1alpha1; import io.quarkiverse.kerberos.KerberosPrincipal; +import io.quarkus.arc.profile.UnlessBuildProfile; import io.quarkus.security.Authenticated; import io.quarkus.security.identity.SecurityIdentity; import jakarta.inject.Inject; @@ -8,6 +9,7 @@ import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; +@UnlessBuildProfile("dev") @Path("/Kerberos") @Authenticated public class Kerberos { diff --git a/src/main/java/com/redhat/pctsec/rest/v1alpha1/Scan.java b/src/main/java/com/redhat/pctsec/rest/v1alpha1/Scan.java index e369267..a16d818 100644 --- a/src/main/java/com/redhat/pctsec/rest/v1alpha1/Scan.java +++ b/src/main/java/com/redhat/pctsec/rest/v1alpha1/Scan.java @@ -2,14 +2,19 @@ package com.redhat.pctsec.rest.v1alpha1; import com.redhat.pctsec.model.ScanCollection; import com.redhat.pctsec.model.pssaas; +import jakarta.enterprise.context.ApplicationScoped; import jakarta.validation.Valid; import jakarta.ws.rs.*; import org.jboss.resteasy.reactive.RestQuery; +import java.util.HashMap; +import java.util.List; -@Path("/Scan") +@ApplicationScoped +@Path("/api/v1a/Scan") public class Scan { + HashMap scanCollection = new HashMap<>(); @POST @Path("PSSaaS") @Consumes({ "application/json" }) @@ -18,6 +23,7 @@ public class Scan { //Validate JSON //CreateScanCollection + //Return ScanCollectionID return 1; } @@ -25,14 +31,22 @@ public class Scan { @GET @Path("{id}") public ScanCollection scanRequest(String id){ - ScanCollection sr = new ScanCollection(); - return sr; + return scanCollection.get(id.toString()); + } + + @GET + @Path("{id}/run") + public String scanRequestExe(String id){ + scanCollection.get(id.toString()).execute(); + return "We'd normally have a json payload here, with pipeline UID"; } @GET @Path("single/git") public String singleGit(@RestQuery String repo, @RestQuery String ref) { + ScanCollection sc = new ScanCollection(repo, ref); + scanCollection.put("1",sc); return "restult"; } @@ -40,6 +54,8 @@ public class Scan { @Path("single/brew") public String singleGit(@RestQuery String brewId) { + ScanCollection sc = new ScanCollection(brewId); + scanCollection.put("2",sc); return "result"; } } diff --git a/src/main/java/com/redhat/pctsec/tekton/brewTaskRun.java b/src/main/java/com/redhat/pctsec/tekton/brewTaskRun.java new file mode 100644 index 0000000..7d155f3 --- /dev/null +++ b/src/main/java/com/redhat/pctsec/tekton/brewTaskRun.java @@ -0,0 +1,49 @@ +package com.redhat.pctsec.tekton; + +import io.fabric8.tekton.client.DefaultTektonClient; +import io.fabric8.tekton.client.TektonClient; +import io.fabric8.tekton.pipeline.v1beta1.ArrayOrString; +import io.fabric8.tekton.pipeline.v1beta1.Param; +import io.fabric8.tekton.pipeline.v1beta1.TaskRun; +import io.fabric8.tekton.pipeline.v1beta1.TaskRunBuilder; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Singleton; +import org.apache.commons.lang3.RandomStringUtils; + +import jakarta.inject.Inject; + +@io.quarkus.arc.Unremovable +public class brewTaskRun { + public static final String NAMESPACE = "pct-security-tooling"; + public static final String BUILD_ID = "buildId"; + public static final String SCAN_PROFILE = "scanProfile"; + public static final String TASK_REFERENCE = "osh-scan-task"; + public static final String SERVICE_ACCOUNT = "osh"; + + //@Inject + TektonClient tektonClient = new DefaultTektonClient(); + + public String invokeScanTask(String buildId) { + // String buildId = "xterm-366-8.el9"; + String scanProfile = "snyk-only-unstable"; + + // random taskrun name generating for now + TaskRun taskRun = new TaskRunBuilder().withNewMetadata().withName("osh-scan-taskrun-" + RandomStringUtils.randomAlphanumeric(8).toLowerCase()) + .endMetadata() + .withNewSpec() + .withServiceAccountName(SERVICE_ACCOUNT) + .withNewTaskRef() + .withName(TASK_REFERENCE) + .endTaskRef() + .withParams( + new Param("buildId", new ArrayOrString(buildId)), + new Param("scanProfile", new ArrayOrString(scanProfile))) + .endSpec() + .build(); + + tektonClient.v1beta1().taskRuns().inNamespace(NAMESPACE).resource(taskRun).create(); + + return "Scan invoked"; + } + +} diff --git a/src/main/java/com/redhat/pctsec/tekton/scmUrlPipelineRun.java b/src/main/java/com/redhat/pctsec/tekton/scmUrlPipelineRun.java new file mode 100644 index 0000000..4f2f298 --- /dev/null +++ b/src/main/java/com/redhat/pctsec/tekton/scmUrlPipelineRun.java @@ -0,0 +1,6 @@ +package com.redhat.pctsec.tekton; + +public class scmUrlPipelineRun { + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 99f1ec9..52a73c3 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -25,6 +25,7 @@ %stage.quarkus.openshift.service-account=osh-wrapper-client-sa %stage.quarkus.openshift.labels.env=stage %stage.quarkus.log.level=DEBUG +quarkus.arc.remove-unused-beans=false #Only in Quarkus > 3.x %stage.quarkus.openshift.route.tls.termination=edge