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