Skip to content
Snippets Groups Projects
Commit 0793cecd authored by Patryk Kazimierowski's avatar Patryk Kazimierowski
Browse files

some changes

parent 92bcc368
Branches
Tags 0.1
2 merge requests!231Resolve "Add application instance scaling support",!209Draft: Resolve "Add application instance scaling support"
Pipeline #94240 failed
Showing
with 113 additions and 15 deletions
......@@ -2,6 +2,7 @@ package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.KubernetesTemplate;
import net.geant.nmaas.orchestration.Identifier;
import net.geant.nmaas.orchestration.entities.AppDeployment;
public interface KServiceLifecycleManager {
......@@ -15,4 +16,6 @@ public interface KServiceLifecycleManager {
void updateHelmRepo();
void scaleDeployment(AppDeployment deployment, int replicas);
}
......@@ -169,5 +169,20 @@ public class HelmCommandExecutor {
throw new CommandExecutionException("Failed to execute helm repository add command -> " + e.getMessage());
}
}
public void executeScaleCommand(String namespace, String releaseName, int replicas) {
try {
HelmUpgradeCommand command = HelmUpgradeCommand.commandWithSetValues(
helmVersion,
namespace,
releaseName,
List.of("replicaCount=" + replicas),
enableTls
);
commandExecutor.execute(command);
} catch (CommandExecutionException e) {
throw new CommandExecutionException("Failed to execute helm scale command -> " + e.getMessage());
}
}
}
......@@ -15,10 +15,11 @@ import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.en
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.ServiceStorageVolume;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.exceptions.KServiceManipulationException;
import net.geant.nmaas.orchestration.Identifier;
import net.geant.nmaas.orchestration.entities.AppDeployment;
import net.geant.nmaas.orchestration.repositories.DomainTechDetailsRepository;
import net.geant.nmaas.utils.bash.CommandExecutionException;
import net.geant.nmaas.utils.logging.LogLevel;
import net.geant.nmaas.utils.logging.Loggable;
import net.geant.nmaas.utils.bash.CommandExecutionException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
......@@ -114,12 +115,12 @@ public class HelmKServiceManager implements KServiceLifecycleManager {
static Map<String, String> removeRedundantParameters(Map<String, String> additionalParameters) {
return additionalParameters.entrySet().stream().filter(entry ->
!entry.getKey().contains(RANDOM_ARGUMENT_EXPRESSION_PREFIX)
&& !entry.getKey().contains(PUBLIC_ACCESS_SELECTOR_ARGUMENT_EXPRESSION_PREFIX)
).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
!entry.getKey().contains(RANDOM_ARGUMENT_EXPRESSION_PREFIX)
&& !entry.getKey().contains(PUBLIC_ACCESS_SELECTOR_ARGUMENT_EXPRESSION_PREFIX)
).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
private Map<String, String> getIngressVariables(IngressResourceConfigOption ingressResourceConfigOption, Set<ServiceAccessMethod> externalAccessMethods, String domain){
private Map<String, String> getIngressVariables(IngressResourceConfigOption ingressResourceConfigOption, Set<ServiceAccessMethod> externalAccessMethods, String domain) {
return HelmChartVariables.ingressVariablesMap(
DEPLOY_FROM_CHART.equals(ingressResourceConfigOption),
externalAccessMethods,
......@@ -131,7 +132,7 @@ public class HelmKServiceManager implements KServiceLifecycleManager {
);
}
private String getIngressClass(String domain){
private String getIngressClass(String domain) {
if (Boolean.TRUE.equals(ingressManager.getIngressPerDomain())) {
return domainTechDetailsRepository.findByDomainCodename(domain).orElseThrow(() -> new IllegalArgumentException("DomainTechDetails cannot be found for domain " + domain)).getKubernetesIngressClass();
}
......@@ -191,4 +192,12 @@ public class HelmKServiceManager implements KServiceLifecycleManager {
}
}
@Override
public void scaleDeployment(AppDeployment deployment, int replicas) {
KubernetesNmServiceInfo serviceInfo = repositoryManager.loadService(deployment.getDeploymentId());
String namespace = namespaceService.namespace(serviceInfo.getDomain());
String releaseName = deployment.getDeploymentId().value();
helmCommandExecutor.executeScaleCommand(namespace, releaseName, replicas);
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.c
import com.google.common.base.Strings;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.helm.HelmCommand;
import java.util.List;
import java.util.function.Predicate;
public class HelmUpgradeCommand extends HelmCommand {
......@@ -78,4 +79,28 @@ public class HelmUpgradeCommand extends HelmCommand {
return o -> !o.startsWith("Error");
}
public static HelmUpgradeCommand commandWithSetValues(String helmVersion, String namespace, String releaseName, List<String> setValues, boolean enableTls) {
if (!HELM_VERSION_3.equals(helmVersion)) {
throw new IllegalArgumentException("Upgrades are not supported for Helm v2");
}
if (releaseName == null || releaseName.isEmpty()) {
throw new IllegalArgumentException("Name of the release can't be null or empty");
}
StringBuilder sb = new StringBuilder();
sb.append(HELM)
.append(SPACE).append(UPGRADE)
.append(SPACE).append(OPTION_NAMESPACE).append(SPACE).append(namespace)
.append(SPACE).append(releaseName)
.append(SPACE).append(releaseName);
for (String setValue : setValues) {
sb.append(SPACE).append("--set").append(SPACE).append(setValue);
}
addTlsOptionIfRequired(helmVersion, enableTls, sb);
return new HelmUpgradeCommand(sb.toString());
}
}
......@@ -90,4 +90,7 @@ public interface AppLifecycleManager {
* @param deploymentId unique identifier of the deployed user application
*/
void updateApplicationStatus(Identifier deploymentId);
void scaleDown(Identifier deploymentId);
void scaleUp(Identifier deploymentId);
}
......@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import net.geant.nmaas.nmservice.NmServiceDeploymentStateChangeEvent;
import net.geant.nmaas.nmservice.configuration.exceptions.UserConfigHandlingException;
import net.geant.nmaas.nmservice.deployment.NmServiceRepositoryManager;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KServiceLifecycleManager;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.janitor.JanitorService;
import net.geant.nmaas.nmservice.deployment.entities.NmServiceDeploymentState;
import net.geant.nmaas.orchestration.api.model.AppConfigurationView;
......@@ -54,6 +55,9 @@ public class DefaultAppLifecycleManager implements AppLifecycleManager {
private final ApplicationEventPublisher eventPublisher;
private final NmServiceRepositoryManager serviceRepositoryManager;
private final JanitorService janitorService;
private final KServiceLifecycleManager kServiceLifecycleManager;
private final AppTermsAcceptanceService appTermsAcceptanceService;
private final ConfigurationManager configurationManager;
......@@ -277,5 +281,32 @@ public class DefaultAppLifecycleManager implements AppLifecycleManager {
public void updateApplicationStatus(Identifier deploymentId) {
eventPublisher.publishEvent(new AppVerifyServiceActionEvent(this, deploymentId));
}
@Override
@Loggable(LogLevel.INFO)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void scaleDown(Identifier deploymentId) {
AppDeployment appDeployment = deploymentRepositoryManager.load(deploymentId);
kServiceLifecycleManager.scaleDeployment(appDeployment, 0);
appDeployment.setState(AppDeploymentState.SCALED_DOWN);
deploymentRepositoryManager.update(appDeployment);
log.info("Scaled down deployment [{}]", deploymentId.value());
}
@Override
@Loggable(LogLevel.INFO)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void scaleUp(Identifier deploymentId) {
AppDeployment appDeployment = deploymentRepositoryManager.load(deploymentId);
int replicas = 1;
kServiceLifecycleManager.scaleDeployment(appDeployment, replicas);
deploymentRepositoryManager.update(appDeployment);
log.info("Scaled up deployment [{}]", deploymentId.value());
}
}
......@@ -11,16 +11,9 @@ import net.geant.nmaas.orchestration.exceptions.InvalidDeploymentIdException;
import net.geant.nmaas.portal.persistent.entity.Application;
import net.geant.nmaas.portal.persistent.repositories.ApplicationRepository;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.security.Principal;
......@@ -116,4 +109,17 @@ public class AppLifecycleManagerRestController {
return ex.getMessage();
}
@PutMapping("/{deploymentId}/scale-down")
public ResponseEntity<Void> scaleDownApp(@PathVariable String deploymentId) {
lifecycleManager.scaleDown(new Identifier(deploymentId));
return ResponseEntity.ok().build();
}
@PutMapping("/{deploymentId}/scale-up")
public ResponseEntity<Void> scaleUpApp(@PathVariable String deploymentId) {
lifecycleManager.scaleUp(new Identifier(deploymentId));
return ResponseEntity.ok().build();
}
}
......@@ -541,6 +541,12 @@ public enum AppDeploymentState {
@Override
public boolean isInFailedState() { return true; }
},
SCALED_DOWN {
@Override
public AppLifecycleState lifecycleState() {
return null;
}
};
public abstract AppLifecycleState lifecycleState();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment