From 10e7f48ec1fc732f1cb779d34257e0c03aa1fc3c Mon Sep 17 00:00:00 2001
From: "fareed.hussain" <fareed.hussain@selectquote.com>
Date: Fri, 11 Jul 2025 19:24:15 +0500
Subject: [PATCH] 
 283-c02.1.233-create-function-Adaptation-Component-Container-Enabler-Container-Cold-Start-Optimizer-11072025

---
 .../config/ContainerConfig.java               | 37 ++++++++++++++
 ...ContainerColdStartOptimizerController.java | 20 ++++++++
 .../models/StartupTimeReport.java             | 26 ++++++++++
 .../containerEnabler/models/WarmupPlan.java   | 26 ++++++++++
 .../ContainerColdStartOptimizerService.java   | 50 +++++++++++++++++++
 .../utils/ContainerManagerService.java        | 21 ++++++++
 6 files changed, 180 insertions(+)
 create mode 100644 src/main/java/com/informationcatalyst/enact/application_controller/config/ContainerConfig.java
 create mode 100644 src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/controllers/ContainerColdStartOptimizerController.java
 create mode 100644 src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/StartupTimeReport.java
 create mode 100644 src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/WarmupPlan.java
 create mode 100644 src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/services/ContainerColdStartOptimizerService.java
 create mode 100644 src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/utils/ContainerManagerService.java

diff --git a/src/main/java/com/informationcatalyst/enact/application_controller/config/ContainerConfig.java b/src/main/java/com/informationcatalyst/enact/application_controller/config/ContainerConfig.java
new file mode 100644
index 00000000..da4635cb
--- /dev/null
+++ b/src/main/java/com/informationcatalyst/enact/application_controller/config/ContainerConfig.java
@@ -0,0 +1,37 @@
+package com.informationcatalyst.enact.application_controller.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "container")
+public class ContainerConfig {
+    private int defaultMinReplicas = 1;
+    private long startupThresholdMs = 5000;
+    private int warmupInstances = 2;
+
+    // Getters and Setters
+    public int getDefaultMinReplicas() {
+        return defaultMinReplicas;
+    }
+
+    public void setDefaultMinReplicas(int defaultMinReplicas) {
+        this.defaultMinReplicas = defaultMinReplicas;
+    }
+
+    public long getStartupThresholdMs() {
+        return startupThresholdMs;
+    }
+
+    public void setStartupThresholdMs(long startupThresholdMs) {
+        this.startupThresholdMs = startupThresholdMs;
+    }
+
+    public int getWarmupInstances() {
+        return warmupInstances;
+    }
+
+    public void setWarmupInstances(int warmupInstances) {
+        this.warmupInstances = warmupInstances;
+    }
+}
diff --git a/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/controllers/ContainerColdStartOptimizerController.java b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/controllers/ContainerColdStartOptimizerController.java
new file mode 100644
index 00000000..579cfda1
--- /dev/null
+++ b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/controllers/ContainerColdStartOptimizerController.java
@@ -0,0 +1,20 @@
+package com.informationcatalyst.enact.application_controller.containerEnabler.controllers;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.informationcatalyst.enact.application_controller.containerEnabler.models.WarmupPlan;
+import com.informationcatalyst.enact.application_controller.containerEnabler.services.ContainerColdStartOptimizerService;
+
+@RestController
+public class ContainerColdStartOptimizerController {
+    @Autowired
+    private ContainerColdStartOptimizerService optimizer;
+
+    @PostMapping("/prewarm/{containerId}")
+    public WarmupPlan prewarm(@PathVariable String containerId) {
+        return optimizer.preWarmContainer(containerId);
+    }
+}
diff --git a/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/StartupTimeReport.java b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/StartupTimeReport.java
new file mode 100644
index 00000000..ff1a1182
--- /dev/null
+++ b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/StartupTimeReport.java
@@ -0,0 +1,26 @@
+package com.informationcatalyst.enact.application_controller.containerEnabler.models;
+
+public class StartupTimeReport {
+    private String containerId;
+    private long startupTimeMs;
+    private String status;
+
+    public StartupTimeReport(String containerId, long startupTimeMs, String status) {
+        this.containerId = containerId;
+        this.startupTimeMs = startupTimeMs;
+        this.status = status;
+    }
+
+    // Getters
+    public String getContainerId() {
+        return containerId;
+    }
+
+    public long getStartupTimeMs() {
+        return startupTimeMs;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+}
diff --git a/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/WarmupPlan.java b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/WarmupPlan.java
new file mode 100644
index 00000000..4d6c78cc
--- /dev/null
+++ b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/models/WarmupPlan.java
@@ -0,0 +1,26 @@
+package com.informationcatalyst.enact.application_controller.containerEnabler.models;
+
+public class WarmupPlan {
+    private String containerId;
+    private int instances;
+    private String status;
+
+    public WarmupPlan(String containerId, int instances, String status) {
+        this.containerId = containerId;
+        this.instances = instances;
+        this.status = status;
+    }
+
+    // Getters
+    public String getContainerId() {
+        return containerId;
+    }
+
+    public int getInstances() {
+        return instances;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/services/ContainerColdStartOptimizerService.java b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/services/ContainerColdStartOptimizerService.java
new file mode 100644
index 00000000..f35598c0
--- /dev/null
+++ b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/services/ContainerColdStartOptimizerService.java
@@ -0,0 +1,50 @@
+package com.informationcatalyst.enact.application_controller.containerEnabler.services;
+
+import com.informationcatalyst.enact.application_controller.config.ContainerConfig;
+
+import com.informationcatalyst.enact.application_controller.containerEnabler.models.StartupTimeReport;
+import com.informationcatalyst.enact.application_controller.containerEnabler.models.WarmupPlan;
+
+import com.informationcatalyst.enact.application_controller.containerEnabler.utils.ContainerManagerService;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ContainerColdStartOptimizerService {
+    private final ContainerManagerService containerManager;
+    private final ContainerConfig config;
+
+    @Autowired
+    public ContainerColdStartOptimizerService(ContainerManagerService containerManager,
+            ContainerConfig config) {
+        this.containerManager = containerManager;
+        this.config = config;
+    }
+
+    public WarmupPlan preWarmContainer(String containerId) {
+        // Use configured warmup instance count
+        int instances = config.getWarmupInstances();
+        containerManager.preWarmContainer(containerId, instances);
+        return new WarmupPlan(containerId, instances, "SUCCESS");
+    }
+
+    public boolean keepAlive(String containerId, int minReplicas) {
+        // Validate input
+        if (minReplicas < 0) {
+            throw new IllegalArgumentException("minReplicas must be >= 0");
+        }
+
+        // Apply default if not specified
+        int effectiveMinReplicas = (minReplicas == 0) ? config.getDefaultMinReplicas() : minReplicas;
+
+        containerManager.setMinReplicas(containerId, effectiveMinReplicas);
+        return true;
+    }
+
+    public StartupTimeReport measureStartupImpact(String containerId) {
+        long startupTime = containerManager.measureStartupTime(containerId);
+        String status = (startupTime <= config.getStartupThresholdMs()) ? "OPTIMIZED" : "NEEDS_IMPROVEMENT";
+        return new StartupTimeReport(containerId, startupTime, status);
+    }
+}
diff --git a/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/utils/ContainerManagerService.java b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/utils/ContainerManagerService.java
new file mode 100644
index 00000000..1279853b
--- /dev/null
+++ b/src/main/java/com/informationcatalyst/enact/application_controller/containerEnabler/utils/ContainerManagerService.java
@@ -0,0 +1,21 @@
+package com.informationcatalyst.enact.application_controller.containerEnabler.utils;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class ContainerManagerService {
+    public void preWarmContainer(String containerId, int instances) {
+        // Simulate API call to container orchestration platform
+        System.out.printf("Pre-warming %d instances for container %s%n", instances, containerId);
+    }
+
+    public void setMinReplicas(String containerId, int minReplicas) {
+        // Simulate updating replica configuration
+        System.out.printf("Setting min replicas for %s to %d%n", containerId, minReplicas);
+    }
+
+    public long measureStartupTime(String containerId) {
+        // Simulate startup time measurement (random between 100ms and 3000ms)
+        return 100 + (long) (Math.random() * 2900);
+    }
+}
-- 
GitLab