use of io.fabric8.kubernetes.api.model.KubernetesListBuilder in project fabric8 by fabric8io.
the class KubernetesModelProcessorProcessor method process.
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
CompilationTaskFactory compilationTaskFactory = new CompilationTaskFactory(processingEnv);
Set<TypeElement> processors = new HashSet<>();
// 1st pass collect classes to compile.
for (Element element : roundEnv.getElementsAnnotatedWith(KubernetesModelProcessor.class)) {
processors.add(getClassElement(element));
}
if (processors.isEmpty()) {
return true;
}
StringWriter writer = new StringWriter();
try {
Callable<Boolean> compileTask = compilationTaskFactory.create(processors, writer);
if (!compileTask.call()) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to compile provider classes. See output below.");
printCompileErrors(compilationTaskFactory);
return false;
}
} catch (Exception e) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Error to compile provider classes, due to: " + e.getMessage() + ". See output below.");
return false;
} finally {
String output = writer.toString();
if (Strings.isNullOrBlank(output)) {
output = "success";
}
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Fabric8 model generator compiler output:" + output);
}
// 2nd pass generate json.
for (Element element : roundEnv.getElementsAnnotatedWith(KubernetesModelProcessor.class)) {
KubernetesModelProcessor annotation = element.getAnnotation(KubernetesModelProcessor.class);
String kubernetesJsonFileName = annotation.value();
KubernetesResource json = readJson(kubernetesJsonFileName);
Builder<? extends KubernetesResource> builder;
if (json instanceof KubernetesList) {
builder = new KubernetesListBuilder((KubernetesList) json);
} else if (json instanceof Template) {
builder = new TemplateBuilder((Template) json);
} else if (json != null) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unknown Kubernetes json type:" + json.getClass());
return false;
} else {
return false;
}
try {
if (element instanceof TypeElement) {
for (ExecutableElement methodElement : ElementFilter.methodsIn(element.getEnclosedElements())) {
TypeElement classElement = getClassElement(element);
Class<?> cls = Class.forName(classElement.getQualifiedName().toString());
final Object instance = cls.newInstance();
final String methodName = methodElement.getSimpleName().toString();
if (builder instanceof Visitable) {
((Visitable) builder).accept(new Visitor() {
@Override
public void visit(Object o) {
for (Method m : findMethods(instance, methodName, o.getClass())) {
Named named = m.getAnnotation(Named.class);
if (named != null && !Strings.isNullOrBlank(named.value())) {
String objectName = getName(o);
// If a name has been explicitly specified check if there is a match
if (!named.value().equals(objectName)) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Named method:" + m.getName() + " with name:" + named.value() + " doesn't match: " + objectName + ", ignoring");
return;
}
}
try {
m.invoke(instance, o);
} catch (IllegalAccessException e) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Error invoking visitor method:" + m.getName() + " on:" + instance + "with argument:" + o);
} catch (InvocationTargetException e) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Error invoking visitor method:" + m.getName() + " on:" + instance + "with argument:" + o);
}
}
}
});
} else {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Json type is not visitable.");
}
}
}
json = builder.build();
generateJson(kubernetesJsonFileName, json);
} catch (Exception ex) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Error creating Kubernetes configuration:" + ex.getMessage());
}
}
return true;
}
use of io.fabric8.kubernetes.api.model.KubernetesListBuilder in project fabric8-maven-plugin by fabric8io.
the class ResourceMojo method moveTemplatesToTopLevel.
private void moveTemplatesToTopLevel(KubernetesListBuilder builder, List<HasMetadata> objects) {
Template template = extractAndRemoveTemplates(objects);
if (template != null) {
openshiftDependencyResources.addMissingParameters(template);
builder.addToItems(template);
} else {
for (HasMetadata object : objects) {
builder.addToItems(object);
}
}
}
use of io.fabric8.kubernetes.api.model.KubernetesListBuilder in project fabric8-maven-plugin by fabric8io.
the class ResourceMojo method addServices.
private void addServices(KubernetesListBuilder builder, List<ServiceConfig> serviceConfig) {
if (serviceConfig != null) {
ServiceHandler serviceHandler = handlerHub.getServiceHandler();
builder.addToServiceItems(toArray(serviceHandler.getServices(serviceConfig)));
}
}
use of io.fabric8.kubernetes.api.model.KubernetesListBuilder in project fabric8-maven-plugin by fabric8io.
the class AppCatalogMojo method executeInternal.
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, true);
}
if (kubernetesResources.isEmpty()) {
log.warn("No Kubernetes resources generated");
} else {
writeResources(new KubernetesListBuilder().withItems(kubernetesResources).build(), ResourceClassifier.KUBERNETES, true);
}
// lets remove the dependencies which are not app templates
removeGeneratedFilesNotMatchingSuffix("kubernetes", kubernetesTemplateFileNames);
removeGeneratedFilesNotMatchingSuffix("openshift", openshiftTemplateFileNames);
}
use of io.fabric8.kubernetes.api.model.KubernetesListBuilder in project fabric8-maven-plugin by fabric8io.
the class OpenshiftBuildService method applyResourceObjects.
private void applyResourceObjects(BuildServiceConfig config, OpenShiftClient client, KubernetesListBuilder builder) throws Exception {
// Adding a workaround to handle intermittent Socket closed errors while
// building on OpenShift. See https://github.com/fabric8io/fabric8-maven-plugin/issues/1133
// for more details.
int nTries = 0;
boolean bResourcesCreated = false;
Exception buildException = null;
do {
try {
if (config.getEnricherTask() != null) {
config.getEnricherTask().execute(builder);
}
if (builder.hasItems()) {
KubernetesList k8sList = builder.build();
client.lists().create(k8sList);
}
// If we are here, it means resources got created successfully.
bResourcesCreated = true;
} catch (Exception aException) {
// Retry only when Exception is of socket closed message.
if (aException.getMessage() != null && aException.getMessage().contains("Socket closed")) {
log.warn("Problem encountered while applying resource objects, retrying..");
buildException = aException;
nTries++;
Thread.sleep(RESOURCE_CREATION_RETRY_TIMEOUT_IN_MILLIS);
// Make a connection to cluster again.
client = clusterAccess.createDefaultClient(log);
} else {
// and simply throw as it is.
throw new MojoExecutionException(aException.getMessage());
}
}
} while (nTries < RESOURCE_CREATION_RETRIES && !bResourcesCreated);
if (!bResourcesCreated)
throw new MojoExecutionException(buildException.getMessage());
}
Aggregations