package io.cattle.platform.servicediscovery.deployment.impl.unit;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.core.constants.ServiceConstants;
import io.cattle.platform.core.model.Service;
import io.cattle.platform.core.model.ServiceExposeMap;
import io.cattle.platform.core.model.ServiceIndex;
import io.cattle.platform.deferred.util.DeferredUtils;
import io.cattle.platform.object.process.StandardProcess;
import io.cattle.platform.object.resource.ResourcePredicate;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.servicediscovery.deployment.DeploymentUnitInstance;
import io.cattle.platform.servicediscovery.deployment.impl.DeploymentManagerImpl.DeploymentServiceContext;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class ExternalDeploymentUnitInstance extends DeploymentUnitInstance {
String ipAddress;
String hostName;
List<String> serviceExternalIps;
String serviceHostName;
@SuppressWarnings("unchecked")
protected ExternalDeploymentUnitInstance(DeploymentServiceContext context, String uuid,
Service service, String launchConfigName, String ipAddress, String hostName) {
super(context, uuid, service, launchConfigName);
if (ipAddress != null) {
this.ipAddress = ipAddress;
this.exposeMap = context.exposeMapDao.getServiceIpExposeMap(service, ipAddress);
this.serviceExternalIps = DataAccessor.fields(service)
.withKey(ServiceConstants.FIELD_EXTERNALIPS).withDefault(Collections.EMPTY_LIST)
.as(List.class);
} else {
this.hostName = hostName;
this.exposeMap = context.exposeMapDao.getServiceHostnameExposeMap(service, hostName);
this.serviceHostName = DataAccessor.fields(service)
.withKey(ServiceConstants.FIELD_HOSTNAME).as(String.class);
}
}
@Override
public boolean isError() {
if (this.ipAddress != null) {
return !serviceExternalIps.contains(this.ipAddress);
} else {
return !serviceHostName.contains(this.hostName);
}
}
@Override
protected void removeUnitInstance() {
return;
}
@Override
public void stop() {
super.remove();
}
@Override
public DeploymentUnitInstance create(Map<String, Object> deployParams) {
if (createNew()) {
if (this.ipAddress != null) {
this.exposeMap = context.exposeMapDao.createIpToServiceMap(this.service, this.ipAddress);
} else {
this.exposeMap = context.exposeMapDao.createHostnameToServiceMap(this.service, this.hostName);
}
}
DeferredUtils.nest(new Runnable() {
@Override
public void run() {
context.objectProcessManager.scheduleStandardProcess(StandardProcess.CREATE, exposeMap, null);
}
});
this.exposeMap = context.objectManager.reload(this.exposeMap);
return this;
}
@Override
public boolean createNew() {
return this.exposeMap == null;
}
@Override
public DeploymentUnitInstance waitForStartImpl() {
this.exposeMap = context.resourceMonitor.waitFor(this.exposeMap, new ResourcePredicate<ServiceExposeMap>() {
@Override
public boolean evaluate(ServiceExposeMap obj) {
return obj != null && CommonStatesConstants.ACTIVE.equals(obj.getState());
}
@Override
public String getMessage() {
return "active state";
}
});
return this;
}
@Override
protected boolean isStartedImpl() {
return this.exposeMap != null && this.exposeMap.getState().equalsIgnoreCase(CommonStatesConstants.ACTIVE);
}
@Override
public boolean isUnhealthy() {
return false;
}
@Override
public void waitForAllocate() {
return;
}
@Override
public boolean isHealthCheckInitializing() {
return false;
}
@Override
protected DeploymentUnitInstance startImpl() {
return this;
}
@Override
public ServiceIndex getServiceIndex() {
return null;
}
@Override
public List<String> getSearchDomains() {
return null;
}
@Override
public Long getCreateIndex() {
return null;
}
@Override
public void scheduleCreate() {
return;
}
@Override
public boolean isTransitioning() {
return false;
}
}