package org.ovirt.engine.core.bll.network.host; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.VdsCommand; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.common.action.HostSetupNetworksParameters; import org.ovirt.engine.core.common.action.NetworkAttachmentParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.validation.group.CreateEntity; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.network.InterfaceDao; import org.ovirt.engine.core.dao.network.NetworkAttachmentDao; import org.ovirt.engine.core.utils.ReplacementUtils; @NonTransactiveCommandAttribute public class AddNetworkAttachmentCommand<T extends NetworkAttachmentParameters> extends VdsCommand<T> { @Inject private NetworkAttachmentDao networkAttachmentDao; @Inject private NetworkIdNetworkNameCompleter networkIdNameCompleter; @Inject private InterfaceDao interfaceDao; private List<VdsNetworkInterface> hostNics; public AddNetworkAttachmentCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); addValidationGroup(CreateEntity.class); } @Override protected boolean validate() { NicNameNicIdCompleter completer = new NicNameNicIdCompleter(getHostInterfaces()); completer.completeNetworkAttachment(getParameters().getNetworkAttachment()); this.networkIdNameCompleter.completeNetworkAttachment(getParameters().getNetworkAttachment()); NetworkAttachment networkAttachment = getParameters().getNetworkAttachment(); if (networkAttachment == null) { return failValidation(EngineMessage.NETWORK_ATTACHMENT_NOT_SPECIFIED); } if (networkAttachment.getId() != null) { return failValidation(EngineMessage.NETWORK_ATTACHMENT_CANNOT_BE_CREATED_WITH_SPECIFIC_ID, ReplacementUtils.createSetVariableString("NETWORK_ATTACHMENT_CANNOT_BE_CREATED_WITH_SPECIFIC_ID_ENTITY", networkAttachment.getId())); } return true; } @Override protected void executeCommand() { HostSetupNetworksParameters params = new HostSetupNetworksParameters(getParameters().getVdsId()); NetworkAttachment networkAttachment = getParameters().getNetworkAttachment(); params.getNetworkAttachments().add(networkAttachment); //storing ids, so we're sure, that they were not mistakenly altered in HostSetupNetworks command. Guid networkId = networkAttachment.getNetworkId(); Guid nicId = networkAttachment.getNicId(); VdcReturnValueBase returnValue = runInternalAction(VdcActionType.HostSetupNetworks, params); if (returnValue.getSucceeded()) { Guid createdAttachmentId = resolveCreatedAttachmentId(networkId, nicId); getReturnValue().setActionReturnValue(createdAttachmentId); } else { propagateFailure(returnValue); } setSucceeded(returnValue.getSucceeded()); } private Guid resolveCreatedAttachmentId(final Guid requiredNetworkId, Guid configuredNicId) { VdsNetworkInterface configuredNic = interfaceDao.get(configuredNicId); List<NetworkAttachment> attachmentsOnNic = networkAttachmentDao.getAllForNic(configuredNic.getId()); NetworkAttachment createNetworkAttachment = attachmentsOnNic.stream().filter (networkAttachment -> networkAttachment.getNetworkId().equals(requiredNetworkId)).findFirst().orElse(null); if (createNetworkAttachment == null) { throw new IllegalStateException(); } return createNetworkAttachment.getId(); } private List<VdsNetworkInterface> getHostInterfaces() { if (hostNics == null) { hostNics = interfaceDao.getAllInterfacesForVds(getVdsId()); } return hostNics; } }