use of org.ballerinax.kubernetes.models.ServiceModel 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.ServiceModel in project kubernetes by ballerinax.
the class KubernetesServiceGeneratorTests method testServiceGenerate.
@Test
public void testServiceGenerate() {
ServiceModel serviceModel = new ServiceModel();
serviceModel.setName("MyService");
serviceModel.setPort(9090);
serviceModel.setServiceType("NodePort");
serviceModel.setSelector("MyAPP");
Map<String, String> labels = new HashMap<>();
labels.put(KubernetesConstants.KUBERNETES_SELECTOR_KEY, "TestAPP");
serviceModel.setLabels(labels);
ServiceHandler kubernetesServiceGenerator = new ServiceHandler(serviceModel);
try {
String serviceYAML = kubernetesServiceGenerator.generate();
Assert.assertNotNull(serviceYAML);
File artifactLocation = new File("target/kubernetes");
artifactLocation.mkdir();
File tempFile = File.createTempFile("temp", serviceModel.getName() + ".yaml", artifactLocation);
KubernetesUtils.writeToFile(serviceYAML, tempFile.getPath());
log.info("Generated YAML: \n" + serviceYAML);
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 service");
}
}
use of org.ballerinax.kubernetes.models.ServiceModel in project kubernetes by ballerinax.
the class KubernetesPlugin method process.
@Override
public void process(EndpointNode endpointNode, List<AnnotationAttachmentNode> annotations) {
String endpointName = endpointNode.getName().getValue();
ServiceModel serviceModel = null;
setCanProcess(true);
for (AnnotationAttachmentNode attachmentNode : annotations) {
String annotationKey = attachmentNode.getAnnotationName().getValue();
try {
switch(annotationKey) {
case "Service":
serviceModel = kubernetesAnnotationProcessor.processServiceAnnotation(endpointName, attachmentNode);
kubernetesDataHolder.addServiceModel(endpointName, serviceModel);
break;
case "Deployment":
kubernetesDataHolder.setDeploymentModel(kubernetesAnnotationProcessor.processDeployment(attachmentNode));
break;
default:
break;
}
} catch (KubernetesPluginException e) {
dlog.logDiagnostic(Diagnostic.Kind.ERROR, endpointNode.getPosition(), e.getMessage());
}
}
List<BLangRecordLiteral.BLangRecordKeyValue> keyValues = ((BLangRecordLiteral) ((BLangEndpoint) endpointNode).configurationExpr).getKeyValuePairs();
for (BLangRecordLiteral.BLangRecordKeyValue keyValue : keyValues) {
String key = keyValue.getKey().toString();
switch(key) {
case "port":
int port = Integer.parseInt(keyValue.getValue().toString());
kubernetesDataHolder.addPort(port);
if (serviceModel != null) {
serviceModel.setPort(port);
}
break;
case "secureSocket":
List<BLangRecordLiteral.BLangRecordKeyValue> sslKeyValues = ((BLangRecordLiteral) keyValue.valueExpr).getKeyValuePairs();
try {
Set<SecretModel> secretModels = kubernetesAnnotationProcessor.processSecureSocketAnnotation(endpointName, sslKeyValues);
kubernetesDataHolder.addEndpointSecret(endpointName, secretModels);
kubernetesDataHolder.addSecrets(secretModels);
} catch (KubernetesPluginException e) {
dlog.logDiagnostic(Diagnostic.Kind.ERROR, null, e.getMessage());
}
break;
default:
break;
}
}
}
use of org.ballerinax.kubernetes.models.ServiceModel in project kubernetes by ballerinax.
the class KubernetesAnnotationProcessor method processServiceAnnotation.
/**
* Process annotations and create service model object.
*
* @param endpointName ballerina service name
* @param attachmentNode annotation attachment node.
* @return Service model object
*/
ServiceModel processServiceAnnotation(String endpointName, AnnotationAttachmentNode attachmentNode) throws KubernetesPluginException {
ServiceModel serviceModel = new ServiceModel();
List<BLangRecordLiteral.BLangRecordKeyValue> keyValues = ((BLangRecordLiteral) ((BLangAnnotationAttachment) attachmentNode).expr).getKeyValuePairs();
for (BLangRecordLiteral.BLangRecordKeyValue keyValue : keyValues) {
ServiceConfiguration serviceConfiguration = ServiceConfiguration.valueOf(keyValue.getKey().toString());
String annotationValue = resolveValue(keyValue.getValue().toString());
switch(serviceConfiguration) {
case name:
serviceModel.setName(getValidName(annotationValue));
break;
case labels:
serviceModel.setLabels(getMap(((BLangRecordLiteral) keyValue.valueExpr).keyValuePairs));
break;
case serviceType:
serviceModel.setServiceType(annotationValue);
break;
case port:
serviceModel.setPort(Integer.parseInt(annotationValue));
break;
default:
break;
}
}
if (serviceModel.getName() == null) {
serviceModel.setName(getValidName(endpointName) + SVC_POSTFIX);
}
return serviceModel;
}
Aggregations