package io.cattle.platform.process.network; import io.cattle.platform.core.constants.AccountConstants; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.NetworkConstants; import io.cattle.platform.core.dao.NetworkDao; import io.cattle.platform.core.model.Account; import io.cattle.platform.core.model.Network; 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.lock.LockCallbackNoReturn; import io.cattle.platform.lock.LockManager; import io.cattle.platform.process.common.handler.AbstractObjectProcessHandler; import io.cattle.platform.process.lock.DefaultNetworkLock; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.ObjectUtils; @Named public class DefaultNetworkProcess extends AbstractObjectProcessHandler { @Inject NetworkDao networkDao; @Inject LockManager lockManager; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { final Network network = (Network)state.getResource(); lockManager.lock(new DefaultNetworkLock(network), new LockCallbackNoReturn() { @Override public void doWithLockNoResult() { setDefaultNetwork(network.getAccountId()); } }); return null; } protected void setDefaultNetwork(Long accountId) { Account account = objectManager.loadResource(Account.class, accountId); if (account == null) { return; } Long defaultNetworkId = account.getDefaultNetworkId(); Long newDefaultNetworkId = null; for (Network network : networkDao.getActiveNetworks(account.getId())) { if (network.getKind().startsWith(NetworkConstants.PREFIX_KIND_DOCKER) || network.getKind().equals("hostOnlyNetwork")) { continue; } if (network.getId().equals(defaultNetworkId)) { newDefaultNetworkId = defaultNetworkId; break; } if ((CommonStatesConstants.ACTIVATING.equals(network.getState()) || CommonStatesConstants.UPDATING_ACTIVE.equals(network.getState())) && newDefaultNetworkId == null) { newDefaultNetworkId = network.getId(); } else if (CommonStatesConstants.ACTIVE.equals(network.getState())) { newDefaultNetworkId = network.getId(); } } if (!ObjectUtils.equals(defaultNetworkId, newDefaultNetworkId)) { objectManager.setFields(account, AccountConstants.FIELD_DEFAULT_NETWORK_ID, newDefaultNetworkId); } } @Override public String[] getProcessNames() { return new String[] { "network.*" }; } }