This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit d29fcb5f8aa263f9b0d4b0b48e9c5b0fc4dfae9a
Author: Alex Heneveld <[email protected]>
AuthorDate: Thu Aug 11 14:32:13 2022 +0100

    expose cleaning up a namespace on containers
---
 .../tasks/kubectl/ContainerTaskFactory.java        | 93 +++++++++++++---------
 1 file changed, 57 insertions(+), 36 deletions(-)

diff --git 
a/software/base/src/main/java/org/apache/brooklyn/tasks/kubectl/ContainerTaskFactory.java
 
b/software/base/src/main/java/org/apache/brooklyn/tasks/kubectl/ContainerTaskFactory.java
index bab7b06fcb..a78c1cb6de 100644
--- 
a/software/base/src/main/java/org/apache/brooklyn/tasks/kubectl/ContainerTaskFactory.java
+++ 
b/software/base/src/main/java/org/apache/brooklyn/tasks/kubectl/ContainerTaskFactory.java
@@ -18,7 +18,6 @@
  */
 package org.apache.brooklyn.tasks.kubectl;
 
-import com.google.common.base.Stopwatch;
 import com.google.common.collect.Lists;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.Task;
@@ -59,7 +58,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -98,41 +96,15 @@ public class ContainerTaskFactory<T extends 
ContainerTaskFactory<T,RET>,RET> imp
                         argumentsCfg = 
MutableList.of(argumentsCfgO.stream().map(x -> 
""+x).collect(Collectors.joining("\n")));
                     }
 
-                    String containerImage = EntityInitializers.resolve(config, 
CONTAINER_IMAGE);
                     PullPolicy containerImagePullPolicy = 
EntityInitializers.resolve(config, CONTAINER_IMAGE_PULL_POLICY);
-                    Boolean devMode = EntityInitializers.resolve(config, 
KEEP_CONTAINER_FOR_DEBUGGING);
 
                     String workingDir = EntityInitializers.resolve(config, 
WORKING_DIR);
                     Set<Map<String,String>> volumeMounts = 
(Set<Map<String,String>>) EntityInitializers.resolve(config, VOLUME_MOUNTS);
                     Set<Map<String, Object>> volumes = (Set<Map<String, 
Object>>) EntityInitializers.resolve(config, VOLUMES);
 
-                    if(Strings.isBlank(containerImage)) {
-                        throw new IllegalStateException("You must specify 
containerImage when using " + this.getClass().getSimpleName());
-                    }
-
+                    final String kubeJobName = initNamespaceAndGetNewJobName();
+                    String containerImage = EntityInitializers.resolve(config, 
CONTAINER_IMAGE);
                     Entity entity = 
BrooklynTaskTags.getContextEntity(Tasks.current());
-                    if (entity == null) {
-                        throw new IllegalStateException("Task must run in 
context of entity to background jobs");
-                    }
-
-                    final String cleanImageName = containerImage.contains(":") 
? containerImage.substring(0, containerImage.indexOf(":")) : containerImage;
-
-                    StringShortener ss = new StringShortener().separator("-");
-                    if (Strings.isNonBlank(this.jobIdentifier)) {
-                        ss.append("job", 
this.jobIdentifier).canTruncate("job", 20);
-                    } else {
-                        ss.append("brooklyn", 
"brooklyn").canTruncate("brooklyn", 2);
-                        ss.append("appId", 
entity.getApplicationId()).canTruncate("appId", 4);
-                        ss.append("entityId", 
entity.getId()).canTruncate("entityId", 4);
-                        ss.append("image", 
cleanImageName).canTruncate("image", 10);
-                    }
-                    ss.append("uid", 
Strings.makeRandomId(9)+Identifiers.makeRandomPassword(1, 
Identifiers.LOWER_CASE_ALPHA));
-                    final String kubeJobName = ss.getStringOfMaxLength(50)
-                            .replaceAll("[^A-Za-z0-9-]+", "-") // remove all 
symbols
-                            .toLowerCase();
-                    if (namespace==null) {
-                        namespace = kubeJobName;
-                    }
 
                     LOG.debug("Submitting container job in namespace 
"+namespace+", name "+kubeJobName);
 
@@ -360,13 +332,9 @@ public class ContainerTaskFactory<T extends 
ContainerTaskFactory<T,RET>,RET> imp
                             return returnConversion==null ? (RET) result : 
returnConversion.apply(result);
 
                         } finally {
-                            // clean up - delete namespace
-                            if (!devMode && deleteNamespaceHere) {
-                                LOG.debug("Deleting namespace "+namespace);
-                                // do this not as a subtask so we can run even 
if the main queue fails
-                                Entities.submit(entity, 
newSimpleTaskFactory(String.format(NAMESPACE_DELETE_CMD, 
namespace)).summary("Tear down containers").newTask()).block();
+                            if (deleteNamespaceHere) {
+                                doDeleteNamespace();
                             }
-                            System.runFinalization();
                         }
                     } catch (Exception e) {
                         throw Exceptions.propagate(e);
@@ -378,6 +346,59 @@ public class ContainerTaskFactory<T extends 
ContainerTaskFactory<T,RET>,RET> imp
         return taskBuilder.build();
     }
 
+    private String initNamespaceAndGetNewJobName() {
+        Entity entity = BrooklynTaskTags.getContextEntity(Tasks.current());
+        if (entity == null) {
+            throw new IllegalStateException("Task must run in context of 
entity to background jobs");
+        }
+
+        String containerImage = EntityInitializers.resolve(config, 
CONTAINER_IMAGE);
+        if(Strings.isBlank(containerImage)) {
+            throw new IllegalStateException("You must specify containerImage 
when using " + this.getClass().getSimpleName());
+        }
+
+        final String cleanImageName = containerImage.contains(":") ? 
containerImage.substring(0, containerImage.indexOf(":")) : containerImage;
+
+        StringShortener ss = new StringShortener().separator("-");
+        if (Strings.isNonBlank(this.jobIdentifier)) {
+            ss.append("job", this.jobIdentifier).canTruncate("job", 20);
+        } else {
+            ss.append("brooklyn", "brooklyn").canTruncate("brooklyn", 2);
+            ss.append("appId", entity.getApplicationId()).canTruncate("appId", 
4);
+            ss.append("entityId", entity.getId()).canTruncate("entityId", 4);
+            ss.append("image", cleanImageName).canTruncate("image", 10);
+        }
+        ss.append("uid", 
Strings.makeRandomId(9)+Identifiers.makeRandomPassword(1, 
Identifiers.LOWER_CASE_ALPHA));
+        final String kubeJobName = ss.getStringOfMaxLength(50)
+                .replaceAll("[^A-Za-z0-9-]+", "-") // remove all symbols
+                .toLowerCase();
+        if (namespace==null) {
+            namespace = kubeJobName;
+        }
+        return kubeJobName;
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public boolean doDeleteNamespace() {
+        if (namespace==null) return false;
+        Entity entity = BrooklynTaskTags.getContextEntity(Tasks.current());
+        if (entity==null) return false;
+        // clean up - delete namespace
+        Boolean devMode = EntityInitializers.resolve(config, 
KEEP_CONTAINER_FOR_DEBUGGING);
+        if (Boolean.TRUE.equals(devMode)) {
+            return false;
+        }
+
+        LOG.debug("Deleting namespace " + namespace);
+        // do this not as a subtask so we can run even if the main queue fails
+        Entities.submit(entity, 
newSimpleTaskFactory(String.format(NAMESPACE_DELETE_CMD, 
namespace)).summary("Tear down containers").newTask()).block();
+        System.runFinalization();
+        return true;
+    }
+
     public T summary(String summary) { this.summary = summary; return self(); }
     public T timeout(Duration timeout) { config.put(TIMEOUT, timeout); return 
self(); }
     public T command(List<String> commands) { config.put(COMMAND, commands); 
return self(); }

Reply via email to