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 0000000000000000000000000000000000000000..da4635cb6b39e84ad9fbf2f0cc21227cf8469f58 --- /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 0000000000000000000000000000000000000000..579cfda1f9dac3797305890dd8679250c6ddd36f --- /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 0000000000000000000000000000000000000000..ff1a1182b821370dd7146e811b81d38c1ed0938a --- /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 0000000000000000000000000000000000000000..4d6c78cc18aeb15466033713a642f082905e8121 --- /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 0000000000000000000000000000000000000000..f35598c012d7e05c93532c458a757fa9615495e9 --- /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 0000000000000000000000000000000000000000..1279853bd1b01bf34d38e648e0cb0f87067501bd --- /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); + } +}