Martin Mucha has uploaded a new change for review. Change subject: core: command for updating template nics. ......................................................................
core: command for updating template nics. Change-Id: Ibf67d6e0aeb094859f7eb1930bb151164f5207be https://bugzilla.redhat.com/show_bug.cgi?id=999969 Signed-off-by: Martin Mucha <mmu...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractUpdateNicsCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderTemplateNicsCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java 5 files changed, 214 insertions(+), 158 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/85/35285/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractUpdateNicsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractUpdateNicsCommand.java new file mode 100644 index 0000000..070a9c5 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractUpdateNicsCommand.java @@ -0,0 +1,170 @@ +package org.ovirt.engine.core.bll; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.AddVmInterfaceParameters; +import org.ovirt.engine.core.common.action.RemoveVmInterfaceParameters; +import org.ovirt.engine.core.common.action.UpdateAndReorderNicsParam; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.action.VmOperationParameterBase; +import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType; +import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; +import org.ovirt.engine.core.compat.Guid; + +public abstract class AbstractUpdateNicsCommand extends CommandBase<UpdateAndReorderNicsParam> { + public AbstractUpdateNicsCommand(UpdateAndReorderNicsParam parameters) { + super(parameters); + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + return Collections.singletonList( + new PermissionSubject(Guid.SYSTEM, VdcObjectType.System, getActionType().getActionGroup())); + } + + @Override + protected void executeCommand() { + UpdateNicsVmInterfaceParametersFactory parameters = calculateRequiredParameters(getExistingNics()); + + invokeActionType(VdcActionType.AddVmInterface, parameters.createVnicParameters); + invokeActionType(VdcActionType.UpdateVmInterface, parameters.updateVnicParameters); + invokeActionType(VdcActionType.RemoveVmInterface, parameters.removeVnicParameters); + + if (getParameters().reorderNics) { + VmOperationParameterBase reorderParams = new VmOperationParameterBase(getParameters().vmId); + runInternalAction(VdcActionType.ReorderVmNics, reorderParams); + } + + getReturnValue().setSucceeded(true); + } + + protected abstract UpdateNicsVmInterfaceParametersFactory calculateRequiredParameters(List<VmNetworkInterface> existingNics); + + private void invokeActionType(VdcActionType actionType, ArrayList<VdcActionParametersBase> parameters) { + if (!parameters.isEmpty()) { + log.debug("calling {} with {}", actionType, Arrays.toString(parameters.toArray())); + List<VdcReturnValueBase> results = runInternalMultipleActions(actionType, + parameters, + true, + true, + getContext().clone()); + + verifyThatAllActionsSucceeded(results, actionType, parameters.size()); + } + } + + private void verifyThatAllActionsSucceeded(List<VdcReturnValueBase> vdcReturnValueBases, + VdcActionType actionType, + int expectedNumberOfResults) { + if (vdcReturnValueBases == null) { + throw new IllegalArgumentException(); + } + + if (vdcReturnValueBases.size() != expectedNumberOfResults) { + throw new IllegalStateException( + String.format("Some of commands of type %1$s wasn't invoked, cannot proceed.", actionType)); + } + + for (VdcReturnValueBase vdcReturnValueBase : vdcReturnValueBases) { + if (!vdcReturnValueBase.getSucceeded()) { + throw new IllegalStateException( + String.format("Some invocation of %1$s failed, cannot proceed.", actionType)); + } + } + } + + protected abstract List<VmNetworkInterface> getExistingNics(); + + protected static class UpdateNicsVmInterfaceParametersFactory { + protected final Iterable<VmNetworkInterface> existingVnics; + protected final Iterable<VmNetworkInterface> vmNetworkInterfaces; + protected final Collection<VmInterfaceType> supportedInterfaceTypes; + protected final Guid vmId; + protected final Integer defaultTypeValue; + + public final ArrayList<VdcActionParametersBase> createVnicParameters = new ArrayList<>(); + public final ArrayList<VdcActionParametersBase> updateVnicParameters = new ArrayList<>(); + public final ArrayList<VdcActionParametersBase> removeVnicParameters = new ArrayList<>(); + + public UpdateNicsVmInterfaceParametersFactory(Iterable<VmNetworkInterface> vmNetworkInterfaces, + VmInterfaceType defaultType, + Collection<VmInterfaceType> supportedInterfaceTypes, + Guid vmId, + Iterable<VmNetworkInterface> existingVnics) { + this.vmNetworkInterfaces = vmNetworkInterfaces; + this.supportedInterfaceTypes = supportedInterfaceTypes; + this.vmId = vmId; + this.existingVnics = existingVnics; + defaultTypeValue = defaultType == null ? null : defaultType.getValue(); + } + + public void createParameters() { + final Set<String> vnicsEncountered = new HashSet<>(); + Map<String, VmNetworkInterface> existingVnicsMap = mapVnicsNamesToVnic(existingVnics); + + // iterate over edited VNICs, see if any need to be added or have been assigned a different profile + for (VmNetworkInterface editedVnic : vmNetworkInterfaces) { + String vnicName = editedVnic.getName(); + VmNetworkInterface existingVnic = existingVnicsMap.get(vnicName); + if (existingVnic == null) { + editedVnic.setType(defaultTypeValue); + createVnicParameters.add(createAddInterfaceParameter(editedVnic)); + } else { + vnicsEncountered.add(vnicName); + Guid existingProfileId = existingVnic.getVnicProfileId(); + Guid editedProfileId = editedVnic.getVnicProfileId(); + if (supportedInterfaceTypes != null && !supportedInterfaceTypes.contains(VmInterfaceType.forValue( + existingVnic.getType()))) { + existingVnic.setType(defaultTypeValue); + } else if (supportedInterfaceTypes == null) { + existingVnic.setType(defaultTypeValue); + } + + if ((editedProfileId == null && existingProfileId != null) + || (editedProfileId != null && !editedProfileId.equals(existingProfileId))) { + existingVnic.setVnicProfileId(editedProfileId); + existingVnic.setNetworkName(editedVnic.getNetworkName()); + updateVnicParameters.add(createAddInterfaceParameter(existingVnic)); + } + } + } + + // iterate over existing VNICs, see if any have not been encountered and thus removed in editing + for (VmNetworkInterface existingVnic : existingVnics) { + if (!vnicsEncountered.contains(existingVnic.getName())) { + removeVnicParameters.add(createRemoveInterfaceParameter(existingVnic)); + } + } + } + + private VdcActionParametersBase createRemoveInterfaceParameter(VmNetworkInterface existingVnic) { + return new RemoveVmInterfaceParameters(vmId, existingVnic.getId()); + } + + private VdcActionParametersBase createAddInterfaceParameter(VmNetworkInterface editedVnic) { + editedVnic.setVmTemplateId(null); + return new AddVmInterfaceParameters(vmId, editedVnic); + } + + private Map<String, VmNetworkInterface> mapVnicsNamesToVnic(Iterable<VmNetworkInterface> existingVnics) { + Map<String, VmNetworkInterface> existingVnicNameToVnicMap = new HashMap<>(); + for (VmNetworkInterface vnic : existingVnics) { + existingVnicNameToVnicMap.put(vnic.getName(), vnic); + } + return existingVnicNameToVnicMap; + } + + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderTemplateNicsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderTemplateNicsCommand.java new file mode 100644 index 0000000..8644a91 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderTemplateNicsCommand.java @@ -0,0 +1,34 @@ +package org.ovirt.engine.core.bll; + +import java.util.List; + +import org.ovirt.engine.core.common.action.UpdateAndReorderNicsParam; +import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class UpdateAndReorderTemplateNicsCommand extends AbstractUpdateNicsCommand { + + public UpdateAndReorderTemplateNicsCommand(UpdateAndReorderNicsParam parameters) { + super(parameters); + } + + @Override + protected UpdateNicsVmInterfaceParametersFactory calculateRequiredParameters(List<VmNetworkInterface> existingNics) { + UpdateNicsVmInterfaceParametersFactory parameters = + new UpdateNicsVmInterfaceParametersFactory(getParameters().updatedVmNetworkInterfaces, + null, + null, + getParameters().vmId, + existingNics); + + parameters.createParameters(); + return parameters; + } + + @Override + protected List<VmNetworkInterface> getExistingNics() { + IdQueryParameters parameters = new IdQueryParameters(getParameters().vmId); + return runInternalQuery(VdcQueryType.GetTemplateInterfacesByTemplateId, parameters).getReturnValue(); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java index 90c5fed..71b0e0f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java @@ -1,106 +1,43 @@ package org.ovirt.engine.core.bll; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Set; -import org.ovirt.engine.core.bll.utils.PermissionSubject; -import org.ovirt.engine.core.common.VdcObjectType; -import org.ovirt.engine.core.common.action.AddVmInterfaceParameters; -import org.ovirt.engine.core.common.action.RemoveVmInterfaceParameters; import org.ovirt.engine.core.common.action.UpdateAndReorderNicsParam; -import org.ovirt.engine.core.common.action.VdcActionParametersBase; -import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.action.VdcReturnValueBase; -import org.ovirt.engine.core.common.action.VmOperationParameterBase; import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.OsQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; -import org.ovirt.engine.core.compat.Guid; -public class UpdateAndReorderVmNicsCommand extends CommandBase<UpdateAndReorderNicsParam> { +public class UpdateAndReorderVmNicsCommand extends AbstractUpdateNicsCommand { public UpdateAndReorderVmNicsCommand(UpdateAndReorderNicsParam parameters) { super(parameters); } @Override - protected void executeCommand() { + protected UpdateNicsVmInterfaceParametersFactory calculateRequiredParameters(List<VmNetworkInterface> existingNics) { + List<VmInterfaceType> supportedInterfaceTypes = getInterfaceTypes(); VmInterfaceType defaultInterfaceType = getDefaultNicType(supportedInterfaceTypes); - UpdateNicsVmInterfaceParametersFactory parameters = - calculateRequiredParameters(supportedInterfaceTypes, defaultInterfaceType); - - invokeActionType(VdcActionType.AddVmInterface, parameters.createVnicParameters); - invokeActionType(VdcActionType.UpdateVmInterface, parameters.updateVnicParameters); - invokeActionType(VdcActionType.RemoveVmInterface, parameters.removeVnicParameters); - - if (getParameters().reorderNics) { - VmOperationParameterBase reorderParams = new VmOperationParameterBase(getParameters().vmId); - runInternalAction(VdcActionType.ReorderVmNics, reorderParams); - } - - getReturnValue().setSucceeded(true); - } - - private void invokeActionType(VdcActionType actionType, ArrayList<VdcActionParametersBase> parameters) { - if (!parameters.isEmpty()) { - log.debug("calling {} with {}", actionType, Arrays.toString(parameters.toArray())); - List<VdcReturnValueBase> results = runInternalMultipleActions(actionType, - parameters, - true, - true, - getContext().clone()); - - verifyThatAllActionsSucceeded(results, actionType, parameters.size()); - } - } - - private void verifyThatAllActionsSucceeded(List<VdcReturnValueBase> vdcReturnValueBases, - VdcActionType actionType, - int expectedNumberOfResults) { - if (vdcReturnValueBases == null) { - throw new IllegalArgumentException(); - } - - if (vdcReturnValueBases.size() != expectedNumberOfResults) { - throw new IllegalStateException( - String.format("Some of commands of type %1$s wasn't invoked, cannot proceed.", actionType)); - } - - for (VdcReturnValueBase vdcReturnValueBase : vdcReturnValueBases) { - if (!vdcReturnValueBase.getSucceeded()) { - throw new IllegalStateException( - String.format("Some invocation of %1$s failed, cannot proceed.", actionType)); - } - } - } - - private UpdateNicsVmInterfaceParametersFactory calculateRequiredParameters(List<VmInterfaceType> supportedInterfaceTypes, - VmInterfaceType defaultInterfaceType) { UpdateNicsVmInterfaceParametersFactory parameters = new UpdateNicsVmInterfaceParametersFactory(getParameters().updatedVmNetworkInterfaces, defaultInterfaceType, supportedInterfaceTypes, getParameters().vmId, - getExistingInterfacesForVm()); + existingNics); parameters.createParameters(); return parameters; } - private List<VmNetworkInterface> getExistingInterfacesForVm() { + @Override + protected List<VmNetworkInterface> getExistingNics() { VdcQueryReturnValue result = runInternalQuery(VdcQueryType.GetVmInterfacesByVmId, new IdQueryParameters(getParameters().vmId)); @@ -143,90 +80,4 @@ return interfaceTypes; } - @Override - public List<PermissionSubject> getPermissionCheckSubjects() { - return Collections.singletonList( - new PermissionSubject(Guid.SYSTEM, VdcObjectType.System, getActionType().getActionGroup())); - } - - private static class UpdateNicsVmInterfaceParametersFactory { - protected final Iterable<VmNetworkInterface> existingVnics; - protected final Iterable<VmNetworkInterface> vmNetworkInterfaces; - protected final Collection<VmInterfaceType> supportedInterfaceTypes; - protected final Guid vmId; - protected final Integer defaultTypeValue; - - public final ArrayList<VdcActionParametersBase> createVnicParameters = new ArrayList<>(); - public final ArrayList<VdcActionParametersBase> updateVnicParameters = new ArrayList<>(); - public final ArrayList<VdcActionParametersBase> removeVnicParameters = new ArrayList<>(); - - public UpdateNicsVmInterfaceParametersFactory(Iterable<VmNetworkInterface> vmNetworkInterfaces, - VmInterfaceType defaultType, - Collection<VmInterfaceType> supportedInterfaceTypes, - Guid vmId, - Iterable<VmNetworkInterface> existingVnics) { - this.vmNetworkInterfaces = vmNetworkInterfaces; - this.supportedInterfaceTypes = supportedInterfaceTypes; - this.vmId = vmId; - this.existingVnics = existingVnics; - defaultTypeValue = defaultType == null ? null : defaultType.getValue(); - } - - public void createParameters() { - final Set<String> vnicsEncountered = new HashSet<>(); - Map<String, VmNetworkInterface> existingVnicsMap = mapVnicsNamesToVnic(existingVnics); - - // iterate over edited VNICs, see if any need to be added or have been assigned a different profile - for (VmNetworkInterface editedVnic : vmNetworkInterfaces) { - String vnicName = editedVnic.getName(); - VmNetworkInterface existingVnic = existingVnicsMap.get(vnicName); - if (existingVnic == null) { - editedVnic.setType(defaultTypeValue); - createVnicParameters.add(createAddInterfaceParameter(editedVnic)); - } else { - vnicsEncountered.add(vnicName); - Guid existingProfileId = existingVnic.getVnicProfileId(); - Guid editedProfileId = editedVnic.getVnicProfileId(); - if (supportedInterfaceTypes != null && !supportedInterfaceTypes.contains(VmInterfaceType.forValue( - existingVnic.getType()))) { - existingVnic.setType(defaultTypeValue); - } else if (supportedInterfaceTypes == null) { - existingVnic.setType(defaultTypeValue); - } - - if ((editedProfileId == null && existingProfileId != null) - || (editedProfileId != null && !editedProfileId.equals(existingProfileId))) { - existingVnic.setVnicProfileId(editedProfileId); - existingVnic.setNetworkName(editedVnic.getNetworkName()); - updateVnicParameters.add(createAddInterfaceParameter(existingVnic)); - } - } - } - - // iterate over existing VNICs, see if any have not been encountered and thus removed in editing - for (VmNetworkInterface existingVnic : existingVnics) { - if (!vnicsEncountered.contains(existingVnic.getName())) { - removeVnicParameters.add(createRemoveInterfaceParameter(existingVnic)); - } - } - } - - private VdcActionParametersBase createRemoveInterfaceParameter(VmNetworkInterface existingVnic) { - return new RemoveVmInterfaceParameters(vmId, existingVnic.getId()); - } - - private VdcActionParametersBase createAddInterfaceParameter(VmNetworkInterface editedVnic) { - editedVnic.setVmTemplateId(null); - return new AddVmInterfaceParameters(vmId, editedVnic); - } - - private Map<String, VmNetworkInterface> mapVnicsNamesToVnic(Iterable<VmNetworkInterface> existingVnics) { - Map<String, VmNetworkInterface> existingVnicNameToVnicMap = new HashMap<>(); - for (VmNetworkInterface vnic : existingVnics) { - existingVnicNameToVnicMap.put(vnic.getName(), vnic); - } - return existingVnicNameToVnicMap; - } - - } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index 84d7e91..820f457 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -388,7 +388,8 @@ UpdateMacPool(3101, ActionGroup.EDIT_MAC_POOL, false, QuotaDependency.NONE), RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, QuotaDependency.NONE), - UpdateAndReorderVmNics(3200, ActionGroup.CREATE_VM, false, QuotaDependency.NONE); + UpdateAndReorderVmNics(3200, ActionGroup.CREATE_VM, false, QuotaDependency.NONE), + UpdateAndReorderTemplateNics(3201, ActionGroup.CREATE_VM, false, QuotaDependency.NONE); private int intValue; private ActionGroup actionGroup; diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java index 892ca22..ad4a7f1 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java @@ -65,7 +65,7 @@ import org.ovirt.engine.core.common.action.StopVmParameters; import org.ovirt.engine.core.common.action.StopVmTypeEnum; import org.ovirt.engine.core.common.action.TryBackToAllSnapshotsOfVmParameters; -import org.ovirt.engine.core.common.action.UpdateAndReorderVmNicsParam; +import org.ovirt.engine.core.common.action.UpdateAndReorderNicsParam; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmManagementParametersBase; @@ -348,7 +348,7 @@ org.ovirt.engine.api.model.UpdateAndReorderVmNicsParameters updateAndReorderVmNicsParameters = action.getUpdateAndReorderVmNicsParameters(); - UpdateAndReorderVmNicsParam commandParameters = new UpdateAndReorderVmNicsParam(); + UpdateAndReorderNicsParam commandParameters = new UpdateAndReorderNicsParam(); commandParameters.vmId = Guid.createGuidFromString(id); commandParameters.version = new Version(updateAndReorderVmNicsParameters.getVersion()); commandParameters.osType = updateAndReorderVmNicsParameters.getOsType().intValue(); -- To view, visit http://gerrit.ovirt.org/35285 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibf67d6e0aeb094859f7eb1930bb151164f5207be Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Mucha <mmu...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches