use of org.ballerinax.kubernetes.models.IngressModel in project kubernetes by ballerinax.
the class KubernetesAnnotationProcessor method createArtifacts.
/**
* Generate kubernetes artifacts.
*
* @param kubernetesDataHolder Kubernetes data holder object
* @param balxFilePath ballerina file path
* @param outputDir output directory to save artifacts
* @throws KubernetesPluginException if an error ocurrs while generating artifacts
*/
void createArtifacts(KubernetesDataHolder kubernetesDataHolder, String balxFilePath, String outputDir) throws KubernetesPluginException {
DeploymentModel deploymentModel = kubernetesDataHolder.getDeploymentModel();
if (deploymentModel == null) {
deploymentModel = getDefaultDeploymentModel(balxFilePath);
}
kubernetesDataHolder.setDeploymentModel(deploymentModel);
deploymentModel.setPorts(kubernetesDataHolder.getPorts());
deploymentModel.setPodAutoscalerModel(kubernetesDataHolder.getPodAutoscalerModel());
deploymentModel.setSecretModels(kubernetesDataHolder.getSecrets());
deploymentModel.setConfigMapModels(kubernetesDataHolder.getConfigMaps());
deploymentModel.setVolumeClaimModels(kubernetesDataHolder.getPersistentVolumeClaims());
// Service
Collection<ServiceModel> serviceModels = kubernetesDataHolder.getEndpointToServiceModelMap().values();
int count = 0;
for (ServiceModel serviceModel : serviceModels) {
count++;
generateService(serviceModel, balxFilePath, outputDir);
out.print("@kubernetes:Service \t\t\t - complete " + count + "/" + serviceModels.size() + "\r");
}
// ingress
count = 0;
Map<IngressModel, Set<String>> ingressModels = kubernetesDataHolder.getIngressToEndpointMap();
if (ingressModels.size() > 0) {
out.println();
}
int size = ingressModels.size();
Map<String, ServiceModel> endpointMap = kubernetesDataHolder.getEndpointToServiceModelMap();
Iterator<Map.Entry<IngressModel, Set<String>>> iterator = ingressModels.entrySet().iterator();
Map<String, Set<SecretModel>> secretModelsMap = kubernetesDataHolder.getSecretModels();
while (iterator.hasNext()) {
Map.Entry<IngressModel, Set<String>> pair = iterator.next();
IngressModel ingressModel = pair.getKey();
Set<String> endpoints = pair.getValue();
for (String endpointName : endpoints) {
ServiceModel serviceModel = endpointMap.get(endpointName);
ingressModel.setServiceName(serviceModel.getName());
ingressModel.setServicePort(serviceModel.getPort());
if (secretModelsMap.get(endpointName) != null && secretModelsMap.get(endpointName).size() != 0) {
ingressModel.setEnableTLS(true);
}
}
generateIngress(ingressModel, balxFilePath, outputDir);
count++;
out.print("@kubernetes:Ingress \t\t\t - complete " + count + "/" + size + "\r");
iterator.remove();
}
// secret
count = 0;
Collection<SecretModel> secretModels = kubernetesDataHolder.getSecrets();
if (secretModels.size() > 0) {
out.println();
}
for (SecretModel secretModel : secretModels) {
count++;
generateSecrets(secretModel, balxFilePath, outputDir);
out.print("@kubernetes:Secret \t\t\t - complete " + count + "/" + secretModels.size() + "\r");
}
// configMap
count = 0;
Collection<ConfigMapModel> configMapModels = kubernetesDataHolder.getConfigMaps();
if (configMapModels.size() > 0) {
out.println();
}
for (ConfigMapModel configMapModel : configMapModels) {
count++;
if (configMapModel.isBallerinaConf()) {
if (configMapModel.getData().size() != 1) {
throw new KubernetesPluginException("There can be only 1 ballerina config file");
}
deploymentModel.setCommandArgs(" --config ${CONFIG_FILE} ");
deploymentModel.addEnv("CONFIG_FILE", configMapModel.getMountPath() + File.separator + configMapModel.getData().keySet().iterator().next());
}
generateConfigMaps(configMapModel, balxFilePath, outputDir);
out.print("@kubernetes:ConfigMap \t\t\t - complete " + count + "/" + configMapModels.size() + "\r");
}
// volume mount
count = 0;
Collection<PersistentVolumeClaimModel> volumeClaims = kubernetesDataHolder.getPersistentVolumeClaims();
if (volumeClaims.size() > 0) {
out.println();
}
for (PersistentVolumeClaimModel claimModel : volumeClaims) {
count++;
generatePersistentVolumeClaim(claimModel, balxFilePath, outputDir);
out.print("@kubernetes:VolumeClaim \t\t - complete " + count + "/" + volumeClaims.size() + "\r");
}
out.println();
generateDeployment(deploymentModel, balxFilePath, outputDir);
out.println();
out.println("@kubernetes:Deployment \t\t\t - complete 1/1");
out.println();
printKubernetesInstructions(outputDir);
}
use of org.ballerinax.kubernetes.models.IngressModel in project kubernetes by ballerinax.
the class KubernetesIngressGeneratorTests method testIngressGenerator.
@Test
public void testIngressGenerator() {
IngressModel ingressModel = new IngressModel();
ingressModel.setName("MyIngress");
ingressModel.setHostname("abc.com");
ingressModel.setPath("/helloworld");
ingressModel.setServicePort(9090);
ingressModel.setIngressClass("nginx");
ingressModel.setServiceName("HelloWorldService");
Map<String, String> labels = new HashMap<>();
labels.put(KubernetesConstants.KUBERNETES_SELECTOR_KEY, "TestAPP");
ingressModel.setLabels(labels);
IngressHandler kubernetesIngressGenerator = new IngressHandler(ingressModel);
try {
String ingressYaml = kubernetesIngressGenerator.generate();
Assert.assertNotNull(ingressYaml);
File artifactLocation = new File("target/kubernetes");
artifactLocation.mkdir();
File tempFile = File.createTempFile("temp", ingressModel.getName() + ".yaml", artifactLocation);
KubernetesUtils.writeToFile(ingressYaml, tempFile.getPath());
log.info("Generated YAML: \n" + ingressYaml);
Assert.assertTrue(tempFile.exists());
// tempFile.deleteOnExit();
} catch (IOException e) {
Assert.fail("Unable to write to file");
} catch (KubernetesPluginException e) {
Assert.fail("Unable to generate yaml from ingress");
}
}
use of org.ballerinax.kubernetes.models.IngressModel in project kubernetes by ballerinax.
the class KubernetesAnnotationProcessor method processIngressAnnotation.
/**
* Process annotations and create Ingress model object.
*
* @param serviceName Ballerina service name
* @param attachmentNode annotation attachment node.
* @return Ingress model object
*/
IngressModel processIngressAnnotation(String serviceName, AnnotationAttachmentNode attachmentNode) throws KubernetesPluginException {
IngressModel ingressModel = new IngressModel();
List<BLangRecordLiteral.BLangRecordKeyValue> keyValues = ((BLangRecordLiteral) ((BLangAnnotationAttachment) attachmentNode).expr).getKeyValuePairs();
for (BLangRecordLiteral.BLangRecordKeyValue keyValue : keyValues) {
IngressConfiguration ingressConfiguration = IngressConfiguration.valueOf(keyValue.getKey().toString());
String annotationValue = resolveValue(keyValue.getValue().toString());
switch(ingressConfiguration) {
case name:
ingressModel.setName(getValidName(annotationValue));
break;
case labels:
ingressModel.setLabels(getMap(((BLangRecordLiteral) keyValue.valueExpr).keyValuePairs));
break;
case path:
ingressModel.setPath(annotationValue);
break;
case targetPath:
ingressModel.setTargetPath(annotationValue);
break;
case hostname:
ingressModel.setHostname(annotationValue);
break;
case ingressClass:
ingressModel.setIngressClass(annotationValue);
break;
case enableTLS:
ingressModel.setEnableTLS(Boolean.parseBoolean(annotationValue));
break;
default:
break;
}
}
if (ingressModel.getName() == null || ingressModel.getName().length() == 0) {
ingressModel.setName(getValidName(serviceName) + INGRESS_POSTFIX);
}
if (ingressModel.getHostname() == null || ingressModel.getHostname().length() == 0) {
ingressModel.setHostname(getValidName(serviceName) + INGRESS_HOSTNAME_POSTFIX);
}
return ingressModel;
}
Aggregations