diff --git a/java/operator/org.eclipse.theia.cloud.operator/src/main/java/org/eclipse/theia/cloud/operator/handler/appdef/EagerStartAppDefinitionAddedHandler.java b/java/operator/org.eclipse.theia.cloud.operator/src/main/java/org/eclipse/theia/cloud/operator/handler/appdef/EagerStartAppDefinitionAddedHandler.java index 97db8166..d92d779d 100644 --- a/java/operator/org.eclipse.theia.cloud.operator/src/main/java/org/eclipse/theia/cloud/operator/handler/appdef/EagerStartAppDefinitionAddedHandler.java +++ b/java/operator/org.eclipse.theia.cloud.operator/src/main/java/org/eclipse/theia/cloud/operator/handler/appdef/EagerStartAppDefinitionAddedHandler.java @@ -163,6 +163,86 @@ public boolean appDefinitionAdded(AppDefinition appDefinition, String correlatio return true; } + @Override + public boolean appDefinitionModified(AppDefinition appDefinition, String correlationId) { + AppDefinitionSpec spec = appDefinition.getSpec(); + LOGGER.info(formatLogMessage(correlationId, "Handling " + spec)); + + String appDefinitionResourceName = appDefinition.getMetadata().getName(); + String appDefinitionResourceUID = appDefinition.getMetadata().getUid(); + int instances = spec.getMinInstances(); + + /* Create ingress if not existing */ + if (!TheiaCloudIngressUtil.checkForExistingIngressAndAddOwnerReferencesIfMissing(client.kubernetes(), + client.namespace(), appDefinition, correlationId)) { + LOGGER.error(formatLogMessage(correlationId, + "Expected ingress '" + spec.getIngressname() + "' for app definition '" + appDefinitionResourceName + + "' does not exist. Abort handling app definition.")); + return false; + } else { + LOGGER.trace(formatLogMessage(correlationId, "Ingress available already")); + } + + /* Get existing services for this app definition */ + List existingServices = K8sUtil.getExistingServices(client.kubernetes(), client.namespace(), + appDefinitionResourceName, appDefinitionResourceUID); + + /* Compute missing services */ + Set missingServiceIds = TheiaCloudServiceUtil.computeIdsOfMissingServices(appDefinition, correlationId, + instances, existingServices); + + Map labelsToAdd = new HashMap(); + + /* Create missing services for this app definition */ + for (int instance : missingServiceIds) { + createAndApplyService(client.kubernetes(), client.namespace(), correlationId, appDefinitionResourceName, + appDefinitionResourceUID, instance, appDefinition, arguments.isUseKeycloak(), labelsToAdd); + } + + if (arguments.isUseKeycloak()) { + /* Get existing configmaps for this app definition */ + List existingConfigMaps = K8sUtil.getExistingConfigMaps(client.kubernetes(), client.namespace(), + appDefinitionResourceName, appDefinitionResourceUID); + List existingProxyConfigMaps = existingConfigMaps.stream()// + .filter(configmap -> LABEL_VALUE_PROXY.equals(configmap.getMetadata().getLabels().get(LABEL_KEY)))// + .collect(Collectors.toList()); + List existingEmailsConfigMaps = existingConfigMaps.stream()// + .filter(configmap -> LABEL_VALUE_EMAILS.equals(configmap.getMetadata().getLabels().get(LABEL_KEY)))// + .collect(Collectors.toList()); + + /* Compute missing configmaps */ + Set missingProxyIds = TheiaCloudConfigMapUtil.computeIdsOfMissingProxyConfigMaps(appDefinition, + correlationId, instances, existingProxyConfigMaps); + Set missingEmailIds = TheiaCloudConfigMapUtil.computeIdsOfMissingEmailConfigMaps(appDefinition, + correlationId, instances, existingEmailsConfigMaps); + + /* Create missing configmaps for this app definition */ + for (int instance : missingProxyIds) { + createAndApplyProxyConfigMap(client.kubernetes(), client.namespace(), correlationId, + appDefinitionResourceName, appDefinitionResourceUID, instance, appDefinition, labelsToAdd); + } + for (int instance : missingEmailIds) { + createAndApplyEmailConfigMap(client.kubernetes(), client.namespace(), correlationId, + appDefinitionResourceName, appDefinitionResourceUID, instance, appDefinition, labelsToAdd); + } + } + + /* Get existing deployments for this app definition */ + List existingDeployments = K8sUtil.getExistingDeployments(client.kubernetes(), client.namespace(), + appDefinitionResourceName, appDefinitionResourceUID); + + /* Compute missing deployments */ + Set missingDeploymentIds = TheiaCloudDeploymentUtil.computeIdsOfMissingDeployments(appDefinition, + correlationId, instances, existingDeployments); + + /* Create missing deployments for this app definition */ + for (int instance : missingDeploymentIds) { + createAndApplyDeployment(client.kubernetes(), client.namespace(), correlationId, appDefinitionResourceName, + appDefinitionResourceUID, instance, appDefinition, arguments.isUseKeycloak(), labelsToAdd); + } + return true; + } + protected void createAndApplyService(NamespacedKubernetesClient client, String namespace, String correlationId, String appDefinitionResourceName, String appDefinitionResourceUID, int instance, AppDefinition appDefinition, boolean useOAuth2Proxy, Map labelsToAdd) {