package io.cattle.platform.servicediscovery.deployment.impl.planner;
import static io.cattle.platform.core.model.tables.StackTable.*;
import io.cattle.platform.core.constants.ServiceConstants;
import io.cattle.platform.core.model.Service;
import io.cattle.platform.core.model.Stack;
import io.cattle.platform.servicediscovery.api.util.ServiceDiscoveryUtil;
import io.cattle.platform.servicediscovery.deployment.ServiceDeploymentPlanner;
import io.cattle.platform.servicediscovery.deployment.ServiceDeploymentPlannerFactory;
import io.cattle.platform.servicediscovery.deployment.impl.DeploymentManagerImpl.DeploymentServiceContext;
import io.cattle.platform.servicediscovery.deployment.impl.unit.DeploymentUnit;
import java.util.List;
public class ServiceDeploymentPlannerFactoryImpl implements ServiceDeploymentPlannerFactory {
@Override
public ServiceDeploymentPlanner createServiceDeploymentPlanner(Service service, List<DeploymentUnit> units,
DeploymentServiceContext context) {
if (service == null) {
return null;
}
Stack stack = context.objectManager.findOne(Stack.class, STACK.ID, service.getStackId());
boolean isGlobalDeploymentStrategy = isGlobalDeploymentStrategy(context, service);
boolean isSelectorOnlyStrategy = isNoopStrategy(context, service);
if (isSelectorOnlyStrategy
|| service.getKind().equalsIgnoreCase(ServiceConstants.KIND_EXTERNAL_SERVICE)
|| service.getKind().equalsIgnoreCase(ServiceConstants.KIND_DNS_SERVICE)) {
return new NoOpServiceDeploymentPlanner(service, stack, units, context);
} else if (isGlobalDeploymentStrategy) {
return new GlobalServiceDeploymentPlanner(service, stack, units, context);
} else {
return new DefaultServiceDeploymentPlanner(service, stack, units, context);
}
}
protected boolean isGlobalDeploymentStrategy(DeploymentServiceContext context, Service service) {
return context.sdService.isGlobalService(service);
}
protected boolean isNoopStrategy(DeploymentServiceContext context, Service service) {
if (ServiceDiscoveryUtil.isNoopService(service) || isExternallyProvidedService(service)) {
return true;
}
return false;
}
protected boolean isExternallyProvidedService(Service service) {
if (service.getKind().equalsIgnoreCase(ServiceConstants.KIND_DNS_SERVICE)
|| service.getKind().equalsIgnoreCase(ServiceConstants.KIND_EXTERNAL_SERVICE)
|| ServiceConstants.SERVICE_LIKE.contains(service.getKind())) {
return false;
}
return true;
}
}