package io.cattle.platform.process.account; import static io.cattle.platform.core.model.tables.CredentialTable.*; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.core.constants.AccountConstants; import io.cattle.platform.core.dao.AccountDao; import io.cattle.platform.core.model.Account; import io.cattle.platform.core.model.Credential; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.json.JsonMapper; import io.cattle.platform.object.process.ObjectProcessManager; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.process.base.AbstractDefaultProcessHandler; import io.cattle.platform.process.util.ProcessHelpers; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; import com.netflix.config.DynamicBooleanProperty; import com.netflix.config.DynamicStringListProperty; import com.netflix.config.DynamicStringProperty; @Named public class AccountCreate extends AbstractDefaultProcessHandler { public static final DynamicBooleanProperty CREATE_CREDENTIAL = ArchaiusUtil.getBoolean("process.account.create.create.credential"); public static final DynamicStringProperty CREDENTIAL_TYPE = ArchaiusUtil.getString("process.account.create.create.credential.default.kind"); public static final DynamicStringListProperty ACCOUNT_KIND_CREDENTIALS = ArchaiusUtil.getList("process.account.create.create.credential.account.kinds"); ObjectProcessManager processManager; @Inject AccountDao accountDao; @Inject JsonMapper jsonMapper; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Account account = (Account) state.getResource(); Map<Object, Object> result = new HashMap<Object, Object>(); boolean createApiKey = DataAccessor.fromMap(state.getData()).withScope(AccountConstants.class).withKey(AccountConstants.OPTION_CREATE_APIKEY) .withDefault(false).as(Boolean.class); String apiKeyKind = DataAccessor.fromMap(state.getData()).withScope(AccountConstants.class).withKey(AccountConstants.OPTION_CREATE_APIKEY_KIND) .withDefault(CREDENTIAL_TYPE.get()).as(String.class); if (shouldCreateCredentials(account, state)) { if (createApiKey || CREATE_CREDENTIAL.get()) { List<Credential> creds = ProcessHelpers.createOneChild(getObjectManager(), processManager, account, Credential.class, CREDENTIAL.ACCOUNT_ID, account.getId(), CREDENTIAL.KIND, apiKeyKind); for (Credential cred : creds) { result.put("_createdCredential" + cred.getId(), true); } } } List<? extends Long> accountLinks = DataAccessor.fromMap(state.getData()).withKey( AccountConstants.FIELD_ACCOUNT_LINKS).withDefault(Collections.EMPTY_LIST) .asList(jsonMapper, Long.class); accountDao.generateAccountLinks(account, accountLinks); return new HandlerResult(result); } public boolean shouldCreateCredentials(Account account, ProcessState state) { return ACCOUNT_KIND_CREDENTIALS.get().contains(account.getKind()); } public ObjectProcessManager getProcessManager() { return processManager; } @Inject public void setProcessManager(ObjectProcessManager processManager) { this.processManager = processManager; } }