diff --git a/CHANGELOG.md b/CHANGELOG.md index 22b755d48c..bf2fbd25f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Usage: ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` ### 1.12-SNAPSHOT +* Fix #1033: Print summary after jkube actions * Fix #1273: Deprecate `jkube.io` annotation prefix in favor of `jkube.eclipse.org` for JKubeAnnotations ### 1.11.0 (2023-02-16) diff --git a/gradle-plugin/doc/src/main/asciidoc/index.adoc b/gradle-plugin/doc/src/main/asciidoc/index.adoc index 7ea71a6a10..dd131ecc18 100644 --- a/gradle-plugin/doc/src/main/asciidoc/index.adoc +++ b/gradle-plugin/doc/src/main/asciidoc/index.adoc @@ -47,4 +47,5 @@ include::{kitdoc-path}/inc/plugins/_jkube_plugins.adoc[] include::inc/_kind-filename-type-mapping.adoc[] +include::{kitdoc-path}/inc/_summary.adoc[] diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/AutoTLSIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/AutoTLSIT.java index 581087104d..69bb0ff253 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/AutoTLSIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/AutoTLSIT.java @@ -39,6 +39,13 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithExpectedTLSAnnotationsAnd .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") .contains("Using first mentioned service port") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/autotls-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/autotls-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/autotls-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ConfigMapIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ConfigMapIT.java index 77a9d52255..4513a4a684 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ConfigMapIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ConfigMapIT.java @@ -43,7 +43,17 @@ void k8sResource_whenRun_generatesK8sManifestsContainingConfigMap() throws IOExc .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [spring-boot]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/configmap-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/configmap-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/jkube-annotation-directory-configmap.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/jkube-annotation-file-configmap.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/jkube-gradle-sample-config-map-configmap.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -63,6 +73,17 @@ void ocResource_whenRun_generatesOpenShiftManifestsContainingConfigMap() throws .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [spring-boot]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/configmap-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/configmap-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/jkube-annotation-directory-configmap.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/jkube-annotation-file-configmap.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/jkube-gradle-sample-config-map-configmap.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/configmap-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DebugModeIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DebugModeIT.java index 485d706b8a..9904de912f 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DebugModeIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DebugModeIT.java @@ -40,7 +40,12 @@ void k8sResource_whenRun_generatesK8sManifests() throws IOException, ParseExcept .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") .contains("Enabling debug on") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/debug-mode-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -55,6 +60,11 @@ void ocResource_whenRun_generatesK8sManifests() throws IOException, ParseExcepti .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") .contains("Enabling debug on") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/debug-mode-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultControllerIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultControllerIT.java index 2e0780e3f4..71e2f8a028 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultControllerIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultControllerIT.java @@ -40,7 +40,12 @@ void k8sResourceTask_whenRun_generatesK8sManifestWithDeployment() throws IOExcep .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/controller-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -56,6 +61,11 @@ void ocResourceTask_whenRun_generatesOpenShiftManifestWithDeploymentConfig() thr .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/controller-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultMetadataIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultMetadataIT.java index 88cb7ad935..ff074e29ee 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultMetadataIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DefaultMetadataIT.java @@ -39,7 +39,14 @@ void k8sResource_whenRun_generatesK8sManifestsWithExpectedLabelsAndAnnotations() .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") .contains("Using first mentioned service port") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/metadata-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/metadata-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/test-serviceaccount-serviceaccount.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -56,7 +63,15 @@ void k8sResource_whenRunWithReplicaSetConfiguredController_generatesK8sManifests .contains("Adding a default ReplicaSet") .contains("Adding revision history limit to 2") .contains("Using first mentioned service port") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/metadata-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/metadata-replicaset.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/metadata-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/test-serviceaccount-serviceaccount.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -71,6 +86,14 @@ void ocResource_whenRun_generatesK8sManifestsWithExpectedLabelsAndAnnotations() .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") .contains("Using first mentioned service port") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/metadata-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/metadata-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/metadata-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/test-serviceaccount-serviceaccount.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DependencyResourcesIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DependencyResourcesIT.java index ae910485de..f9786aff29 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DependencyResourcesIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DependencyResourcesIT.java @@ -42,7 +42,13 @@ void k8sResource_whenRun_generatesK8sManifestsIncludingDependencies() throws IOE assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/example-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/web-replicaset.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -59,6 +65,12 @@ void k8sResource_whenRunWithReplicas_generatesK8sManifestsIncludingDependencies( assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/example-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/web-replicaset.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleIT.java index 576955ef7d..617eb05df0 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleIT.java @@ -40,7 +40,13 @@ void k8sResource_whenRun_generatesK8sManifests() throws IOException, ParseExcept .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") .contains("Using first mentioned service port") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/dockerfile-simple-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/dockerfile-simple-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -56,6 +62,13 @@ void ocResource_whenRun_generatesOpenShiftManifests() throws IOException, ParseE .contains("Converting Deployment to DeploymentConfig") .contains("Adding revision history limit to 2") .contains("Using first mentioned service port") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/dockerfile-simple-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/dockerfile-simple-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/dockerfile-simple-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/FileSecretIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/FileSecretIT.java index 5137a44c48..e692841a15 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/FileSecretIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/FileSecretIT.java @@ -37,7 +37,12 @@ void k8sResource_whenRun_generatesK8sSecret() throws IOException, ParseException assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/secret-file-secret.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -50,6 +55,11 @@ void ocResource_whenRun_generatesK8sSecret() throws IOException, ParseException assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/secret-file-secret.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GitAnnotationsIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GitAnnotationsIT.java index 9f20c5af11..0e49cc967c 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GitAnnotationsIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GitAnnotationsIT.java @@ -38,7 +38,12 @@ void k8sResource_whenRun_generatesK8sManifestsWithGitAnnotations() throws IOExce .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/git-annotations-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -52,6 +57,11 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithGitAnnotations() throws I .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/git-annotations-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GroovyDSLImageIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GroovyDSLImageIT.java index a36fe1fab5..69db9593de 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GroovyDSLImageIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/GroovyDSLImageIT.java @@ -39,6 +39,12 @@ void k8sResource_whenRun_generatesK8sManifests() throws IOException, ParseExcept .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") .contains("Using first mentioned service port") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/groovy-dsl-image-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/groovy-dsl-image-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageChangeTriggerIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageChangeTriggerIT.java index a6a6c589fd..1fb3aa0f0d 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageChangeTriggerIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageChangeTriggerIT.java @@ -48,6 +48,11 @@ void ocResource_whenRunWithProvidedArg_generatesDeploymentConfigWithNoImageChang .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/imagechangetrigger-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullPolicyIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullPolicyIT.java index b86671c232..14be61cf24 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullPolicyIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullPolicyIT.java @@ -62,7 +62,12 @@ void k8sResource_whenRun_generatesK8sManifestsWithProjectLabels(String expectedD assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/imagepullpolicy-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "resource task with {1} ") @@ -81,6 +86,11 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithProjectLabels(String expe assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/imagepullpolicy-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/IngressIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/IngressIT.java index 1c5e7c293c..65b1e31c47 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/IngressIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/IngressIT.java @@ -60,6 +60,13 @@ void k8sResourceTask_whenRun_generatesK8sManifestWithIngress(String profileName, .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/ingress-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/ingress-ingress.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/ingress-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/JavaOptionsEnvMergeIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/JavaOptionsEnvMergeIT.java index 7e26c75901..3e69b8a716 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/JavaOptionsEnvMergeIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/JavaOptionsEnvMergeIT.java @@ -38,7 +38,12 @@ void k8sResource_whenRun_thenGeneratedManifestShouldHaveMergedEnvVariables() thr .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/java-options-env-merge-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -52,6 +57,11 @@ void ocResource_whenRun_thenGeneratedManifestShouldHaveMergedEnvVariables() thro .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/java-options-env-merge-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NameIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NameIT.java index 8add45d2f0..95e3d25cd6 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NameIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NameIT.java @@ -52,7 +52,11 @@ void k8sResource_whenRun_generatesK8sManifestsWithDefaultName(String expectedDir .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "k8sResource {0} configured name = {1}") @@ -69,7 +73,11 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithDefaultName(String expect .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NamespaceIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NamespaceIT.java index d14774891b..364b0c690d 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NamespaceIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/NamespaceIT.java @@ -56,7 +56,12 @@ void k8sResourceTask_whenRunWithConfiguredWithNamespace_generatesK8sManifestWith assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/namespace-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "{0} : jkube.namespace = {1}, jkube.enricher.jkube-namespace.namespace={2}") @@ -74,6 +79,11 @@ void ocResourceTask_whenRunWithConfiguredWithNamespace_generatesOpenShiftManifes assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/namespace-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/OpenLibertyIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/OpenLibertyIT.java index af6eeb8292..e4a52ad353 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/OpenLibertyIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/OpenLibertyIT.java @@ -43,7 +43,13 @@ void k8sResource_whenRun_generatesK8sManifestsWithProbes() throws IOException, P .contains("jkube-healthcheck-openliberty: Adding liveness probe on port 9080") .contains("jkube-healthcheck-openliberty: Adding startup probe on port 9080") .contains("jkube-service-discovery: Using first mentioned service port '9080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/openliberty-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/openliberty-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -63,6 +69,13 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithProbes() throws IOExcepti .contains("jkube-healthcheck-openliberty: Adding liveness probe on port 9080") .contains("jkube-healthcheck-openliberty: Adding startup probe on port 9080") .contains("jkube-service-discovery: Using first mentioned service port '9080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/openliberty-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/openliberty-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/openliberty-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProbesGroovyDSLIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProbesGroovyDSLIT.java index 2509db3a80..33246b4200 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProbesGroovyDSLIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProbesGroovyDSLIT.java @@ -43,7 +43,13 @@ void k8sResource_whenRun_generatesK8sManifestsWithProbes(String probeConfigMode) .contains("jkube-controller: Adding a default Deployment") .contains("jkube-service: Adding a default service") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/probes-groovy-dsl-config-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/probes-groovy-dsl-config-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "{0}") @@ -62,6 +68,13 @@ void ocResource_whenRun_generatesOpenShiftManifests(String probeConfigMode) thro .contains("jkube-service: Adding a default service") .contains("jkube-openshift-deploymentconfig: Converting Deployment to DeploymentConfig") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/probes-groovy-dsl-config-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/probes-groovy-dsl-config-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/probes-groovy-dsl-config-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProjectLabelIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProjectLabelIT.java index c4911f3270..67ff2e77ba 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProjectLabelIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ProjectLabelIT.java @@ -61,7 +61,13 @@ void k8sResource_whenRun_generatesK8sManifestsWithProjectLabels(String expectedD .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/project-label-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/project-label-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "k8sResource {0} configured project-label ") @@ -81,6 +87,13 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithProjectLabels(String expe .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/project-label-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/project-label-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/project-label-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RevisionHistoryIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RevisionHistoryIT.java index 525218b465..9071edd5bd 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RevisionHistoryIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RevisionHistoryIT.java @@ -58,7 +58,12 @@ void k8sResource_whenRun_generatesK8sManifestsWithRevisionHistory(String expecte .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to ") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/revisionhistory-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "k8sResource {0} configured limit = {1}") @@ -78,6 +83,11 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithRevisionHistory(String ex .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to ") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/revisionhistory-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RouteIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RouteIT.java index 8558d31612..26b43b25c6 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RouteIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/RouteIT.java @@ -52,7 +52,13 @@ void ocResource_whenRunWithRouteFlag_generatesOpenShiftManifests(String expected .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to ") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/route-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/route-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); assertThat(gradleRunner.resolveDefaultOpenShiftResourceDir().listFiles()) .hasSize(expectedGeneratedFiles); } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceAccountIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceAccountIT.java index 40d07a91a0..6f32388bb6 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceAccountIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceAccountIT.java @@ -59,7 +59,11 @@ void k8sResource_whenRun_generatesServiceAccount(String testProjectDir, String[] assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "resource task on project = {0} with {1}") @@ -78,6 +82,10 @@ void ocResource_whenRun_generatesServiceAccount(String testProjectDir, String[] .contains("Using resource templates from") .contains("Converting Deployment to DeploymentConfig") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceIT.java index 1cf63c0eae..ef0a7321a2 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ServiceIT.java @@ -40,7 +40,14 @@ void k8sResourceTask_whenRun_generatesK8sManifestWithService() throws IOExceptio .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/service-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/svc1-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/svc2-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -56,6 +63,14 @@ void ocResourceTask_whenRun_generatesOpenShiftManifestWithServiceAndRoute() thro .contains("Using resource templates from") .contains("Adding a default Deployment") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/service-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/svc1-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/svc1-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/svc2-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootIT.java index ac482064eb..154a62bf61 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootIT.java @@ -44,7 +44,14 @@ void k8sResource_whenRun_generatesK8sManifests() throws IOException, ParseExcept .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [spring-boot]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/spring-boot-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/spring-boot-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -64,6 +71,14 @@ void ocResource_whenRun_generatesOpenShiftManifests() throws IOException, ParseE .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [spring-boot]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/spring-boot-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/spring-boot-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/spring-boot-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootWithFragmentIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootWithFragmentIT.java index 006f7935e0..78cde31e7d 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootWithFragmentIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootWithFragmentIT.java @@ -42,7 +42,14 @@ void k8sResource_whenRun_generatesK8sManifests() throws IOException, ParseExcept .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [spring-boot]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/spring-boot-with-fragment-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/spring-boot-with-fragment-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -61,6 +68,14 @@ void ocResource_whenRun_generatesOpenShiftManifests() throws IOException, ParseE .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") .contains("jkube-service-discovery: Using first mentioned service port '8080' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [spring-boot]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/spring-boot-with-fragment-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/spring-boot-with-fragment-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/spring-boot-with-fragment-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/TriggersAnnotationIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/TriggersAnnotationIT.java index 17b6907a48..3336937f5e 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/TriggersAnnotationIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/TriggersAnnotationIT.java @@ -40,7 +40,12 @@ void k8sResourceTask_whenRun_generatesK8sManifestWithTriggersAnnotation() throws .contains("Using resource templates from") .contains("Adding a default ReplicaSet") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/triggersannotation-replicaset.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @Test @@ -56,6 +61,11 @@ void ocResourceTask_whenRun_generatesOpenShiftManifestWithTriggersAnnotation() t .contains("Using resource templates from") .contains("Adding a default ReplicaSet") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/triggersannotation-replicaset.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VertxIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VertxIT.java index 2d7b0c14af..b0cabb0fd9 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VertxIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VertxIT.java @@ -70,7 +70,14 @@ void k8sResource_whenRun_generatesK8sManifestsWithProbes(String description, Str .contains("jkube-healthcheck-vertx: Adding readiness probe on port 8888") .contains("jkube-healthcheck-vertx: Adding liveness probe on port 8888") .contains("jkube-service-discovery: Using first mentioned service port '8888' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [vertx]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/vertx-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/vertx-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "resource task with {0} generates deployment with liveness and readiness probes") @@ -95,6 +102,13 @@ void ocResource_whenRun_generatesOpenShiftManifestsWithProbes(String description .contains("jkube-healthcheck-vertx: Adding readiness probe on port 8888") .contains("jkube-healthcheck-vertx: Adding liveness probe on port 8888") .contains("jkube-service-discovery: Using first mentioned service port '8888' ") - .contains("jkube-revision-history: Adding revision history limit to 2"); + .contains("jkube-revision-history: Adding revision history limit to 2") + .contains("SUMMARY") + .contains("Generators applied: [vertx]") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/vertx-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/vertx-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java index 729c030a57..2acbd11a48 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java @@ -58,7 +58,14 @@ void k8sResourceTask_whenRun_generatesK8sManifestWithPersistentVolume(String exp assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/jkube-docker-registry-deployment.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/jkube-docker-registry-service.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes/jkube-docker-registry-storage-persistentvolumeclaim.yml") + .contains("build/classes/java/main/META-INF/jkube/kubernetes.yml") + .contains("SUCCESS"); } @ParameterizedTest(name = "{0} : jkube.enricher.jkube-volume-permission.defaultStorageClass={1}") @@ -77,6 +84,14 @@ void ocResourceTask_whenRun_generatesOpenShiftManifestWithPersistentVolume(Strin assertThat(result).extracting(BuildResult::getOutput).asString() .contains("Using resource templates from") .contains("Adding revision history limit to 2") - .contains("validating"); + .contains("validating") + .contains("SUMMARY") + .contains("Generated resources:") + .contains("build/classes/java/main/META-INF/jkube/openshift/jkube-docker-registry-deploymentconfig.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/jkube-docker-registry-route.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/jkube-docker-registry-service.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift/jkube-docker-registry-storage-persistentvolumeclaim.yml") + .contains("build/classes/java/main/META-INF/jkube/openshift.yml") + .contains("SUCCESS"); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/GradleUtil.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/GradleUtil.java index fc8edd75c5..5489186a6d 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/GradleUtil.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/GradleUtil.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -104,6 +105,19 @@ private static Properties extractProperties(Project gradleProject) { }, (acc, e) -> acc); } + public static String getLastExecutingTask(Project gradleProject, Map taskPrioritiesMap) { + List tasks = gradleProject.getGradle().getStartParameter().getTaskNames().stream() + .filter(taskPrioritiesMap::containsKey) + .sorted(Comparator.comparing(taskPrioritiesMap::get)) + .collect(Collectors.toList()); + + if (tasks == null || tasks.isEmpty()) { + return null; + } + + return tasks.get(tasks.size() - 1); + } + private static List extractDependencies(Project gradleProject) { return extractDependencies(gradleProject, rr -> rr.getRoot().getDependencies()); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java index f4c37512fd..c141837e26 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java @@ -261,6 +261,8 @@ public abstract class KubernetesExtension { public abstract Property getWatchContainerNamePattern(); + public abstract Property getSummaryEnabled(); + public WatchMode watchMode; public JKubeBuildStrategy buildStrategy; @@ -734,6 +736,10 @@ public String getWatchShowLogsOrNull() { return getOrDefaultString("jkube.watch.showLogs", this::getWatchShowLogs, null); } + public boolean getSummaryEnabledOrDefault() { + return getOrDefaultBoolean("jkube.summaryEnabled", this::getSummaryEnabled, true); + } + protected boolean getOrDefaultBoolean(String property, Supplier> dslGetter, boolean defaultValue) { return getOrDefault(property, Boolean::parseBoolean, dslGetter, defaultValue); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index b6336b91f8..ff75eb6617 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -48,6 +48,7 @@ import static org.eclipse.jkube.kit.build.service.docker.helper.ConfigHelper.initImageConfiguration; import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.updateResourceConfigNamespace; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummaryIfLastExecuting; public abstract class AbstractJKubeTask extends DefaultTask implements KubernetesJKubeTask { @@ -66,12 +67,16 @@ protected AbstractJKubeTask(Class extensionClass) @TaskAction public final void runTask() { - init(); - if (shouldSkip()) { + try { + init(); + if (shouldSkip()) { kitLogger.info("`%s` task is skipped.", this.getName()); return; + } + run(); + } finally { + printSummaryIfLastExecuting(jKubeServiceHub, getName(), GradleUtil.getLastExecutingTask(getProject(), getTaskPrioritiesMap())); } - run(); } private void init() { @@ -83,6 +88,9 @@ private void init() { jKubeServiceHub = initJKubeServiceHubBuilder().build(); kubernetesExtension.resources = updateResourceConfigNamespace(kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources); ImageConfigResolver imageConfigResolver = new ImageConfigResolver(); + jKubeServiceHub.getSummaryService().setSuccessful(true); + jKubeServiceHub.getSummaryService().setActionType("Tasks"); + jKubeServiceHub.getSummaryService().addToActions(getName()); try { resolvedImages = resolveImages(imageConfigResolver); final JKubeEnricherContext context = JKubeEnricherContext.builder() @@ -95,6 +103,7 @@ private void init() { .resources(kubernetesExtension.resources) .log(kitLogger) .jKubeBuildStrategy(kubernetesExtension.getBuildStrategyOrDefault()) + .summaryService(jKubeServiceHub.getSummaryService()) .build(); final List extraClasspathElements = kubernetesExtension.getUseProjectClassPathOrDefault() ? kubernetesExtension.javaProject.getCompileClassPathElements() : Collections.emptyList(); @@ -115,7 +124,7 @@ public KubernetesExtension getExtension() { } private List customizeConfig(List configs) { - return GeneratorManager.generate(configs, initGeneratorContextBuilder().build(), false); + return GeneratorManager.generate(configs, initGeneratorContextBuilder().build(), false, jKubeServiceHub.getSummaryService()); } private boolean isAnsiEnabled() { @@ -145,6 +154,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { .build()) .clusterAccess(clusterAccess) .offline(kubernetesExtension.getOfflineOrDefault()) + .summaryEnabled(kubernetesExtension.getSummaryEnabledOrDefault()) .platformMode(kubernetesExtension.getRuntimeMode()); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java index d6ce30dd3d..d8ff205ed2 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java @@ -32,6 +32,8 @@ import java.util.List; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.resolveFallbackNamespace; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummary; @SuppressWarnings("CdiInjectionPointsInspection") public class KubernetesApplyTask extends AbstractJKubeTask { @@ -62,13 +64,13 @@ public void run() { kitLogger.info("[[B]]HINT:[[B]] Use the command `%s get pods -w` to watch your pods start up", clusterAccess.isOpenShift() ? "oc" : "kubectl"); } catch (KubernetesClientException e) { - KubernetesResourceUtil.handleKubernetesClientException(e, kitLogger); + IllegalStateException illegalStateException = KubernetesResourceUtil.handleKubernetesClientException(e, kitLogger, jKubeServiceHub.getSummaryService()); + printSummary(jKubeServiceHub); + throw illegalStateException; } catch (IOException ioException) { kitLogger.error("Error in loading Kubernetes Manifests ", ioException); + handleExceptionAndSummary(jKubeServiceHub, ioException); throw new IllegalStateException(ioException); - } catch (InterruptedException interruptedException) { - Thread.currentThread().interrupt(); - throw new IllegalStateException(interruptedException.getMessage(), interruptedException); } } @@ -77,7 +79,7 @@ protected boolean shouldSkip() { return super.shouldSkip() || kubernetesExtension.getSkipApplyOrDefault(); } - private void applyEntities(String fileName, final Collection entities) throws InterruptedException { + private void applyEntities(String fileName, final Collection entities) { KitLogger serviceLogger = createLogger("[[G]][SVC][[G]] [[s]]"); applyService.applyEntities(fileName, entities, serviceLogger, kubernetesExtension.getServiceUrlWaitTimeSecondsOrDefault()); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTask.java index b7e14e0f20..b54ad2ce72 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTask.java @@ -29,6 +29,7 @@ import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestampFile; import static org.eclipse.jkube.kit.common.util.EnvUtil.storeTimestamp; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; @SuppressWarnings("CdiInjectionPointsInspection") public class KubernetesBuildTask extends AbstractJKubeTask { @@ -65,6 +66,7 @@ public void run() { jKubeServiceHub.getBuildService().build(resolvedImages.toArray(new ImageConfiguration[0])); } catch (JKubeServiceException | IOException e) { kitLogger.error(e.getMessage()); + handleExceptionAndSummary(jKubeServiceHub, e); throw new GradleException(e.getMessage(), e); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java index e999a98b3e..0fffcb8d56 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java @@ -18,6 +18,7 @@ import javax.inject.Inject; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmPushConfig; @@ -41,6 +42,7 @@ public void run() { jKubeServiceHub.getHelmService().uploadHelmChart(helm); } catch (Exception exp) { kitLogger.error("Error performing helm push", exp); + handleExceptionAndSummary(jKubeServiceHub, exp); throw new IllegalStateException(exp.getMessage(), exp); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java index 69cd72c53f..02ff86d303 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; public class KubernetesHelmTask extends AbstractJKubeTask { @@ -41,6 +42,7 @@ public void run() { kubernetesExtension.helm).build(); jKubeServiceHub.getHelmService().generateHelmCharts(helm); } catch (IOException exception) { + handleExceptionAndSummary(jKubeServiceHub, exception); throw new IllegalStateException(exception.getMessage(), exception); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesJKubeTask.java index bd951dec8c..9a9c86ee19 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesJKubeTask.java @@ -16,6 +16,10 @@ import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.gradle.api.tasks.Internal; +import java.util.HashMap; +import java.util.Map; + + public interface KubernetesJKubeTask extends JKubeTask { String DEFAULT_LOG_PREFIX = "k8s: "; @@ -26,4 +30,20 @@ public interface KubernetesJKubeTask extends JKubeTask { default String getLogPrefix() { return DEFAULT_LOG_PREFIX; } + + @Internal + default Map getTaskPrioritiesMap() { + Map kubernetesPluginTaskPriorities = new HashMap<>(); + kubernetesPluginTaskPriorities.put("k8sBuild", 1); + kubernetesPluginTaskPriorities.put("k8sResource", 2); + kubernetesPluginTaskPriorities.put("k8sPush", 2); + kubernetesPluginTaskPriorities.put("k8sHelm", 3); + kubernetesPluginTaskPriorities.put("k8sHelmPush", 4); + kubernetesPluginTaskPriorities.put("k8sApply", 5); + kubernetesPluginTaskPriorities.put("k8sLog", 6); + kubernetesPluginTaskPriorities.put("k8sDebug", 6); + kubernetesPluginTaskPriorities.put("k8sWatch", 6); + kubernetesPluginTaskPriorities.put("k8sUndeploy", 7); + return kubernetesPluginTaskPriorities; + } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java index eedfd17016..72782c48d3 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java @@ -23,6 +23,8 @@ import javax.inject.Inject; import java.util.Collections; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; + public class KubernetesPushTask extends AbstractJKubeTask { @Inject public KubernetesPushTask(Class extensionClass) { @@ -44,6 +46,7 @@ public void run() { jKubeServiceHub.getBuildService() .push(resolvedImages, kubernetesExtension.getPushRetriesOrDefault(), initRegistryConfig(), kubernetesExtension.getSkipTagOrDefault()); } catch (JKubeServiceException e) { + handleExceptionAndSummary(jKubeServiceHub, e); throw new IllegalStateException("Error in pushing image: " + e.getMessage(), e); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java index 5510e6e117..17311b1024 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java @@ -34,6 +34,7 @@ import static org.eclipse.jkube.kit.common.util.DekorateUtil.DEFAULT_RESOURCE_LOCATION; import static org.eclipse.jkube.kit.common.util.DekorateUtil.useDekorate; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; import static org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil.updateKindFilenameMappings; import static org.eclipse.jkube.kit.common.JKubeFileInterpolator.interpolate; @@ -88,10 +89,11 @@ public void run() { ResourceClassifier resourceClassifier = kubernetesExtension.getResourceClassifier(); KubernetesList resourceList = jKubeServiceHub.getResourceService().generateResources(kubernetesExtension.getPlatformMode(), enricherManager, kitLogger); final File resourceClassifierDir = new File(kubernetesExtension.getResourceTargetDirectoryOrDefault(), resourceClassifier.getValue()); - jKubeServiceHub.getResourceService().writeResources(resourceList, resourceClassifier, kitLogger); + jKubeServiceHub.getResourceService().writeResources(resourceList, resourceClassifier, kitLogger, jKubeServiceHub.getSummaryService()); validateIfRequired(resourceClassifierDir, resourceClassifier); } } catch (IOException e) { + handleExceptionAndSummary(jKubeServiceHub, e); throw new IllegalStateException("Failed to generate kubernetes descriptor", e); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java index d733da2b89..182d911bbb 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Optional; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; + public class KubernetesUndeployTask extends AbstractJKubeTask { @Inject @@ -44,6 +46,7 @@ public void run() { jKubeServiceHub.getUndeployService() .undeploy(environmentResourceDirs, resources, findManifestsToUndeploy().toArray(new File[0])); } catch (IOException e) { + handleExceptionAndSummary(jKubeServiceHub, e); throw new IllegalStateException(e.getMessage(), e); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java index 15346b4163..8c329db9fd 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java @@ -37,6 +37,8 @@ import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.applicableNamespace; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummary; public class KubernetesWatchTask extends AbstractJKubeTask { @Inject @@ -68,8 +70,11 @@ public void run() { resources, context); } catch (KubernetesClientException kubernetesClientException) { - KubernetesResourceUtil.handleKubernetesClientException(kubernetesClientException, kitLogger); + IllegalStateException illegalStateException = KubernetesResourceUtil.handleKubernetesClientException(kubernetesClientException, kitLogger, jKubeServiceHub.getSummaryService()); + printSummary(jKubeServiceHub); + throw illegalStateException; } catch (Exception ioException) { + handleExceptionAndSummary(jKubeServiceHub, ioException); throw new IllegalStateException("An error has occurred while while trying to watch the resources", ioException); } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/GradleUtilTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/GradleUtilTest.java index 33dfef5ad7..ee5212ba7d 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/GradleUtilTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/GradleUtilTest.java @@ -18,6 +18,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -32,6 +33,7 @@ import org.eclipse.jkube.kit.common.JavaProject; +import org.gradle.StartParameter; import org.gradle.api.Project; import org.gradle.api.UnknownDomainObjectException; import org.gradle.api.artifacts.Configuration; @@ -42,6 +44,7 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult; import org.gradle.api.internal.plugins.DefaultPluginContainer; import org.gradle.api.internal.provider.DefaultProvider; +import org.gradle.api.invocation.Gradle; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.internal.deprecation.DeprecatableConfiguration; import org.junit.jupiter.api.BeforeEach; @@ -320,6 +323,35 @@ void canBeResolved_DeprecatedAndNullResolutionAlternativesAndResolvable_shouldRe assertThat(result).isTrue(); } + @Test + void getLastExecutingTask_whenTasksReturnedEmpty_shouldReturnNull() { + // Given + When + String task = GradleUtil.getLastExecutingTask(project, Collections.emptyMap()); + + // Then + assertThat(task).isNull(); + } + + @Test + void getLastExecutingTask_whenTasksReturnsValidList_shouldReturnLastExecutingTask() { + // Given + Gradle gradle = mock(Gradle.class); + StartParameter startParameter = mock(StartParameter.class); + when(startParameter.getTaskNames()).thenReturn(Arrays.asList("k8sBuild", "k8sResource", "k8sApply")); + when(gradle.getStartParameter()).thenReturn(startParameter); + when(project.getGradle()).thenReturn(gradle); + Map taskPrioritiesMap = new HashMap<>(); + taskPrioritiesMap.put("k8sBuild", 1); + taskPrioritiesMap.put("k8sResource", 1); + taskPrioritiesMap.put("k8sApply", 2); + + // When + String task = GradleUtil.getLastExecutingTask(project, taskPrioritiesMap); + + // Then + assertThat(task).isEqualTo("k8sApply"); + } + private static Function configurationDependencyMock() { return s -> { final Configuration c = mock(Configuration.class, RETURNS_DEEP_STUBS); diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java index c071cc9f1f..07add7e727 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java @@ -391,4 +391,9 @@ public Property getWatchShowLogs() { public Property getWatchContainerNamePattern() { return new DefaultProperty<>(String.class); } + + @Override + public Property getSummaryEnabled() { + return new DefaultProperty<>(Boolean.class); + } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java index 77c6cb55e1..e3ee36aa35 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java @@ -17,9 +17,11 @@ import java.net.URL; import java.util.Collections; +import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; +import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.ApplyService; @@ -30,14 +32,19 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.MockedConstruction; +import org.mockito.MockedStatic; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -48,7 +55,6 @@ class KubernetesApplyTaskTest { private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); private MockedConstruction clusterAccessMockedConstruction; - private MockedConstruction applyServiceMockedConstruction; private TestKubernetesExtension extension; @BeforeEach @@ -60,7 +66,6 @@ void setUp() throws IOException { when(kubernetesClient.adapt(OpenShiftClient.class)).thenReturn(kubernetesClient); when(mock.createDefaultClient()).thenReturn(kubernetesClient); }); - applyServiceMockedConstruction = mockConstruction(ApplyService.class); extension = new TestKubernetesExtension(); when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); extension.isFailOnNoKubernetesJson = false; @@ -68,7 +73,6 @@ void setUp() throws IOException { @AfterEach void tearDown() { - applyServiceMockedConstruction.close(); clusterAccessMockedConstruction.close(); } @@ -97,58 +101,121 @@ void runTask_withNoManifest_shouldThrowException() { @Test void configureApplyService_withManifest_shouldSetDefaults() throws Exception { - // Given - taskEnvironment.withKubernetesManifest(); - final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); - // When - applyTask.runTask(); - // Then - final ApplyService as = applyServiceMockedConstruction.constructed().iterator().next(); - verify(as, times(1)).setAllowCreate(true); - verify(as, times(1)).setServicesOnlyMode(false); - verify(as, times(1)).setIgnoreServiceMode(false); - verify(as, times(1)).setLogJsonDir(any()); - verify(as, times(1)).setBasedir(taskEnvironment.getRoot()); - verify(as, times(1)).setSupportOAuthClients(false); - verify(as, times(1)).setIgnoreRunningOAuthClients(true); - verify(as, times(1)).setProcessTemplatesLocally(true); - verify(as, times(1)).setDeletePodsOnReplicationControllerUpdate(true); - verify(as, times(1)).setRollingUpgrade(false); - verify(as, times(1)).setRollingUpgradePreserveScale(false); - verify(as, times(1)).setRecreateMode(false); - verify(as, times(1)).setNamespace(null); - verify(as, times(1)).setFallbackNamespace(null); + try (MockedConstruction applyServiceMockedConstruction = mockConstruction(ApplyService.class)) { + // Given + taskEnvironment.withKubernetesManifest(); + final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); + // When + applyTask.runTask(); + // Then + final ApplyService as = applyServiceMockedConstruction.constructed().iterator().next(); + verify(as, times(1)).setAllowCreate(true); + verify(as, times(1)).setServicesOnlyMode(false); + verify(as, times(1)).setIgnoreServiceMode(false); + verify(as, times(1)).setLogJsonDir(any()); + verify(as, times(1)).setBasedir(taskEnvironment.getRoot()); + verify(as, times(1)).setSupportOAuthClients(false); + verify(as, times(1)).setIgnoreRunningOAuthClients(true); + verify(as, times(1)).setProcessTemplatesLocally(true); + verify(as, times(1)).setDeletePodsOnReplicationControllerUpdate(true); + verify(as, times(1)).setRollingUpgrade(false); + verify(as, times(1)).setRollingUpgradePreserveScale(false); + verify(as, times(1)).setRecreateMode(false); + verify(as, times(1)).setNamespace(null); + verify(as, times(1)).setFallbackNamespace(null); + } + } + + @Test + void configureApplySerVvice_withManifest_shouldSetDefaults() throws Exception { + try (MockedConstruction applyServiceMockedConstruction = mockConstruction(ApplyService.class)) { + // Given + taskEnvironment.withKubernetesManifest(); + final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); + // When + applyTask.runTask(); + // Then + final ApplyService as = applyServiceMockedConstruction.constructed().iterator().next(); + verify(as, times(1)).setAllowCreate(true); + verify(as, times(1)).setServicesOnlyMode(false); + verify(as, times(1)).setIgnoreServiceMode(false); + verify(as, times(1)).setLogJsonDir(any()); + verify(as, times(1)).setBasedir(taskEnvironment.getRoot()); + verify(as, times(1)).setSupportOAuthClients(false); + verify(as, times(1)).setIgnoreRunningOAuthClients(true); + verify(as, times(1)).setProcessTemplatesLocally(true); + verify(as, times(1)).setDeletePodsOnReplicationControllerUpdate(true); + verify(as, times(1)).setRollingUpgrade(false); + verify(as, times(1)).setRollingUpgradePreserveScale(false); + verify(as, times(1)).setRecreateMode(false); + verify(as, times(1)).setNamespace(null); + verify(as, times(1)).setFallbackNamespace(null); + } } @Test void runTask_withManifest_shouldApplyEntities() throws Exception { - // Given - taskEnvironment.withKubernetesManifest(); - final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); - // When - applyTask.runTask(); - // Then - assertThat(applyServiceMockedConstruction.constructed()).hasSize(1); - verify(applyServiceMockedConstruction.constructed().iterator().next(), times(1)) - .applyEntities(any(), eq(Collections.emptyList()), any(), eq(5L)); + try (MockedConstruction applyServiceMockedConstruction = mockConstruction(ApplyService.class)) { + // Given + taskEnvironment.withKubernetesManifest(); + final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); + // When + applyTask.runTask(); + // Then + assertThat(applyServiceMockedConstruction.constructed()).hasSize(1); + verify(applyServiceMockedConstruction.constructed().iterator().next(), times(1)) + .applyEntities(any(), eq(Collections.emptyList()), any(), eq(5L)); + } } @Test void runTask_withSkipApply_shouldDoNothing() { - // Given - extension = new TestKubernetesExtension() { - @Override - public Property getSkipApply() { - return new DefaultProperty<>(Boolean.class).value(true); - } - }; - when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); - final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); + try (MockedConstruction applyServiceMockedConstruction = mockConstruction(ApplyService.class)) { + // Given + extension = new TestKubernetesExtension() { + @Override + public Property getSkipApply() { + return new DefaultProperty<>(Boolean.class).value(true); + } + }; + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); + + // When + applyTask.runTask(); + + // Then + assertThat(applyServiceMockedConstruction.constructed()).isEmpty(); + } + } - // When - applyTask.runTask(); + @Test + void runTask_whenApplyServiceFails_thenExceptionThrown() { + try (MockedConstruction applyServiceMockedConstruction = mockConstruction(ApplyService.class, (mock, ctx) -> { + doThrow(new KubernetesClientException("failure")).when(mock).applyEntities(anyString(), any(), any(), anyLong()); + })) { + // Given + final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(applyTask::runTask) + .withMessage("failure"); + assertThat(applyServiceMockedConstruction.constructed()).hasSize(1); + } + } - // Then - assertThat(applyServiceMockedConstruction.constructed()).isEmpty(); + @Test + void runTask_whenLoadingManifestFails_thenExceptionThrown() { + try (MockedStatic kubernetesHelperMockedStatic = mockStatic(KubernetesHelper.class)) { + // Given + kubernetesHelperMockedStatic.when(() -> KubernetesHelper.loadResources(any())).thenThrow(new IOException("failure")); + final KubernetesApplyTask applyTask = new KubernetesApplyTask(KubernetesExtension.class); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(applyTask::runTask) + .withMessageContaining("failure"); + } } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java index 0c09e22ae7..b9b9be3ddb 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java @@ -112,6 +112,13 @@ void runTask_withImageConfigurationAndNoApplicableService_shouldThrowException() void runTask_withImageConfigurationAndBuildError_shouldThrowException() { // Given isBuildError = true; + extension = new TestKubernetesExtension() { + @Override + public Property getSummaryEnabled() { + return new DefaultProperty<>(Boolean.class).value(false); + } + }; + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); final KubernetesBuildTask buildTask = new KubernetesBuildTask(KubernetesExtension.class); // When & Then assertThatExceptionOfType(GradleException.class) diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesLogTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesLogTaskTest.java index 8949b57e42..774233470c 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesLogTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesLogTaskTest.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.gradle.api.internal.provider.DefaultProperty; +import org.gradle.api.provider.Property; import org.mockito.MockedStatic; import org.mockito.Mockito; @@ -61,6 +63,13 @@ void runTask_withNoK8sManifests_shouldLogCantWatchPods() { @Test void runTask_withNoManifestAndFailure_shouldThrowException() { // Given + extension = new TestKubernetesExtension() { + @Override + public Property getSummaryEnabled() { + return new DefaultProperty<>(Boolean.class).value(false); + } + }; + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); extension.isFailOnNoKubernetesJson = true; final KubernetesLogTask kubernetesLogTask = new KubernetesLogTask(KubernetesExtension.class); // When & Then @@ -74,6 +83,13 @@ void runTask_withIOException_shouldThrowException() { try (MockedStatic mockStatic = Mockito.mockStatic(KubernetesHelper.class)) { // Given mockStatic.when(() -> KubernetesHelper.loadResources(any())).thenThrow(new IOException("IO error with logs")); + extension = new TestKubernetesExtension() { + @Override + public Property getSummaryEnabled() { + return new DefaultProperty<>(Boolean.class).value(false); + } + }; + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); KubernetesLogTask kubernetesLogTask = new KubernetesLogTask(KubernetesExtension.class); // When & Then assertThatExceptionOfType(GradleException.class) diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java index c2f4c9de98..5d2bbb7cf7 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java @@ -33,12 +33,14 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.MockedConstruction; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.contains; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; @@ -51,7 +53,6 @@ class KubernetesPushTaskTest { private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); private MockedConstruction dockerAccessFactoryMockedConstruction; - private MockedConstruction dockerBuildServiceMockedConstruction; private KubernetesExtension extension; @BeforeEach @@ -59,8 +60,6 @@ void setUp() throws IOException { // Mock required for environments with no DOCKER available (don't remove) dockerAccessFactoryMockedConstruction = mockConstruction(DockerAccessFactory.class, (mock, ctx) -> when(mock.createDockerAccess(any())).thenReturn(mock(DockerAccess.class))); - dockerBuildServiceMockedConstruction = mockConstruction(DockerBuildService.class, - (mock, ctx) -> when(mock.isApplicable()).thenReturn(true)); extension = new TestKubernetesExtension(); when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); extension.images = Collections.singletonList(ImageConfiguration.builder() @@ -73,45 +72,67 @@ void setUp() throws IOException { @AfterEach void tearDown() { - dockerBuildServiceMockedConstruction.close(); dockerAccessFactoryMockedConstruction.close(); } @Test void run_withImageConfiguration_shouldPushImage() throws JKubeServiceException { - // Given - final KubernetesPushTask kubernetesPushTask = new KubernetesPushTask(KubernetesExtension.class); - - // When - kubernetesPushTask.runTask(); - - // Then - assertThat(dockerBuildServiceMockedConstruction.constructed()).hasSize(1); - verify(dockerBuildServiceMockedConstruction.constructed().iterator().next(), times(1)) - .push(eq(extension.images), eq(0), any(), eq(false)); + try (MockedConstruction dockerBuildServiceMockedConstruction = mockConstruction(DockerBuildService.class, + (mock, ctx) -> when(mock.isApplicable()).thenReturn(true))) { + // Given + final KubernetesPushTask kubernetesPushTask = new KubernetesPushTask(KubernetesExtension.class); + + // When + kubernetesPushTask.runTask(); + + // Then + assertThat(dockerBuildServiceMockedConstruction.constructed()).hasSize(1); + verify(dockerBuildServiceMockedConstruction.constructed().iterator().next(), times(1)) + .push(eq(extension.images), eq(0), any(), eq(false)); + } } @Test void runTask_withSkipPush_shouldDoNothing() throws JKubeServiceException { - // Given - extension = new TestKubernetesExtension() { - @Override - public Property getSkipPush() { - return new DefaultProperty<>(Boolean.class).value(true); - } - }; - when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); - final KubernetesPushTask pushTask = new KubernetesPushTask(KubernetesExtension.class); - when(pushTask.getName()).thenReturn("k8sPush"); - - // When - pushTask.runTask(); - - // Then - assertThat(dockerBuildServiceMockedConstruction.constructed()).isEmpty(); - verify(pushTask.jKubeServiceHub.getBuildService(), times(0)).push(any(), anyInt(), any(), anyBoolean()); - verify(taskEnvironment.logger, times(1)).lifecycle(contains("k8s: `k8sPush` task is skipped.")); + try (MockedConstruction dockerBuildServiceMockedConstruction = mockConstruction(DockerBuildService.class, + (mock, ctx) -> when(mock.isApplicable()).thenReturn(true))) { + // Given + extension = new TestKubernetesExtension() { + @Override + public Property getSkipPush() { + return new DefaultProperty<>(Boolean.class).value(true); + } + }; + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + final KubernetesPushTask pushTask = new KubernetesPushTask(KubernetesExtension.class); + when(pushTask.getName()).thenReturn("k8sPush"); + + // When + pushTask.runTask(); + + // Then + assertThat(dockerBuildServiceMockedConstruction.constructed()).isEmpty(); + verify(pushTask.jKubeServiceHub.getBuildService(), times(0)).push(any(), anyInt(), any(), anyBoolean()); + verify(taskEnvironment.logger, times(1)).lifecycle(contains("k8s: `k8sPush` task is skipped.")); + } + } + @Test + void runTask_whenPushFails_thenExceptionThrown() { + try (MockedConstruction dockerBuildServiceMockedConstruction = mockConstruction(DockerBuildService.class, + (mock, ctx) -> { + when(mock.isApplicable()).thenReturn(true); + doThrow(new JKubeServiceException("failure")).when(mock).push(any(), anyInt(), any(), anyBoolean()); + })) { + // Given + final KubernetesPushTask pushTask = new KubernetesPushTask(KubernetesExtension.class); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(pushTask::runTask) + .withMessage("Error in pushing image: failure"); + assertThat(dockerBuildServiceMockedConstruction.constructed()).isNotEmpty(); + } } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java index d184f5d19f..6187477055 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java @@ -35,6 +35,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; @@ -46,7 +49,6 @@ class KubernetesUndeployTaskTest { @RegisterExtension private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); - private MockedConstruction kubernetesUndeployServiceMockedConstruction; private MockedConstruction clusterAccessMockedConstruction; private TestKubernetesExtension extension; @@ -57,14 +59,12 @@ void setUp() throws IOException { when(mock.createDefaultClient()).thenReturn(kubernetesClient); when(kubernetesClient.getMasterUrl()).thenReturn(new URL("http://kubernetes-cluster")); }); - kubernetesUndeployServiceMockedConstruction = mockConstruction(KubernetesUndeployService.class); extension = new TestKubernetesExtension(); when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); } @AfterEach void tearDown() { - kubernetesUndeployServiceMockedConstruction.close(); clusterAccessMockedConstruction.close(); } @@ -83,38 +83,58 @@ void runTask_withOffline_shouldThrowException() { @Test void runTask_withOfflineTrue_shouldUndeployResources() throws IOException { // Given - final KubernetesUndeployTask undeployTask = new KubernetesUndeployTask(KubernetesExtension.class); - - // When - undeployTask.runTask(); - - // Then - assertThat(kubernetesUndeployServiceMockedConstruction.constructed()).hasSize(1); - verify(kubernetesUndeployServiceMockedConstruction.constructed().iterator().next(), times(1)) - .undeploy( - Collections.singletonList(taskEnvironment.getRoot().toPath().resolve(Paths.get("src", "main", "jkube")) - .toFile()), - ResourceConfig.builder().build(), taskEnvironment.getRoot().toPath() - .resolve(Paths.get("build", "classes", "java", "main", "META-INF", "jkube", "kubernetes.yml")).toFile() - ); + try (MockedConstruction kubernetesUndeployServiceMockedConstruction = mockConstruction(KubernetesUndeployService.class)) { + // Given + final KubernetesUndeployTask undeployTask = new KubernetesUndeployTask(KubernetesExtension.class); + + // When + undeployTask.runTask(); + + // Then + assertThat(kubernetesUndeployServiceMockedConstruction.constructed()).hasSize(1); + verify(kubernetesUndeployServiceMockedConstruction.constructed().iterator().next(), times(1)) + .undeploy( + Collections.singletonList(taskEnvironment.getRoot().toPath().resolve(Paths.get("src", "main", "jkube")) + .toFile()), + ResourceConfig.builder().build(), taskEnvironment.getRoot().toPath() + .resolve(Paths.get("build", "classes", "java", "main", "META-INF", "jkube", "kubernetes.yml")).toFile() + ); + } } @Test void runTask_withSkipUndeploy_shouldDoNothing() { - // Given - extension = new TestKubernetesExtension() { - @Override - public Property getSkipUndeploy() { - return new DefaultProperty<>(Boolean.class).value(true); - } - }; - when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); - final KubernetesUndeployTask kubernetesUndeployTask = new KubernetesUndeployTask(KubernetesExtension.class); - - // When - kubernetesUndeployTask.runTask(); + try (MockedConstruction kubernetesUndeployServiceMockedConstruction = mockConstruction(KubernetesUndeployService.class)) { + // Given + extension = new TestKubernetesExtension() { + @Override + public Property getSkipUndeploy() { + return new DefaultProperty<>(Boolean.class).value(true); + } + }; + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + final KubernetesUndeployTask kubernetesUndeployTask = new KubernetesUndeployTask(KubernetesExtension.class); + + // When + kubernetesUndeployTask.runTask(); + + // Then + assertThat(kubernetesUndeployServiceMockedConstruction.constructed()).isEmpty(); + } + } - // Then - assertThat(kubernetesUndeployServiceMockedConstruction.constructed()).isEmpty(); + @Test + void runTask_whenUndeployServiceFails_thenThrowException() { + try (MockedConstruction kubernetesUndeployServiceMockedConstruction = mockConstruction(KubernetesUndeployService.class, + (mock, ctx) -> doThrow(new IOException("failure")).when(mock).undeploy(any(), any(), any()))) { + // Given + final KubernetesUndeployTask kubernetesUndeployTask = new KubernetesUndeployTask(KubernetesExtension.class); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(kubernetesUndeployTask::runTask) + .withMessageContaining("failure"); + assertThat(kubernetesUndeployServiceMockedConstruction.constructed()).isNotEmpty(); + } } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java index 7f1f62eaa2..946ca36824 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.gradle.api.internal.provider.DefaultProperty; +import org.gradle.api.provider.Property; import org.mockito.MockedConstruction; import org.mockito.MockedStatic; @@ -88,7 +90,14 @@ void tearDown() { @Test void runTask_withNoManifest_shouldThrowException() { // Given + extension = new TestKubernetesExtension() { + @Override + public Property getSummaryEnabled() { + return new DefaultProperty<>(Boolean.class).value(false); + } + }; extension.isFailOnNoKubernetesJson = true; + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); final KubernetesWatchTask watchTask = new KubernetesWatchTask(KubernetesExtension.class); // When & Then assertThatIllegalStateException() diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftJKubeTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftJKubeTask.java index 8fb55e44ce..6d375f2703 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftJKubeTask.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftJKubeTask.java @@ -16,6 +16,9 @@ import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.gradle.api.tasks.Internal; +import java.util.HashMap; +import java.util.Map; + public interface OpenShiftJKubeTask extends KubernetesJKubeTask { String DEFAULT_LOG_PREFIX = "oc: "; @@ -30,4 +33,21 @@ default OpenShiftExtension getOpenShiftExtension() { default String getLogPrefix() { return DEFAULT_LOG_PREFIX; } + + @Internal + @Override + default Map getTaskPrioritiesMap() { + Map openshiftPluginTaskPrioritiesMap = new HashMap<>(); + openshiftPluginTaskPrioritiesMap.put("ocBuild", 1); + openshiftPluginTaskPrioritiesMap.put("ocResource", 2); + openshiftPluginTaskPrioritiesMap.put("ocPush", 2); + openshiftPluginTaskPrioritiesMap.put("ocHelm", 3); + openshiftPluginTaskPrioritiesMap.put("ocHelmPush", 4); + openshiftPluginTaskPrioritiesMap.put("ocApply", 5); + openshiftPluginTaskPrioritiesMap.put("ocLog", 6); + openshiftPluginTaskPrioritiesMap.put("ocDebug", 6); + openshiftPluginTaskPrioritiesMap.put("ocWatch", 6); + openshiftPluginTaskPrioritiesMap.put("ocUndeploy", 7); + return openshiftPluginTaskPrioritiesMap; + } } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/TestOpenShiftExtension.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/TestOpenShiftExtension.java index d7bc38f3f6..9d34ded557 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/TestOpenShiftExtension.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/TestOpenShiftExtension.java @@ -418,4 +418,9 @@ public Property getWatchShowLogs() { public Property getWatchContainerNamePattern() { return new DefaultProperty<>(String.class); } + + @Override + public Property getSummaryEnabled() { + return new DefaultProperty<>(Boolean.class); + } } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java index 077f0397ea..e227d47a15 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.gradle.api.internal.provider.DefaultProperty; +import org.gradle.api.provider.Property; import org.mockito.MockedConstruction; import org.mockito.MockedStatic; @@ -73,6 +75,13 @@ void tearDown() { @Test void runTask_withNoManifest_shouldThrowException() { // Given + extension = new TestOpenShiftExtension() { + @Override + public Property getSummaryEnabled() { + return new DefaultProperty<>(Boolean.class).value(false); + } + }; + when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); extension.isFailOnNoKubernetesJson = true; final OpenShiftWatchTask watchTask = new OpenShiftWatchTask(OpenShiftExtension.class); // When & Then diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManager.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManager.java index 386cd3f492..6ac4b4bab0 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManager.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManager.java @@ -41,6 +41,7 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; import org.eclipse.jkube.kit.common.archive.JKubeTarArchiver; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.FileUtil; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -94,12 +95,13 @@ public static AssemblyManager getInstance() { * @param buildConfig configuration for how to build the image * @param log KitLogger used to display warning if permissions are to be normalized * @param finalCustomizer finalCustomizer to be applied to the tar archive + * @param summaryService {@link SummaryService} * @return file holding the path to the created assembly tar file * @throws IOException IO exception */ public File createDockerTarArchive( String imageName, final JKubeConfiguration configuration, final BuildConfiguration buildConfig, KitLogger log, - ArchiverCustomizer finalCustomizer) throws IOException { + ArchiverCustomizer finalCustomizer, SummaryService summaryService) throws IOException { final BuildDirs buildDirs = createBuildDirs(imageName, configuration); final List archiveCustomizers = new ArrayList<>(); @@ -109,6 +111,7 @@ public File createDockerTarArchive( try { if (buildConfig.isDockerFileMode()) { + summaryService.setDockerFileImageSummary(imageName, buildConfig.getDockerFileFile().getAbsolutePath()); createDockerTarArchiveForDockerFile(buildConfig, assemblyConfig, configuration, buildDirs, log, archiveCustomizers); } else { createAssemblyArchive(assemblyConfig, configuration, buildDirs, buildConfig.getCompression(), layers); @@ -472,5 +475,4 @@ private static List createDockerIncludesList(File directory) throws IOEx } return includes; } - } diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManagerCreateDockerTarArchiveTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManagerCreateDockerTarArchiveTest.java index 237342c3ff..aabaf4330d 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManagerCreateDockerTarArchiveTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/assembly/AssemblyManagerCreateDockerTarArchiveTest.java @@ -32,6 +32,7 @@ import org.eclipse.jkube.kit.common.PrefixedLogger; import org.eclipse.jkube.kit.common.assertj.ArchiveAssertions; import org.eclipse.jkube.kit.common.assertj.FileAssertions; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.assertj.core.api.AbstractFileAssert; import org.assertj.core.api.AbstractListAssert; @@ -55,10 +56,12 @@ class AssemblyManagerCreateDockerTarArchiveTest { private AssemblyManager assemblyManager; private File baseDirectory; private File targetDirectory; + private SummaryService summaryService; @BeforeEach void setUp() throws IOException { prefixedLogger = mock(PrefixedLogger.class); + summaryService = mock(SummaryService.class); assemblyManager = AssemblyManager.getInstance(); baseDirectory = temporaryFolder.toFile(); targetDirectory = Files.createDirectory(temporaryFolder.resolve("target")).toFile(); @@ -93,7 +96,7 @@ void withoutDockerfile() throws IOException { // When File dockerArchiveFile = assemblyManager.createDockerTarArchive( - "test-image", jKubeConfiguration, buildConfiguration, prefixedLogger, null); + "test-image", jKubeConfiguration, buildConfiguration, prefixedLogger, null, summaryService); // Then assertTargetHasDockerDirectories("test-image"); @@ -124,7 +127,7 @@ void withoutDockerfileAndFinalCustomizer() throws IOException { // When File dockerArchiveFile = assemblyManager.createDockerTarArchive( - "no-docker-file-and-customizer", jKubeConfiguration, buildConfiguration, prefixedLogger, finalCustomizer); + "no-docker-file-and-customizer", jKubeConfiguration, buildConfiguration, prefixedLogger, finalCustomizer, summaryService); // Then assertTargetHasDockerDirectories("no-docker-file-and-customizer"); @@ -150,11 +153,11 @@ void withoutDockerfileAndAlreadyExistingFileInAssemblyGetsOverwritten() throws I // When assemblyManager.createDockerTarArchive( - "modified-image", jKubeConfiguration, buildConfiguration, prefixedLogger, null); + "modified-image", jKubeConfiguration, buildConfiguration, prefixedLogger, null, summaryService); // Modify file contents writeLineToFile(jKubeConfiguration.getProject().getArtifact(), "Modified content"); dockerArchiveFile = assemblyManager.createDockerTarArchive( - "modified-image", jKubeConfiguration, buildConfiguration, prefixedLogger, null); + "modified-image", jKubeConfiguration, buildConfiguration, prefixedLogger, null, summaryService); // Then assertTargetHasDockerDirectories("modified-image"); @@ -185,7 +188,7 @@ void withDockerfileInBaseDirectory() throws IOException { .dockerFileFile(dockerFile).dockerFile(dockerFile.getPath()).build(); // When - File dockerArchiveFile = assemblyManager.createDockerTarArchive("test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null); + File dockerArchiveFile = assemblyManager.createDockerTarArchive("test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null, summaryService); // Then assertTargetHasDockerDirectories("test-image"); @@ -226,7 +229,7 @@ void withDockerfileInBaseDirectoryAndAssemblyFile() throws IOException { // When final File dockerArchiveFile = assemblyManager.createDockerTarArchive( - "dockerfile-and-assembly-file", configuration, jKubeBuildConfiguration, prefixedLogger, null); + "dockerfile-and-assembly-file", configuration, jKubeBuildConfiguration, prefixedLogger, null, summaryService); // Then assertTargetHasDockerDirectories("dockerfile-and-assembly-file"); @@ -259,7 +262,7 @@ void withDockerfileInBaseDirectoryAndDockerinclude() throws IOException { // When final File dockerArchiveFile = assemblyManager.createDockerTarArchive( - "test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null); + "test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null, summaryService); // Then assertTargetHasDockerDirectories("test-image"); @@ -290,7 +293,7 @@ void withDockerfileInBaseDirectoryAndDockerexclude() throws IOException { // When final File dockerArchiveFile = assemblyManager.createDockerTarArchive( - "test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null); + "test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null, summaryService); // Then assertTargetHasDockerDirectories("test-image"); @@ -323,7 +326,7 @@ void withDockerfileInBaseDirectoryAndDockerignore() throws IOException { .dockerFileFile(dockerFile).dockerFile(dockerFile.getPath()).build(); // When - File dockerArchiveFile = assemblyManager.createDockerTarArchive("test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null); + File dockerArchiveFile = assemblyManager.createDockerTarArchive("test-image", configuration, jKubeBuildConfiguration, prefixedLogger, null, summaryService); // Then assertTargetHasDockerDirectories("test-image"); diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java index 3395443c40..174b1691f4 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/ArchiveService.java @@ -18,6 +18,7 @@ import org.eclipse.jkube.kit.build.api.assembly.ArchiverCustomizer; import org.eclipse.jkube.kit.build.api.assembly.AssemblyFiles; import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.common.KitLogger; @@ -48,9 +49,9 @@ public ArchiveService(AssemblyManager assemblyManager, KitLogger log) { * @return file for holding the sources * @throws IOException if during creation of the tar an error occurs. */ - public File createDockerBuildArchive(ImageConfiguration imageConfig, JKubeConfiguration params) + public File createDockerBuildArchive(ImageConfiguration imageConfig, JKubeConfiguration params, SummaryService summaryService) throws IOException { - return createDockerBuildArchive(imageConfig, params, null); + return createDockerBuildArchive(imageConfig, params, null, summaryService); } /** @@ -63,9 +64,9 @@ public File createDockerBuildArchive(ImageConfiguration imageConfig, JKubeConfig * @return file for holding the sources * @throws IOException if during creation of the tar an error occurs. */ - public File createDockerBuildArchive(ImageConfiguration imageConfig, JKubeConfiguration params, ArchiverCustomizer customizer) + public File createDockerBuildArchive(ImageConfiguration imageConfig, JKubeConfiguration params, ArchiverCustomizer customizer, SummaryService summaryService) throws IOException { - File ret = createArchive(imageConfig.getName(), imageConfig.getBuildConfiguration(), params, log, customizer); + File ret = createArchive(imageConfig.getName(), imageConfig.getBuildConfiguration(), params, log, customizer, summaryService); log.info("%s: Created docker source tar %s",imageConfig.getDescription(), ret); return ret; } @@ -108,13 +109,14 @@ public File createChangedFilesArchive( return assemblyManager.createChangedFilesArchive(entries, assemblyDir, imageName, jKubeConfiguration); } - File createArchive(String imageName, BuildConfiguration buildConfig, JKubeConfiguration params, KitLogger log) + File createArchive(String imageName, BuildConfiguration buildConfig, JKubeConfiguration params, KitLogger log, SummaryService summaryService) throws IOException { - return createArchive(imageName, buildConfig, params, log, null); + return createArchive(imageName, buildConfig, params, log, null, summaryService); } - File createArchive(String imageName, BuildConfiguration buildConfig, JKubeConfiguration params, KitLogger log, ArchiverCustomizer customizer) + File createArchive(String imageName, BuildConfiguration buildConfig, JKubeConfiguration params, KitLogger log, + ArchiverCustomizer customizer, SummaryService summaryService) throws IOException { - return assemblyManager.createDockerTarArchive(imageName, params, buildConfig, log, customizer); + return assemblyManager.createDockerTarArchive(imageName, params, buildConfig, log, customizer, summaryService); } } diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java index 9b5e12eec3..d194346757 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java @@ -30,6 +30,7 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.build.api.helper.DockerFileUtil; import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.build.service.docker.access.BuildOptions; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; @@ -68,14 +69,14 @@ public class BuildService { * @param configuration the project configuration * @throws IOException in case of any problems */ - public void buildImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration) + public void buildImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration, SummaryService summaryService) throws IOException { if (imagePullManager != null) { - autoPullBaseImage(imageConfig, imagePullManager, configuration); + autoPullBaseImage(imageConfig, imagePullManager, configuration, summaryService); } - buildImage(imageConfig, configuration, checkForNocache(imageConfig), addBuildArgs(configuration)); + buildImage(imageConfig, configuration, checkForNocache(imageConfig), addBuildArgs(configuration), summaryService); } public void tagImage(String imageName, ImageConfiguration imageConfig) throws DockerAccessException { @@ -101,10 +102,12 @@ public void tagImage(String imageName, ImageConfiguration imageConfig) throws Do * @param params mojo params for the project * @param noCache if not null, dictate the caching behaviour. Otherwise its taken from the build configuration * @param buildArgs maven build context + * @param summaryService {@link SummaryService} * @throws DockerAccessException docker access exception * @throws IOException in case of any I/O exception */ - protected void buildImage(ImageConfiguration imageConfig, JKubeConfiguration params, boolean noCache, Map buildArgs) + protected void buildImage(ImageConfiguration imageConfig, JKubeConfiguration params, boolean noCache + , Map buildArgs, SummaryService summaryService) throws IOException { String imageName = imageConfig.getName(); @@ -128,40 +131,23 @@ protected void buildImage(ImageConfiguration imageConfig, JKubeConfiguration par return; } - File dockerArchive = archiveService.createArchive(imageName, buildConfig, params, log); + File dockerArchive = archiveService.createArchive(imageName, buildConfig, params, log, summaryService); log.info("%s: Created %s in %s", imageConfig.getDescription(), dockerArchive.getName(), EnvUtil.formatDurationTill(time)); Map mergedBuildMap = prepareBuildArgs(buildArgs, buildConfig); - // auto is now supported by docker, consider switching? BuildOptions opts = - new BuildOptions(buildConfig.getBuildOptions()) - .dockerfile(getDockerfileName(buildConfig)) - .forceRemove(cleanupMode.isRemove()) - .noCache(noCache) - .cacheFrom(buildConfig.getCacheFrom()) - .buildArgs(mergedBuildMap); - String newImageId = doBuildImage(imageName, dockerArchive, opts); - if (newImageId == null) { - throw new IllegalStateException("Failure in building image, unable to find image built with name " + imageName); - } - log.info("%s: Built image %s", imageConfig.getDescription(), newImageId); - - if (oldImageId != null && !oldImageId.equals(newImageId)) { - try { - docker.removeImage(oldImageId, true); - log.info("%s: Removed old image %s", imageConfig.getDescription(), oldImageId); - } catch (DockerAccessException exp) { - if (cleanupMode == CleanupMode.TRY_TO_REMOVE) { - log.warn("%s: %s (old image)%s", imageConfig.getDescription(), exp.getMessage(), - (exp.getCause() != null ? " [" + exp.getCause().getMessage() + "]" : "")); - } else { - throw exp; - } - } - } + new BuildOptions(buildConfig.getBuildOptions()) + .dockerfile(getDockerfileName(buildConfig)) + .forceRemove(cleanupMode.isRemove()) + .noCache(noCache) + .cacheFrom(buildConfig.getCacheFrom()) + .buildArgs(mergedBuildMap); + String newImageId = buildNewImage(imageConfig, summaryService, imageName, dockerArchive, opts); + removeOldImage(imageConfig, oldImageId, cleanupMode, newImageId); } + private Map prepareBuildArgs(Map buildArgs, BuildConfiguration buildConfig) { ImmutableMap.Builder builder = ImmutableMap.builder().putAll(buildArgs); if (buildConfig.getArgs() != null) { @@ -243,7 +229,7 @@ private Map addBuildArgsFromDockerConfig() { return buildArgs; } - private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration) + private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration, SummaryService summaryService) throws IOException { BuildConfiguration buildConfig = imageConfig.getBuildConfiguration(); @@ -264,6 +250,7 @@ private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager } for (String fromImage : fromImages) { if (fromImage != null && !AssemblyManager.SCRATCH_IMAGE.equals(fromImage)) { + summaryService.setBaseImageNameImageSummary(imageConfig.getName(), fromImage); registryService.pullImageWithPolicy(fromImage, imagePullManager, configuration.getRegistryConfig(), buildConfig); } } @@ -294,6 +281,33 @@ private boolean checkForNocache(ImageConfiguration imageConfig) { } } + private void removeOldImage(ImageConfiguration imageConfig, String oldImageId, CleanupMode cleanupMode, String newImageId) throws DockerAccessException { + if (oldImageId != null && !oldImageId.equals(newImageId)) { + try { + docker.removeImage(oldImageId, true); + log.info("%s: Removed old image %s", imageConfig.getDescription(), oldImageId); + } catch (DockerAccessException exp) { + if (cleanupMode == CleanupMode.TRY_TO_REMOVE) { + log.warn("%s: %s (old image)%s", imageConfig.getDescription(), exp.getMessage(), + (exp.getCause() != null ? " [" + exp.getCause().getMessage() + "]" : "")); + } else { + throw exp; + } + } + } + } + + private String buildNewImage(ImageConfiguration imageConfig, SummaryService summaryService, String imageName, File dockerArchive, BuildOptions opts) throws DockerAccessException { + + String newImageId = doBuildImage(imageName, dockerArchive, opts); + if (newImageId == null) { + throw new IllegalStateException("Failure in building image, unable to find image built with name " + imageName); + } + log.info("%s: Built image %s", imageConfig.getDescription(), newImageId); + summaryService.setImageShaImageSummary(imageName, newImageId); + return newImageId; + } + private boolean isEmpty(String str) { return str == null || str.isEmpty(); } diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java index be24844edf..1cc8b444ae 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java @@ -14,12 +14,14 @@ package org.eclipse.jkube.kit.build.service.docker; import java.io.IOException; +import java.util.Optional; import org.eclipse.jkube.kit.build.api.auth.AuthConfig; import org.eclipse.jkube.kit.build.service.docker.access.CreateImageOptions; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.build.service.docker.auth.AuthConfigFactory; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.ImageName; @@ -52,16 +54,18 @@ public class RegistryService { * @throws IOException exception */ public void pushImage(ImageConfiguration imageConfig, - int retries, RegistryConfig registryConfig, boolean skipTag) throws IOException { + int retries, RegistryConfig registryConfig, boolean skipTag, SummaryService summaryService) throws IOException { BuildConfiguration buildConfig = imageConfig.getBuildConfiguration(); String name = imageConfig.getName(); if (buildConfig != null) { + ImageName imageName = new ImageName(imageConfig.getName()); String configuredRegistry = EnvUtil.firstRegistryOf( - new ImageName(imageConfig.getName()).getRegistry(), + imageName.getRegistry(), imageConfig.getRegistry(), registryConfig.getRegistry()); + summaryService.setPushRegistry(Optional.ofNullable(configuredRegistry).orElse("docker.io")); AuthConfig authConfig = createAuthConfig(true, new ImageName(name).getUser(), configuredRegistry, registryConfig); long start = System.currentTimeMillis(); diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java index ba43f57ac4..4faecfb26a 100755 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/WatchService.java @@ -33,6 +33,7 @@ import org.eclipse.jkube.kit.build.service.docker.watch.WatchException; import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.RunImageConfiguration; import org.eclipse.jkube.kit.config.image.WaitConfiguration; @@ -62,7 +63,7 @@ public WatchService(ArchiveService archiveService, BuildService buildService, Qu this.log = log; } - public synchronized void watch(WatchContext context, JKubeConfiguration buildContext, List images) + public synchronized void watch(WatchContext context, JKubeConfiguration buildContext, List images, SummaryService summaryService) throws IOException { // Important to be be a single threaded scheduler since watch jobs must run serialized @@ -71,39 +72,7 @@ public synchronized void watch(WatchContext context, JKubeConfiguration buildCon executor = Executors.newSingleThreadScheduledExecutor(); for (ImageConfiguration imageConfig : runService.getImagesConfigsInOrder(queryService, images)) { - - String imageId = queryService.getImageId(imageConfig.getName()); - String containerId = runService.lookupContainer(imageConfig.getName()); - - ImageWatcher watcher = new ImageWatcher(imageConfig, context, imageId, containerId); - long interval = watcher.getInterval(); - - WatchMode watchMode = watcher.getWatchMode(imageConfig); - log.info("Watching %s %s", imageConfig.getName(), (watchMode != null ? " using " + watchMode.getDescription() : "")); - - ArrayList tasks = new ArrayList<>(); - - if (imageConfig.getBuildConfiguration() != null && - imageConfig.getBuildConfiguration().getAssembly() != null) { - if (watcher.isCopy()) { - schedule(executor, createCopyWatchTask(watcher, context.getBuildContext()), interval); - tasks.add("copying artifacts"); - } - - if (watcher.isBuild()) { - schedule(executor, createBuildWatchTask(watcher, context.getBuildContext(), watchMode == WatchMode.both, buildContext), interval); - tasks.add("rebuilding"); - } - } - - if (watcher.isRun() && watcher.getContainerId() != null) { - schedule(executor, createRestartWatchTask(watcher), interval); - tasks.add("restarting"); - } - - if (!tasks.isEmpty()) { - log.info("%s: Watch for %s", imageConfig.getDescription(), String.join(" and ", tasks)); - } + watchImage(context, buildContext, summaryService, executor, imageConfig); } log.info("Waiting ..."); if (!context.isKeepRunning()) { @@ -167,7 +136,8 @@ void callPostExec(ImageWatcher watcher) throws IOException, WatchException { } Runnable createBuildWatchTask(final ImageWatcher watcher, - final JKubeConfiguration mojoParameters, final boolean doRestart, final JKubeConfiguration buildContext) + final JKubeConfiguration mojoParameters, final boolean doRestart, + final JKubeConfiguration buildContext, final SummaryService summaryService) throws IOException { final ImageConfiguration imageConfig = watcher.getImageConfiguration(); final AssemblyFiles files = archiveService.getAssemblyFiles(imageConfig, mojoParameters); @@ -186,7 +156,7 @@ Runnable createBuildWatchTask(final ImageWatcher watcher, log.info("%s: Customizing the image ...", imageConfig.getDescription()); watcher.getWatchContext().getImageCustomizer().execute(imageConfig); } - buildService.buildImage(imageConfig, null, buildContext); + buildService.buildImage(imageConfig, null, buildContext, summaryService); String name = imageConfig.getName(); watcher.setImageId(queryService.getImageId(name)); @@ -283,6 +253,41 @@ private String getPreStopCommand(ImageConfiguration imageConfig) { .orElse(null); } + private void watchImage(WatchContext context, JKubeConfiguration buildContext, SummaryService summaryService, ScheduledExecutorService executor, ImageConfiguration imageConfig) throws IOException { + String imageId = queryService.getImageId(imageConfig.getName()); + String containerId = runService.lookupContainer(imageConfig.getName()); + + ImageWatcher watcher = new ImageWatcher(imageConfig, context, imageId, containerId); + long interval = watcher.getInterval(); + + WatchMode watchMode = watcher.getWatchMode(imageConfig); + log.info("Watching %s %s", imageConfig.getName(), (watchMode != null ? " using " + watchMode.getDescription() : "")); + + ArrayList tasks = new ArrayList<>(); + + if (imageConfig.getBuildConfiguration() != null && + imageConfig.getBuildConfiguration().getAssembly() != null) { + if (watcher.isCopy()) { + schedule(executor, createCopyWatchTask(watcher, context.getBuildContext()), interval); + tasks.add("copying artifacts"); + } + + if (watcher.isBuild()) { + schedule(executor, createBuildWatchTask(watcher, context.getBuildContext(), watchMode == WatchMode.both, buildContext, summaryService), interval); + tasks.add("rebuilding"); + } + } + + if (watcher.isRun() && watcher.getContainerId() != null) { + schedule(executor, createRestartWatchTask(watcher), interval); + tasks.add("restarting"); + } + + if (!tasks.isEmpty()) { + log.info("%s: Watch for %s", imageConfig.getDescription(), String.join(" and ", tasks)); + } + } + // =============================================================================================================== // Helper class for holding state and parameter when watching images diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java index 27c191566c..f385e19f6b 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java @@ -17,6 +17,7 @@ import org.eclipse.jkube.kit.build.service.docker.access.DockerAccessException; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.BeforeEach; @@ -37,6 +38,7 @@ class BuildServiceTest { private DockerAccess mockedDockerAccess; private BuildService buildService; + private SummaryService summaryService; private ImageConfiguration imageConfiguration; private ImagePullManager mockedImagePullManager; private JKubeConfiguration mockedJKubeConfiguration; @@ -46,6 +48,7 @@ void setUp() { mockedDockerAccess = mock(DockerAccess.class, RETURNS_DEEP_STUBS); ArchiveService mockedArchiveService = mock(ArchiveService.class, RETURNS_DEEP_STUBS); RegistryService mockedRegistryService = mock(RegistryService.class, RETURNS_DEEP_STUBS); + summaryService = mock(SummaryService.class); KitLogger mockedLog = mock(KitLogger.SilentLogger.class, RETURNS_DEEP_STUBS); mockedImagePullManager = mock(ImagePullManager.class, RETURNS_DEEP_STUBS); mockedJKubeConfiguration = mock(JKubeConfiguration.class, RETURNS_DEEP_STUBS); @@ -66,7 +69,7 @@ void buildImage_whenValidImageConfigurationProvidedAndDockerDaemonReturnsValidId when(mockedDockerAccess.getImageId("image-name")).thenReturn("c8003cb6f5db"); // When - buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration); + buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration, summaryService); // Then verify(mockedDockerAccess, times(1)) @@ -79,7 +82,7 @@ void buildImage_whenValidImageConfigurationProvidedAndDockerDaemonReturnsNull_sh when(mockedDockerAccess.getImageId("image-name")).thenReturn(null); // When & Then assertThatIllegalStateException() - .isThrownBy(() -> buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration)) + .isThrownBy(() -> buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration, summaryService)) .withMessage("Failure in building image, unable to find image built with name image-name"); } diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/RegistryServiceTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/RegistryServiceTest.java index 9373364a18..432d5795d8 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/RegistryServiceTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/RegistryServiceTest.java @@ -17,6 +17,7 @@ import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.BeforeEach; @@ -45,6 +46,7 @@ class RegistryServiceTest { private RegistryService registryService; private ImageConfiguration imageConfiguration; private RegistryConfig mockedRegistryConfig; + private SummaryService summaryService; @BeforeEach void setUp() { @@ -58,6 +60,7 @@ void setUp() { dockerAccess = mock(DockerAccess.class); queryService = mock(QueryService.class); mockedRegistryConfig = mock(RegistryConfig.class); + summaryService = mock(SummaryService.class); registryService = new RegistryService(dockerAccess, queryService, new KitLogger.SilentLogger()); when(mockedRegistryConfig.getRegistry()).thenReturn("example.com"); } @@ -117,7 +120,7 @@ void pullImageWithPolicy_pullPolicyAlwaysAndBuildConfiguration_shouldPull() thro @Test void pushImage_whenValidImageConfigurationProvidedWithSkipTag_shouldNotPushAdditionalTags() throws IOException { // When - registryService.pushImage(imageConfiguration, 1, mockedRegistryConfig, true); + registryService.pushImage(imageConfiguration, 1, mockedRegistryConfig, true, summaryService); // Then verify(dockerAccess, times(1)) @@ -129,7 +132,7 @@ void pushImage_whenValidImageConfigurationProvidedWithSkipTag_shouldNotPushAddit @Test void pushImage_whenValidImageConfigurationProvided_shouldPushApplicableTags() throws IOException { // When - registryService.pushImage(imageConfiguration, 1, mockedRegistryConfig, false); + registryService.pushImage(imageConfiguration, 1, mockedRegistryConfig, false, summaryService); // Then verify(dockerAccess, times(1)) diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java index c90c32446e..4f86fcde6c 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java @@ -35,6 +35,7 @@ import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.ImageName; import org.eclipse.jkube.kit.common.Arguments; @@ -116,19 +117,22 @@ public static void buildContainer(JibContainerBuilder jibContainerBuilder, TarIm } public static JibContainerBuilder containerFromImageConfiguration( - ImageConfiguration imageConfiguration, Credential pullRegistryCredential) throws InvalidImageReferenceException { + ImageConfiguration imageConfiguration, Credential pullRegistryCredential, SummaryService summaryService) throws InvalidImageReferenceException { + summaryService.setBaseImageNameImageSummary(imageConfiguration.getName(), imageConfiguration.getBuildConfiguration().getFrom()); final JibContainerBuilder containerBuilder = Jib.from(getRegistryImage(getBaseImage(imageConfiguration), pullRegistryCredential)) .setFormat(ImageFormat.Docker); return populateContainerBuilderFromImageConfiguration(containerBuilder, imageConfiguration); } - public static String getFullImageName(ImageConfiguration imageConfiguration, String tag) { + public static String getFullImageName(ImageConfiguration imageConfiguration, String tag, SummaryService summaryService) { ImageName imageName; if (tag != null) { imageName = new ImageName(imageConfiguration.getName(), tag); } else { imageName = new ImageName(imageConfiguration.getName()); } + summaryService.setPushRegistry(Optional.ofNullable(imageName.getRegistry()) + .orElse("docker.io")); return imageName.getFullName(); } @@ -140,12 +144,12 @@ public static String getFullImageName(ImageConfiguration imageConfiguration, Str * @param tarArchive tar archive built during build goal * @param log Logger */ - public static void jibPush(ImageConfiguration imageConfiguration, Credential pushCredentials, File tarArchive, KitLogger log) { + public static void jibPush(ImageConfiguration imageConfiguration, Credential pushCredentials, File tarArchive, KitLogger log, SummaryService summaryService) { BuildConfiguration buildImageConfiguration = imageConfiguration.getBuildConfiguration(); - String imageName = getFullImageName(imageConfiguration, null); + String imageName = getFullImageName(imageConfiguration, null, summaryService); try { for (String tag : getAllImageTags(buildImageConfiguration.getTags(), imageName)) { - String imageNameWithTag = getFullImageName(imageConfiguration, tag); + String imageNameWithTag = getFullImageName(imageConfiguration, tag, summaryService); log.info("Pushing image: %s", imageNameWithTag); pushImage(TarImage.at(tarArchive.toPath()), imageNameWithTag, pushCredentials, log); } diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java index d4efa21942..c761a054b5 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java @@ -30,6 +30,8 @@ import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.common.Arguments; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; @@ -39,6 +41,7 @@ import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import com.google.cloud.tools.jib.api.buildplan.Port; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.mockito.MockedConstruction; @@ -51,6 +54,12 @@ import static org.mockito.Mockito.verify; class JibServiceUtilTest { + private SummaryService summaryService; + + @BeforeEach + public void setUp() { + summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); + } @Test void testGetBaseImageWithNullBuildConfig() { @@ -77,7 +86,7 @@ void testContainerFromImageConfiguration() throws Exception { // Given ImageConfiguration imageConfiguration = getSampleImageConfiguration(); // When - JibContainerBuilder jibContainerBuilder = containerFromImageConfiguration(imageConfiguration, null); + JibContainerBuilder jibContainerBuilder = containerFromImageConfiguration(imageConfiguration, null, summaryService); // Then verify(jibContainerBuilder, times(1)).addLabel("foo", "bar"); verify(jibContainerBuilder, times(1)).setEntrypoint(Arrays.asList("java", "-jar", "foo.jar")); @@ -105,13 +114,13 @@ void testAppendOriginalImageNameTagIfApplicable() { @Test void testGetFullImageNameWithDefaultTag() { - assertThat(JibServiceUtil.getFullImageName(getSampleImageConfiguration(), null)) + assertThat(JibServiceUtil.getFullImageName(getSampleImageConfiguration(), null, summaryService)) .isEqualTo("test/test-project:latest"); } @Test void testGetFullImageNameWithProvidedTag() { - assertThat(JibServiceUtil.getFullImageName(getSampleImageConfiguration(), "0.0.1")) + assertThat(JibServiceUtil.getFullImageName(getSampleImageConfiguration(), "0.0.1", summaryService)) .isEqualTo("test/test-project:0.0.1"); } diff --git a/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MavenUtil.java b/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MavenUtil.java index 16aff547a6..d7d20af265 100644 --- a/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MavenUtil.java +++ b/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MavenUtil.java @@ -272,6 +272,13 @@ public static File getRootProjectFolder(MavenProject project) { return answer; } + public static String getLastExecutingGoal(MavenSession session, String logPrefix) { + List goals = session.getGoals().stream() + .filter(g -> g.startsWith(logPrefix)) + .collect(Collectors.toList()); + return goals.isEmpty() ? null : goals.get(goals.size() - 1).substring(logPrefix.length()); + } + private static File getArtifactFileFromArtifactMap(MavenProject mavenProject, org.apache.maven.model.Dependency dependency) { Artifact artifact = mavenProject.getArtifactMap().get(dependency.getGroupId() + ":" + dependency.getArtifactId()); if (artifact != null) { diff --git a/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/MavenUtilTest.java b/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/MavenUtilTest.java index 07d8b227d7..a0b2e73a0e 100644 --- a/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/MavenUtilTest.java +++ b/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/MavenUtilTest.java @@ -158,6 +158,32 @@ void testLoadedPomFromFile() throws Exception { assertThat(plugins.get(1).getExecutions()).isEqualTo(Arrays.asList("resource", "build", "helm")); } + @Test + void getLastExecutingGoal_whenSessionReturnsGoalsList_thenLastExecutingGoalReturned() { + // Given + MavenSession mavenSession = mock(MavenSession.class); + when(mavenSession.getGoals()).thenReturn(Arrays.asList("clean", "k8s:build", "k8s:resource")); + + // When + String lastExecutingGoal = MavenUtil.getLastExecutingGoal(mavenSession, "k8s:"); + + // Then + assertThat(lastExecutingGoal).isEqualTo("resource"); + } + + @Test + void getLastExecutingGoal_whenSessionReturnsEmptyList_thenNullReturned() { + // Given + MavenSession mavenSession = mock(MavenSession.class); + when(mavenSession.getGoals()).thenReturn(Collections.emptyList()); + + // When + String lastExecutingGoal = MavenUtil.getLastExecutingGoal(mavenSession, "k8s:"); + + // Then + assertThat(lastExecutingGoal).isNull(); + } + private MavenProject getMavenProject() { mavenProject = new MavenProject(); File baseDir = new File("test-project-base-dir"); diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java index 910a2e9393..318f214084 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java @@ -52,6 +52,10 @@ public Properties getProperties() { return project.getProperties(); } + public File getBuildDirectory() { + return project.getBuildDirectory(); + } + public File inOutputDir(String path) { return inDir(getOutputDirectory(), path); } diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/service/SummaryService.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/service/SummaryService.java new file mode 100644 index 0000000000..95b14eafc5 --- /dev/null +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/service/SummaryService.java @@ -0,0 +1,480 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.common.service; + +import io.fabric8.kubernetes.client.utils.Serialization; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.summary.ImageSummary; +import org.eclipse.jkube.kit.common.summary.KubernetesResourceSummary; +import org.eclipse.jkube.kit.common.summary.Summary; +import org.eclipse.jkube.kit.common.util.FileUtil; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; +import java.util.stream.Collectors; + +import static org.eclipse.jkube.kit.common.util.FileUtil.createDirectory; + +public class SummaryService { + private static final String SUMMARY_FILE_NAME = "summary.json"; + private static final String DASHED_LINE = "-------------------------------"; + private static final String LIST_ELEMENT = " - %s"; + private static File summaryFile = null; + private final File summaryOutputDir; + private final KitLogger logger; + private final boolean summaryEnabled; + + public SummaryService(File summaryOutputDirectory, KitLogger kitLogger, boolean summaryEnabled) { + this.summaryOutputDir = summaryOutputDirectory; + this.logger = kitLogger; + this.summaryEnabled = summaryEnabled; + } + + + public void addGeneratedResourceFile(File resourceFilePath) { + addToSummary(s -> { + s.setGeneratedResourceFiles(createOrAddToExistingList(s.getGeneratedResourceFiles(), resourceFilePath)); + return s; + }); + } + + public void addAppliedKubernetesResource(KubernetesResourceSummary kubernetesResource) { + addToSummary(s -> { + s.setAppliedKubernetesResources(createOrAddToExistingList(s.getAppliedKubernetesResources(), kubernetesResource)); + return s; + }); + } + + public void addDeletedKubernetesResource(KubernetesResourceSummary kubernetesResource) { + addToSummary(s -> { + s.setDeletedKubernetesResources(createOrAddToExistingList(s.getDeletedKubernetesResources(), kubernetesResource)); + return s; + }); + } + + public void addToGenerators(String generator) { + addToSummary(s -> { + s.setGeneratorsApplied(createOrAddToExistingList(s.getGeneratorsApplied(), generator)); + return s; + }); + } + + public void addToEnrichers(String enricher) { + addToSummary(s -> { + s.setEnrichersApplied(createOrAddToExistingList(s.getEnrichersApplied(), enricher)); + return s; + }); + } + + public void addToActions(String action) { + addToSummary(s -> { + s.setActionsRun(createOrAddToExistingList(s.getActionsRun(), action)); + return s; + }); + } + + public void setActionType(String actionType) { + addToSummary(s -> { + s.setActionType(actionType); + return s; + }); + } + + public void setSuccessful(boolean isSuccessful) { + addToSummary(s -> { + s.setSuccessful(isSuccessful); + return s; + }); + } + + public void setFailureCause(String failureCause) { + addToSummary(s -> { + s.setFailureCause(failureCause); + return s; + }); + } + + public void setDockerFileImageSummary(String imageName, String dockerFileLocation) { + addToSummary(s -> { + s.setImageSummariesMap(createOrAddToExistingMap(s.getImageSummariesMap(), imageName, () -> ImageSummary.builder().build(), is -> { + is.setDockerfilePath(dockerFileLocation); + return is; + })); + return s; + }); + } + + public void setImageShaImageSummary(String imageName, String imageSha) { + addToSummary(s -> { + s.setImageSummariesMap(createOrAddToExistingMap(s.getImageSummariesMap(), imageName, () -> ImageSummary.builder().build(), is -> { + is.setImageSha(imageSha); + return is; + })); + return s; + }); + } + + public void setImageStreamUsedImageSummary(String imageName, String imageStreamUsed) { + addToSummary(s -> { + s.setImageSummariesMap(createOrAddToExistingMap(s.getImageSummariesMap(), imageName, () -> ImageSummary.builder().build(), is -> { + is.setImageStreamUsed(imageStreamUsed); + return is; + })); + return s; + }); + } + + public void setBaseImageNameImageSummary(String imageName, String baseImage) { + addToSummary(s -> { + s.setImageSummariesMap(createOrAddToExistingMap(s.getImageSummariesMap(), imageName, () -> ImageSummary.builder().build(), is -> { + is.setBaseImageName(baseImage); + return is; + })); + return s; + }); + } + + public void setPushRegistry(String registry) { + addToSummary(s -> { + s.setPushRegistry(registry); + return s; + }); + } + + public void setBuildStrategy(String buildStrategy) { + addToSummary(s -> { + s.setBuildStrategy(buildStrategy); + return s; + }); + } + + public void setAppliedClusterUrl(String targetClusterUrl) { + addToSummary(s -> { + s.setAppliedClusterUrl(targetClusterUrl); + return s; + }); + } + + public void setUndeployedClusterUrl(String targetClusterUrl) { + addToSummary(s -> { + s.setUndeployedClusterUrl(targetClusterUrl); + return s; + }); + } + + public void setOpenShiftBuildConfigName(String buildConfigName) { + addToSummary(s -> { + s.setOpenShiftBuildConfigName(buildConfigName); + return s; + }); + } + + public void setHelmChartName(String chart) { + addToSummary(s -> { + s.setHelmChartName(chart); + return s; + }); + } + + public void setHelmChartLocation(File chart) { + addToSummary(s -> { + s.setHelmChart(chart); + return s; + }); + } + + public void setHelmRepository(String helmRepository) { + addToSummary(s -> { + s.setHelmRepository(helmRepository); + return s; + }); + } + + public void setHelmChartCompressedLocation(File chartCompressed) { + addToSummary(s -> { + s.setHelmChartCompressed(chartCompressed); + return s; + }); + } + + public void setAggregateResourceFile(File aggregateResourceFile) { + addToSummary(s -> { + s.setAggregateResourceFile(aggregateResourceFile); + return s; + }); + } + + public void clear() { + if (summaryFile != null && summaryFile.exists()) { + try { + Files.delete(summaryFile.toPath()); + } catch (IOException e) { + logger.verbose("Unable to delete summary file", e); + } + } + } + + public void setFailureAndCause(String failureMessage) { + setSuccessful(false); + setFailureCause(failureMessage); + } + + public void printSummary(File baseDirectory) { + Summary summaryInstance = loadSummaryFromFile(); + if (summaryInstance != null && summaryEnabled) { + printBanner(); + printCommonSummary(summaryInstance, baseDirectory); + printBuildSummary(summaryInstance); + printPushSummary(summaryInstance); + printResourceSummary(summaryInstance, baseDirectory); + printApplySummary(summaryInstance); + printUndeploySummary(summaryInstance); + printHelmSummary(summaryInstance, baseDirectory); + printHelmPushSummary(summaryInstance); + printActions(summaryInstance); + logger.info(DASHED_LINE); + if (summaryInstance.isSuccessful()) { + logger.info("SUCCESS"); + } else { + logger.error("FAILURE [%s]", summaryInstance.getFailureCause()); + } + logger.info(DASHED_LINE); + } + } + + private void printActions(Summary summaryInstance) { + if (StringUtils.isNotBlank(summaryInstance.getActionType()) && + summaryInstance.getActionsRun() != null && + !summaryInstance.getActionsRun().isEmpty()) { + logger.info("%s executed : [ %s ]", summaryInstance.getActionType(), String.join(", ", summaryInstance.getActionsRun())); + } + } + + private void printCommonSummary(Summary summaryInstance, File baseDirectory) { + if (summaryInstance.getImageSummariesMap() != null && !summaryInstance.getImageSummariesMap().isEmpty()) { + logger.info("Container images:"); + for (Map.Entry imageSummaryEntry : summaryInstance.getImageSummariesMap().entrySet()) { + printImageSummary(baseDirectory, imageSummaryEntry.getKey(), imageSummaryEntry.getValue()); + } + logger.info(""); + } + } + + private void printImageSummary(File baseDirectory, String imageName, ImageSummary imageSummary) { + logger.info(LIST_ELEMENT, imageName); + if (imageSummary.getBaseImageName() != null) { + logger.info(" * Base image: %s", imageSummary.getBaseImageName()); + } + if (imageSummary.getDockerfilePath() != null) { + logger.info(" * Dockerfile image: %s", FileUtil.getRelativeFilePath(baseDirectory.getAbsolutePath(), imageSummary.getDockerfilePath())); + } + if (imageSummary.getImageStreamUsed() != null) { + logger.info(" * ImageStream: %s", imageSummary.getImageStreamUsed()); + } + if (imageSummary.getImageSha() != null) { + logger.info(" * SHA: %s", imageSummary.getImageSha()); + } + } + + private void printBanner() { + logger.info(" __ / / //_/ / / / _ )/ __/"); + logger.info("/ // / ,< / /_/ / _ / _/ "); + logger.info("\\___/_/|_|\\____/____/___/ \n"); + logger.info(DASHED_LINE); + logger.info(" SUMMARY"); + logger.info(DASHED_LINE); + } + + private void printBuildSummary(Summary summary) { + if (summary.getBuildStrategy() != null) { + logger.info("Build Strategy : %s", summary.getBuildStrategy()); + } + if (summary.getGeneratorsApplied() != null && !summary.getGeneratorsApplied().isEmpty()) { + logger.info("Generators applied: [%s]", String.join(",", summary.getGeneratorsApplied())); + } + if (summary.getOpenShiftBuildConfigName() != null) { + logger.info("Build config: %s", summary.getOpenShiftBuildConfigName()); + } + logger.info(""); + } + + private void printResourceSummary(Summary summary, File baseDir) { + if (summary.getGeneratedResourceFiles() != null && !summary.getGeneratedResourceFiles().isEmpty()) { + if (summary.getEnrichersApplied() != null && summary.getEnrichersApplied().size() < 20) { + logger.info("Enrichers applied: [%s]", String.join(", ", summary.getEnrichersApplied())); + } + logger.info("Generated resources:"); + List generatedFilesResourcePaths = summary.getGeneratedResourceFiles().stream() + .map(File::getAbsolutePath) + .map(p -> FileUtil.getRelativeFilePath(baseDir.getAbsolutePath(), p)) + .collect(Collectors.toList()); + logList(generatedFilesResourcePaths); + } + if (summary.getAggregateResourceFile() != null) { + logger.info(LIST_ELEMENT, FileUtil.getRelativeFilePath(baseDir.getAbsolutePath(), summary.getAggregateResourceFile().getAbsolutePath())); + } + logger.info(""); + } + + private void printApplySummary(Summary summary) { + if (StringUtils.isNotBlank(summary.getAppliedClusterUrl())) { + String appliedResources = createKubernetesResourceSummary(summary.getAppliedKubernetesResources()); + logger.info("Applied resources to %s: %s", summary.getAppliedClusterUrl(), appliedResources); + logger.info(""); + } + } + + private void printUndeploySummary(Summary summary) { + if (StringUtils.isNotBlank(summary.getUndeployedClusterUrl())) { + String deletedResources = createKubernetesResourceSummary(summary.getDeletedKubernetesResources()); + logger.info("Undeployed resources to %s: %s", summary.getUndeployedClusterUrl(), deletedResources); + logger.info(""); + } + } + + private String createKubernetesResourceSummary(List kubernetesResourceSummaries) { + StringBuilder sb = new StringBuilder(); + if (kubernetesResourceSummaries != null && !kubernetesResourceSummaries.isEmpty()) { + sb.append("["); + for (int i = 0; i < kubernetesResourceSummaries.size(); i++) { + KubernetesResourceSummary kubernetesResourceSummary = kubernetesResourceSummaries.get(i); + sb.append(kubernetesResourceSummary.getKind()) + .append("/") + .append(kubernetesResourceSummary.getResourceName()); + + if (i < kubernetesResourceSummaries.size() - 1) { + sb.append(", "); + } + } + + sb.append("]"); + } + return sb.toString(); + } + + private void printPushSummary(Summary summary) { + if (StringUtils.isNotBlank(summary.getPushRegistry())) { + logger.info("Registry: %s", summary.getPushRegistry()); + } + } + + private void printHelmSummary(Summary summary, File baseDir) { + if (StringUtils.isNotBlank(summary.getHelmChartName())) { + logger.info("Chart : %s", summary.getHelmChartName()); + } + if (summary.getHelmChart() != null) { + logger.info("Location : %s", FileUtil.getRelativeFilePath(baseDir.getAbsolutePath(), summary.getHelmChart().getAbsolutePath())); + } + if (summary.getHelmChartCompressed() != null) { + logger.info("Compressed : %s", FileUtil.getRelativeFilePath(baseDir.getAbsolutePath(), summary.getHelmChartCompressed().getAbsolutePath())); + } + } + + private void printHelmPushSummary(Summary summary) { + if (StringUtils.isNotBlank(summary.getHelmRepository())) { + logger.info("Repository : %s", summary.getHelmRepository()); + } + } + + private void logList(List list) { + for (String item : list) { + logger.info(LIST_ELEMENT, item); + } + } + + private void addToSummary(UnaryOperator summaryConsumer) { + if (summaryOutputDir != null) { + if (!summaryOutputDir.exists() && !summaryOutputDir.mkdir()) { + logger.debug("Failure in creating Summary output directory %s", summaryOutputDir.getAbsolutePath()); + return; + } + Summary summary = loadSummaryFromFile(); + if (summary == null) { + summary = new Summary(); + } + summary = summaryConsumer.apply(summary); + writeSummaryToFile(summary); + } + } + + private Map createOrAddToExistingMap(Map orignalMap, K key, Supplier emptySupplier, UnaryOperator valueConsumer) { + if (orignalMap == null) { + orignalMap = new HashMap<>(); + } + orignalMap.computeIfAbsent(key, s -> emptySupplier.get()); + orignalMap.put(key, valueConsumer.apply(orignalMap.get(key))); + return orignalMap; + } + + private List createOrAddToExistingList(List currentList, T item) { + if (currentList == null) { + currentList = new ArrayList<>(); + } + if (!currentList.contains(item)) { + currentList.add(item); + } + return currentList; + } + + private synchronized Summary loadSummaryFromFile() { + try { + if (!isValidSummaryFile()) { + summaryFile = createSummaryFile(); + summaryFile.deleteOnExit(); + } else { + return Serialization.jsonMapper().readValue(summaryFile, Summary.class); + } + } catch (IOException ioException) { + logger.verbose("Failure in loading Summary file: ", ioException); + } + return null; + } + + private File createSummaryFile() throws IOException { + if (!summaryOutputDir.exists()) { + createDirectory(summaryOutputDir); + } + File newSummaryFile = new File(summaryOutputDir, SUMMARY_FILE_NAME); + if (newSummaryFile.createNewFile()) { + logger.verbose("Created summary file"); + } + return newSummaryFile; + } + + private void writeSummaryToFile(Summary summary) { + if (isValidSummaryFile()) { + try (FileWriter fileWriter = new FileWriter(summaryFile)) { + fileWriter.write(Serialization.jsonMapper().writeValueAsString(summary)); + } catch (IOException ioException) { + logger.verbose("Failure in writing to Summary file: ", ioException); + } + } + } + + private static boolean isValidSummaryFile() { + return summaryFile != null && + StringUtils.isNotBlank(summaryFile.getAbsolutePath()) && + summaryFile.getAbsolutePath().contains(SUMMARY_FILE_NAME) && + summaryFile.exists(); + } +} diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/ImageSummary.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/ImageSummary.java new file mode 100644 index 0000000000..0723d14f1f --- /dev/null +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/ImageSummary.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.common.summary; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@NoArgsConstructor +public class ImageSummary { + private String baseImageName; + private String dockerfilePath; + private String imageStreamUsed; + private String imageSha; + + public ImageSummary(String baseImageName, String dockerfilePath, String imageStreamUsed, String imageSha) { + this.baseImageName = baseImageName; + this.dockerfilePath = dockerfilePath; + this.imageStreamUsed = imageStreamUsed; + this.imageSha = imageSha; + } +} diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/KubernetesResourceSummary.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/KubernetesResourceSummary.java new file mode 100644 index 0000000000..87854827de --- /dev/null +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/KubernetesResourceSummary.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.common.summary; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@NoArgsConstructor +public class KubernetesResourceSummary { + private String resourceName; + private String group; + private String version; + private String kind; + private String namespace; + + public KubernetesResourceSummary(String resourceName, String group, String version, String kind, String namespace) { + this.resourceName = resourceName; + this.group = group; + this.version = version; + this.kind = kind; + this.namespace = namespace; + } +} diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/Summary.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/Summary.java new file mode 100644 index 0000000000..cc7a0cbf36 --- /dev/null +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/summary/Summary.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.common.summary; + +import lombok.Getter; +import lombok.Setter; + +import java.io.File; +import java.util.List; +import java.util.Map; + +@Getter +@Setter +public class Summary { + private Map imageSummariesMap; + private String buildStrategy; + private List generatorsApplied; + private String actionType; + private List actionsRun; + private String openShiftBuildConfigName; + private boolean successful; + private String failureCause; + private File aggregateResourceFile; + private String appliedClusterUrl; + private String undeployedClusterUrl; + private String pushRegistry; + private String helmChartName; + private File helmChartCompressed; + private File helmChart; + private String helmRepository; + private List generatedResourceFiles; + private List appliedKubernetesResources; + private List deletedKubernetesResources; + private List enrichersApplied; +} diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java index 2e1ac10c5e..8cfbf6ba2f 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java @@ -39,6 +39,17 @@ void getBaseDir_withJavaProject_shouldReturnJavaProjectBaseDirectory() { assertThat(result).isEqualTo(new File("base-directory")); } + @Test + void getBuildDirectory_withJavaProject_shouldReturnJavaProjectBuildDirectory() { + // Given + final JKubeConfiguration configuration = JKubeConfiguration.builder().project(JavaProject.builder() + .buildDirectory(new File("build-directory")).build()).build(); + // When + final File result = configuration.getBuildDirectory(); + // Then + assertThat(result).isEqualTo(new File("build-directory")); + } + @Test void getProperties_withJavaProject_shouldReturnJavaProjectProperties() { // Given diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/service/SummaryServiceTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/service/SummaryServiceTest.java new file mode 100644 index 0000000000..d9eda1a992 --- /dev/null +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/service/SummaryServiceTest.java @@ -0,0 +1,229 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.common.service; + +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.summary.KubernetesResourceSummary; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +class SummaryServiceTest { + private KitLogger logger; + @TempDir + private File temporaryFolder; + private SummaryService summaryService; + + @BeforeEach + public void setUp() { + logger = spy(new KitLogger.SilentLogger()); + summaryService = new SummaryService(temporaryFolder, logger, true); + } + + @Test + void printSummary_whenInvoked_shouldPrintSummary() { + // Given + initializeSummary(); + + // When + summaryService.printSummary(temporaryFolder); + + // Then + verifySummaryPrintedOnce(); + } + + @Test + void printSummary_whenFailure_shouldPrintFailureAndCause() { + // Given + summaryService.setSuccessful(false); + summaryService.setFailureCause("failure in pulling image"); + + // When + summaryService.printSummary(temporaryFolder); + + // Then + verify(logger).error("FAILURE [%s]", "failure in pulling image"); + } + + @Test + void printSummary_whenSummaryEnabledFalse_shouldNotPrintAnything() { + // Given + summaryService = new SummaryService(temporaryFolder, logger, false); + // When + summaryService.printSummary(temporaryFolder); + + // Then + verify(logger, times(0)).info(anyString()); + } + + @Test + void setFailureAndCause_whenSummaryEnabled_shouldLogFailureAndCause() { + // Given + summaryService.setFailureAndCause("failed to execute"); + + // When + summaryService.printSummary(temporaryFolder); + + // Then + verify(logger).error("FAILURE [%s]", "failed to execute"); + } + + @Test + void setFailureAndCause_whenSummaryDisabled_shouldLogNothing() { + // Given + summaryService = new SummaryService(temporaryFolder, logger, false); + + // When + summaryService.setFailureAndCause( "failed"); + summaryService.printSummary(temporaryFolder); + + // Then + verify(logger, times(0)).error(anyString(), anyString()); + } + + @Test + void clear_whenInvoked_shouldDeleteSummaryFile() { + // Given + summaryService.setSuccessful(true); + + // When + summaryService.clear(); + + // Then + verify(logger, times(0)).info(anyString()); + } + + private void initializeSummary() { + summaryService.setBuildStrategy("Local Docker"); + summaryService.addToGenerators("java-exec"); + summaryService.setDockerFileImageSummary("quay.io/example/test:latest", new File(temporaryFolder, "src/main/docker/Dockerfile").getAbsolutePath()); + summaryService.setBaseImageNameImageSummary("quay.io/example/test:latest", "quay.io/jkube/java:latest"); + summaryService.setImageShaImageSummary("quay.io/example/test:latest", "def3"); + summaryService.setImageStreamUsedImageSummary("quay.io/example/test:latest", "test"); + summaryService.setPushRegistry("quay.io"); + summaryService.setOpenShiftBuildConfigName("test"); + summaryService.addGeneratedResourceFile(new File(temporaryFolder, "target/classes/META-INF/jkube/kubernetes/test-deployment.yml")); + summaryService.addGeneratedResourceFile(new File(temporaryFolder, "target/classes/META-INF/jkube/kubernetes/test-service.yml")); + summaryService.setAggregateResourceFile(new File(temporaryFolder, "target/classes/META-INF/jkube/kubernetes.yml")); + summaryService.addToEnrichers("jkube-controller"); + summaryService.addToEnrichers("jkube-service"); + summaryService.addAppliedKubernetesResource(KubernetesResourceSummary.builder() + .kind("Deployment") + .group("apps") + .version("v1") + .namespace("test-ns") + .resourceName("test") + .build()); + summaryService.addAppliedKubernetesResource(KubernetesResourceSummary.builder() + .kind("Service") + .group("v1") + .version("v1") + .namespace("test-ns") + .resourceName("test") + .build()); + summaryService.setHelmChartName("test"); + summaryService.setHelmChartCompressedLocation(new File(temporaryFolder, "target/test.tar.gz")); + summaryService.setHelmChartLocation(new File(temporaryFolder, "target/jkube/helm/test/kubernetes")); + summaryService.setHelmRepository("localhost:8001/api/charts"); + summaryService.addDeletedKubernetesResource(KubernetesResourceSummary.builder() + .kind("Deployment") + .group("apps") + .version("v1") + .namespace("test-ns") + .resourceName("test") + .build()); + summaryService.addDeletedKubernetesResource(KubernetesResourceSummary.builder() + .kind("Service") + .group("v1") + .version("v1") + .namespace("test-ns") + .resourceName("test") + .build()); + summaryService.setAppliedClusterUrl("https://192.168.39.75:8443/"); + summaryService.setUndeployedClusterUrl("https://192.168.39.75:8443/"); + summaryService.setActionType("Goals"); + summaryService.addToActions("k8sResource"); + summaryService.addToActions("k8sHelm"); + summaryService.setSuccessful(true); + } + + private void verifySummaryPrintedOnce() { + verifySummaryBannerPrinted(); + verifyCommonSummaryPrinted(); + verifyBuildSummaryPrinted(); + verifyPushSummaryPrinted(); + verifyResourceSummaryPrinted(); + verifyHelmSummaryPrinted(); + verifyApplyUndeploySummaryPrinted(); + verifyActionsRunPrinted(); + verify(logger).info(" SUMMARY"); + } + + private void verifyApplyUndeploySummaryPrinted() { + verify(logger).info("Undeployed resources to %s: %s", "https://192.168.39.75:8443/", "[Deployment/test, Service/test]"); + verify(logger).info("Applied resources to %s: %s", "https://192.168.39.75:8443/", "[Deployment/test, Service/test]"); + } + + private void verifyPushSummaryPrinted() { + verify(logger).info("Registry: %s", "quay.io"); + } + + private void verifyBuildSummaryPrinted() { + verify(logger).info("Build Strategy : %s", "Local Docker"); + verify(logger).info("Generators applied: [%s]", "java-exec"); + verify(logger).info("Build config: %s", "test"); + } + + private void verifyCommonSummaryPrinted() { + verify(logger).info("Container images:"); + verify(logger).info(" - %s", "quay.io/example/test:latest"); + verify(logger).info(" * Base image: %s", "quay.io/jkube/java:latest"); + verify(logger).info(" * Dockerfile image: %s", "src/main/docker/Dockerfile"); + verify(logger).info(" * SHA: %s", "def3"); + verify(logger).info(" * ImageStream: %s", "test"); + } + + private void verifySummaryBannerPrinted() { + verify(logger, times(4)).info("-------------------------------"); + verify(logger).info(" SUMMARY"); + verify(logger).info(" __ / / //_/ / / / _ )/ __/"); + verify(logger).info("/ // / ,< / /_/ / _ / _/ "); + verify(logger).info("\\___/_/|_|\\____/____/___/ \n"); + } + + private void verifyResourceSummaryPrinted() { + verify(logger).info("Enrichers applied: [%s]", "jkube-controller, jkube-service"); + verify(logger).info("Generated resources:"); + verify(logger).info(" - %s", "target/classes/META-INF/jkube/kubernetes/test-deployment.yml"); + verify(logger).info(" - %s", "target/classes/META-INF/jkube/kubernetes/test-service.yml"); + verify(logger).info(" - %s", "target/classes/META-INF/jkube/kubernetes.yml"); + } + + private void verifyHelmSummaryPrinted() { + verify(logger).info("Chart : %s", "test"); + verify(logger).info("Location : %s", "target/jkube/helm/test/kubernetes"); + verify(logger).info("Compressed : %s", "target/test.tar.gz"); + } + + private void verifyActionsRunPrinted() { + verify(logger).info("%s executed : [ %s ]", "Goals", "k8sResource, k8sHelm"); + } +} diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceService.java b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceService.java index d8def86348..f58356b82e 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceService.java +++ b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceService.java @@ -17,6 +17,7 @@ import java.io.IOException; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.ResourceClassifier; import io.fabric8.kubernetes.api.model.KubernetesList; @@ -26,7 +27,7 @@ public interface ResourceService { KubernetesList generateResources(PlatformMode platformMode, EnricherManager enricherManager, KitLogger log) throws IOException; - File writeResources(KubernetesList resources, ResourceClassifier classifier, KitLogger log) throws IOException; + File writeResources(KubernetesList resources, ResourceClassifier classifier, KitLogger log, SummaryService summaryService) throws IOException; @FunctionalInterface interface ResourceFileProcessor { diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java index abefcc7084..7c01200d31 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java @@ -31,6 +31,8 @@ import io.fabric8.kubernetes.client.dsl.base.PatchContext; import io.fabric8.kubernetes.client.dsl.base.PatchType; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; +import org.eclipse.jkube.kit.common.summary.KubernetesResourceSummary; import org.eclipse.jkube.kit.common.util.FileUtil; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; @@ -80,6 +82,8 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; +import static io.fabric8.kubernetes.client.utils.ApiVersionUtil.trimGroup; +import static io.fabric8.kubernetes.client.utils.ApiVersionUtil.trimVersion; import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.eclipse.jkube.kit.common.util.KubernetesHelper.getKind; @@ -112,13 +116,15 @@ public class ApplyService { private boolean rollingUpgradePreserveScale = true; private boolean recreateMode; private final PatchService patchService; + private final SummaryService summaryService; // This map is to track projects created. private static final Set projectsCreated = new HashSet<>(); - public ApplyService(KubernetesClient kubernetesClient, KitLogger log) { + public ApplyService(KubernetesClient kubernetesClient, KitLogger log, SummaryService summaryService) { this.kubernetesClient = kubernetesClient; this.patchService = new PatchService(kubernetesClient, log); this.log = log; + this.summaryService = summaryService; } /** @@ -238,6 +244,7 @@ public void applyGenericKubernetesResource(GenericKubernetesResource genericKube } kubernetesClient.genericKubernetesResources(genericKubernetesResource.getApiVersion(), genericKubernetesResource.getKind()).inNamespace(applyNamespace).withName(name) .createOrReplace(genericKubernetesResource); + addToAppliedResourcesSummary(genericKubernetesResource, applyNamespace); log.info("Created Custom Resource: %s %s/%s", apiGroupWithKind, applyNamespace, name); } @@ -265,6 +272,7 @@ public void applyOAuthClient(OAuthClient entity, String sourceName) { } else { try { Object answer = openShiftClient.oAuthClients().withName(id).replace(entity); + addToAppliedResourcesSummary(entity, null); log.info("Updated OAuthClient result: %s", answer); } catch (Exception e) { onApplyError("Failed to update OAuthClient from " + sourceName + ". " + e + ". " + entity, e); @@ -285,6 +293,7 @@ protected void doCreateOAuthClient(OAuthClient entity, String sourceName) { if (OpenshiftHelper.isOpenShift(kubernetesClient)) { try { asOpenShiftClient().oAuthClients().resource(entity).create(); + addToAppliedResourcesSummary(entity, null); } catch (Exception e) { onApplyError("Failed to create OAuthClient from " + sourceName + ". " + e + ". " + entity, e); } @@ -327,6 +336,7 @@ public void installTemplate(Template entity, String sourceName) { log.info("Updating a Template from %s", sourceName); try { Object answer = openShiftClient.templates().inNamespace(currentNamespace).withName(id).replace(entity); + addToAppliedResourcesSummary(entity, currentNamespace); log.info("Updated Template: " + answer); } catch (Exception e) { onApplyError("Failed to update Template from " + sourceName + ". " + e + ". " + entity, e); @@ -353,6 +363,7 @@ protected void doCreateTemplate(Template entity, String namespace, String source try { final Template answer = asOpenShiftClient().templates().inNamespace(namespace).create(entity); logGeneratedEntity("Created Template: ", namespace, entity, answer); + addToAppliedResourcesSummary(answer, namespace); } catch (Exception e) { onApplyError("Failed to Template entity from " + sourceName + ". " + e + ". " + entity, e); } @@ -382,6 +393,7 @@ public void applyServiceAccount(ServiceAccount serviceAccount, String sourceName log.info("Updating a ServiceAccount from " + sourceName); try { Object answer = kubernetesClient.serviceAccounts().inNamespace(currentNamespace).withName(id).replace(serviceAccount); + addToAppliedResourcesSummary(serviceAccount, currentNamespace); logGeneratedEntity("Updated ServiceAccount: ", currentNamespace, serviceAccount, answer); } catch (Exception e) { onApplyError("Failed to update ServiceAccount from " + sourceName + ". " + e + ". " + serviceAccount, e); @@ -402,6 +414,7 @@ protected void doCreateServiceAccount(ServiceAccount serviceAccount, String name (serviceAccount)); try { Object answer = kubernetesClient.serviceAccounts().inNamespace(namespace).create(serviceAccount); + addToAppliedResourcesSummary(serviceAccount, namespace); logGeneratedEntity("Created ServiceAccount: ", namespace, serviceAccount, answer); } catch (Exception e) { onApplyError("Failed to create ServiceAccount from " + sourceName + ". " + e + ". " + serviceAccount, e); @@ -480,6 +493,7 @@ private void doCreateCustomResourceDefinition(CustomResourceDefinition entity, S log.info("Creating a Custom Resource Definition from " + sourceName + " name " + getName(entity)); try { CustomResourceDefinition answer = kubernetesClient.apiextensions().v1().customResourceDefinitions().create(entity); + addToAppliedResourcesSummary(answer, null); log.info("Created Custom Resource Definition result: %s", answer.getMetadata().getName()); } catch (Exception e) { onApplyError("Failed to create Custom Resource Definition from " + sourceName + ". " + e + ". " + entity, e); @@ -497,6 +511,7 @@ protected void doCreatePersistentVolumeClaim(PersistentVolumeClaim entity, Strin try { Object answer; answer = kubernetesClient.persistentVolumeClaims().inNamespace(namespace).create(entity); + addToAppliedResourcesSummary(entity, namespace); logGeneratedEntity("Created PersistentVolumeClaim: ", namespace, entity, answer); } catch (Exception e) { onApplyError("Failed to create PersistentVolumeClaim from " + sourceName + ". " + e + ". " + entity, e); @@ -540,6 +555,7 @@ protected void doCreateSecret(Secret secret, String namespace, String sourceName try { Object answer = kubernetesClient.secrets().inNamespace(namespace).create(secret); logGeneratedEntity("Created Secret: ", namespace, secret, answer); + addToAppliedResourcesSummary(secret, namespace); } catch (Exception e) { onApplyError("Failed to create Secret from " + sourceName + ". " + e + ". " + secret, e); } @@ -654,6 +670,7 @@ private void doCreateRoute(Route entity, String namespace, String sourceName) { "host: " + entity.getSpec().getHost() : "No Spec !")); asOpenShiftClient().routes().inNamespace(namespace).resource(entity).create(); + addToAppliedResourcesSummary(entity, namespace); } catch (Exception e) { onApplyError("Failed to create Route from " + sourceName + ". " + e + ". " + entity, e); } @@ -695,6 +712,7 @@ public void doCreateBuildConfig(BuildConfig entity, String namespace , String so if (OpenshiftHelper.isOpenShift(kubernetesClient)) { try { asOpenShiftClient().buildConfigs().inNamespace(namespace).resource(entity).create(); + addToAppliedResourcesSummary(entity, namespace); } catch (Exception e) { onApplyError("Failed to create BuildConfig from " + sourceName + ". " + e, e); } @@ -724,6 +742,7 @@ public void applyRoleBinding(RoleBinding entity, String sourceName) { metadata.setNamespace(currentNamespace); metadata.setResourceVersion(resourceVersion); Object answer = kubernetesClient.rbac().roleBindings().inNamespace(currentNamespace).withName(id).replace(entity); + addToAppliedResourcesSummary(entity, currentNamespace); logGeneratedEntity("Updated RoleBinding: ", currentNamespace, entity, answer); } catch (Exception e) { onApplyError("Failed to update RoleBinding from " + sourceName + ". " + e + ". " + entity, e); @@ -743,6 +762,7 @@ public void doCreateRoleBinding(RoleBinding entity, String namespace , String so try { log.info("Creating RoleBinding from " + sourceName + " namespace " + namespace + " name " + getName(entity)); kubernetesClient.rbac().roleBindings().inNamespace(namespace).create(entity); + addToAppliedResourcesSummary(entity, namespace); } catch (Exception e) { onApplyError("Failed to create RoleBinding from " + sourceName + ". " + e, e); } @@ -760,8 +780,10 @@ public void applyImageStream(ImageStream entity, String sourceName) { if (old == null) { log.info("Creating " + kind + " " + name + " from " + sourceName); resource.create(entity); + addToAppliedResourcesSummary(entity, currentNamespace); } else { log.info("Updating " + kind + " " + name + " from " + sourceName); + addToAppliedResourcesSummary(entity, currentNamespace); copyAllImageStreamTags(entity, old); entity = patchService.compareAndPatchEntity(currentNamespace, entity, old); openShiftClient.resource(entity).inNamespace(currentNamespace).createOrReplace(); @@ -878,6 +900,7 @@ public void applyResource(T resource, String sourceNam log.info("Updating " + kind + " from " + sourceName); try { Object answer = resources.inNamespace(currentNamespace).withName(id).replace(resource); + addToAppliedResourcesSummary(resource, currentNamespace); logGeneratedEntity("Updated " + kind + ": ", currentNamespace, resource, answer); } catch (Exception e) { onApplyError("Failed to update " + kind + " from " + sourceName + ". " + e + ". " + resource, e); @@ -898,6 +921,7 @@ protected void doCreateResource(T resource, String na log.info("Creating a " + kind + " from " + sourceName + " namespace " + namespace + " name " + getName(resource)); try { Object answer = resources.inNamespace(namespace).create(resource); + addToAppliedResourcesSummary(resource, namespace); logGeneratedEntity("Created " + kind + ": ", namespace, resource, answer); } catch (Exception e) { onApplyError("Failed to create " + kind + " from " + sourceName + ". " + e + ". " + resource, e); @@ -909,6 +933,7 @@ private void doPatchEntity(T oldEntity, T newEntity, Str log.info("Updating %s from %s", kind, sourceName); try { Object answer = patchService.compareAndPatchEntity(namespace, newEntity, oldEntity); + addToAppliedResourcesSummary(newEntity, namespace); logGeneratedEntity("Updated " + kind + ": ", namespace, newEntity, answer); } catch (Exception e) { onApplyError("Failed to update " + kind + " from " + sourceName + ". " + e + ". " + newEntity, e); @@ -919,6 +944,7 @@ protected void doCreateService(Service service, String namespace, String sourceN log.info("Creating a Service from " + sourceName + " namespace " + namespace + " name " + getName(service)); try { Object answer = kubernetesClient.services().inNamespace(namespace).create(service); + addToAppliedResourcesSummary(service, namespace); logGeneratedEntity("Created Service: ", namespace, service, answer); } catch (Exception e) { onApplyError("Failed to create Service from " + sourceName + ". " + e + ". " + service, e); @@ -1089,6 +1115,7 @@ public void applyReplicationController(ReplicationController replicationControll log.info("Updating ReplicationController from " + sourceName + " namespace " + currentNamespace + " name " + getName(replicationController)); try { Object answer = patchService.compareAndPatchEntity(currentNamespace, replicationController, old); + addToAppliedResourcesSummary(replicationController, currentNamespace); logGeneratedEntity("Updated replicationController: ", currentNamespace, replicationController, answer); if (deletePodsOnReplicationControllerUpdate) { @@ -1176,6 +1203,7 @@ protected void applyJob(Job job, String sourceName) { if(exception.getStatus().getCode().equals(HttpURLConnection.HTTP_CONFLICT)) { Job old = kubernetesClient.batch().v1().jobs().inNamespace(currentNamespace).withName(id).get(); Job updatedJob = patchService.compareAndPatchEntity(currentNamespace, job, old); + addToAppliedResourcesSummary(updatedJob, currentNamespace); log.info("Updated Job: " + updatedJob.getMetadata().getName()); return; } @@ -1341,6 +1369,7 @@ public void setRollingUpgradePreserveScale(boolean rollingUpgradePreserveScale) public void applyEntities(String fileName, Collection entities, KitLogger serviceLogger, long serviceUrlWaitTimeSeconds) { + summaryService.setAppliedClusterUrl(kubernetesClient.getMasterUrl().toString()); applyStandardEntities(fileName, getK8sListWithNamespaceFirst(entities)); } @@ -1361,6 +1390,16 @@ private void applyStandardEntities(String fileName, List entities) } } + private void addToAppliedResourcesSummary(HasMetadata h, String applicableNamespace) { + summaryService.addAppliedKubernetesResource(KubernetesResourceSummary.builder() + .group(trimGroup(h.getApiVersion())) + .version(trimVersion(h.getApiVersion())) + .namespace(applicableNamespace) + .resourceName(KubernetesHelper.getName(h)) + .kind(h.getKind()) + .build()); + } + public static List getK8sListWithNamespaceFirst(Collection k8sList) { return k8sList.stream().sorted(new HasMetadataComparator()).sorted((k1, k2) -> { if (isNamespaceOrProject(k1)) { diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java index 6a2e8ed705..bc8c3b3188 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java @@ -25,6 +25,7 @@ import org.eclipse.jkube.kit.common.service.MigrateService; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.access.ClusterConfiguration; @@ -66,14 +67,16 @@ public class JKubeServiceHub implements Closeable { private LazyBuilder helmService; private LazyBuilder clusterAccessLazyBuilder; private LazyBuilder kubernetesClientLazyBuilder; + private LazyBuilder summaryService; private final boolean offline; + private final boolean summaryEnabled; @Builder public JKubeServiceHub( ClusterAccess clusterAccess, RuntimeMode platformMode, KitLogger log, DockerServiceHub dockerServiceHub, JKubeConfiguration configuration, BuildServiceConfig buildServiceConfig, - LazyBuilder resourceService, boolean offline) { + LazyBuilder resourceService, boolean offline, boolean summaryEnabled) { this.clusterAccess = clusterAccess; this.platformMode = platformMode; this.log = log; @@ -82,6 +85,7 @@ public JKubeServiceHub( this.buildServiceConfig = buildServiceConfig; this.resourceService = resourceService; this.offline = offline; + this.summaryEnabled = summaryEnabled; init(); } @@ -103,9 +107,10 @@ private void init() { private void initLazyBuilders() { clusterAccessLazyBuilder = new LazyBuilder<>(this::initClusterAccessIfNecessary); kubernetesClientLazyBuilder = new LazyBuilder<>(() -> getClusterAccess().createDefaultClient()); + summaryService = new LazyBuilder<>(() -> new SummaryService(configuration.getBuildDirectory(), log, summaryEnabled)); buildServiceManager = new LazyBuilder<>(() -> new BuildServiceManager(this)); pluginManager = new LazyBuilder<>(() -> new PluginManager(this)); - applyService = new LazyBuilder<>(() -> new ApplyService(getClient(), log)); + applyService = new LazyBuilder<>(() -> new ApplyService(getClient(), log, getSummaryService())); portForwardService = new LazyBuilder<>(() -> { getClient(); return new PortForwardService(log); @@ -120,7 +125,7 @@ private void initLazyBuilders() { return new KubernetesUndeployService(this, log); }); migrateService = new LazyBuilder<>(() -> new MigrateService(getConfiguration().getBasedir(), log)); - helmService = new LazyBuilder<>(() -> new HelmService(getConfiguration(), log)); + helmService = new LazyBuilder<>(() -> new HelmService(getConfiguration(), log, getSummaryService())); } private ClusterAccess initClusterAccessIfNecessary() { @@ -181,4 +186,8 @@ public KubernetesClient getClient() { public ClusterAccess getClusterAccess() { return clusterAccessLazyBuilder.get(); } + + public SummaryService getSummaryService() { + return summaryService.get(); + } } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java index 183962cb45..470a17c099 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java @@ -18,6 +18,7 @@ import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -36,6 +37,7 @@ public class DockerBuildService extends AbstractImageBuildService { private final BuildServiceConfig buildServiceConfig; private final JKubeConfiguration jKubeConfiguration; private final DockerServiceHub dockerServices; + private final SummaryService summaryService; public DockerBuildService(JKubeServiceHub jKubeServiceHub) { super(jKubeServiceHub); @@ -46,6 +48,7 @@ public DockerBuildService(JKubeServiceHub jKubeServiceHub) { "JKubeConfiguration is required"); this.dockerServices = Objects.requireNonNull(jKubeServiceHub.getDockerServiceHub(), "Docker Service Hub is required"); + this.summaryService = jKubeServiceHub.getSummaryService(); } @Override @@ -56,7 +59,8 @@ public boolean isApplicable() { @Override public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeServiceException { try { - dockerServices.getBuildService().buildImage(imageConfig, buildServiceConfig.getImagePullManager(), jKubeConfiguration); + summaryService.setBuildStrategy("Local Docker"); + dockerServices.getBuildService().buildImage(imageConfig, buildServiceConfig.getImagePullManager(), jKubeConfiguration, summaryService); // Assume we always want to tag dockerServices.getBuildService().tagImage(imageConfig.getName(), imageConfig); @@ -68,7 +72,7 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService @Override protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException { try { - dockerServices.getRegistryService().pushImage(imageConfiguration, retries, registryConfig, skipTag); + dockerServices.getRegistryService().pushImage(imageConfiguration, retries, registryConfig, skipTag, summaryService); } catch (IOException ex) { throw new JKubeServiceException("Error while trying to push the image: " + ex.getMessage(), ex); } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java index 905754028e..335763cc43 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java @@ -25,6 +25,7 @@ import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.ImageName; @@ -58,6 +59,7 @@ public class JibBuildService extends AbstractImageBuildService { private final KitLogger log; private final BuildServiceConfig buildServiceConfig; private final JKubeConfiguration configuration; + private final SummaryService summaryService; public JibBuildService(JKubeServiceHub jKubeServiceHub) { super(jKubeServiceHub); @@ -66,6 +68,8 @@ public JibBuildService(JKubeServiceHub jKubeServiceHub) { "BuildServiceConfig is required"); this.configuration = Objects.requireNonNull(jKubeServiceHub.getConfiguration(), "JKubeConfiguration is required"); + this.summaryService = Objects.requireNonNull(jKubeServiceHub.getSummaryService(), + "SummaryService is required"); } @Override @@ -76,6 +80,7 @@ public boolean isApplicable() { @Override public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeServiceException { try { + summaryService.setBuildStrategy("Local Jib"); log.info("[[B]]JIB[[B]] image build started"); if (imageConfig.getBuildConfiguration().isDockerFileMode()) { throw new JKubeServiceException("Dockerfile mode is not supported with JIB build strategy"); @@ -84,7 +89,7 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService BuildDirs buildDirs = new BuildDirs(imageConfig.getName(), configuration); final Credential pullRegistryCredential = getRegistryCredentials( configuration.getRegistryConfig(), false, imageConfig, log); - final JibContainerBuilder containerBuilder = containerFromImageConfiguration(imageConfig, pullRegistryCredential); + final JibContainerBuilder containerBuilder = containerFromImageConfiguration(imageConfig, pullRegistryCredential, summaryService); final Map> layers = AssemblyManager.getInstance() .copyFilesToFinalTarballDirectory(configuration, buildDirs, @@ -96,7 +101,7 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService // files should be added using the AssemblyFileEntry list. AssemblyManager, should provide // a common way to achieve this so that both the tar builder and any other builder could get a hold of // archive customizers, file entries, etc. - File dockerTarArchive = getAssemblyTarArchive(imageConfig, configuration, log); + File dockerTarArchive = getAssemblyTarArchive(imageConfig, configuration, log, summaryService); JibServiceUtil.buildContainer(containerBuilder, TarImage.at(dockerTarArchive.toPath()).named(imageConfig.getName()), log); log.info(" %s successfully built", dockerTarArchive.getAbsolutePath()); @@ -116,7 +121,8 @@ protected void pushSingleImage(ImageConfiguration imageConfiguration, int retrie imageConfiguration, getRegistryCredentials(registryConfig, true, imageConfiguration, log), getBuildTarArchive(imageConfiguration, configuration), - log + log, + summaryService ); } catch (Exception ex) { throw new JKubeServiceException("Error when push JIB image", ex); @@ -137,11 +143,11 @@ static ImageConfiguration prependRegistry(ImageConfiguration imageConfiguration, return imageConfiguration; } - static File getAssemblyTarArchive(ImageConfiguration imageConfig, JKubeConfiguration configuration, KitLogger log) throws IOException { + static File getAssemblyTarArchive(ImageConfiguration imageConfig, JKubeConfiguration configuration, KitLogger log, SummaryService summaryService) throws IOException { log.info("Preparing assembly files"); final String targetImage = imageConfig.getName(); return AssemblyManager.getInstance() - .createDockerTarArchive(targetImage, configuration, imageConfig.getBuildConfiguration(), log, null); + .createDockerTarArchive(targetImage, configuration, imageConfig.getBuildConfiguration(), log, null, summaryService); } static Credential getRegistryCredentials( diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java index 5db4ed8f85..d8ed4478c6 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java @@ -26,6 +26,7 @@ import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.summary.KubernetesResourceSummary; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; @@ -34,6 +35,8 @@ import io.fabric8.kubernetes.api.model.DeletionPropagation; import io.fabric8.kubernetes.api.model.HasMetadata; +import static io.fabric8.kubernetes.client.utils.ApiVersionUtil.trimGroup; +import static io.fabric8.kubernetes.client.utils.ApiVersionUtil.trimVersion; import static org.eclipse.jkube.kit.common.util.KubernetesHelper.loadResources; import static org.eclipse.jkube.kit.config.service.ApplyService.getK8sListWithNamespaceFirst; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.applicableNamespace; @@ -63,6 +66,7 @@ public void undeploy(List resourceDirs, ResourceConfig resourceConfig, Fil logger.warn("No such generated manifests found for this project, ignoring."); return; } + jKubeServiceHub.getSummaryService().setUndeployedClusterUrl(jKubeServiceHub.getClient().getMasterUrl().toString()); List undeployEntities = getK8sListWithNamespaceFirst(entities); Collections.reverse(undeployEntities); undeployCustomResources(resourceConfig.getNamespace(), fallbackNamespace, undeployEntities); @@ -87,6 +91,7 @@ protected Consumer resourceDeleter(String namespace, String fallbac .inNamespace(undeployNamespace) .withPropagationPolicy(DeletionPropagation.BACKGROUND) .delete(); + addToUndeployedResourcesSummary(undeployNamespace, resource); }; } @@ -116,6 +121,16 @@ private void deleteCustomResource(GenericKubernetesResource customResource, Stri } } + private void addToUndeployedResourcesSummary(String namespace, HasMetadata h) { + jKubeServiceHub.getSummaryService().addDeletedKubernetesResource(KubernetesResourceSummary.builder() + .group(trimGroup(h.getApiVersion())) + .version(trimVersion(h.getApiVersion())) + .namespace(namespace) + .resourceName(KubernetesHelper.getName(h)) + .kind(h.getKind()) + .build()); + } + protected JKubeServiceHub getjKubeServiceHub() { return jKubeServiceHub; } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/SummaryServiceUtil.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/SummaryServiceUtil.java new file mode 100644 index 0000000000..30ede6c1eb --- /dev/null +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/SummaryServiceUtil.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.config.service.kubernetes; + +import org.eclipse.jkube.kit.config.service.JKubeServiceHub; + +public class SummaryServiceUtil { + private SummaryServiceUtil() { } + + public static void printSummary(JKubeServiceHub jKubeServiceHub) { + if (jKubeServiceHub != null) { + jKubeServiceHub.getSummaryService().printSummary(jKubeServiceHub.getConfiguration().getBasedir()); + jKubeServiceHub.getSummaryService().clear(); + } + } + + public static void printSummaryIfLastExecuting(JKubeServiceHub jKubeServiceHub, String current, String lastExecuting) { + if (lastExecuting != null && lastExecuting.equals(current)) { + printSummary(jKubeServiceHub); + } + } + + public static void handleExceptionAndSummary(JKubeServiceHub jKubeServiceHub, Exception exception) { + if (jKubeServiceHub != null) { + jKubeServiceHub.getSummaryService().setFailureAndCause(exception.getMessage()); + printSummary(jKubeServiceHub); + } + } +} diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java index f8d285f08b..686a08cd68 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java @@ -62,7 +62,7 @@ protected static File createBuildArchive(JKubeServiceHub jKubeServiceHub, ImageC final ArchiverCustomizer customizer = createS2IArchiveCustomizer(jKubeServiceHub.getBuildServiceConfig(), imageConfig); try { return jKubeServiceHub.getDockerServiceHub().getArchiveService() - .createDockerBuildArchive(imageConfig, jKubeServiceHub.getConfiguration(), customizer); + .createDockerBuildArchive(imageConfig, jKubeServiceHub.getConfiguration(), customizer, jKubeServiceHub.getSummaryService()); } catch (IOException e) { throw new JKubeServiceException("Unable to create the build archive", e); } @@ -123,6 +123,7 @@ protected static BuildStrategy createBuildStrategy( final String fromNamespace = getMapValueWithDefault(fromExt, JKubeBuildStrategy.SourceStrategy.namespace, IMAGE_STREAM_TAG.equals(fromKind) ? "openshift" : null); if (osBuildStrategy == JKubeBuildStrategy.docker) { + jKubeServiceHub.getSummaryService().setBuildStrategy("Cluster Docker"); BuildStrategy buildStrategy = new BuildStrategyBuilder() .withType("Docker") .withNewDockerStrategy() @@ -141,6 +142,7 @@ protected static BuildStrategy createBuildStrategy( } return buildStrategy; } else if (osBuildStrategy == JKubeBuildStrategy.s2i) { + jKubeServiceHub.getSummaryService().setBuildStrategy("Cluster S2I"); BuildStrategy buildStrategy = new BuildStrategyBuilder() .withType("Source") .withNewSourceStrategy() diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java index 82f8d3ce2a..226d63d391 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java @@ -151,6 +151,8 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService // Create a file with generated image streams addImageStreamToFile(getImageStreamFile(), imageName, client); + jKubeServiceHub.getSummaryService().setBaseImageNameImageSummary(imageConfig.getName(), imageConfig.getBuildConfiguration().getFrom()); + jKubeServiceHub.getSummaryService().setImageStreamUsedImageSummary(imageConfig.getName(), resolveImageStreamName(imageName)); createAdditionalTags(imageConfig, imageName); } else { @@ -206,6 +208,7 @@ protected String updateOrCreateBuildConfig(BuildServiceConfig config, OpenShiftC // Fetch existing build config BuildConfig buildConfig = client.buildConfigs().inNamespace(applicableOpenShiftNamespace).withName(buildName).get(); + jKubeServiceHub.getSummaryService().setOpenShiftBuildConfigName(buildName); if (buildConfig != null) { // lets verify the BC BuildConfigSpec spec = OpenShiftBuildServiceUtils.getBuildConfigSpec(buildConfig); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java index 925238582d..8f358a3503 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java @@ -35,6 +35,7 @@ import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.service.openshift.WebServerEventCollector; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; @@ -60,10 +61,12 @@ import static java.net.HttpURLConnection.HTTP_NOT_FOUND; import static java.net.HttpURLConnection.HTTP_OK; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; @EnableKubernetesMockClient class ApplyServiceTest { private KitLogger log; + private SummaryService summaryService; KubernetesMockServer mockServer; OpenShiftClient client; @@ -73,7 +76,8 @@ class ApplyServiceTest { @BeforeEach void setUp() { log = new KitLogger.SilentLogger(); - applyService = new ApplyService(client, log); + summaryService = mock(SummaryService.class); + applyService = new ApplyService(client, log, summaryService); applyService.setNamespace("default"); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java index b548a4d44d..8e32822ea0 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java @@ -42,6 +42,7 @@ import okhttp3.mockwebserver.RecordedRequest; import org.assertj.core.groups.Tuple; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -61,6 +62,7 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.startsWith; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; @@ -78,8 +80,9 @@ class DebugServiceTest { @BeforeEach void setUp() { logger = spy(new KitLogger.SilentLogger()); + SummaryService summaryService = mock(SummaryService.class); singleThreadExecutor = Executors.newSingleThreadExecutor(); - final ApplyService applyService = new ApplyService(kubernetesClient, logger); + final ApplyService applyService = new ApplyService(kubernetesClient, logger, summaryService); applyService.setNamespace(kubernetesClient.getNamespace()); debugService = new DebugService(logger, kubernetesClient, new PortForwardService(logger), applyService); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java index 942988110d..ee086638bc 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.kit.config.service; +import java.io.File; import java.util.stream.Stream; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; @@ -33,6 +34,7 @@ import static org.junit.jupiter.params.provider.Arguments.arguments; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class JKubeServiceHubBuildServiceTest { @@ -55,9 +57,11 @@ void getBuildService(RuntimeMode runtimeMode, JKubeBuildStrategy buildStrategy, Class buildServiceClass) { // Given final BuildServiceConfig config = BuildServiceConfig.builder().jKubeBuildStrategy(buildStrategy).build(); + final JKubeConfiguration jKubeConfiguration = mock(JKubeConfiguration.class); + when(jKubeConfiguration.getBuildDirectory()).thenReturn(new File("target")); final JKubeServiceHub jKubeServiceHub = new JKubeServiceHub(null, runtimeMode, new KitLogger.StdoutLogger(), - mock(DockerServiceHub.class, RETURNS_DEEP_STUBS), new JKubeConfiguration(), config, new LazyBuilder<>(() -> null), - true); + mock(DockerServiceHub.class, RETURNS_DEEP_STUBS), jKubeConfiguration, config, new LazyBuilder<>(() -> null), + true, false); // When final BuildService result = jKubeServiceHub.getBuildService(); // Then diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java index 710dc0d3e3..eb187d3065 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java @@ -73,7 +73,7 @@ void build_withInvalidConfiguration_shouldNotBuildAndTag() throws Exception { new DockerBuildService(mockedJKubeServiceHub).build(image); // Then verify(mockedDockerBuildService, times(0)) - .buildImage(eq(image), any(), any()); + .buildImage(eq(image), any(), any(), any()); verify(mockedDockerBuildService, times(0)) .tagImage(anyString(), eq(image)); } @@ -84,7 +84,7 @@ void build_withValidConfiguration_shouldBuildAndTag() throws Exception { new DockerBuildService(mockedJKubeServiceHub).build(image); // Then verify(mockedDockerBuildService, times(1)) - .buildImage(eq(image), any(), any()); + .buildImage(eq(image), any(), any(), any()); verify(mockedDockerBuildService, times(1)) .tagImage("image-name", image); } @@ -104,7 +104,7 @@ void build_withImageBuildConfigurationSkipEnabled_shouldNotBuildAndTag() throws new DockerBuildService(mockedJKubeServiceHub).build(imageWithSkipEnabled); // Then verify(mockedDockerBuildService, times(0)) - .buildImage(eq(image), any(), any()); + .buildImage(eq(image), any(), any(), any()); verify(mockedDockerBuildService, times(0)) .tagImage(anyString(), eq(image)); } @@ -112,7 +112,7 @@ void build_withImageBuildConfigurationSkipEnabled_shouldNotBuildAndTag() throws @Test void build_withFailure_shouldThrowException() throws Exception { // Given - doThrow(new IOException("Mock IO error")).when(mockedDockerBuildService).buildImage(eq(image), any(), any()); + doThrow(new IOException("Mock IO error")).when(mockedDockerBuildService).buildImage(eq(image), any(), any(), any()); // When + Then assertThatExceptionOfType(JKubeServiceException.class) .isThrownBy(() -> new DockerBuildService(mockedJKubeServiceHub).build(image)) @@ -125,7 +125,7 @@ void push_withDefaults_shouldPush() throws Exception { new DockerBuildService(mockedJKubeServiceHub).push(Collections.emptyList(), 0, null, false); // Then verify(mockedJKubeServiceHub.getDockerServiceHub().getRegistryService(), times(0)) - .pushImage(any(), eq(0), isNull(), eq(false)); + .pushImage(any(), eq(0), isNull(), eq(false), any()); } @Test @@ -134,6 +134,6 @@ void push_withImageBuildConfigurationSkipEnabled_shouldNotPush() throws Exceptio new DockerBuildService(mockedJKubeServiceHub).build(imageWithSkipEnabled); // Then verify(mockedJKubeServiceHub.getDockerServiceHub().getRegistryService(), times(0)) - .pushImage(any(), eq(0), isNull(), eq(false)); + .pushImage(any(), eq(0), isNull(), eq(false), any()); } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java index 4ead5d86d8..74466f9cc0 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java @@ -157,7 +157,7 @@ void getAssemblyTarArchive() throws IOException { // Given File projectBaseDir = Files.createDirectory(temporaryFolder.resolve("test")).toFile(); // When - File tarArchive = JibBuildService.getAssemblyTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir), mockedLogger); + File tarArchive = JibBuildService.getAssemblyTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir), mockedLogger, mockedServiceHub.getSummaryService()); // Then assertThat(tarArchive).isNotNull() .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("testimage").resolve("0.0.1") @@ -178,7 +178,7 @@ void pushWithNoConfigurations() throws Exception { // When new JibBuildService(mockedServiceHub).push(Collections.emptyList(), 1, null, false); // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), eq(mockedLogger)), times(0)); + jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), eq(mockedLogger), any()), times(0)); } @Test @@ -187,7 +187,7 @@ void pushWithConfiguration() throws Exception { // When new JibBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(eq(imageConfiguration), eq(Credential.from("testuserpush", "testpass")), any(), eq(mockedLogger)), times(1)); + jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(eq(imageConfiguration), eq(Credential.from("testuserpush", "testpass")), any(), eq(mockedLogger), any()), times(1)); } } @@ -204,7 +204,7 @@ void push_withImageBuildConfigurationSkipTrue_shouldNotPushImage() throws JKubeS // When new JibBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any()), times(0)); + jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any(), any()), times(0)); } @Test diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java index 91d485f1cf..5ba8018798 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java @@ -34,6 +34,7 @@ import io.fabric8.kubernetes.client.utils.Serialization; import org.apache.commons.io.FileUtils; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.access.ClusterConfiguration; @@ -73,7 +74,11 @@ void setUp() { final JKubeServiceHub jKubeServiceHub = JKubeServiceHub.builder() .log(logger) .platformMode(RuntimeMode.KUBERNETES) - .configuration(JKubeConfiguration.builder().build()) + .configuration(JKubeConfiguration.builder() + .project(JavaProject.builder() + .buildDirectory(new File("target")) + .build()) + .build()) .clusterAccess(new ClusterAccess(logger, ClusterConfiguration.builder().namespace("test").build()) { @Override public T createDefaultClient() { diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/SummaryServiceUtilTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/SummaryServiceUtilTest.java new file mode 100644 index 0000000000..fe145c58ce --- /dev/null +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/SummaryServiceUtilTest.java @@ -0,0 +1,107 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.kit.config.service.kubernetes; + +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.service.SummaryService; +import org.eclipse.jkube.kit.config.service.JKubeServiceHub; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class SummaryServiceUtilTest { + private JKubeServiceHub mockedJKubeServiceHub; + private SummaryService mockedSummaryService; + + @BeforeEach + public void setUp() { + JKubeConfiguration mockedJKubeConfiguration = mock(JKubeConfiguration.class); + when(mockedJKubeConfiguration.getBasedir()).thenReturn(new File("test")); + mockedJKubeServiceHub = mock(JKubeServiceHub.class); + mockedSummaryService = mock(SummaryService.class); + when(mockedJKubeServiceHub.getSummaryService()).thenReturn(mockedSummaryService); + when(mockedJKubeServiceHub.getConfiguration()).thenReturn(mockedJKubeConfiguration); + } + + @Test + void printSummary_whenNullJKubeServiceHub_thenDoesNothing() { + // Given + When + SummaryServiceUtil.printSummary(null); + + // Then + verify(mockedJKubeServiceHub, times(0)).getSummaryService(); + } + + @Test + void printSummary_whenJKubeServiceHub_thenPrintsSummary() { + // Given + When + SummaryServiceUtil.printSummary(mockedJKubeServiceHub); + + // Then + verifySummaryPrinted(2); + } + + @Test + void printSummaryIfLastExecuting_whenLastExecutingNull_thenPrintsNothing() { + // Given + When + SummaryServiceUtil.printSummaryIfLastExecuting(mockedJKubeServiceHub, "resource", null); + + // Then + verify(mockedJKubeServiceHub, times(0)).getSummaryService(); + } + + @Test + void printSummaryIfLastExecuting_whenLastExecutingAndCurrentDifferent_thenPrintsNothing() { + // Given + When + SummaryServiceUtil.printSummaryIfLastExecuting(mockedJKubeServiceHub, "resource", "apply"); + + // Then + verify(mockedJKubeServiceHub, times(0)).getSummaryService(); + } + + @Test + void printSummaryIfLastExecuting_whenLastExecutingAndCurrentSame_thenPrintsSummary() { + // Given + When + SummaryServiceUtil.printSummaryIfLastExecuting(mockedJKubeServiceHub, "resource", "resource"); + + // Then + verifySummaryPrinted(2); + } + + @Test + void handleExceptionAndSummary_whenInvoked_thenSetsFailureAndPrintsSummary() { + // Given + When + SummaryServiceUtil.handleExceptionAndSummary(mockedJKubeServiceHub, new IOException("failure")); + + // Then + verifySummaryPrinted(3); + verify(mockedSummaryService).setFailureAndCause("failure"); + } + + + private void verifySummaryPrinted(int summaryServiceInvocations) { + verify(mockedJKubeServiceHub, times(summaryServiceInvocations)).getSummaryService(); + verify(mockedSummaryService).printSummary(any()); + verify(mockedSummaryService).clear(); + } + +} diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java index 27fedbf0e6..e3e94e2d85 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java @@ -120,7 +120,7 @@ void build_withImageBuildConfigurationSkipEnabled_shouldNotBuildImage() throws J // Then verify(mockedArchiveService, times(0)) - .createDockerBuildArchive(any(), any(), any()); + .createDockerBuildArchive(any(), any(), any(), any()); } @Test diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java index 281e49366e..6a06642afc 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java @@ -93,7 +93,7 @@ void tearDown() { void createBuildArchive_withIOExceptionOnCreateDockerBuildArchive_shouldThrowException() throws Exception { // Given when(jKubeServiceHub.getDockerServiceHub().getArchiveService().createDockerBuildArchive( - any(ImageConfiguration.class), any(JKubeConfiguration.class), any(ArchiverCustomizer.class))) + any(ImageConfiguration.class), any(JKubeConfiguration.class), any(ArchiverCustomizer.class), any())) .thenThrow(new IOException("Mocked Exception")); // When + Then assertThatExceptionOfType(JKubeServiceException.class) @@ -249,7 +249,7 @@ void checkTarPackage() throws Exception { final ArgumentCaptor customizer = ArgumentCaptor.forClass(ArchiverCustomizer.class); verify(jKubeServiceHub.getDockerServiceHub().getArchiveService(), times(1)) - .createDockerBuildArchive(any(ImageConfiguration.class), any(JKubeConfiguration.class), customizer.capture()); + .createDockerBuildArchive(any(ImageConfiguration.class), any(JKubeConfiguration.class), customizer.capture(), any()); customizer.getValue().customize(tarArchiver); final ArgumentCaptor path = ArgumentCaptor.forClass(String.class); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java index 45c807ea85..14a43ba014 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java @@ -26,6 +26,7 @@ import io.fabric8.kubernetes.client.utils.Serialization; import org.apache.commons.io.FileUtils; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.access.ClusterConfiguration; @@ -74,7 +75,11 @@ void setUp() { final JKubeServiceHub jKubeServiceHub = JKubeServiceHub.builder() .log(logger) .platformMode(RuntimeMode.KUBERNETES) - .configuration(JKubeConfiguration.builder().build()) + .configuration(JKubeConfiguration.builder() + .project(JavaProject.builder() + .buildDirectory(new File("target")) + .build()) + .build()) .clusterAccess(new ClusterAccess(logger, ClusterConfiguration.builder().namespace("test").build()) { @Override public T createDefaultClient() { diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java index 2ce8f99fca..d65c9d3723 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java @@ -35,7 +35,7 @@ class PluginManagerTest { @BeforeEach void setUp() { jKubeServiceHub = new JKubeServiceHub(null, RuntimeMode.KUBERNETES, new KitLogger.StdoutLogger(), - null, new JKubeConfiguration(), new BuildServiceConfig(), new LazyBuilder<>(() -> null), true); + null, new JKubeConfiguration(), new BuildServiceConfig(), new LazyBuilder<>(() -> null), true, false); } @Test diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java index c4bf559b3d..2ecf832c3b 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java @@ -57,7 +57,7 @@ void setUp() { .outputDirectory(temporaryFolder) .build()) .build(), - new BuildServiceConfig(), new LazyBuilder<>(() -> null), true); + new BuildServiceConfig(), new LazyBuilder<>(() -> null), true, false); } @Test diff --git a/jkube-kit/doc/src/main/asciidoc/inc/_summary.adoc b/jkube-kit/doc/src/main/asciidoc/inc/_summary.adoc new file mode 100644 index 0000000000..14fe1186f9 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/_summary.adoc @@ -0,0 +1,15 @@ +[[summary]] += Summary + +{plugin} prints a brief summary of the task it performed in order to give better idea of what's going on to the user. At the moment, most of the build related actions (build, push, resource, apply etc.) print summary. It can be disabled with `jkube.summaryEnabled` property. + +.Summary configuration +[cols="2,6"] +|=== +| Property | Description + +| `jkube.summaryEnabled` +| Whether summary should be printed or not. + +Defaults to `true` +|=== diff --git a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/EnricherContext.java b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/EnricherContext.java index 49d0de554b..a811685279 100644 --- a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/EnricherContext.java +++ b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/EnricherContext.java @@ -22,6 +22,7 @@ import org.eclipse.jkube.kit.common.Dependency; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.GroupArtifactVersion; import org.eclipse.jkube.kit.enricher.api.model.Configuration; import org.eclipse.jkube.kit.common.util.ProjectClassLoaders; @@ -135,4 +136,5 @@ default Optional getDependencyVersion(String groupId, String artifactId) * @return the Handler Hub instance. */ HandlerHub getHandlerHub(); + SummaryService getSummaryService(); } diff --git a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/JKubeEnricherContext.java b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/JKubeEnricherContext.java index b29947d3ea..2613330581 100644 --- a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/JKubeEnricherContext.java +++ b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/JKubeEnricherContext.java @@ -28,6 +28,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Singular; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; import org.eclipse.jkube.kit.common.JavaProject; @@ -73,13 +74,15 @@ public class JKubeEnricherContext implements EnricherContext { private HandlerHub handlerHub; @Getter(AccessLevel.NONE) private JKubeBuildStrategy jKubeBuildStrategy; + private SummaryService summaryService; @Builder(toBuilder = true) public JKubeEnricherContext( @Singular List settings, @Singular Map processingInstructions, JavaProject project, KitLogger log, - ResourceConfig resources, @Singular List images, ProcessorConfig processorConfig, JKubeBuildStrategy jKubeBuildStrategy) { + ResourceConfig resources, @Singular List images, ProcessorConfig processorConfig, + JKubeBuildStrategy jKubeBuildStrategy, SummaryService summaryService) { this.settings = settings; this.processingInstructions = processingInstructions; this.project = project; @@ -88,6 +91,7 @@ public JKubeEnricherContext( this.images = images; this.processorConfig = processorConfig; this.handlerHub = new HandlerHub(getGav(), getProperties()); + this.summaryService = summaryService; this.configuration = Configuration.builder() .images(images) .resource(resources) diff --git a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java index fbdc9d67d3..4aab753883 100644 --- a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java +++ b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java @@ -49,6 +49,7 @@ import io.fabric8.kubernetes.api.model.VolumeMountBuilder; import io.fabric8.kubernetes.client.utils.Serialization; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.KindFilenameMapperUtil; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.MapUtil; @@ -412,16 +413,18 @@ public static void validateKubernetesMasterUrl(URL masterUrl) { } } - public static void handleKubernetesClientException(KubernetesClientException e, KitLogger logger) { + public static IllegalStateException handleKubernetesClientException(KubernetesClientException e, KitLogger logger, SummaryService summaryService) { Throwable cause = e.getCause(); if (cause instanceof UnknownHostException) { logger.error( "Could not connect to kubernetes cluster!"); logger.error( "Connection error: %s", cause); String message = "Could not connect to kubernetes cluster. Are you sure if you're connected to a remote cluster via `kubectl`? Error: " + cause; - throw new IllegalStateException(message, e); + summaryService.setFailureAndCause(message); + return new IllegalStateException(message, e); } else { - throw new IllegalStateException(e.getMessage(), e); + summaryService.setFailureAndCause(e.getMessage()); + return new IllegalStateException(e.getMessage(), e); } } diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java index 30a2a837e4..27c44cdfbb 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java @@ -41,6 +41,7 @@ import org.assertj.core.api.InstanceOfAssertFactories; import io.fabric8.kubernetes.client.KubernetesClientException; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ControllerResourceConfig; @@ -75,7 +76,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIOException; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.tuple; import static org.eclipse.jkube.kit.config.resource.PlatformMode.kubernetes; import static org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil.DEFAULT_RESOURCE_VERSIONING; @@ -97,6 +97,7 @@ class KubernetesResourceUtilTest { private static File fragmentsDir; private KitLogger log; private ImageConfiguration imageConfiguration; + private SummaryService summaryService; @BeforeAll static void initPath() { @@ -116,6 +117,7 @@ void setUp() { .from("base:latest") .build()) .build(); + summaryService = new SummaryService(new File("target"), log, false); } @Nested @@ -617,10 +619,12 @@ void handleKubernetesClientException_whenCauseNoHost_thenThrowExceptionWithMessa // Given KubernetesClientException exception = new KubernetesClientException("test", new UnknownHostException()); - // When + Then - assertThatIllegalStateException() - .isThrownBy(() -> handleKubernetesClientException(exception, log)) - .withMessageContaining("Could not connect to kubernetes cluster. Are you sure if you're connected to a remote cluster via `kubectl`? Error: "); + // When + IllegalStateException illegalStateException = handleKubernetesClientException(exception, log, summaryService); + + // Then + assertThat(illegalStateException) + .hasMessageContaining("Could not connect to kubernetes cluster. Are you sure if you're connected to a remote cluster via `kubectl`? Error: "); } @Test @@ -628,10 +632,12 @@ void handleKubernetesClientException_whenInvoked_thenThrowExceptionWithMessage() // Given KubernetesClientException exception = new KubernetesClientException("kubernetes failure", new RuntimeException()); - // When + Then - assertThatIllegalStateException() - .isThrownBy(() -> handleKubernetesClientException(exception, log)) - .withMessageContaining("kubernetes failure"); + // When + IllegalStateException illegalStateException = handleKubernetesClientException(exception, log, summaryService); + + // Then + assertThat(illegalStateException) + .hasMessageContaining("kubernetes failure"); } @Nested diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ConfigMapEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ConfigMapEnricher.java index d234f096b8..783c4aeaa5 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ConfigMapEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ConfigMapEnricher.java @@ -62,6 +62,7 @@ public void visit(ConfigMapBuilder element) { final Map annotations = element.buildMetadata().getAnnotations(); if (annotations != null) { try { + getContext().getSummaryService().addToEnrichers(getName()); addConfigMapFromAnnotations(annotations, element); } catch (IOException e) { throw new IllegalArgumentException(e); @@ -111,6 +112,7 @@ private void addConfigMapFromResourceConfigurations(KubernetesListBuilder builde if ((configMap.getData() != null && !configMap.getData().isEmpty()) || (configMap.getBinaryData() != null && !configMap.getBinaryData().isEmpty())) { + getContext().getSummaryService().addToEnrichers(getName()); builder.addToConfigMapItems(configMap); } } catch (IOException e) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ContainerEnvJavaOptionsMergeEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ContainerEnvJavaOptionsMergeEnricher.java index 501e16b34e..da9906340c 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ContainerEnvJavaOptionsMergeEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ContainerEnvJavaOptionsMergeEnricher.java @@ -59,6 +59,7 @@ public ContainerEnvJavaOptionsMergeEnricher(JKubeEnricherContext enricherContext @Override public void enrich(PlatformMode platformMode, KubernetesListBuilder builder) { if (!asBoolean(getConfig(Config.DISABLE)) && hasImageConfiguration()) { + getContext().getSummaryService().addToEnrichers(getName()); builder.accept(new ContainerEnvJavaOptionsMergeVisitor(getImages())); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricher.java index 29394891c7..83e1d66fc4 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricher.java @@ -84,6 +84,7 @@ public void create(PlatformMode platformMode, KubernetesListBuilder builder) { final List images = getImages(); // Check if at least a replica set is added. If not add a default one if (KubernetesResourceUtil.checkForKind(builder, POD_CONTROLLER_KINDS)) { + getContext().getSummaryService().addToEnrichers(getName()); // At least one image must be present, otherwise the resulting config will be invalid if (KubernetesResourceUtil.checkForKind(builder, "StatefulSet")) { final StatefulSetSpec spec = statefulSetHandler.get(controllerResourceConfig, images).getSpec(); diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DebugEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DebugEnricher.java index f499ce41ca..22891847dd 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DebugEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DebugEnricher.java @@ -68,6 +68,7 @@ public DebugEnricher(JKubeEnricherContext buildContext) { @Override public void create(PlatformMode platformMode, KubernetesListBuilder builder) { if (isDebugEnabled()) { + getContext().getSummaryService().addToEnrichers(getName()); int count = 0; List items = builder.buildItems(); if (items != null) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricher.java index a869b5155c..9249098584 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricher.java @@ -117,6 +117,7 @@ public void create(PlatformMode platformMode, KubernetesListBuilder builder) { .getHandlerFor(fromType(getConfig(Config.TYPE))); final HasMetadata resource = ch.get(controllerResourceConfig, images); log.info("Adding a default %s", resource.getKind()); + getContext().getSummaryService().addToEnrichers(getName()); builder.addToItems(resource); setProcessingInstruction(FABRIC8_GENERATED_CONTAINERS, getContainersFromPodSpec(ch.getPodTemplateSpec(controllerResourceConfig, images))); diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricher.java index 0b1f7baa7e..ad8bfcf69e 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricher.java @@ -70,6 +70,7 @@ private void enrichLabelsAndAnnotations(KubernetesListBuilder builder) { } private void visit(KubernetesListBuilder builder, MetadataVisitor[] visitors) { + getContext().getSummaryService().addToEnrichers(getName()); for (MetadataVisitor visitor : visitors) { builder.accept(visitor); } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricher.java index 39d38da6e9..28730d87b8 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricher.java @@ -99,6 +99,7 @@ public void visit(ObjectMetaBuilder metaBuilder) { boolean forceModifyNamespace = Boolean.parseBoolean(getConfig(Config.FORCE)); if (StringUtils.isBlank(metaBuilder.getNamespace()) || forceModifyNamespace) { + getContext().getSummaryService().addToEnrichers(getName()); metaBuilder.withNamespace(getNamespaceName()).build(); } } @@ -145,6 +146,7 @@ private void addNewNamespaceToBuilderIfProvided(PlatformMode platformMode, Strin private void addNamespaceToBuilder(PlatformMode platformMode, String newNamespaceToCreate, KubernetesListBuilder builder, String type) { HasMetadata namespaceOrProject = getNamespaceOrProject(platformMode, type, newNamespaceToCreate); if (namespaceOrProject != null) { + getContext().getSummaryService().addToEnrichers(getName()); builder.addToItems(namespaceOrProject); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java index cc2475355d..af3d63b148 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java @@ -127,6 +127,7 @@ public DefaultServiceEnricher(JKubeEnricherContext buildContext) { public void create(PlatformMode platformMode, KubernetesListBuilder builder) { final ResourceConfig xmlConfig = getConfiguration().getResource(); + getContext().getSummaryService().addToEnrichers(getName()); if (Optional.ofNullable(xmlConfig).map(ResourceConfig::getServices).map(c -> !c.isEmpty()).orElse(false)) { // Add Services configured via XML addServices(builder, xmlConfig.getServices()); diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java index b356a8ac6d..db4fdfa7b1 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java @@ -88,6 +88,7 @@ private void addArtifactsWithYaml(Set artifactSet, String dependencyYaml) t File file = artifact.getFile(); try { URI uri = new URI("jar:" + file.toURI() + "!/" + dependencyYaml); + getContext().getSummaryService().addToEnrichers(getName()); artifactSet.add(uri); } catch (URISyntaxException e) { getLog().debug("Failed to create URL for %s: %s", file, e); diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricher.java index 40e3fb287b..c013f9830a 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricher.java @@ -64,6 +64,7 @@ protected Map generateData(String dockerId) { JsonObject ret = new JsonObject(); ret.add(dockerId, params); + getContext().getSummaryService().addToEnrichers(getName()); return Collections.singletonMap( SecretConstants.DOCKER_DATA_KEY, encode(ret.toString())); diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/FileDataSecretEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/FileDataSecretEnricher.java index f8719e4668..4d1865b499 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/FileDataSecretEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/FileDataSecretEnricher.java @@ -56,6 +56,7 @@ public void visit(SecretBuilder element) { try { if (annotations != null && !annotations.isEmpty()) { final Map secretAnnotations = createSecretFromAnnotations(annotations); + getContext().getSummaryService().addToEnrichers(getName()); element.addToData(secretAnnotations); } } catch (IOException e) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java index 4b44389cc8..d71f1cf559 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java @@ -65,6 +65,7 @@ private Map getAnnotations(PlatformMode platformMode) { log.warn("Could not detect any git remote"); } + getContext().getSummaryService().addToEnrichers(getName()); annotations.putAll(getAnnotations(platformMode, gitRemoteUrl, repository.getBranch(), GitUtil.getGitCommitId(repository), useDeprecatedAnnotationPrefix)); } return annotations; diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java index 688e872258..a72a996279 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java @@ -205,6 +205,7 @@ public void visit(PodTemplateSpecBuilder templateBuilder) { if (containers == null) { containers = new ArrayList<>(); } + getContext().getSummaryService().addToEnrichers(getName()); mergeImageConfigurationWithContainerSpec(containers); podSpec.withContainers(containers).endSpec(); } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricher.java index 3875b5d26e..168c8eab81 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricher.java @@ -30,6 +30,7 @@ public ImagePullPolicyEnricher(EnricherContext context) { public void enrich(PlatformMode platformMode, KubernetesListBuilder builder) { String imagePullPolicy = getValueFromConfig(JKUBE_ENFORCED_IMAGE_PULL_POLICY, null); if (StringUtils.isNotBlank(imagePullPolicy)) { + getContext().getSummaryService().addToEnrichers(getName()); builder.accept(new TypedVisitor() { @Override public void visit(ContainerBuilder containerBuilder) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/IngressEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/IngressEnricher.java index 6f40f7356f..b44e7a052c 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/IngressEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/IngressEnricher.java @@ -81,6 +81,7 @@ public void visit(ServiceBuilder serviceBuilder) { } HasMetadata generatedIngress = generateIngressWithConfiguredApiVersion(serviceBuilder); if (generatedIngress != null) { + getContext().getSummaryService().addToEnrichers(getName()); listBuilder.addToItems(generatedIngress); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenIssueManagementEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenIssueManagementEnricher.java index 2c7efe4be8..fe43bb5b4e 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenIssueManagementEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenIssueManagementEnricher.java @@ -120,6 +120,7 @@ private Map getAnnotations() { String system = rootProject.getIssueManagementSystem(); String url = rootProject.getIssueManagementUrl(); if (StringUtils.isNotEmpty(system) && StringUtils.isNotEmpty(url)) { + getContext().getSummaryService().addToEnrichers(getName()); annotations.put(JKubeAnnotations.ISSUE_SYSTEM.value(useDeprecatedAnnotationPrefix), system); annotations.put(JKubeAnnotations.ISSUE_TRACKER_URL.value(useDeprecatedAnnotationPrefix), url); } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenScmEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenScmEnricher.java index 0e81da80c4..2916ef4e9a 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenScmEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/MavenScmEnricher.java @@ -63,6 +63,7 @@ private Map getAnnotations() { String url = rootProject.getScmUrl(); String tag = rootProject.getScmTag(); + getContext().getSummaryService().addToEnrichers(getName()); if (StringUtils.isNotEmpty(tag)) { annotations.put(JKubeAnnotations.SCM_TAG.value(useDeprecatedAnnotationPrefix), tag); } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/NameEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/NameEnricher.java index 34e67d3f37..0a5374e5a4 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/NameEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/NameEnricher.java @@ -50,6 +50,7 @@ private enum Config implements Configs.Config { public void create(PlatformMode platformMode, KubernetesListBuilder builder) { final String configuredName = getConfig(Config.NAME); final String defaultName = JKubeProjectUtil.createDefaultResourceName(getContext().getGav().getSanitizedArtifactId()); + getContext().getSummaryService().addToEnrichers(getName()); builder.accept(new TypedVisitor() { @Override public void visit(ObjectMetaBuilder resource) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricher.java index df1fb5b160..4292f0ffae 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricher.java @@ -47,6 +47,7 @@ public void enrich(PlatformMode platformMode, KubernetesListBuilder builder) { template.setMetadata(new ObjectMeta()); } final ObjectMeta templateMetadata = template.getMetadata(); + getContext().getSummaryService().addToEnrichers(getName()); templateMetadata.setAnnotations(MapUtil.mergeMaps(templateMetadata.getAnnotations(), item.getMetadata().getAnnotations())); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PortNameEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PortNameEnricher.java index a8e8c38631..760dfe8296 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PortNameEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PortNameEnricher.java @@ -56,6 +56,7 @@ public void visit(ContainerPortBuilder portBuilder) { // If port is given but no name, then try to detect the name if (port != null && StringUtils.isBlank(portBuilder.getName())) { + getContext().getSummaryService().addToEnrichers(getName()); addPortName(portBuilder, port); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ProjectLabelEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ProjectLabelEnricher.java index 35f3940571..8d1dc0a32a 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ProjectLabelEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ProjectLabelEnricher.java @@ -83,6 +83,7 @@ public ProjectLabelEnricher(JKubeEnricherContext buildContext) { @Override public void create(PlatformMode platformMode, KubernetesListBuilder builder) { + getContext().getSummaryService().addToEnrichers(getName()); builder.accept(new TypedVisitor() { @Override public void visit(ServiceBuilder serviceBuilder) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricher.java index 33fbe6a44a..5a41d8b11d 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricher.java @@ -34,6 +34,7 @@ public ReplicaCountEnricher(EnricherContext context) { public void enrich(PlatformMode platformMode, KubernetesListBuilder builder) { Integer replicas = Configs.asInteger(getValueFromConfig(JKUBE_ENFORCED_REPLICAS, null)); if (replicas != null) { + getContext().getSummaryService().addToEnrichers(getName()); getContext().getHandlerHub().getControllerHandlers() .forEach(controller -> controller.get().overrideReplicas(builder, replicas)); } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/RevisionHistoryEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/RevisionHistoryEnricher.java index a6f581b63d..ee284c4c28 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/RevisionHistoryEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/RevisionHistoryEnricher.java @@ -54,6 +54,7 @@ public void create(PlatformMode platformMode, KubernetesListBuilder builder) { log.info("Adding revision history limit to %s", maxRevisionHistories); + getContext().getSummaryService().addToEnrichers(getName()); builder.accept(new TypedVisitor() { @Override public void visit(io.fabric8.kubernetes.api.model.apps.DeploymentBuilder item) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/SecretEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/SecretEnricher.java index 77af810b1a..bca2af605d 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/SecretEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/SecretEnricher.java @@ -64,6 +64,7 @@ public void visit(SecretBuilder secretBuilder) { } // remove the annotation key annotation.remove(getAnnotationKey()); + getContext().getSummaryService().addToEnrichers(getName()); secretBuilder.addToData(data); } } @@ -122,6 +123,7 @@ private void addSecretsFromXmlConfiguration(KubernetesListBuilder builder) { Secret secret = new SecretBuilder().withData(data).withMetadata(metadata).withType(type).build(); if(!secretToIndexMap.containsKey(secretConfig.getName())) { + getContext().getSummaryService().addToEnrichers(getName()); builder.addToSecretItems(i, secret); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricher.java index 1fd28a0ff5..2120341069 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricher.java @@ -68,6 +68,7 @@ public void create(PlatformMode mode, KubernetesListBuilder builder) { private List createServiceAccountFromResourceConfig(ResourceConfig resourceConfig) { List serviceAccounts = new ArrayList<>(); if(resourceConfig != null && resourceConfig.getServiceAccounts() != null && !Boolean.parseBoolean(getConfig(Config.SKIP_CREATE))) { + getContext().getSummaryService().addToEnrichers(getName()); for(ServiceAccountConfig serviceAccountConfig : resourceConfig.getServiceAccounts()) { if(serviceAccountConfig.getName() != null) { serviceAccounts.add(createServiceAccount(serviceAccountConfig.getName())); @@ -88,6 +89,7 @@ public void visit(DeploymentBuilder deploymentBuilder) { serviceAccounts.add(createServiceAccount(serviceAccountName)); } if(deploymentToSaPair.containsKey(deploymentBuilder.buildMetadata().getName())) { + getContext().getSummaryService().addToEnrichers(getName()); deploymentBuilder.editSpec() .editTemplate() .editSpec() diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricher.java index 17ff194047..32c95f0353 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricher.java @@ -146,6 +146,7 @@ public void visit(ContainerBuilder cb) { .build(); trigger.setAdditionalProperty("fieldPath", "spec.template.spec.containers[?(@.name==\"" + containerName + "\")].image"); + getContext().getSummaryService().addToEnrichers(getName()); triggerList.add(trigger); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java index 4a8dc3447b..441999cbc6 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java @@ -96,6 +96,7 @@ public void visit(PodTemplateSpecBuilder builder) { log.verbose("Adding init container for changing persistent volumes access mode to %s", getConfig(Config.PERMISSION)); + getContext().getSummaryService().addToEnrichers(getName()); if (!KubernetesResourceUtil.hasInitContainer(builder, ENRICHER_NAME)) { KubernetesResourceUtil.appendInitContainer(builder, createPvInitContainer(podSpec), log); } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/AutoTLSEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/AutoTLSEnricher.java index 11322ebd2a..bcd695a0c4 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/AutoTLSEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/AutoTLSEnricher.java @@ -80,6 +80,7 @@ public void enrich(PlatformMode platformMode, KubernetesListBuilder builder) { return; } + getContext().getSummaryService().addToEnrichers(getName()); builder.accept(new TypedVisitor() { @Override public void visit(PodTemplateSpecBuilder builder) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricher.java index 6eae9c8399..fb39df1af8 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricher.java @@ -51,6 +51,7 @@ public DeploymentConfigEnricher(JKubeEnricherContext context) { public void create(PlatformMode platformMode, KubernetesListBuilder builder) { if (isApplicable(platformMode)) { for(HasMetadata item : builder.buildItems()) { + getContext().getSummaryService().addToEnrichers(getName()); if(item instanceof Deployment) { DeploymentConfig deploymentConfig = convertFromAppsV1Deployment(item); removeItemFromKubernetesBuilder(builder, item); diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java index 1de159bc44..08478efb20 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java @@ -63,6 +63,7 @@ public void create(PlatformMode platformMode, KubernetesListBuilder builder) { if(platformMode.equals(PlatformMode.kubernetes)) return; + getContext().getSummaryService().addToEnrichers(getName()); builder.accept(new TypedVisitor() { @Override public void visit(DeploymentConfigSpecBuilder builder) { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricher.java index caffe4c9cb..a65a20a8c1 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricher.java @@ -43,6 +43,7 @@ public void create(PlatformMode platformMode, KubernetesListBuilder builder) { if(item instanceof Namespace) { Project project = convertToProject((Namespace) item); removeItemFromKubernetesBuilder(builder, item); + getContext().getSummaryService().addToEnrichers(getName()); builder.addToItems(project); } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java index b288c3d9ad..ac47f2ce4e 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java @@ -81,6 +81,7 @@ public void create(PlatformMode platformMode, final KubernetesListBuilder listBu } if(platformMode == PlatformMode.openshift && isGenerateRoute()) { + getContext().getSummaryService().addToEnrichers(getName()); listBuilder.accept(new TypedVisitor() { @Override diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherCreateTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherCreateTest.java index f92442660b..900575efa6 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherCreateTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherCreateTest.java @@ -21,6 +21,7 @@ import io.fabric8.kubernetes.api.model.batch.v1.Job; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ResourceConfig; @@ -34,6 +35,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.io.File; import java.util.Properties; import java.util.stream.Stream; @@ -49,8 +51,10 @@ class DefaultControllerEnricherCreateTest { @BeforeEach void setUp() throws Exception { properties = new Properties(); + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); buildContext = JKubeEnricherContext.builder() .log(new KitLogger.SilentLogger()) + .summaryService(summaryService) .resources(ResourceConfig.builder().build()) .image(ImageConfiguration.builder().build()) .project(JavaProject.builder() diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherTest.java index d435698a36..b07149bb58 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultControllerEnricherTest.java @@ -21,6 +21,7 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentSpec; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.common.JavaProject; @@ -31,6 +32,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -51,9 +53,11 @@ class DefaultControllerEnricherTest { void setUp() throws Exception { config = new HashMap<>(); properties = new Properties(); + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); context = JKubeEnricherContext.builder() .processorConfig(new ProcessorConfig(null, null, config)) .log(new KitLogger.SilentLogger()) + .summaryService(summaryService) .image(ImageConfiguration.builder() .name("helloworld") .build(BuildConfiguration.builder() diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricherTest.java index 86b9f45fd0..03d191bc69 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultNamespaceEnricherTest.java @@ -17,6 +17,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.enricher.api.EnricherContext; @@ -34,14 +35,17 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class DefaultNamespaceEnricherTest { private EnricherContext context; private void setExpectations(Properties properties, ResourceConfig resourceConfig) { + SummaryService summaryService = mock(SummaryService.class); context = JKubeEnricherContext.builder() .log(new KitLogger.SilentLogger()) + .summaryService(summaryService) .resources(resourceConfig) .project(JavaProject.builder() .properties(properties) diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherAddMissingPartsTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherAddMissingPartsTest.java index 4a5f7aa356..2b58278b3f 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherAddMissingPartsTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherAddMissingPartsTest.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.enricher.generic; +import java.io.File; import java.util.Arrays; import java.util.Properties; @@ -20,6 +21,7 @@ import org.eclipse.jkube.kit.common.KitLogger; import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; @@ -40,6 +42,7 @@ class DefaultServiceEnricherAddMissingPartsTest { @BeforeEach void setUp() { properties = new Properties(); + KitLogger logger = new KitLogger.SilentLogger(); final JKubeEnricherContext context = JKubeEnricherContext.builder() .image(ImageConfiguration.builder() .name("test-image") @@ -50,7 +53,8 @@ void setUp() { .groupId("group-id") .artifactId("artifact-id") .build()) - .log(new KitLogger.SilentLogger()) + .log(logger) + .summaryService(new SummaryService(new File("target"), logger, false)) .build(); enricher = new DefaultServiceEnricher(context); } diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherExternalServiceTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherExternalServiceTest.java index 10deef806b..1f99d7762c 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherExternalServiceTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricherExternalServiceTest.java @@ -26,6 +26,7 @@ import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; @@ -34,6 +35,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; @@ -44,6 +46,7 @@ class DefaultServiceEnricherExternalServiceTest { @BeforeEach void setUp() { + KitLogger kitLogger = new KitLogger.SilentLogger(); final JKubeEnricherContext context = JKubeEnricherContext.builder() .image(ImageConfiguration.builder() .name("test-image") @@ -57,7 +60,8 @@ void setUp() { .groupId("group-id") .artifactId("artifact-id") .build()) - .log(new KitLogger.SilentLogger()) + .log(kitLogger) + .summaryService(new SummaryService(new File("target"), kitLogger, false)) .build(); kubernetesListBuilder = new KubernetesListBuilder(); kubernetesListBuilder.addToItems(createNewExternalServiceFragment()); diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DependencyEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DependencyEnricherTest.java index 4f131362eb..fd28a7c10c 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DependencyEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DependencyEnricherTest.java @@ -19,6 +19,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.Dependency; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.eclipse.jkube.kit.enricher.api.model.KindAndName; @@ -48,6 +49,7 @@ class DependencyEnricherTest { @BeforeEach void setUp() { + KitLogger logger = new KitLogger.SilentLogger(); context = JKubeEnricherContext.builder() .project(JavaProject.builder() .name("the-project") @@ -57,7 +59,8 @@ void setUp() { .file(new File(getClass().getResource(ARTIFACT_FILE_PATH).getFile())) .build())) .build()) - .log(new KitLogger.SilentLogger()) + .log(logger) + .summaryService(new SummaryService(new File("target"), logger, false)) .build(); } diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricherTest.java index ed7529147f..186c0cc9c1 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DockerRegistrySecretEnricherTest.java @@ -23,6 +23,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.eclipse.jkube.kit.enricher.api.util.SecretConstants; @@ -30,6 +31,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.HashMap; import java.util.Map; @@ -45,9 +47,11 @@ class DockerRegistrySecretEnricherTest { @BeforeEach void setupExpectations() { + KitLogger kitLogger = new KitLogger.SilentLogger(); context = JKubeEnricherContext.builder() - .log(new KitLogger.SilentLogger()) + .log(kitLogger) .project(JavaProject.builder().build()) + .summaryService(new SummaryService(new File("target"), kitLogger, false)) .setting(RegistryServerConfiguration.builder() .configuration(new HashMap<>()) .id("docker.io") diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricherTest.java index fc726f94b8..db888788b2 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ImagePullPolicyEnricherTest.java @@ -13,7 +13,6 @@ */ package org.eclipse.jkube.enricher.generic; - import io.fabric8.kubernetes.api.model.Container; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.KubernetesListBuilder; @@ -42,10 +41,12 @@ import org.assertj.core.api.ObjectAssert; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.List; import java.util.Properties; @@ -317,7 +318,9 @@ private void assertStatefulSetImagePullPolicy(List buildItems, Stri } private JKubeEnricherContext createNewJKubeEnricherContextWithProperties(Properties properties) { + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); return JKubeEnricherContext.builder() + .summaryService(summaryService) .log(new KitLogger.SilentLogger()) .project(JavaProject.builder() .properties(properties) diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherBehavioralTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherBehavioralTest.java index 1244245f82..86a315aba1 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherBehavioralTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherBehavioralTest.java @@ -19,12 +19,14 @@ import io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; @@ -36,11 +38,13 @@ class IngressEnricherBehavioralTest { @BeforeEach void setUp() throws Exception { + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); context = JKubeEnricherContext.builder() .project(JavaProject.builder() .properties(new Properties()) .build()) .resources(ResourceConfig.builder().build()) + .summaryService(summaryService) .log(new KitLogger.SilentLogger()) .build(); klb = new KubernetesListBuilder(); diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricherTest.java index acc7695271..416fc21e28 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PodAnnotationEnricherTest.java @@ -26,6 +26,8 @@ import io.fabric8.openshift.api.model.DeploymentConfigBuilder; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.enricher.api.EnricherContext; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; @@ -35,6 +37,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.io.File; import java.util.Properties; import java.util.stream.Stream; @@ -49,10 +52,12 @@ class PodAnnotationEnricherTest { void setUp() { Properties properties = new Properties(); klb = new KubernetesListBuilder(); + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); EnricherContext context = JKubeEnricherContext.builder() .project(JavaProject.builder() .properties(properties) .build()) + .summaryService(summaryService) .build(); podAnnotationEnricher = new PodAnnotationEnricher(context); } diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricherTest.java index a8ce593fed..606742adf2 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ReplicaCountEnricherTest.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.enricher.generic; import java.util.Collections; +import java.io.File; import java.util.List; import java.util.Properties; @@ -26,6 +27,7 @@ import io.fabric8.openshift.api.model.DeploymentConfigSpec; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.enricher.api.EnricherContext; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.junit.jupiter.api.BeforeEach; @@ -52,11 +54,13 @@ class ReplicaCountEnricherTest { void setUpEnricher() { final Properties properties = new Properties(); properties.setProperty("jkube.replicas", "" + EXPECTED_REPLICAS); + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); EnricherContext context = JKubeEnricherContext.builder() .log(new KitLogger.SilentLogger()) .project(JavaProject.builder() .properties(properties) .build()) + .summaryService(summaryService) .build(); enricher = new ReplicaCountEnricher(context); } diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricherTest.java index e5c0f7b38c..1fdf1650ad 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ServiceAccountEnricherTest.java @@ -20,6 +20,8 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.resource.ServiceAccountConfig; @@ -27,6 +29,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; @@ -41,6 +44,7 @@ void setUp() { .properties(new Properties()) .build()) .resources(ResourceConfig.builder().build()) + .summaryService(new SummaryService(new File("target"), new KitLogger.SilentLogger(), false)) .build(); } diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricherTest.java index 14addfa784..eab4ee0cd2 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/DeploymentConfigEnricherTest.java @@ -13,11 +13,13 @@ */ package org.eclipse.jkube.enricher.generic.openshift; +import java.io.File; import java.util.Properties; import java.util.function.Consumer; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; @@ -38,11 +40,13 @@ class DeploymentConfigEnricherTest { @BeforeEach void setUp() { + KitLogger logger = new KitLogger.SilentLogger(); context = JKubeEnricherContext.builder() - .log(new KitLogger.SilentLogger()) + .log(logger) .project(JavaProject.builder() .properties(new Properties()) .build()) + .summaryService(new SummaryService(new File("target"), logger, false)) .build(); deploymentConfigEnricher = new DeploymentConfigEnricher(context); kubernetesListBuilder = new KubernetesListBuilder(); diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricherTest.java index d598c065f0..d60ba03d66 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/ProjectEnricherTest.java @@ -26,6 +26,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; class ProjectEnricherTest { @@ -34,7 +35,7 @@ class ProjectEnricherTest { @BeforeEach void setExpectations() { - context = mock(JKubeEnricherContext.class); + context = mock(JKubeEnricherContext.class, RETURNS_DEEP_STUBS); } @Test diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherBehavioralTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherBehavioralTest.java index 2ebd6ebbed..82b76473de 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherBehavioralTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherBehavioralTest.java @@ -18,12 +18,14 @@ import io.fabric8.kubernetes.api.model.Service; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.File; import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; @@ -35,12 +37,14 @@ class RouteEnricherBehavioralTest { @BeforeEach void setUp() { + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); context = JKubeEnricherContext.builder() .project(JavaProject.builder() .properties(new Properties()) .build()) .resources(ResourceConfig.builder().build()) .log(new KitLogger.SilentLogger()) + .summaryService(summaryService) .build(); klb = new KubernetesListBuilder(); } diff --git a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/DockerHealthCheckEnricher.java b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/DockerHealthCheckEnricher.java index 7b440f7357..004512adca 100644 --- a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/DockerHealthCheckEnricher.java +++ b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/DockerHealthCheckEnricher.java @@ -59,6 +59,7 @@ private Probe getProbe(ContainerBuilder container) { private Probe getProbe(ImageConfiguration image) { if (hasHealthCheck(image)) { HealthCheckConfiguration health = image.getBuildConfiguration().getHealthCheck(); + getContext().getSummaryService().addToEnrichers(getName()); return new ProbeBuilder() .withExec(new ExecAction(health.getCmd().asStrings())) .withTimeoutSeconds(durationSeconds(health.getTimeout()).orElse(null)) diff --git a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java index 3e5a2eee38..ad0618311d 100644 --- a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java +++ b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java @@ -91,6 +91,7 @@ private Probe discoverKarafProbe(String path, int initialDelay) { for (String featureValue : features) { if ("jkube-karaf-checks".equals(featureValue)) { + getContext().getSummaryService().addToEnrichers(getName()); return new ProbeBuilder().withNewHttpGet().withNewPort(DEFAULT_HEALTH_CHECK_PORT).withPath(path).endHttpGet() .withSuccessThreshold(getSuccessThreshold()) .withFailureThreshold(getFailureThreshold()) @@ -101,6 +102,7 @@ private Probe discoverKarafProbe(String path, int initialDelay) { String featureValue = (String) feature; if ("jkube-karaf-checks".equals(featureValue)) { + getContext().getSummaryService().addToEnrichers(getName()); return new ProbeBuilder().withNewHttpGet().withNewPort(DEFAULT_HEALTH_CHECK_PORT).withPath(path).endHttpGet() .withSuccessThreshold(getSuccessThreshold()) .withFailureThreshold(getFailureThreshold()) diff --git a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/PrometheusEnricher.java b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/PrometheusEnricher.java index abdbc7cc01..2df712dfda 100644 --- a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/PrometheusEnricher.java +++ b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/PrometheusEnricher.java @@ -67,6 +67,7 @@ public void visit(ServiceBuilder serviceBuilder) { annotations.put(ANNOTATION_PROMETHEUS_PORT, prometheusPort); annotations.put(ANNOTATION_PROMETHEUS_SCRAPE, "true"); annotations.put(ANNOTATION_PROMETHEUS_PATH, getConfig(Config.PROMETHEUS_PATH)); + getContext().getSummaryService().addToEnrichers(getName()); log.verbose("Adding prometheus.io annotations: %s", annotations.entrySet() .stream() diff --git a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/ServiceDiscoveryEnricher.java b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/ServiceDiscoveryEnricher.java index 3a01c4de15..394aa35fe4 100644 --- a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/ServiceDiscoveryEnricher.java +++ b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/ServiceDiscoveryEnricher.java @@ -137,6 +137,7 @@ protected void addAnnotations(ServiceBuilder serviceBuilder) { annotations.put(PREFIX + "/" + ANNOTATION_DESCRIPTION_PATH, resolvedDescriptionPath); } annotations.forEach((key, value) -> log.info("Add %s annotation: \"%s\" : \"%s\"", PREFIX, key, value)); + getContext().getSummaryService().addToEnrichers(getName()); serviceBuilder.editMetadata().addToAnnotations(annotations).and().buildMetadata(); } } diff --git a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/WebAppHealthCheckEnricher.java b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/WebAppHealthCheckEnricher.java index 49daa08598..37c14d7d20 100644 --- a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/WebAppHealthCheckEnricher.java +++ b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/WebAppHealthCheckEnricher.java @@ -62,6 +62,7 @@ private Probe getProbe(boolean readiness) { return null; } + getContext().getSummaryService().addToEnrichers(getName()); Integer port = getPort(); String scheme = getScheme().toUpperCase(); String path = getPath(); diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorManager.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorManager.java index 71db8b9f68..7c1b59a946 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorManager.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorManager.java @@ -16,6 +16,7 @@ import java.util.List; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.ClassUtil; import org.eclipse.jkube.kit.common.util.PluginServiceFactory; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -36,7 +37,7 @@ private GeneratorManager() { } public static List generate(List imageConfigs, - GeneratorContext genCtx, boolean prePackagePhase) { + GeneratorContext genCtx, boolean prePackagePhase, SummaryService summaryService) { final PluginServiceFactory pluginFactory = new PluginServiceFactory<>(genCtx); if (genCtx.isUseProjectClasspath()) { @@ -53,6 +54,7 @@ public static List generate(List imageCo log.verbose(" - %s", generator.getName()); if (generator.isApplicable(ret)) { log.info("Running generator %s", generator.getName()); + summaryService.addToGenerators(generator.getName()); ret = generator.customize(ret, prePackagePhase); } } diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/GeneratorManagerTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/GeneratorManagerTest.java index 0ba881ef1f..071c2549ff 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/GeneratorManagerTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/GeneratorManagerTest.java @@ -13,11 +13,13 @@ */ package org.eclipse.jkube.generator.api; +import java.io.File; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.junit.jupiter.api.BeforeEach; @@ -31,6 +33,7 @@ class GeneratorManagerTest { private KitLogger logger; + private SummaryService summaryService; private GeneratorContext generatorContext; @@ -39,6 +42,7 @@ void setUp() { logger = spy(new KitLogger.SilentLogger()); final ProcessorConfig processorConfig = new ProcessorConfig(); processorConfig.setIncludes(Collections.singletonList("fake-generator")); + summaryService = new SummaryService(new File("target"), logger, false); generatorContext = GeneratorContext.builder() .config(processorConfig) .logger(logger) @@ -51,7 +55,7 @@ void generate_withTestGenerator_shouldProcessImages() { final List images = Collections.singletonList(new ImageConfiguration()); // When final List result = GeneratorManager - .generate(images, generatorContext, false); + .generate(images, generatorContext, false, summaryService); // Then assertThat(result) .isNotSameAs(images) diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java index a7fad52a04..bc14b17222 100644 --- a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java @@ -85,6 +85,7 @@ private Probe buildProbe(Integer initialDelaySeconds, Integer periodSeconds){ return null; } + getContext().getSummaryService().addToEnrichers(getName()); final String firstImagePort = getImages().stream().findFirst() .map(ImageConfiguration::getBuild).map(BuildConfiguration::getPorts) .orElse(Collections.emptyList()).stream() diff --git a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricherTest.java b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricherTest.java index b64d09ce78..970ffdc97d 100644 --- a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricherTest.java +++ b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricherTest.java @@ -19,6 +19,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; @@ -51,6 +52,7 @@ void setUp() { .outputDirectory(new File("target")) .build(); klb = new KubernetesListBuilder(); + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); klb.addToItems(new ServiceBuilder() .withNewMetadata().withName("make-it-real").endMetadata() .build()); @@ -58,6 +60,7 @@ void setUp() { .log(new KitLogger.SilentLogger()) .processorConfig(new ProcessorConfig()) .project(project) + .summaryService(summaryService) .build(); } diff --git a/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/enricher/QuarkusHealthCheckEnricher.java b/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/enricher/QuarkusHealthCheckEnricher.java index 5019d99936..d875c23587 100644 --- a/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/enricher/QuarkusHealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/enricher/QuarkusHealthCheckEnricher.java @@ -85,6 +85,7 @@ private Probe discoverQuarkusHealthCheck(int initialDelay, Function configs, Collection configs, String namespace, Collection resources, PlatformMode mode) throws Exception { + public void watch(List configs, String namespace, Collection resources, PlatformMode mode, SummaryService summaryService) { final NamespacedKubernetesClient kubernetes; if (namespace != null) { kubernetes = getContext().getJKubeServiceHub().getClient().adapt(NamespacedKubernetesClient.class).inNamespace(namespace); diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java index 7046de780a..5ce76e7298 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java @@ -27,6 +27,7 @@ import org.eclipse.jkube.kit.common.Dependency; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.SpringBootConfigurationHelper; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; @@ -60,6 +61,7 @@ public abstract class AbstractSpringBootHealthCheckEnricherTestSupport { @BeforeEach void init(@TempDir Path project) throws IOException { projectClassLoaders = mock(ProjectClassLoaders.class, RETURNS_DEEP_STUBS); + SummaryService summaryService = mock(SummaryService.class); context = spy(JKubeEnricherContext.builder() .log(new KitLogger.SilentLogger()) .project(JavaProject.builder() @@ -73,6 +75,7 @@ void init(@TempDir Path project) throws IOException { .version(getSpringBootVersion()) .build())) .build()) + .summaryService(summaryService) .processorConfig(new ProcessorConfig()) .build()); when(context.getProjectClassLoaders()).thenReturn(projectClassLoaders); diff --git a/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java b/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java index 7f66999486..9345c17a94 100644 --- a/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java @@ -68,6 +68,7 @@ private Probe discoverThorntailHealthCheck(int initialDelay) { if (getContext().hasDependency(IO_THORNTAIL, "monitor") || getContext().hasDependency(IO_THORNTAIL, "microprofile-health")) { + getContext().getSummaryService().addToEnrichers(getName()); Integer port = getPort(); // scheme must be in upper case in k8s String scheme = getScheme().toUpperCase(); diff --git a/jkube-kit/jkube-kit-vertx/src/main/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricher.java b/jkube-kit/jkube-kit-vertx/src/main/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricher.java index 926ac99496..65403ccb5b 100644 --- a/jkube-kit/jkube-kit-vertx/src/main/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-vertx/src/main/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricher.java @@ -127,6 +127,7 @@ private Probe discoverVertxHealthCheck(boolean readiness) { if (!isApplicable()) { return null; } + getContext().getSummaryService().addToEnrichers(getName()); // We don't allow to set the HOST, because it should rather be configured in the HTTP header (Host header) // cf. https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/ String type = getStringValue(Config.TYPE, readiness).orElse("http").toUpperCase(); diff --git a/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java b/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java index e9f3183931..7c2c7d3599 100644 --- a/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java +++ b/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.vertx.enricher; +import java.io.File; import java.util.AbstractMap; import java.util.Collections; import java.util.HashMap; @@ -27,6 +28,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; @@ -61,12 +63,14 @@ void setUp() { plexusMavenConfig = new TreeMap<>(); jKubePluginConfiguration = new HashMap<>(); properties = new Properties(); + SummaryService summaryService = new SummaryService(new File("target"), new KitLogger.SilentLogger(), false); final ProcessorConfig processorConfig = new ProcessorConfig(); processorConfig.setConfig(Collections.singletonMap("jkube-healthcheck-vertx", plexusMavenConfig)); context = JKubeEnricherContext.builder() .log(new KitLogger.SilentLogger()) .processorConfig(processorConfig) .project(createNewJavaProjectWithVertxPlugin("io.reactiverse", "vertx-maven-plugin")) + .summaryService(summaryService) .build(); } diff --git a/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricher.java b/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricher.java index 119fe73655..afa45d6e3a 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricher.java @@ -94,6 +94,7 @@ protected Probe getStartupProbe() { private Probe discoverWildflyJARHealthCheck(Config path, Config initialDelay) { if (isAvailable()) { + getContext().getSummaryService().addToEnrichers(getName()); int port = asInt(getConfig(Config.PORT)); if (port <= 0) { return null; diff --git a/jkube-kit/resource/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java b/jkube-kit/resource/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java index 1545ab46d8..abd3b98fab 100644 --- a/jkube-kit/resource/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java +++ b/jkube-kit/resource/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java @@ -34,6 +34,7 @@ import org.eclipse.jkube.kit.common.ResourceFileType; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; import org.eclipse.jkube.kit.common.archive.JKubeTarArchiver; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.FileUtil; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.ResourceUtil; @@ -64,10 +65,12 @@ public class HelmService { private final JKubeConfiguration jKubeConfiguration; private final KitLogger logger; + private final SummaryService summaryService; - public HelmService(JKubeConfiguration jKubeConfiguration, KitLogger logger) { + public HelmService(JKubeConfiguration jKubeConfiguration, KitLogger logger, SummaryService summaryService) { this.jKubeConfiguration = jKubeConfiguration; this.logger = logger; + this.summaryService = summaryService; } /** @@ -106,9 +109,12 @@ public void generateHelmCharts(HelmConfig helmConfig) throws IOException { logger.debug("Creating Helm configuration Tarball: '%s'", tarballFile.getAbsolutePath()); final Consumer prependNameAsDirectory = tae -> tae.setName(String.format("%s/%s", helmConfig.getChart(), tae.getName())); - JKubeTarArchiver.createTarBall( + summaryService.setHelmChartName(helmConfig.getChart()); + summaryService.setHelmChartLocation(outputDir); + File helmTarball = JKubeTarArchiver.createTarBall( tarballFile, outputDir, FileUtil.listFilesAndDirsRecursivelyInDirectory(outputDir), Collections.emptyMap(), ArchiveCompression.fromFileName(tarballFile.getName()), null, prependNameAsDirectory); + summaryService.setHelmChartCompressedLocation(helmTarball); Optional.ofNullable(helmConfig.getGeneratedChartListeners()).orElse(Collections.emptyList()) .forEach(listener -> listener.chartFileGenerated(helmConfig, helmType, tarballFile)); } @@ -136,6 +142,7 @@ public void uploadHelmChart(HelmConfig helm) throws BadUploadException, IOExcept .orElse(s -> s); setAuthentication(helmRepository, logger, registryServerConfigurations, passwordDecryptor); uploadHelmChart(helm, helmRepository); + summaryService.setHelmRepository(helmRepository.getName()); } else { String error = "No repository or invalid repository configured for upload"; logger.error(error); diff --git a/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceIT.java b/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceIT.java index 60ab2915e4..4f25f47db0 100644 --- a/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceIT.java +++ b/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceIT.java @@ -27,6 +27,7 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.assertj.ArchiveAssertions; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.ResourceUtil; import com.fasterxml.jackson.databind.ObjectMapper; @@ -51,7 +52,7 @@ class HelmServiceIT { @BeforeEach void setUp(@TempDir Path temporaryFolder) throws Exception { mapper = new ObjectMapper(new YAMLFactory()); - helmService = new HelmService(new JKubeConfiguration(), new KitLogger.SilentLogger()); + helmService = new HelmService(new JKubeConfiguration(), new KitLogger.SilentLogger(), new SummaryService(temporaryFolder.toFile(), new KitLogger.SilentLogger(), false)); helmOutputDir = Files.createDirectory(temporaryFolder.resolve("helm-output")).toFile(); helmConfig = new HelmConfig(); helmConfig.setSourceDir(new File(HelmServiceIT.class.getResource("/it/sources").toURI()).getAbsolutePath()); diff --git a/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java b/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java index 0aa99d8119..862c7b1990 100644 --- a/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java +++ b/jkube-kit/resource/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java @@ -25,6 +25,7 @@ import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; import org.eclipse.jkube.kit.common.ResourceFileType; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.ResourceUtil; import org.eclipse.jkube.kit.resource.helm.HelmConfig.HelmType; import org.junit.jupiter.api.AfterEach; @@ -57,7 +58,8 @@ void setUp() { helmConfig = HelmConfig.builder(); jKubeConfiguration = JKubeConfiguration.builder() .registryConfig(RegistryConfig.builder().settings(new ArrayList<>()).build()).build(); - helmService = new HelmService(jKubeConfiguration, new KitLogger.SilentLogger()); + SummaryService summaryService = mock(SummaryService.class); + helmService = new HelmService(jKubeConfiguration, new KitLogger.SilentLogger(), summaryService); } @AfterEach diff --git a/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java b/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java index 5bc5649038..0b78c6f668 100644 --- a/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java +++ b/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java @@ -22,6 +22,7 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.ResourceFileType; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; import org.eclipse.jkube.kit.common.util.ResourceClassifier; import org.eclipse.jkube.kit.common.util.ValidationUtil; @@ -62,18 +63,19 @@ public KubernetesList generateResources(PlatformMode platformMode, EnricherManag } @Override - public File writeResources(KubernetesList resources, ResourceClassifier classifier, KitLogger log) throws IOException { + public File writeResources(KubernetesList resources, ResourceClassifier classifier, KitLogger log, SummaryService summaryService) throws IOException { final File targetDir = resourceServiceConfig.getTargetDir(); final ResourceFileType resourceFileType = resourceServiceConfig.getResourceFileType(); // write kubernetes.yml / openshift.yml File resourceFileBase = new File(targetDir, classifier.getValue()); - File file = writeResourcesIndividualAndComposite(resources, resourceFileBase, resourceFileType, log); + File file = writeResourcesIndividualAndComposite(resources, resourceFileBase, resourceFileType, log, summaryService); // Resolve template placeholders if (resourceServiceConfig.isInterpolateTemplateParameters()) { interpolateTemplateVariables(resources, file); } + summaryService.setAggregateResourceFile(file); return file; } diff --git a/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/WriteUtil.java b/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/WriteUtil.java index b85317870a..59c7bd9f5a 100644 --- a/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/WriteUtil.java +++ b/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/WriteUtil.java @@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.ResourceFileType; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.ResourceUtil; import org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil; @@ -29,6 +30,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import static org.eclipse.jkube.kit.resource.service.TemplateUtil.getSingletonTemplate; @@ -39,7 +41,7 @@ class WriteUtil { private WriteUtil(){ } static File writeResourcesIndividualAndComposite( - KubernetesList resources, File resourceFileBase, ResourceFileType resourceFileType, KitLogger log) throws IOException { + KubernetesList resources, File resourceFileBase, ResourceFileType resourceFileType, KitLogger log, SummaryService summaryService) throws IOException { resources.getItems().sort(COMPARATOR); // entity is object which will be sent to writeResource for openshift.yml @@ -60,12 +62,12 @@ static File writeResourcesIndividualAndComposite( // write separate files, one for each resource item // resources passed to writeIndividualResources is also new one. - writeIndividualResources(resources, resourceFileBase, resourceFileType, log); + writeIndividualResources(resources, resourceFileBase, resourceFileType, log, summaryService); return file; } private static void writeIndividualResources( - KubernetesList resources, File targetDir, ResourceFileType resourceFileType, KitLogger log) throws IOException { + KubernetesList resources, File targetDir, ResourceFileType resourceFileType, KitLogger log, SummaryService summaryService) throws IOException { final Map generatedFiles = new HashMap<>(); for (HasMetadata item : resources.getItems()) { String name = KubernetesHelper.getName(item); @@ -81,6 +83,9 @@ private static void writeIndividualResources( // Here we are writing individual file for all the resources. File itemTarget = new File(targetDir, fileName); + summaryService.addGeneratedResourceFile(Optional.ofNullable(resourceFileType) + .map(r -> r.addExtensionIfMissing(itemTarget)) + .orElse(itemTarget)); writeResource(itemTarget, item, resourceFileType); } } diff --git a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java index 6bb357233d..93f89aba5e 100644 --- a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java +++ b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java @@ -26,6 +26,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.ResourceFileType; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.ResourceClassifier; import org.eclipse.jkube.kit.config.resource.EnricherManager; import org.eclipse.jkube.kit.config.resource.PlatformMode; @@ -53,11 +54,13 @@ class DefaultResourceServiceTest { private File targetDir; private ResourceServiceConfig resourceServiceConfig; private DefaultResourceService defaultResourceService; + private SummaryService summaryService; @BeforeEach void init(@TempDir Path temporaryFolder) throws IOException { enricherManager = mock(EnricherManager.class); kitLogger = new KitLogger.SilentLogger(); + summaryService = mock(SummaryService.class); targetDir = Files.createDirectory(temporaryFolder.resolve("target")).toFile(); resourceServiceConfig = ResourceServiceConfig.builder() .interpolateTemplateParameters(true) @@ -114,9 +117,9 @@ void writeResources() throws IOException { MockedStatic templateUtil = mockStatic(TemplateUtil.class) ) { // When - defaultResourceService.writeResources(null, ResourceClassifier.KUBERNETES, kitLogger); + defaultResourceService.writeResources(null, ResourceClassifier.KUBERNETES, kitLogger, summaryService); // Then - writeUtil.verify(() -> WriteUtil.writeResourcesIndividualAndComposite(isNull(), eq(new File(targetDir, "kubernetes")), eq(ResourceFileType.yaml), eq(kitLogger)), times(1)); + writeUtil.verify(() -> WriteUtil.writeResourcesIndividualAndComposite(isNull(), eq(new File(targetDir, "kubernetes")), eq(ResourceFileType.yaml), eq(kitLogger), eq(summaryService)), times(1)); templateUtil.verify(() -> TemplateUtil.interpolateTemplateVariables(isNull(), any()), times(1)); } } diff --git a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java index f6069859bf..074e59115d 100644 --- a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java +++ b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java @@ -20,6 +20,7 @@ import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.ResourceUtil; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; @@ -36,6 +37,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; @@ -48,18 +50,22 @@ class WriteUtilTest { private KubernetesListBuilder klb; private File resourceFileBase; + private SummaryService summaryService; @BeforeEach void initGlobalVariables() { log = new KitLogger.SilentLogger(); + summaryService = mock(SummaryService.class); resourceUtil = mockStatic(ResourceUtil.class); klb = new KubernetesListBuilder(); resourceFileBase = temporaryFolder; } + @AfterEach public void close() { resourceUtil.close(); } + @Test void writeResource() throws IOException { // Given @@ -88,7 +94,7 @@ void writeResourceThrowsException() throws IOException { @Test void writeResourcesIndividualAndCompositeWithNoResourcesShouldOnlyWriteComposite() throws IOException { // When - WriteUtil.writeResourcesIndividualAndComposite(klb.build(), resourceFileBase, null, log); + WriteUtil.writeResourcesIndividualAndComposite(klb.build(), resourceFileBase, null, log, summaryService); // Then verifyResourceUtilSave(resourceFileBase); } @@ -102,7 +108,7 @@ void writeResourcesIndividualAndCompositeWithResourcesShouldWriteAll() throws IO new SecretBuilder().withNewMetadata().withName(" ").endMetadata().build() ); // When - WriteUtil.writeResourcesIndividualAndComposite(klb.build(), resourceFileBase, null, log); + WriteUtil.writeResourcesIndividualAndComposite(klb.build(), resourceFileBase, null, log, summaryService); // Then verifyResourceUtilSave(resourceFileBase); verifyResourceUtilSave(new File(resourceFileBase, "cm-1-configmap")); @@ -120,7 +126,7 @@ void writeResourcesIndividualAndComposite_withResourcesWithSameName_shouldWriteA genericCustomResource("CustomResourceOfKind3") ); // When - WriteUtil.writeResourcesIndividualAndComposite(klb.build(), resourceFileBase, null, log); + WriteUtil.writeResourcesIndividualAndComposite(klb.build(), resourceFileBase, null, log, summaryService); // Then verifyResourceUtilSave(resourceFileBase); verifyResourceUtilSave(new File(resourceFileBase, "cm-1-configmap")); diff --git a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/Watcher.java b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/Watcher.java index 869dd3c3ac..1cf5114480 100644 --- a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/Watcher.java +++ b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/Watcher.java @@ -17,6 +17,7 @@ import java.util.List; import org.eclipse.jkube.kit.common.Named; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; @@ -41,8 +42,9 @@ public interface Watcher extends Named { * @param namespace namespace in which resources are deployed * @param resources list of resources applied * @param mode {@link PlatformMode} + * @param summaryService {@link SummaryService} * @throws Exception in case of any failure */ - void watch(List configs, String namespace, Collection resources, PlatformMode mode) throws Exception; + void watch(List configs, String namespace, Collection resources, PlatformMode mode, SummaryService summaryService); } diff --git a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java index 1456e54dfa..5dda173db2 100644 --- a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java +++ b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java @@ -73,6 +73,6 @@ public static void watch(List ret, String namespace, Collect } log.info("Running watcher %s", chosen.getName()); - chosen.watch(ret, namespace, resources, mode); + chosen.watch(ret, namespace, resources, mode, watcherCtx.getJKubeServiceHub().getSummaryService()); } } diff --git a/jkube-kit/watcher/api/src/test/java/org/eclipse/jkube/watcher/api/WatcherManagerTest.java b/jkube-kit/watcher/api/src/test/java/org/eclipse/jkube/watcher/api/WatcherManagerTest.java index a394a403c1..da35144944 100644 --- a/jkube-kit/watcher/api/src/test/java/org/eclipse/jkube/watcher/api/WatcherManagerTest.java +++ b/jkube-kit/watcher/api/src/test/java/org/eclipse/jkube/watcher/api/WatcherManagerTest.java @@ -18,6 +18,7 @@ import java.util.List; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; @@ -85,7 +86,7 @@ public boolean isApplicable(List configs, Collection configs, String namespace, Collection resources, PlatformMode mode) { + public void watch(List configs, String namespace, Collection resources, PlatformMode mode, SummaryService summaryService) { configs.forEach(ic -> ic.setName("processed-by-test")); } } diff --git a/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java b/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java index 35cbe77b05..0ceeae4625 100644 --- a/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java +++ b/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java @@ -25,6 +25,7 @@ import org.eclipse.jkube.kit.build.service.docker.helper.ImageNameFormatter; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; import org.eclipse.jkube.kit.build.service.docker.watch.WatchException; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.config.access.ClusterAccess; @@ -92,7 +93,7 @@ public boolean isApplicable(List configs, Collection configs, String namespace, final Collection resources, PlatformMode mode) { + public void watch(List configs, String namespace, final Collection resources, PlatformMode mode, SummaryService summaryService) { WatchContext watchContext = getContext().getWatchContext(); @@ -105,7 +106,7 @@ public void watch(List configs, String namespace, final Coll DockerServiceHub hub = getContext().getJKubeServiceHub().getDockerServiceHub(); try { - hub.getWatchService().watch(watchContext, getContext().getBuildContext(), configs); + hub.getWatchService().watch(watchContext, getContext().getBuildContext(), configs, getContext().getJKubeServiceHub().getSummaryService()); } catch (Exception ex) { throw new RuntimeException("Error while watching", ex); } diff --git a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java index 0368a74b90..ecab468320 100644 --- a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java +++ b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java @@ -20,6 +20,7 @@ import org.eclipse.jkube.kit.build.service.docker.watch.ExecTask; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.watcher.api.WatcherContext; @@ -42,6 +43,7 @@ class DockerImageWatcherTest { private WatchService watchService; private DockerImageWatcher dockerImageWatcher; + private SummaryService summaryService; @BeforeEach public void setUp() { @@ -49,6 +51,7 @@ public void setUp() { ClusterAccess mockedClusterAccess = mock(ClusterAccess.class); watchService = mock(WatchService.class); DockerServiceHub mockedDockerServiceHub = mock(DockerServiceHub.class,RETURNS_DEEP_STUBS); + summaryService = mock(SummaryService.class); dockerImageWatcher = new DockerImageWatcher(watcherContext); when(mockedDockerServiceHub.getWatchService()).thenReturn(watchService); when(watcherContext.getJKubeServiceHub().getDockerServiceHub()).thenReturn(mockedDockerServiceHub); @@ -79,9 +82,9 @@ void watchShouldInitWatchContext() throws IOException { // Given ArgumentCaptor watchContextArgumentCaptor = ArgumentCaptor.forClass(WatchContext.class); // When - dockerImageWatcher.watch(null, null, null, null); + dockerImageWatcher.watch(null, null, null, null, summaryService); // Then - verify(watchService).watch(watchContextArgumentCaptor.capture(),any(),any()); + verify(watchService).watch(watchContextArgumentCaptor.capture(),any(),any(), any()); assertThat(watchContextArgumentCaptor.getValue()) .isNotNull() .extracting("imageCustomizer","containerRestarter","containerCommandExecutor","containerCopyTask") @@ -93,8 +96,8 @@ void watchExecuteCommandInPodTask() throws Exception { try (MockedConstruction podExecutorMockedConstruction = mockConstruction(PodExecutor.class)) { // Given ArgumentCaptorwatchContextArgumentCaptor=ArgumentCaptor.forClass(WatchContext.class); - dockerImageWatcher.watch(null,null,null,null); - verify(watchService).watch(watchContextArgumentCaptor.capture(),any(),any()); + dockerImageWatcher.watch(null,null,null,null, summaryService); + verify(watchService).watch(watchContextArgumentCaptor.capture(),any(),any(), any()); final ExecTask execTask=watchContextArgumentCaptor.getValue().getContainerCommandExecutor(); //When execTask.exec("thecommand"); @@ -109,8 +112,8 @@ void watchCopyFileToPod() throws Exception { try (MockedConstruction podExecutorMockedConstruction = mockConstruction(PodExecutor.class)) { // Given ArgumentCaptor watchContextArgumentCaptor = ArgumentCaptor.forClass(WatchContext.class); - dockerImageWatcher.watch(null,null,null,null); - verify(watchService).watch(watchContextArgumentCaptor.capture(),any(),any()); + dockerImageWatcher.watch(null,null,null,null, summaryService); + verify(watchService).watch(watchContextArgumentCaptor.capture(),any(),any(), any()); final CopyFilesTask copyFilesTask = watchContextArgumentCaptor.getValue().getContainerCopyTask(); // When copyFilesTask.copy(null); diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc index e94c0ebbe1..78f571d0e8 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc @@ -40,6 +40,7 @@ include::inc/_access.adoc[] include::inc/_registry.adoc[] include::inc/_authentication.adoc[] +include::{kitdoc-path}/inc/_summary.adoc[] include::inc/_volumes.adoc[] include::inc/_integrations.adoc[] diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index d14d986579..d64758732b 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -87,6 +87,8 @@ import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestampFile; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.updateResourceConfigNamespace; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummaryIfLastExecuting; import static org.eclipse.jkube.maven.plugin.mojo.build.AbstractJKubeMojo.DEFAULT_LOG_PREFIX; public abstract class AbstractDockerMojo extends AbstractMojo @@ -387,6 +389,9 @@ public abstract class AbstractDockerMojo extends AbstractMojo @Parameter(property = "jkube.offline", defaultValue = "false") protected boolean offline; + @Parameter(property = "jkube.summaryEnabled", defaultValue = "true") + public boolean summaryEnabled; + protected JavaProject javaProject; @Override @@ -446,19 +451,26 @@ protected void doExecute() throws MojoExecutionException { .dockerServiceHub(DockerServiceHub.newInstance(log, dockerAccess, logOutputSpecFactory)) .buildServiceConfig(buildServiceConfigBuilder().build()) .offline(offline) + .summaryEnabled(summaryEnabled) .build(); resolvedImages = ConfigHelper.initImageConfiguration(apiVersion, getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP), images, imageConfigResolver, log, filter, this, jkubeServiceHub.getConfiguration()); + jkubeServiceHub.getSummaryService().setSuccessful(true); + jkubeServiceHub.getSummaryService().setActionType("Goals"); + jkubeServiceHub.getSummaryService().addToActions(String.format("%s\b%s", getLogPrefix(), mojoExecution.getGoal())); executeInternal(); } catch (IOException | DependencyResolutionRequiredException exp) { logException(exp); + handleExceptionAndSummary(jkubeServiceHub, exp); throw new MojoExecutionException(exp.getMessage()); } catch (MojoExecutionException exp) { logException(exp); + handleExceptionAndSummary(jkubeServiceHub, exp); throw exp; - } finally { - Optional.ofNullable(jkubeServiceHub).ifPresent(JKubeServiceHub::close); } } finally { + printSummaryIfLastExecuting(jkubeServiceHub, mojoExecution.getGoal(), + MavenUtil.getLastExecutingGoal(session, getLogPrefix().trim())); + Optional.ofNullable(jkubeServiceHub).ifPresent(JKubeServiceHub::close); Ansi.setEnabled(ansiRestore); } } @@ -615,7 +627,7 @@ public List customizeConfig(List configs log.info("Building Docker image in [[B]]Kubernetes[[B]] mode"); } try { - return GeneratorManager.generate(configs, generatorContextBuilder().build(), false); + return GeneratorManager.generate(configs, generatorContextBuilder().build(), false, jkubeServiceHub.getSummaryService()); } catch (DependencyResolutionRequiredException de) { throw new IllegalArgumentException("Instructed to use project classpath, but cannot. Continuing build if we can: ", de); } @@ -642,6 +654,7 @@ public EnricherContext getEnricherContext() throws DependencyResolutionRequiredE .images(getResolvedImages()) .resources(resources) .log(log) + .summaryService(jkubeServiceHub.getSummaryService()) .build(); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java index c0661d6b30..f5ffc3897e 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.maven.plugin.mojo.build; +import io.fabric8.kubernetes.client.KubernetesClientException; import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugins.annotations.Component; import org.eclipse.jkube.kit.common.JavaProject; @@ -38,6 +39,7 @@ import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; +import org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil; import org.eclipse.jkube.maven.plugin.mojo.KitLoggerProvider; import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher; import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException; @@ -46,6 +48,9 @@ import java.util.Optional; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.updateResourceConfigNamespace; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummary; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummaryIfLastExecuting; public abstract class AbstractJKubeMojo extends AbstractMojo implements KitLoggerProvider { @@ -89,6 +94,9 @@ public abstract class AbstractJKubeMojo extends AbstractMojo implements KitLogge @Parameter(property = "jkube.namespace") public String namespace; + @Parameter(property = "jkube.summaryEnabled", defaultValue = "true") + public boolean summaryEnabled; + @Parameter protected ClusterConfiguration access; @@ -114,7 +122,14 @@ public void execute() throws MojoExecutionException, MojoFailureException { } executeInternal(); } catch (DependencyResolutionRequiredException e) { + handleExceptionAndSummary(jkubeServiceHub, e); throw new MojoFailureException(e.getMessage()); + } catch (KubernetesClientException kubernetesClientException) { + IllegalStateException illegalStateException = KubernetesResourceUtil.handleKubernetesClientException(kubernetesClientException, this.log, jkubeServiceHub.getSummaryService()); + printSummary(jkubeServiceHub); + throw illegalStateException; + } finally { + printSummaryIfLastExecuting(jkubeServiceHub, mojoExecution.getGoal(), MavenUtil.getLastExecutingGoal(session, getLogPrefix().trim())); } } @@ -124,6 +139,9 @@ protected void init() throws DependencyResolutionRequiredException { javaProject = MavenUtil.convertMavenProjectToJKubeProject(project, session); jkubeServiceHub = initJKubeServiceHubBuilder(javaProject).build(); resources = updateResourceConfigNamespace(namespace, resources); + jkubeServiceHub.getSummaryService().setSuccessful(true); + jkubeServiceHub.getSummaryService().setActionType("Goals"); + jkubeServiceHub.getSummaryService().addToActions(String.format("%s\b%s", getLogPrefix(), mojoExecution.getGoal())); } protected boolean shouldSkip() { @@ -180,6 +198,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder(Java .build()) .clusterAccess(clusterAccess) .offline(offline) + .summaryEnabled(summaryEnabled) .platformMode(getRuntimeMode()); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java index 9ad78b4b0c..b059f9a8a5 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java @@ -38,6 +38,8 @@ import org.apache.maven.project.MavenProject; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.resolveFallbackNamespace; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummary; /** * Base class for goals which deploy the generated artifacts into the Kubernetes cluster @@ -157,7 +159,7 @@ public File getKubernetesManifest() { public void executeInternal() throws MojoExecutionException { try (KubernetesClient kubernetes = jkubeServiceHub.getClient()) { applyService = jkubeServiceHub.getApplyService(); - initServices(kubernetes); + initServices(); URL masterUrl = kubernetes.getMasterUrl(); final File manifest = getManifest(kubernetes); @@ -187,21 +189,21 @@ public void executeInternal() throws MojoExecutionException { applyEntities(kubernetes, manifest.getName(), entities); log.info("[[B]]HINT:[[B]] Use the command `%s get pods -w` to watch your pods start up", clusterAccess.isOpenShift() ? "oc" : "kubectl"); } catch (KubernetesClientException e) { - KubernetesResourceUtil.handleKubernetesClientException(e, this.log); - } catch(InterruptedException ex) { - Thread.currentThread().interrupt(); + IllegalStateException illegalStateException = KubernetesResourceUtil.handleKubernetesClientException(e, this.log, jkubeServiceHub.getSummaryService()); + printSummary(jkubeServiceHub); + throw illegalStateException; } catch (Exception e) { + handleExceptionAndSummary(jkubeServiceHub, e); throw new MojoExecutionException(e.getMessage(), e); } - } - protected void applyEntities(final KubernetesClient kubernetes, String fileName, final Collection entities) throws InterruptedException { + protected void applyEntities(final KubernetesClient kubernetes, String fileName, final Collection entities) { KitLogger serviceLogger = createLogger("[[G]][SVC][[G]] [[s]]"); applyService.applyEntities(fileName, entities, serviceLogger, serviceUrlWaitTimeSeconds); } - protected void initServices(KubernetesClient kubernetes) { + protected void initServices() { log.debug("No services required in ApplyMojo"); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java index d4c3883674..922cc8462d 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java @@ -26,6 +26,7 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProjectHelper; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; /** @@ -65,6 +66,7 @@ public void executeInternal() throws MojoExecutionException { .build(); jkubeServiceHub.getHelmService().generateHelmCharts(helm); } catch (IOException exception) { + handleExceptionAndSummary(jkubeServiceHub, exception); throw new MojoExecutionException(exception.getMessage()); } } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojo.java index b23962fb4b..6893ebcdda 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojo.java @@ -19,6 +19,7 @@ import org.apache.maven.plugins.annotations.ResolutionScope; import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmPushConfig; @Mojo(name = "helm-push", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.COMPILE) @@ -38,6 +39,7 @@ public void executeInternal() throws MojoExecutionException { jkubeServiceHub.getHelmService().uploadHelmChart(helm); } catch (Exception exp) { getKitLogger().error("Error performing helm push", exp); + handleExceptionAndSummary(jkubeServiceHub, exp); throw new MojoExecutionException(exp.getMessage(), exp); } } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java index bf4d03df23..9dd28eb026 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java @@ -19,6 +19,8 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; + /** * Uploads the built Docker images to a Docker registry * @@ -58,6 +60,7 @@ public void executeInternal() throws MojoExecutionException { try { jkubeServiceHub.getBuildService().push(getResolvedImages(), retries, getRegistryConfig(pushRegistry), skipTag); } catch (Exception ex) { + handleExceptionAndSummary(jkubeServiceHub, ex); throw new MojoExecutionException(ex.getMessage(), ex); } } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 420c9a9182..a181e26160 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -63,6 +63,7 @@ import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.common.util.DekorateUtil.DEFAULT_RESOURCE_LOCATION; import static org.eclipse.jkube.kit.common.util.DekorateUtil.useDekorate; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; import static org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil.updateKindFilenameMappings; import static org.eclipse.jkube.maven.plugin.mojo.build.BuildMojo.CONTEXT_KEY_BUILD_TIMESTAMP; @@ -213,12 +214,13 @@ public void executeInternal() throws MojoExecutionException, MojoFailureExceptio final ResourceClassifier resourceClassifier = getResourceClassifier(); final KubernetesList resourceList = generateResources(); final File resourceClassifierDir = new File(this.targetDir, resourceClassifier.getValue()); - final File artifact = jkubeServiceHub.getResourceService().writeResources(resourceList, resourceClassifier, log); + final File artifact = jkubeServiceHub.getResourceService().writeResources(resourceList, resourceClassifier, log, jkubeServiceHub.getSummaryService()); validateIfRequired(resourceClassifierDir, resourceClassifier); // Attach it to the Maven reactor so that it will also get deployed projectHelper.attachArtifact(project, this.resourceFileType.getArtifactType(), resourceClassifier.getValue(), artifact); } } catch (IOException e) { + handleExceptionAndSummary(jkubeServiceHub, e); throw new MojoExecutionException("Failed to generate kubernetes descriptor", e); } } @@ -302,6 +304,7 @@ private KubernetesList generateResources() .settings(MavenUtil.getRegistryServerFromMavenSettings(settings)) .resources(resources) .images(resolvedImages) + .summaryService(jkubeServiceHub.getSummaryService()) .log(log); DefaultEnricherManager enricherManager = new DefaultEnricherManager(ctxBuilder.build(), @@ -339,7 +342,7 @@ private List getResolvedImages(List imag .strategy(JKubeBuildStrategy.docker) .useProjectClasspath(useProjectClasspath) .build(); - return GeneratorManager.generate(configs, ctx, true); + return GeneratorManager.generate(configs, ctx, true, jkubeServiceHub.getSummaryService()); } catch (Exception e) { throw new IllegalArgumentException("Cannot extract generator: " + e, e); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java index 8405f27e6f..2bf3e29a16 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java @@ -28,6 +28,7 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; import static org.eclipse.jkube.maven.plugin.mojo.build.ApplyMojo.DEFAULT_KUBERNETES_MANIFEST; /** @@ -70,6 +71,7 @@ public final void executeInternal() throws MojoExecutionException { try { undeploy(); } catch (IOException ex) { + handleExceptionAndSummary(jkubeServiceHub, ex); throw new MojoExecutionException(ex.getMessage(), ex); } } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index 1909a1f26a..0bc9c07a1a 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -51,6 +51,8 @@ import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.applicableNamespace; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.handleExceptionAndSummary; +import static org.eclipse.jkube.kit.config.service.kubernetes.SummaryServiceUtil.printSummary; import static org.eclipse.jkube.maven.plugin.mojo.build.ApplyMojo.DEFAULT_KUBERNETES_MANIFEST; @@ -112,8 +114,11 @@ public void executeInternal() throws MojoExecutionException { context); } catch (KubernetesClientException ex) { - KubernetesResourceUtil.handleKubernetesClientException(ex, this.log); + IllegalStateException exception = KubernetesResourceUtil.handleKubernetesClientException(ex, this.log, jkubeServiceHub.getSummaryService()); + printSummary(jkubeServiceHub); + throw exception; } catch (Exception ex) { + handleExceptionAndSummary(jkubeServiceHub, ex); throw new MojoExecutionException("An error has occurred while while trying to watch the resources", ex); } } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoFailureScenariosTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoFailureScenariosTest.java new file mode 100644 index 0000000000..0cdc461dd1 --- /dev/null +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoFailureScenariosTest.java @@ -0,0 +1,109 @@ +/** + * Copyright (c) 2019 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at: + * + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.jkube.maven.plugin.mojo.build; + +import io.fabric8.kubernetes.client.KubernetesClientException; +import io.fabric8.openshift.client.NamespacedOpenShiftClient; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.util.KubernetesHelper; +import org.eclipse.jkube.kit.config.service.ApplyService; +import org.eclipse.jkube.kit.config.service.JKubeServiceHub; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.MockedStatic; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyCollection; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +class ApplyMojoFailureScenariosTest { + + private JKubeServiceHub mockedJKubeServiceHub; + private MockedStatic kubernetesHelperMockedStatic; + private File kubernetesManifestFile; + private ApplyService mockedApplyService; + + private ApplyMojo applyMojo; + + @BeforeEach + void setUp(@TempDir Path temporaryFolder) throws IOException { + mockedApplyService = mock(ApplyService.class); + kubernetesHelperMockedStatic = mockStatic(KubernetesHelper.class); + kubernetesHelperMockedStatic.when(KubernetesHelper::getDefaultNamespace).thenReturn("default"); + kubernetesManifestFile = Files.createFile(temporaryFolder.resolve("kubernetes.yml")).toFile(); + NamespacedOpenShiftClient defaultKubernetesClient = mock(NamespacedOpenShiftClient.class); + when(defaultKubernetesClient.adapt(any())).thenReturn(defaultKubernetesClient); + when(defaultKubernetesClient.getMasterUrl()).thenReturn(URI.create("https://www.example.com").toURL()); + mockedJKubeServiceHub = mock(JKubeServiceHub.class, RETURNS_DEEP_STUBS); + when(mockedJKubeServiceHub.getApplyService()).thenReturn(mockedApplyService); + when(mockedJKubeServiceHub.getClient()).thenReturn(defaultKubernetesClient); + // @formatter:off + applyMojo = new ApplyMojo() {{ + jkubeServiceHub = mockedJKubeServiceHub; + settings = mock(Settings.class); + kubernetesManifest = kubernetesManifestFile; + log = new KitLogger.SilentLogger(); + }}; + // @formatter:on + } + + @AfterEach + void tearDown() { + kubernetesHelperMockedStatic.close(); + applyMojo = null; + } + + @Test + void executeInternal_whenApplyServiceFailsToApplyManifests_thenThrowException() { + // Given + doThrow(new KubernetesClientException("kubernetes failure")) + .when(mockedApplyService).applyEntities(anyString(), anyCollection(), any(), anyLong()); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> applyMojo.executeInternal()) + .withMessage("kubernetes failure"); + } + + @Test + void executeInternal_whenManifestLoadFailure_thenThrowException() { + // Given + kubernetesHelperMockedStatic.when(() -> KubernetesHelper.loadResources(any())) + .thenThrow(new IOException("failure in loading manifests")); + + // When + Then + assertThatExceptionOfType(MojoExecutionException.class) + .isThrownBy(() -> applyMojo.executeInternal()) + .withMessage("failure in loading manifests"); + } + +} diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java index f95d922e7d..bc6f682995 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java @@ -18,10 +18,14 @@ import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collections; import java.util.Properties; import io.fabric8.openshift.client.NamespacedOpenShiftClient; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.ApplyService; @@ -51,6 +55,8 @@ class ApplyMojoTest { private MockedConstruction clusterAccessMockedConstruction; private File kubernetesManifestFile; private MavenProject mavenProject; + private MavenSession mavenSession; + private MojoExecution mockedMojoExecution; private NamespacedOpenShiftClient defaultKubernetesClient; private String kubeConfigNamespace; @@ -58,23 +64,30 @@ class ApplyMojoTest { @BeforeEach void setUp(@TempDir Path temporaryFolder) throws IOException { + SummaryService summaryService = mock(SummaryService.class); jKubeServiceHubMockedConstruction = mockConstruction(JKubeServiceHub.class, withSettings().defaultAnswer(RETURNS_DEEP_STUBS), (mock, context) -> { when(mock.getClient()).thenReturn(defaultKubernetesClient); when(mock.getClusterAccess().createDefaultClient()).thenReturn(defaultKubernetesClient); - when(mock.getApplyService()).thenReturn(new ApplyService(defaultKubernetesClient, new KitLogger.SilentLogger())); + when(mock.getApplyService()).thenReturn(new ApplyService(defaultKubernetesClient, new KitLogger.SilentLogger(), summaryService)); }); clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, context) -> when(mock.getNamespace()).thenAnswer(invocation -> kubeConfigNamespace)); kubernetesManifestFile = Files.createFile(temporaryFolder.resolve("kubernetes.yml")).toFile(); mavenProject = mock(MavenProject.class); + mavenSession = mock(MavenSession.class); + mockedMojoExecution = mock(MojoExecution.class); when(mavenProject.getProperties()).thenReturn(new Properties()); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:apply")); + when(mockedMojoExecution.getGoal()).thenReturn("k8s:apply"); defaultKubernetesClient = mock(NamespacedOpenShiftClient.class); when(defaultKubernetesClient.adapt(any())).thenReturn(defaultKubernetesClient); when(defaultKubernetesClient.getMasterUrl()).thenReturn(URI.create("https://www.example.com").toURL()); // @formatter:off applyMojo = new ApplyMojo() {{ project = mavenProject; + session = mavenSession; + mojoExecution = mockedMojoExecution; settings = mock(Settings.class); kubernetesManifest = kubernetesManifestFile; }}; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java index ab0260f67c..d641c54f43 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java @@ -13,33 +13,167 @@ */ package org.eclipse.jkube.maven.plugin.mojo.build; +import org.apache.maven.artifact.DependencyResolutionRequiredException; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.build.service.docker.DockerAccessFactory; +import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; +import org.eclipse.jkube.kit.build.service.docker.config.handler.ImageConfigResolver; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.service.SummaryService; +import org.eclipse.jkube.kit.common.util.MavenUtil; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.OpenshiftBuildConfig; import org.eclipse.jkube.kit.config.resource.ResourceConfig; +import org.eclipse.jkube.kit.config.service.BuildService; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; +import org.eclipse.jkube.kit.config.service.JKubeServiceException; +import org.eclipse.jkube.kit.config.service.JKubeServiceHub; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.MockedConstruction; +import org.mockito.MockedStatic; import java.io.File; +import java.util.Collections; +import java.util.List; +import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class BuildMojoTest { - private MavenProject mavenProject; + private DockerAccessFactory mockedDockerAccessFactory; + private MavenProject mockedMavenProject; + private Settings mockedMavenSettings; + private BuildMojo buildMojo; + private BuildService mockedBuildService; + private List imageConfigurationList; + private MockedStatic mavenUtilMockedStatic; + private MockedConstruction jKubeServiceHubMockedConstruction; + @TempDir + private File temporaryFolder; + @BeforeEach void setUp() { - mavenProject = mock(MavenProject.class,RETURNS_DEEP_STUBS); - when(mavenProject.getBuild().getDirectory()).thenReturn("target"); + imageConfigurationList = Collections.singletonList(ImageConfiguration.builder() + .name("test/foo:latest") + .build(BuildConfiguration.builder() + .from("test/base:latest") + .build()) + .build()); + mockedDockerAccessFactory = mock(DockerAccessFactory.class); + ImageConfigResolver mockedImageConfigResolver = mock(ImageConfigResolver.class); + MojoExecution mockedMojoExecution = mock(MojoExecution.class); + MavenSession mockedMavenSession = mock(MavenSession.class); + JavaProject mockedJavaProject = mock(JavaProject.class); + JKubeConfiguration mockedJKubeConfiguration = mock(JKubeConfiguration.class); + SummaryService mockedSummaryService = mock(SummaryService.class); + mockedMavenProject = mock(MavenProject.class, RETURNS_DEEP_STUBS); + mockedMavenSettings = mock(Settings.class, RETURNS_DEEP_STUBS); + mockedBuildService = mock(BuildService.class); + mavenUtilMockedStatic = mockStatic(MavenUtil.class); + jKubeServiceHubMockedConstruction = mockConstruction(JKubeServiceHub.class, (mock, ctx) -> { + when(mock.getBuildService()).thenReturn(mockedBuildService); + when(mock.getConfiguration()).thenReturn(mockedJKubeConfiguration); + when(mock.getSummaryService()).thenReturn(mockedSummaryService); + }); + mavenUtilMockedStatic.when(() -> MavenUtil.convertMavenProjectToJKubeProject(any(), any())) + .thenReturn(mockedJavaProject); + when(mockedDockerAccessFactory.createDockerAccess(any())).thenReturn(mock(DockerAccess.class)); + when(mockedMavenProject.getPackaging()).thenReturn("jar"); + when(mockedMavenProject.getBuild().getDirectory()).thenReturn(temporaryFolder.getAbsolutePath()); + when(mockedJKubeConfiguration.getProject()).thenReturn(mockedJavaProject); + when(mockedJavaProject.getProperties()).thenReturn(new Properties()); + buildMojo = new BuildMojo() {{ + dockerAccessFactory = mockedDockerAccessFactory; + imageConfigResolver = mockedImageConfigResolver; + project = mockedMavenProject; + settings = mockedMavenSettings; + session = mockedMavenSession; + mojoExecution = mockedMojoExecution; + }}; + } + + @AfterEach + void tearDown() { + mavenUtilMockedStatic.close(); + jKubeServiceHubMockedConstruction.close(); + } + + @Test + void execute_withImageConfiguration_shouldDelegateToBuildService() throws Exception { + // Given + buildMojo.resolvedImages = imageConfigurationList; + + // When + buildMojo.execute(); + + // Then + assertThat(jKubeServiceHubMockedConstruction.constructed()).isNotEmpty(); + verify(mockedBuildService).build(any()); + verify(mockedBuildService).postProcess(); + } + + @Test + void execute_withPomPackagingAndSkipBuildPom_shouldDoNothing() throws Exception { + // Given + buildMojo.resolvedImages = imageConfigurationList; + buildMojo.skipBuildPom = true; + when(mockedMavenProject.getPackaging()).thenReturn("pom"); + + // When + buildMojo.execute(); + + // Then + verify(mockedBuildService, times(0)).build(any()); + } + + @Test + void execute_whenBuildServiceFails_thenThrowException() throws Exception { + // Given + doThrow(new JKubeServiceException("failure in build")) + .when(mockedBuildService).build(any()); + + // When + Then + assertThatExceptionOfType(MojoExecutionException.class) + .isThrownBy(() -> buildMojo.execute()) + .withMessage("Failed to execute the build"); + } + + @Test + void execute_whenFailureInInitializingProject_thenThrowException() { + // Given + DependencyResolutionRequiredException dependencyResolutionRequiredException = mock(DependencyResolutionRequiredException.class); + when(dependencyResolutionRequiredException.getMessage()).thenReturn("Attempted to access the artifact foo; which has not yet been resolved"); + mavenUtilMockedStatic.when(() -> MavenUtil.convertMavenProjectToJKubeProject(any(), any())) + .thenThrow(dependencyResolutionRequiredException); + + // When + Then + assertThatExceptionOfType(MojoExecutionException.class) + .isThrownBy(() -> buildMojo.execute()) + .withMessage("Attempted to access the artifact foo; which has not yet been resolved"); } @Test void buildServiceConfigBuilder_shouldReturnNonNullResourceConfigIfConfigured() { // Given - BuildMojo buildMojo = new BuildMojo(); - buildMojo.project = mavenProject; buildMojo.resources = ResourceConfig.builder() .openshiftBuildConfig(OpenshiftBuildConfig.builder() .limit("cpu", "200m") diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojoTest.java index 2850045dd8..5e36f2e38f 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojoTest.java @@ -18,9 +18,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; +import java.util.Collections; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; import io.fabric8.kubernetes.api.model.KubernetesListBuilder; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; import org.apache.maven.settings.Settings; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; @@ -56,6 +59,7 @@ import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class HelmMojoTest { @@ -66,20 +70,27 @@ class HelmMojoTest { @BeforeEach void setUp() { + MojoExecution mockedMojoExecution = mock(MojoExecution.class); + MavenSession mockedMavenSession = mock(MavenSession.class); resourceUtilMockedStatic = mockStatic(ResourceUtil.class); helmMojo = new HelmMojo(); helmMojo.offline = true; helmMojo.project = new MavenProject(); helmMojo.settings = new Settings(); + helmMojo.session = mockedMavenSession; + helmMojo.mojoExecution = mockedMojoExecution; helmMojo.jkubeServiceHub = JKubeServiceHub.builder() .configuration(JKubeConfiguration.builder().build()) .log(new KitLogger.SilentLogger()) .platformMode(RuntimeMode.KUBERNETES) + .summaryEnabled(false) .build(); helmMojo.project.getBuild() .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); helmMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); helmMojo.project.setFile(projectDir.resolve("target").toFile()); + when(mockedMavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:helm")); + when(mockedMojoExecution.getGoal()).thenReturn("k8s:helm"); } @AfterEach diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java index 062a06a92d..3a57dbcb46 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java @@ -14,9 +14,12 @@ package org.eclipse.jkube.maven.plugin.mojo.build; import java.nio.file.Path; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import org.apache.maven.plugin.descriptor.PluginDescriptor; +import org.apache.maven.execution.MavenSession; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; import org.eclipse.jkube.kit.resource.helm.BadUploadException; import org.eclipse.jkube.kit.resource.helm.HelmConfig; @@ -25,7 +28,6 @@ import org.eclipse.jkube.kit.resource.helm.HelmService; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.descriptor.MojoDescriptor; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Server; import org.apache.maven.settings.Settings; @@ -42,6 +44,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; @@ -53,23 +56,29 @@ class HelmPushMojoTest { @TempDir private Path projectDir; + private MavenSession mavenSession; + private MojoExecution mojoExecution; + private HelmPushMojo helmPushMojo; @BeforeEach void setUp() throws Exception { helmPushMojo = new HelmPushMojo(); + mavenSession = mock(MavenSession.class); + mojoExecution = mock(MojoExecution.class, RETURNS_DEEP_STUBS); helmPushMojo.helm = new HelmConfig(); helmPushMojo.project = new MavenProject(); + helmPushMojo.session = mavenSession; helmPushMojo.settings = new Settings(); helmPushMojo.securityDispatcher = mock(SecDispatcher.class); - helmPushMojo.mojoExecution = new MojoExecution(new MojoDescriptor()); + helmPushMojo.mojoExecution = mojoExecution; helmPushMojo.project.getBuild() .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); helmPushMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); helmPushMojo.project.setFile(projectDir.resolve("target").toFile()); - helmPushMojo.mojoExecution.getMojoDescriptor().setPluginDescriptor(new PluginDescriptor()); - helmPushMojo.mojoExecution.getMojoDescriptor().getPluginDescriptor().setGoalPrefix("k8s"); - helmPushMojo.mojoExecution.getMojoDescriptor().setGoal("helm-push"); + when(mojoExecution.getMojoDescriptor().getFullGoalName()).thenReturn("k8s:helm-push"); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:helm-push")); + when(mojoExecution.getGoal()).thenReturn("k8s:helm-push"); when(helmPushMojo.securityDispatcher.decrypt(anyString())) .thenReturn(String.valueOf(AdditionalAnswers.returnsFirstArg())); } @@ -101,6 +110,8 @@ void execute_withValidXMLConfigAndUploadError_shouldFail() { (mock, ctx) -> doThrow(new BadUploadException("Error uploading helm chart")).when(mock).uploadHelmChart(any()) )) { // Given + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:helm-push")); + when(mojoExecution.getGoal()).thenReturn("k8s:helm-push"); helmPushMojo.helm.setStableRepository(completeValidRepository()); helmPushMojo.project.setVersion("1337"); // When & Then @@ -121,6 +132,8 @@ void execute_withValidPropertiesConfig_shouldUpload() throws Exception { helmPushMojo.project.getProperties().put("jkube.helm.snapshotRepository.username", "propsUser"); helmPushMojo.project.getProperties().put("jkube.helm.snapshotRepository.password", "propS3cret"); helmPushMojo.project.setVersion("1337-SNAPSHOT"); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:helm-push")); + when(mojoExecution.getGoal()).thenReturn("k8s:helm-push"); // When helmPushMojo.execute(); // Then @@ -142,6 +155,8 @@ void execute_withValidPropertiesAndXMLConfig_shouldGenerateWithPropertiesTakingP helmPushMojo.helm.setSnapshotRepository(completeValidRepository()); helmPushMojo.project.getProperties().put("jkube.helm.snapshotRepository.password", "propS3cret"); helmPushMojo.project.setVersion("1337-SNAPSHOT"); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:helm-push")); + when(mojoExecution.getGoal()).thenReturn("k8s:helm-push"); // When helmPushMojo.execute(); // Then @@ -162,6 +177,8 @@ void execute_withValidMavenSettings_shouldUpload() throws Exception { // Given helmPushMojo.settings.addServer(completeValidServer()); helmPushMojo.project.setVersion("1337-SNAPSHOT"); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:helm-push")); + when(mojoExecution.getGoal()).thenReturn("k8s:helm-push"); // When helmPushMojo.execute(); // Then @@ -177,6 +194,8 @@ void execute_withValidMavenSettings_shouldUpload() throws Exception { void execute_withSkip_shouldSkipExecution() throws Exception { try (MockedConstruction helmServiceMockedConstruction = mockConstruction(HelmService.class)) { // Given + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:helm-push")); + when(mojoExecution.getGoal()).thenReturn("k8s:helm-push"); helmPushMojo.skip = true; // When helmPushMojo.execute(); diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java index 26b186b37c..cdbf6476ec 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.maven.plugin.mojo.build; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -72,10 +73,12 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { ImageConfigResolver mockedImageConfigResolver = mock(ImageConfigResolver.class, RETURNS_DEEP_STUBS); Properties properties = new Properties(); MavenProject mockedMavenProject = mock(MavenProject.class, RETURNS_DEEP_STUBS); + MavenSession mockedMavenSession = mock(MavenSession.class); mockedResourceService = mock(ResourceService.class, RETURNS_DEEP_STUBS); MojoExecution mockedMojoExecution = mock(MojoExecution.class, RETURNS_DEEP_STUBS); MojoDescriptor mockedMojoDescriptor = mock(MojoDescriptor.class, RETURNS_DEEP_STUBS); when(mockedMojoExecution.getMojoDescriptor()).thenReturn(mockedMojoDescriptor); + when(mockedMojoExecution.getGoal()).thenReturn("k8s:resource"); when(mockedMojoDescriptor.getFullGoalName()).thenReturn("k8s:resource"); defaultEnricherManagerMockedConstruction = mockConstruction(DefaultEnricherManager.class); JavaProject javaProject = JavaProject.builder() @@ -99,6 +102,7 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { this.resourceMojo.images = Collections.singletonList(imageConfiguration); this.resourceMojo.project = mockedMavenProject; this.resourceMojo.settings = mock(Settings.class, RETURNS_DEEP_STUBS); + this.resourceMojo.session = mockedMavenSession; this.resourceMojo.jkubeServiceHub = mockedJKubeServiceHub; this.resourceMojo.log = mock(KitLogger.class, RETURNS_DEEP_STUBS); this.resourceMojo.skipResourceValidation = true; @@ -110,6 +114,7 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { resourceMojo.mojoExecution = mockedMojoExecution; when(mockedMavenProject.getProperties()).thenReturn(properties); + when(mockedMavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:resource")); when(mockedJKubeServiceHub.getConfiguration().getProject()).thenReturn(javaProject); when(mockedJKubeServiceHub.getConfiguration().getBasedir()).thenReturn(temporaryFolder.toFile()); when(mockedJKubeServiceHub.getResourceService()).thenReturn(mockedResourceService); @@ -137,7 +142,7 @@ void executeInternal_whenInvoked_shouldDelegateResourceGenerationToResourceServi .isEqualTo("jkube/test-project"); verify(mockedJKubeServiceHub, times(2)).getResourceService(); verify(mockedResourceService, times(1)).generateResources(eq(PlatformMode.kubernetes), any(), any()); - verify(mockedResourceService, times(1)).writeResources(any(), eq(ResourceClassifier.KUBERNETES), any()); + verify(mockedResourceService, times(1)).writeResources(any(), eq(ResourceClassifier.KUBERNETES), any(), any()); } @Test @@ -152,7 +157,7 @@ void executeInternal_whenSkipTrue_shouldDoNothing() throws MojoExecutionExceptio assertThat(defaultEnricherManagerMockedConstruction.constructed()).isEmpty(); verify(mockedJKubeServiceHub, times(0)).getResourceService(); verify(mockedResourceService, times(0)).generateResources(any(), any(), any()); - verify(mockedResourceService, times(0)).writeResources(any(), any(), any()); + verify(mockedResourceService, times(0)).writeResources(any(), any(), any(), any()); } @Test @@ -167,7 +172,7 @@ void executeInternal_whenSkipResourceTrue_shouldDoNothing() throws MojoExecution assertThat(defaultEnricherManagerMockedConstruction.constructed()).isEmpty(); verify(mockedJKubeServiceHub, times(0)).getResourceService(); verify(mockedResourceService, times(0)).generateResources(any(), any(), any()); - verify(mockedResourceService, times(0)).writeResources(any(), any(), any()); + verify(mockedResourceService, times(0)).writeResources(any(), any(), any(), any()); } @Test @@ -182,7 +187,7 @@ void executeInternal_whenInvoked_shouldWriteResourcesFirstThenValidate() throws assertThat(resourceValidatorMockedConstruction.constructed()).hasSize(1); ResourceValidator mockResourceValidator = resourceValidatorMockedConstruction.constructed().get(0); InOrder inOrder = inOrder(mockedResourceService, mockResourceValidator); - inOrder.verify(mockedResourceService).writeResources(any(), any(), any()); + inOrder.verify(mockedResourceService).writeResources(any(), any(), any(), any()); inOrder.verify(mockResourceValidator).validate(); } } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/SkipGoalsTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/SkipGoalsTest.java index bbd5a26eec..93529258f4 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/SkipGoalsTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/SkipGoalsTest.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.maven.plugin.mojo.build; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecution; import org.eclipse.jkube.kit.common.KitLogger; import org.junit.jupiter.api.BeforeEach; @@ -22,6 +23,8 @@ import org.mockito.Mock; import org.mockito.Spy; +import java.util.Collections; + import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -36,6 +39,9 @@ class SkipGoalsTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private MojoExecution mojoExecution; + @Mock + private MavenSession mavenSession; + @Spy @InjectMocks BuildMojo buildMojo; @@ -82,6 +88,7 @@ private void setupApplyGoal() throws Exception { doNothing().when(applyMojo).init(); doNothing().when(applyMojo).executeInternal(); when(mojoExecution.getMojoDescriptor().getFullGoalName()).thenReturn("k8s:apply"); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:apply")); } @Test diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java index 1c60ddfcc9..bb55185c8f 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java @@ -17,8 +17,11 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collections; import java.util.Properties; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; import org.eclipse.jkube.kit.common.util.AnsiLogger; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; @@ -52,6 +55,8 @@ class DebugMojoTest { private MockedConstruction clusterAccessMockedConstruction; private File kubernetesManifestFile; private MavenProject mavenProject; + private MavenSession mavenSession; + private MojoExecution mockedMojoExecution; private DebugMojo debugMojo; @@ -66,10 +71,16 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class); kubernetesManifestFile = Files.createFile(temporaryFolder.resolve("kubernetes.yml")).toFile(); mavenProject = mock(MavenProject.class); + mavenSession = mock(MavenSession.class); + mockedMojoExecution = mock(MojoExecution.class); when(mavenProject.getProperties()).thenReturn(new Properties()); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:debug")); + when(mockedMojoExecution.getGoal()).thenReturn("k8s:debug"); // @formatter:off debugMojo = new DebugMojo() { { project = mavenProject; + session = mavenSession; + mojoExecution = mockedMojoExecution; settings = mock(Settings.class); kubernetesManifest = kubernetesManifestFile; }}; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java index 5c18155c8e..7a831deae3 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java @@ -15,10 +15,14 @@ import java.io.File; import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; import java.util.Properties; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.openshift.client.OpenShiftClient; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.kit.config.service.PodLogService; @@ -52,7 +56,8 @@ class LogMojoTest { private MockedConstruction podLogServiceMockedConstruction; private File kubernetesManifestFile; private MavenProject mavenProject; - + private MavenSession mockedMavenSession; + private MojoExecution mockedMojoExecution; private LogMojo logMojo; @BeforeEach @@ -67,10 +72,16 @@ void setUp(@TempDir File temporaryFolder) throws IOException { podLogServiceMockedConstruction = mockConstruction(PodLogService.class); kubernetesManifestFile = File.createTempFile("kubernetes", ".yml", temporaryFolder); mavenProject = mock(MavenProject.class); + mockedMavenSession = mock(MavenSession.class); + mockedMojoExecution = mock(MojoExecution.class); when(mavenProject.getProperties()).thenReturn(new Properties()); + when(mockedMavenSession.getGoals()).thenReturn(Arrays.asList("k8s:log", "k8s:apply")); + when(mockedMojoExecution.getGoal()).thenReturn("k8s:log"); // @formatter:off logMojo = new LogMojo() { { project = mavenProject; + session = mockedMavenSession; + mojoExecution = mockedMojoExecution; settings = mock(Settings.class); kubernetesManifest = kubernetesManifestFile; }}; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojoTest.java index 33fae8e3e6..b7b1a033a6 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojoTest.java @@ -13,6 +13,8 @@ */ package org.eclipse.jkube.maven.plugin.mojo.develop; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; import org.eclipse.jkube.kit.remotedev.RemoteDevelopmentService; @@ -22,6 +24,7 @@ import org.junit.jupiter.api.Test; import org.mockito.MockedConstruction; +import java.util.Collections; import java.util.Properties; import java.util.concurrent.CompletableFuture; @@ -43,10 +46,16 @@ class RemoteDevMojoTest { @BeforeEach void setUp() { final MavenProject mavenProject = mock(MavenProject.class); + final MavenSession mavenSession = mock(MavenSession.class); + final MojoExecution mavenMojoExecution = mock(MojoExecution.class); + when(mavenSession.getGoals()).thenReturn(Collections.singletonList("k8s:remote-dev")); + when(mavenMojoExecution.getGoal()).thenReturn("k8s:remote-dev"); when(mavenProject.getProperties()).thenReturn(new Properties()); remoteDevMojo = new RemoteDevMojo() {{ project = mavenProject; settings = mock(Settings.class, RETURNS_DEEP_STUBS); + mojoExecution = mavenMojoExecution; + session = mavenSession; }}; started = new CompletableFuture<>(); remoteDevelopmentService = mockConstruction(RemoteDevelopmentService.class, (mock, ctx) -> diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java index e8e8deb4a6..fe7338efb4 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java @@ -13,23 +13,27 @@ */ package org.eclipse.jkube.maven.plugin.mojo.develop; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; import org.apache.maven.plugin.MojoExecution; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.descriptor.MojoDescriptor; import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; -import org.eclipse.jkube.kit.config.service.kubernetes.KubernetesUndeployService; +import org.eclipse.jkube.kit.config.service.UndeployService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -38,39 +42,51 @@ import org.mockito.MockedStatic; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class UndeployMojoTest { @TempDir private Path temporaryFolder; - private MockedConstruction undeployServiceMockedConstruction; private MockedStatic mavenUtilMockedStatic; + private UndeployService mockedUndeployService; private MockedStatic openshiftHelperMockedStatic; + private MockedConstruction jKubeServiceHubMockedConstruction; private UndeployMojo undeployMojo; @BeforeEach void setUp() throws IOException { - undeployServiceMockedConstruction = mockConstruction(KubernetesUndeployService.class); + File buildDirectory = new File("target"); + KitLogger kitLogger = new KitLogger.SilentLogger(); openshiftHelperMockedStatic = mockStatic(OpenshiftHelper.class); openshiftHelperMockedStatic.when(() -> OpenshiftHelper.isOpenShift(any())).thenReturn(false); mavenUtilMockedStatic = mockStatic(MavenUtil.class); + mockedUndeployService = mock(UndeployService.class); + jKubeServiceHubMockedConstruction = mockConstruction(JKubeServiceHub.class, (mock, ctx) -> { + when(mock.getConfiguration()).thenReturn(JKubeConfiguration.builder() + .project(JavaProject.builder() + .buildDirectory(buildDirectory) + .build()) + .build()); + when(mock.getLog()).thenReturn(kitLogger); + when(mock.getPlatformMode()).thenReturn(RuntimeMode.KUBERNETES); + when(mock.getUndeployService()).thenReturn(mockedUndeployService); + when(mock.getSummaryService()).thenReturn(new SummaryService(buildDirectory, kitLogger, false)); + }); undeployMojo = new UndeployMojo() {{ this.resourceDir = Files.createDirectory(temporaryFolder.resolve("resources")).toFile(); this.kubernetesManifest = Files.createFile(temporaryFolder.resolve("kubernetes.yml")).toFile(); project = new MavenProject(); settings = new Settings(); - jkubeServiceHub = JKubeServiceHub.builder() - .configuration(JKubeConfiguration.builder().build()) - .log(new KitLogger.SilentLogger()) - .platformMode(RuntimeMode.KUBERNETES) - .build(); -// log = new KitLogger.SilentLogger(); mojoExecution = new MojoExecution(new MojoDescriptor()); mojoExecution.getMojoDescriptor().setPluginDescriptor(new PluginDescriptor()); mojoExecution.getMojoDescriptor().getPluginDescriptor().setGoalPrefix("k8s"); @@ -82,7 +98,7 @@ void setUp() throws IOException { void tearDown() { mavenUtilMockedStatic.close(); openshiftHelperMockedStatic.close(); - undeployServiceMockedConstruction.close(); + jKubeServiceHubMockedConstruction.close(); undeployMojo = null; } @@ -117,13 +133,26 @@ void execute_withCustomProperties() throws Exception { .hasFieldOrPropertyWithValue("namespace", "custom-namespace"); } + @Test + void execute_whenUndeployServiceFails_thenExceptionThrown() throws IOException { + // Given + doThrow(new IOException("failure")) + .when(mockedUndeployService).undeploy(any(), any(), any()); + + // When + assertThatExceptionOfType(MojoExecutionException.class) + .isThrownBy(() -> undeployMojo.execute()) + .withMessage("failure"); + } + private void assertUndeployServiceUndeployWasCalled() throws Exception { - verify(undeployServiceMockedConstruction.constructed().get(0), times(1)) + verify(mockedUndeployService, times(1)) .undeploy(eq(Collections.singletonList(temporaryFolder.resolve("resources").toFile())), any(), eq(temporaryFolder.resolve("kubernetes.yml").toFile())); } - private void assertUndeployServiceUndeployWasNotCalled() { - assertThat(undeployServiceMockedConstruction.constructed()).isEmpty(); + private void assertUndeployServiceUndeployWasNotCalled() throws IOException { + verify(mockedUndeployService, times(0)) + .undeploy(any(), any(), any()); } } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java index 90d64b9ac1..4aa703b370 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java @@ -22,6 +22,7 @@ import org.eclipse.jkube.kit.build.service.docker.config.handler.ImageConfigResolver; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.service.SummaryService; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.ApplyService; @@ -72,8 +73,9 @@ void setUp(@TempDir File temporaryFolder) throws IOException { mockedJavaProject = mock(JavaProject.class); mockedClusterAccess = mock(ClusterAccess.class); watcherManagerMockedStatic = mockStatic(WatcherManager.class); + SummaryService mockedSummaryService = mock(SummaryService.class); - when(mockedJKubeServiceHub.getApplyService()).thenReturn(new ApplyService(mockKubernetesClient, new KitLogger.SilentLogger())); + when(mockedJKubeServiceHub.getApplyService()).thenReturn(new ApplyService(mockKubernetesClient, new KitLogger.SilentLogger(), mockedSummaryService)); when(mockedJavaProject.getProperties()).thenReturn(new Properties()); when(mavenProject.getArtifactId()).thenReturn("artifact-id"); when(mavenProject.getVersion()).thenReturn("1337");