public void executeInternal()

in plugin/src/main/java/io/fabric8/maven/plugin/mojo/build/AppCatalogMojo.java [78:244]


    public void executeInternal() throws MojoExecutionException, MojoFailureException {
        List<HasMetadata> openshiftResources = new ArrayList<>();
        List<HasMetadata> kubernetesResources = new ArrayList<>();

        Map<URL, KubernetesResource> openshiftMap = loadYamlResourcesOnClassPath("META-INF/fabric8/openshift.yml");
        log.info("Found " + openshiftMap.size() + " openshift resources");
        for (Map.Entry<URL, KubernetesResource> entry : openshiftMap.entrySet()) {
            URL url = entry.getKey();
            KubernetesResource<?> resource = entry.getValue();
            Template template = null;
            if (resource instanceof Template) {
                template = (Template) resource;
                getOrCreateAnnotations(template).put(RESOURCE_APP_CATALOG_ANNOTATION, "true");
                log.debug("Found Template " + getName(template) + " with " + notNullList(template.getParameters()).size() + " parameters");
            } else {
                TemplateBuilder builder = new TemplateBuilder();
                boolean foundMetadata = false;
                if (resource instanceof HasMetadata) {
                    HasMetadata hasMetadata = (HasMetadata) resource;
                    ObjectMeta metadata = hasMetadata.getMetadata();
                    if (metadata != null) {
                        if (Strings.isNotBlank(metadata.getName())) {
                            foundMetadata = true;
                            getOrCreateAnnotations(hasMetadata).put(RESOURCE_APP_CATALOG_ANNOTATION, "true");
                            builder.withMetadata(metadata);
                        }
                    }
                }
                if (!foundMetadata) {
                    Map<String, String> labels = new HashMap<>();
                    Map<String, String> annotations = new HashMap<>();
                    annotations.put(RESOURCE_APP_CATALOG_ANNOTATION, "true");
                    String name = extractNameFromURL(url, labels);
                    if (name.equals("META-INF")) {
                        log.debug("Ignoring local build dependency %s", url);
                        continue;
                    }
                    if (Strings.isNullOrBlank(name)) {
                        log.warn("Cannot generate a template name from URL: %s", url);
                        continue;
                    }
                    populateLabelsFromResources(resource, labels);
                    populateAnnotationsFromResources(resource, annotations);
                    builder.withNewMetadata().withName(name).withLabels(labels).withAnnotations(annotations).endMetadata();
                }
                if (resource instanceof KubernetesList) {
                    KubernetesList list = (KubernetesList) resource;
                    List<HasMetadata> items = list.getItems();
                    if (items == null || items.isEmpty()) {
                        log.warn("Ignoring resource %s as it contains a List which contains no items!", url);
                        continue;
                    }
                    builder.withObjects(items);
                }
                template = builder.build();
            }
            if (template != null) {
                openshiftResources.add(template);
            }
        }
        Map<String, Template> kubernetesTemplates = new HashMap<>();
        Map<URL, KubernetesResource> kubernetesTemplateMap = loadYamlResourcesOnClassPath("META-INF/fabric8/" + KUBERNETES_TEMPLATE.getValue() + ".yml");
        for (Map.Entry<URL, KubernetesResource> entry : kubernetesTemplateMap.entrySet()) {
            URL url = entry.getKey();
            KubernetesResource<?> resource = entry.getValue();
            if (resource instanceof Template) {
                Template template = (Template) resource;
                String name = getName(template);
                if (Strings.isNullOrBlank(name)) {
                    log.warn("Ignoring Template from %s as it has no name!", url);
                    continue;
                }
                if (kubernetesTemplates.containsKey(name)) {
                    log.warn("Found duplicate template named: %s for url: %s", name, url);
                }
                kubernetesTemplates.put(name, template);
            }
        }

        Set<String> kubernetesTemplateFileNames = new HashSet<>();
        Set<String> openshiftTemplateFileNames = new HashSet<>();

        Map<URL, KubernetesResource> kubernetesMap = loadYamlResourcesOnClassPath("META-INF/fabric8/kubernetes.yml");
        for (Map.Entry<URL, KubernetesResource> entry : kubernetesMap.entrySet()) {
            URL url = entry.getKey();
            KubernetesResource<?> resource = entry.getValue();
            Map<String, String> labels = new HashMap<>();
            Map<String, String> annotations = new HashMap<>();
            String name = extractNameFromURL(url, labels);
            if (name.equals("META-INF")) {
                log.debug("Ignoring local build dependency %s", url);
                continue;
            }
            if (Strings.isNullOrBlank(name)) {
                log.warn("Cannot generate a template name from URL: %s", url);
                continue;
            }
            if (kubernetesTemplates.containsKey(name)) {
                log.info("Ignoring duplicate template %s from url: %s", name, url);
                continue;
            }
            populateLabelsFromResources(resource, labels);
            populateAnnotationsFromResources(resource, annotations);
            TemplateBuilder builder = new TemplateBuilder();
            builder.withNewMetadata().withName(name).withLabels(labels).withAnnotations(annotations).endMetadata();

            if (resource instanceof KubernetesList) {
                KubernetesList list = (KubernetesList) resource;
                List<HasMetadata> items = list.getItems();
                if (items == null || items.isEmpty()) {
                    log.warn("Ignoring resource %s as it contains a List which contains no items!", url);
                    continue;
                }
                builder.withObjects(items);
            } else if (resource instanceof HasMetadata) {
                HasMetadata hasMetadata = (HasMetadata) resource;
                builder.withObjects(hasMetadata);
            }
            Template template = builder.build();
            if (template != null) {
                kubernetesTemplates.put(name, template);
                openshiftTemplateFileNames.add(name + "-template.yml");
            }
        }
        for (Map.Entry<String, Template> entry : kubernetesTemplates.entrySet()) {
            String name = entry.getKey();
            Template template = entry.getValue();
            String templateYaml = null;
            try {
                templateYaml = KubernetesHelper.toYaml(template);
            } catch (IOException e) {
                throw new MojoExecutionException("Failed to convert template " + name + " into YAML: " + e, e);
            }
            String catalogName = "catalog-" + name;

            Map<String, String> labels = new LinkedHashMap<>(KubernetesHelper.getLabels(template));
            Map<String, String> annotations = getOrCreateAnnotations(template);
            annotations.put(RESOURCE_APP_CATALOG_ANNOTATION, "true");
            populateLabelsFromResources(template, labels);
            populateAnnotationsFromResources(template, annotations);
            labels.put("kind", "catalog");

            Map<String, String> data = new HashMap<>();
            data.put(catalogName + ".yml", templateYaml);
            kubernetesTemplateFileNames.add(catalogName + "-configmap.yml");

            ConfigMap configMap = new ConfigMapBuilder().
                    withNewMetadata().withName(catalogName).withLabels(labels).withAnnotations(annotations).endMetadata().
                    withData(data).build();
            kubernetesResources.add(configMap);
        }
        if (openshiftResources.isEmpty()) {
            log.warn("No OpenShift resources generated");
        } else {
            writeResources(new KubernetesListBuilder().withItems(openshiftResources).build(), ResourceClassifier.OPENSHIFT);
        }

        if (kubernetesResources.isEmpty()) {
            log.warn("No Kubernetes resources generated");
        } else {
            writeResources(new KubernetesListBuilder().withItems(kubernetesResources).build(), ResourceClassifier.KUBERNETES);
        }

        // lets remove the dependencies which are not app templates
        removeGeneratedFilesNotMatchingSuffix("kubernetes", kubernetesTemplateFileNames);
        removeGeneratedFilesNotMatchingSuffix("openshift", openshiftTemplateFileNames);
    }