package io.cattle.platform.register.process;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.core.constants.CredentialConstants;
import io.cattle.platform.core.model.Account;
import io.cattle.platform.core.model.Agent;
import io.cattle.platform.core.model.Credential;
import io.cattle.platform.core.model.GenericObject;
import io.cattle.platform.deferred.util.DeferredUtils;
import io.cattle.platform.engine.handler.HandlerResult;
import io.cattle.platform.engine.handler.ProcessHandler;
import io.cattle.platform.engine.process.ProcessInstance;
import io.cattle.platform.engine.process.ProcessState;
import io.cattle.platform.engine.process.impl.ProcessCancelException;
import io.cattle.platform.object.process.StandardProcess;
import io.cattle.platform.object.resource.ResourceMonitor;
import io.cattle.platform.object.resource.ResourcePredicate;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.process.common.handler.AbstractGenericObjectProcessLogic;
import io.cattle.platform.register.dao.RegisterDao;
import io.cattle.platform.register.util.RegisterConstants;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class RegisterCreate extends AbstractGenericObjectProcessLogic implements ProcessHandler {
RegisterDao registerDao;
ResourceMonitor resourceMonitor;
@Override
public String[] getProcessNames() {
return new String[] { "genericobject.create" };
}
@Override
public String getKind() {
return "register";
}
@Override
protected HandlerResult handleKind(final ProcessState state, ProcessInstance process) {
GenericObject resource = (GenericObject) state.getResource();
String key = resource.getKey();
if (key == null) {
return null;
}
Agent agent;
Long agentId = DataAccessor.fromDataFieldOf(resource).withKey(RegisterConstants.DATA_AGENT_ID).as(Long.class);
agent = loadResource(Agent.class, agentId);
if (agent == null) {
agent = registerDao.createAgentForRegistration(key, resource);
}
final Agent agentFinal = agent;
DeferredUtils.nest(new Runnable() {
@Override
public void run() {
try {
objectProcessManager.scheduleStandardProcess(StandardProcess.CREATE, agentFinal, state.getData());
} catch (ProcessCancelException e) {
}
}
});
agent = resourceMonitor.waitFor(agent, new ResourcePredicate<Agent>() {
@Override
public boolean evaluate(Agent obj) {
return getCredential(obj) != null;
}
@Override
public String getMessage() {
return "credentials assigned";
}
});
Credential cred = getCredential(agent);
return new HandlerResult(RegisterConstants.FIELD_ACCESS_KEY, cred.getPublicValue(), RegisterConstants.FIELD_SECRET_KEY, cred.getSecretValue());
}
protected Credential getCredential(Agent agent) {
Account account = loadResource(Account.class, agent.getAccountId());
for (Credential cred : children(account, Credential.class)) {
if (cred.getKind().equals(CredentialConstants.KIND_AGENT_API_KEY) && CommonStatesConstants.ACTIVE.equals(cred.getState())) {
return cred;
}
}
return null;
}
public RegisterDao getRegisterDao() {
return registerDao;
}
@Inject
public void setRegisterDao(RegisterDao registerDao) {
this.registerDao = registerDao;
}
public ResourceMonitor getResourceMonitor() {
return resourceMonitor;
}
@Inject
public void setResourceMonitor(ResourceMonitor resourceMonitor) {
this.resourceMonitor = resourceMonitor;
}
}