Muli Salem has uploaded a new change for review.

Change subject: core: AddVmInterface Calls PlugUnplugCommand (#850854)
......................................................................

core: AddVmInterface Calls PlugUnplugCommand (#850854)

https://bugzilla.redhat.com/850854

Instead of calling HotPlugNicVdsCommand, AddVmInterfaceCommand
is changed to call PlugUnPligVmNicCommand. This prevents
redundancy between the two engine commands.

Signed-off-by: Muli Salem <[email protected]>
Change-Id: Ibc4636c8003ea3fc170a13be96a3efb9dc8cca24
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmInterfaceCommand.java
1 file changed, 53 insertions(+), 37 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/42/7542/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmInterfaceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmInterfaceCommand.java
index 5cc2eea..5329031 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmInterfaceCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmInterfaceCommand.java
@@ -4,18 +4,21 @@
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.PermissionSubject;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.AddVmInterfaceParameters;
+import org.ovirt.engine.core.common.action.PlugAction;
+import org.ovirt.engine.core.common.action.PlugUnplugVmNicParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.businessentities.ActionGroup;
 import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.Network;
-import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.businessentities.VmDeviceId;
-import org.ovirt.engine.core.common.businessentities.VmDynamic;
 import org.ovirt.engine.core.common.businessentities.VmInterfaceType;
 import org.ovirt.engine.core.common.businessentities.VmNetworkInterface;
 import org.ovirt.engine.core.common.businessentities.VmStatic;
@@ -23,8 +26,6 @@
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.utils.ValidationUtils;
 import org.ovirt.engine.core.common.validation.group.CreateEntity;
-import org.ovirt.engine.core.common.vdscommands.HotPlugUnplgNicVDSParameters;
-import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.Regex;
 import org.ovirt.engine.core.dal.VdcBllMessages;
@@ -33,7 +34,10 @@
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogFields;
 import org.ovirt.engine.core.utils.linq.LinqUtils;
 import org.ovirt.engine.core.utils.linq.Predicate;
+import org.ovirt.engine.core.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
+@NonTransactiveCommandAttribute(forceCompensation = true)
 @CustomLogFields({ @CustomLogField("InterfaceName") })
 public class AddVmInterfaceCommand<T extends AddVmInterfaceParameters> extends 
VmCommand<T> {
 
@@ -62,40 +66,58 @@
 
         getParameters().getInterface().setId(Guid.NewGuid());
         getParameters().getInterface().setVmId(getParameters().getVmId());
-        DbFacade dbFacade = DbFacade.getInstance();
-        dbFacade
-                .getVmNetworkInterfaceDAO()
-                .save(getParameters().getInterface());
-        dbFacade
-                .getVmNetworkStatisticsDAO()
-                .save(getParameters().getInterface().getStatistics());
 
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                addInterfaceToDb(getParameters().getInterface());
+                addInterfaceDeviceToDb();
+                getCompensationContext().stateChanged();
+                return null;
+            }
+        });
+
+        boolean succeeded = true;
+        if (getParameters().getInterface().isActive()) {
+            succeeded = plugNic();
+        }
+        setSucceeded(succeeded);
+    }
+
+    private void addInterfaceDeviceToDb() {
         VmDevice vmDevice = VmDeviceUtils.addNetworkInterfaceDevice(
                 new VmDeviceId(getParameters().getInterface().getId(), 
getParameters().getVmId()),
                 getParameters().getInterface().isActive());
-
-        boolean succeded = true;
-        VmDynamic vmDynamic = getVm().getDynamicData();
-        if (getParameters().getInterface().isActive()
-                && 
VmHandler.isHotPlugNicAllowedForVmStatus(vmDynamic.getstatus())) {
-            succeded = hotPlugNic(vmDevice, vmDynamic);
-            if (!succeded) {
-                getReturnValue().getExecuteFailedMessages().add("Failed 
hot-plugging nic to VM");
-            }
-        }
-        setSucceeded(succeded);
+        getCompensationContext().snapshotNewEntity(vmDevice);
     }
 
-    private boolean hotPlugNic(VmDevice vmDevice, VmDynamic vmDynamic) {
-        if (!canPerformHotPlug()) {
-            return false;
-        } else {
-            return runVdsCommand(VDSCommandType.HotPlugNic,
-                    new 
HotPlugUnplgNicVDSParameters(vmDynamic.getrun_on_vds().getValue(),
-                            vmDynamic.getId(),
-                            getParameters().getInterface(),
-                            vmDevice)).getSucceeded();
+    private void addInterfaceToDb(VmNetworkInterface vmNetworkInterface) {
+        DbFacade dbFacade = DbFacade.getInstance();
+
+        dbFacade.getVmNetworkInterfaceDAO().save(vmNetworkInterface);
+        getCompensationContext().snapshotNewEntity(vmNetworkInterface);
+
+        
dbFacade.getVmNetworkStatisticsDAO().save(vmNetworkInterface.getStatistics());
+        
getCompensationContext().snapshotNewEntity(vmNetworkInterface.getStatistics());
+    }
+
+    private boolean plugNic() {
+        PlugUnplugVmNicParameters plugParameters = 
createPlugUnPlugParameters();
+        plugParameters.setVmId(getParameters().getVmId());
+        VdcReturnValueBase plugVmNicReturnValue =
+                
Backend.getInstance().runInternalAction(VdcActionType.PlugUnplugVmNic,
+                        plugParameters,
+                        
ExecutionHandler.createDefaultContexForTasks(getExecutionContext()));
+        if (!plugVmNicReturnValue.getSucceeded()) {
+            getReturnValue().getExecuteFailedMessages().add("Failed 
hot-plugging nic to VM");
+            
getReturnValue().getCanDoActionMessages().addAll(plugVmNicReturnValue.getCanDoActionMessages());
+            
getReturnValue().getCanDoActionMessages().remove(VdcBllMessages.VAR__ACTION__ADD);
         }
+        return plugVmNicReturnValue.getSucceeded();
+    }
+
+    private PlugUnplugVmNicParameters createPlugUnPlugParameters() {
+        return new 
PlugUnplugVmNicParameters(getParameters().getInterface().getId(), 
PlugAction.PLUG);
     }
 
     @Override
@@ -168,12 +190,6 @@
             
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_NOT_A_VM_NETWORK);
             addCanDoActionMessage(String.format("$networks %1$s", 
interfaceNetwork.getname()));
             return false;
-        }
-
-        if (getParameters().getInterface().isActive()) {
-            if (getVm().getstatus() == VMStatus.Up && !canPerformHotPlug()) {
-                return false;
-            }
         }
 
         if (!StringUtils.isEmpty(getMacAddress())) {


--
To view, visit http://gerrit.ovirt.org/7542
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibc4636c8003ea3fc170a13be96a3efb9dc8cca24
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Muli Salem <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to