You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ek...@apache.org on 2015/04/05 13:25:08 UTC

[1/8] git commit: updated refs/heads/master to 096d1b9

Repository: cloudstack
Updated Branches:
  refs/heads/master c59308b0e -> 096d1b93b


Refactoring the MigrateWithStorageReceiveCommand wrapper in order to cope with new design
   - Unit tests added: 65% coverage
   - It's a bit difficult to test the Xen API classes due to their static nature


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c5a2f926
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c5a2f926
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c5a2f926

Branch: refs/heads/master
Commit: c5a2f926e010a77d0cd61485747e199789a23e74
Parents: 858b87f
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Apr 3 15:30:35 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 09:23:09 2015 +0200

----------------------------------------------------------------------
 .../resource/wrapper/CitrixRequestWrapper.java  |   2 +
 ...rver610MigrateWithStorageCommandWrapper.java |   4 +-
 ...MigrateWithStorageReceiveCommandWrapper.java |  91 +++++++++++++
 .../wrapper/XenServer610WrapperTest.java        | 134 +++++++++++++++++--
 4 files changed, 221 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c5a2f926/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
index 59d1a5f..e89d926 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -45,6 +45,7 @@ import com.cloud.agent.api.GetVncPortCommand;
 import com.cloud.agent.api.MaintainCommand;
 import com.cloud.agent.api.MigrateCommand;
 import com.cloud.agent.api.MigrateWithStorageCommand;
+import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
 import com.cloud.agent.api.ModifySshKeysCommand;
 import com.cloud.agent.api.ModifyStoragePoolCommand;
 import com.cloud.agent.api.NetworkRulesSystemVmCommand;
@@ -195,6 +196,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
         // XenServer610Resource commands
         final Hashtable<Class<? extends Command>, CommandWrapper> xenServer610Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
         xenServer610Commands.put(MigrateWithStorageCommand.class, new XenServer610MigrateWithStorageCommandWrapper());
+        xenServer610Commands.put(MigrateWithStorageReceiveCommand.class, new XenServer610MigrateWithStorageReceiveCommandWrapper());
         resources.put(XenServer610Resource.class, xenServer610Commands);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c5a2f926/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java
index 0d1cac4..970ed10 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java
@@ -82,7 +82,9 @@ public final class XenServer610MigrateWithStorageCommandWrapper extends CommandW
             final Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
             final Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
             for (final Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
-                vdiMap.put(xenServer610Resource.getVDIbyUuid(connection, entry.getKey().getPath()), xenServer610Resource.getStorageRepository(connection, entry.getValue().getUuid()));
+                final VolumeTO volume = entry.getKey();
+                final StorageFilerTO sotrageFiler = entry.getValue();
+                vdiMap.put(xenServer610Resource.getVDIbyUuid(connection, volume.getPath()), xenServer610Resource.getStorageRepository(connection, sotrageFiler.getUuid()));
             }
 
             // Get the vm to migrate.

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c5a2f926/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageReceiveCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageReceiveCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageReceiveCommandWrapper.java
new file mode 100644
index 0000000..57f5851
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageReceiveCommandWrapper.java
@@ -0,0 +1,91 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.MigrateWithStorageReceiveAnswer;
+import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.hypervisor.xenserver.resource.XsHost;
+import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.SR;
+
+public final class XenServer610MigrateWithStorageReceiveCommandWrapper extends CommandWrapper<MigrateWithStorageReceiveCommand, Answer, XenServer610Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer610MigrateWithStorageReceiveCommandWrapper.class);
+
+    @Override
+    public Answer execute(final MigrateWithStorageReceiveCommand command, final XenServer610Resource xenServer610Resource) {
+        final Connection connection = xenServer610Resource.getConnection();
+        final VirtualMachineTO vmSpec = command.getVirtualMachine();
+        final Map<VolumeTO, StorageFilerTO> volumeToFiler = command.getVolumeToFiler();
+
+        try {
+            // Get a map of all the SRs to which the vdis will be migrated.
+            final Map<VolumeTO, Object> volumeToSr = new HashMap<VolumeTO, Object>();
+            for (final Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
+                final StorageFilerTO storageFiler = entry.getValue();
+                final SR sr = xenServer610Resource.getStorageRepository(connection, storageFiler.getUuid());
+                volumeToSr.put(entry.getKey(), sr);
+            }
+
+            // Get the list of networks to which the vifs will attach.
+            final Map<NicTO, Object> nicToNetwork = new HashMap<NicTO, Object>();
+            for (final NicTO nicTo : vmSpec.getNics()) {
+                final Network network = xenServer610Resource.getNetwork(connection, nicTo);
+                nicToNetwork.put(nicTo, network);
+            }
+
+            final XsLocalNetwork nativeNetworkForTraffic = xenServer610Resource.getNativeNetworkForTraffic(connection, TrafficType.Storage, null);
+            final Network network = nativeNetworkForTraffic.getNetwork();
+            final XsHost xsHost = xenServer610Resource.getHost();
+            final String uuid = xsHost.getUuid();
+
+            final Map<String, String> other = new HashMap<String, String>();
+            other.put("live", "true");
+
+            final Host host = Host.getByUuid(connection, uuid);
+            final Map<String, String> token = host.migrateReceive(connection, network, other);
+
+            return new MigrateWithStorageReceiveAnswer(command, volumeToSr, nicToNetwork, token);
+        } catch (final CloudRuntimeException e) {
+            s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
+            return new MigrateWithStorageReceiveAnswer(command, e);
+        } catch (final Exception e) {
+            s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
+            return new MigrateWithStorageReceiveAnswer(command, e);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c5a2f926/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
index a708684..649dd1f 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
@@ -34,12 +34,12 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CheckNetworkCommand;
 import com.cloud.agent.api.MigrateWithStorageCommand;
+import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
 import com.cloud.agent.api.SetupCommand;
 import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.StorageFilerTO;
@@ -52,12 +52,12 @@ import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.PhysicalNetworkSetupInfo;
 import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
 import com.xensource.xenapi.Network;
+import com.xensource.xenapi.SR;
 import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VDI;
 
 @RunWith(PowerMockRunner.class)
-@PrepareForTest({Host.class})
 public class XenServer610WrapperTest {
 
     @Mock
@@ -96,10 +96,19 @@ public class XenServer610WrapperTest {
     public void testMigrateWithStorageCommand() {
         final String vmName = "small";
         final String uuid = "206b21a7-c6ec-40e2-b5e2-f861b9612f04";
+        final String path = "/";
 
         final Connection conn = Mockito.mock(Connection.class);
         final VirtualMachineTO vmSpec = Mockito.mock(VirtualMachineTO.class);
+
+        final VolumeTO vol1 = Mockito.mock(VolumeTO.class);
+        final VolumeTO vol2 = Mockito.mock(VolumeTO.class);
+        final StorageFilerTO storage1 = Mockito.mock(StorageFilerTO.class);
+        final StorageFilerTO storage2 = Mockito.mock(StorageFilerTO.class);
+
         final Map<VolumeTO, StorageFilerTO> volumeToFiler = new  HashMap<VolumeTO, StorageFilerTO>();
+        volumeToFiler.put(vol1, storage1);
+        volumeToFiler.put(vol2, storage2);
 
         final NicTO nicTO1 = Mockito.mock(NicTO.class);
         final NicTO nicTO2 = Mockito.mock(NicTO.class);
@@ -108,11 +117,15 @@ public class XenServer610WrapperTest {
 
         final XsLocalNetwork nativeNetworkForTraffic = Mockito.mock(XsLocalNetwork.class);
         final Network networkForSm = Mockito.mock(Network.class);
-
         final XsHost xsHost = Mockito.mock(XsHost.class);
-        final Host host = Mockito.mock(Host.class);
 
-        final MigrateWithStorageCommand gpuStats = new MigrateWithStorageCommand(vmSpec, volumeToFiler);
+        final SR sr1 = Mockito.mock(SR.class);
+        final SR sr2 = Mockito.mock(SR.class);
+
+        final VDI vdi1 = Mockito.mock(VDI.class);
+        final VDI vdi2 = Mockito.mock(VDI.class);
+
+        final MigrateWithStorageCommand migrateStorageCommand = new MigrateWithStorageCommand(vmSpec, volumeToFiler);
 
         final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
         assertNotNull(wrapper);
@@ -121,30 +134,133 @@ public class XenServer610WrapperTest {
         when(vmSpec.getName()).thenReturn(vmName);
         when(vmSpec.getNics()).thenReturn(nicTOs);
 
+        when(storage1.getUuid()).thenReturn(uuid);
+        when(storage2.getUuid()).thenReturn(uuid);
+
+        when(vol1.getPath()).thenReturn(path);
+        when(vol2.getPath()).thenReturn(path);
+
+        when(xenServer610Resource.getStorageRepository(conn, storage1.getUuid())).thenReturn(sr1);
+        when(xenServer610Resource.getStorageRepository(conn, storage2.getUuid())).thenReturn(sr2);
+
+        when(xenServer610Resource.getVDIbyUuid(conn, storage1.getPath())).thenReturn(vdi1);
+        when(xenServer610Resource.getVDIbyUuid(conn, storage2.getPath())).thenReturn(vdi2);
+
         try {
+            when(xenServer610Resource.getNativeNetworkForTraffic(conn, TrafficType.Storage, null)).thenReturn(nativeNetworkForTraffic);
+            when(nativeNetworkForTraffic.getNetwork()).thenReturn(networkForSm);
+
             when(xenServer610Resource.getHost()).thenReturn(xsHost);
             when(xsHost.getUuid()).thenReturn(uuid);
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        final Answer answer = wrapper.execute(migrateStorageCommand, xenServer610Resource);
+
+        verify(xenServer610Resource, times(1)).getConnection();
+
+        try {
+            verify(xenServer610Resource, times(1)).prepareISO(conn, vmName);
+            verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO1);
+            verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO2);
+            verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO3);
+
+            verify(xenServer610Resource, times(1)).getNativeNetworkForTraffic(conn, TrafficType.Storage, null);
+            verify(nativeNetworkForTraffic, times(1)).getNetwork();
+
+            verify(xenServer610Resource, times(1)).getHost();
+            verify(xsHost, times(1)).getUuid();
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        assertFalse(answer.getResult());
+    }
+
+    @Test
+    public void testMigrateWithStorageReceiveCommand() {
+        final String vmName = "small";
+        final String uuid = "206b21a7-c6ec-40e2-b5e2-f861b9612f04";
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final VirtualMachineTO vmSpec = Mockito.mock(VirtualMachineTO.class);
+
+        final VolumeTO vol1 = Mockito.mock(VolumeTO.class);
+        final VolumeTO vol2 = Mockito.mock(VolumeTO.class);
+        final StorageFilerTO storage1 = Mockito.mock(StorageFilerTO.class);
+        final StorageFilerTO storage2 = Mockito.mock(StorageFilerTO.class);
+
+        final Map<VolumeTO, StorageFilerTO> volumeToFiler = new  HashMap<VolumeTO, StorageFilerTO>();
+        volumeToFiler.put(vol1, storage1);
+        volumeToFiler.put(vol2, storage2);
+
+        final NicTO nicTO1 = Mockito.mock(NicTO.class);
+        final NicTO nicTO2 = Mockito.mock(NicTO.class);
+        final NicTO nicTO3 = Mockito.mock(NicTO.class);
+        final NicTO [] nicTOs = {nicTO1, nicTO2, nicTO3};
+
+        final XsLocalNetwork nativeNetworkForTraffic = Mockito.mock(XsLocalNetwork.class);
+        final Network network = Mockito.mock(Network.class);
+        final XsHost xsHost = Mockito.mock(XsHost.class);
+
+        final Network nw1 = Mockito.mock(Network.class);
+        final Network nw2 = Mockito.mock(Network.class);
+        final Network nw3 = Mockito.mock(Network.class);
+
+        final SR sr1 = Mockito.mock(SR.class);
+        final SR sr2 = Mockito.mock(SR.class);
+
+        final MigrateWithStorageReceiveCommand migrateStorageCommand = new MigrateWithStorageReceiveCommand(vmSpec, volumeToFiler);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer610Resource.getConnection()).thenReturn(conn);
+        when(vmSpec.getName()).thenReturn(vmName);
+        when(vmSpec.getNics()).thenReturn(nicTOs);
+
+        when(storage1.getUuid()).thenReturn(uuid);
+        when(storage2.getUuid()).thenReturn(uuid);
+
+        when(xenServer610Resource.getStorageRepository(conn, storage1.getUuid())).thenReturn(sr1);
+        when(xenServer610Resource.getStorageRepository(conn, storage2.getUuid())).thenReturn(sr2);
+
+        try {
+
+            when(xenServer610Resource.getNetwork(conn, nicTO1)).thenReturn(nw1);
+            when(xenServer610Resource.getNetwork(conn, nicTO2)).thenReturn(nw2);
+            when(xenServer610Resource.getNetwork(conn, nicTO3)).thenReturn(nw3);
 
             when(xenServer610Resource.getNativeNetworkForTraffic(conn, TrafficType.Storage, null)).thenReturn(nativeNetworkForTraffic);
-            when(nativeNetworkForTraffic.getNetwork()).thenReturn(networkForSm);
+            when(nativeNetworkForTraffic.getNetwork()).thenReturn(network);
+
+            when(xenServer610Resource.getHost()).thenReturn(xsHost);
+            when(xsHost.getUuid()).thenReturn(uuid);
         } catch (final XenAPIException e) {
             fail(e.getMessage());
         } catch (final XmlRpcException e) {
             fail(e.getMessage());
         }
 
-        final Answer answer = wrapper.execute(gpuStats, xenServer610Resource);
+        final Answer answer = wrapper.execute(migrateStorageCommand, xenServer610Resource);
 
         verify(xenServer610Resource, times(1)).getConnection();
 
         try {
-            verify(xenServer610Resource, times(1)).prepareISO(conn, vmName);
             verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO1);
             verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO2);
             verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO3);
 
             verify(xenServer610Resource, times(1)).getNativeNetworkForTraffic(conn, TrafficType.Storage, null);
             verify(nativeNetworkForTraffic, times(1)).getNetwork();
+
+            verify(xenServer610Resource, times(1)).getHost();
+            verify(xsHost, times(1)).getUuid();
         } catch (final XenAPIException e) {
             fail(e.getMessage());
         } catch (final XmlRpcException e) {


[5/8] git commit: updated refs/heads/master to 096d1b9

Posted by ek...@apache.org.
Refactoring the MigrateWithStorageCompleteCommand wrapper in order to cope with new design
   - Unit tests added: 50% coverage
   - It's a bit difficult to test the Xen API classes due to their static nature


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f6e162af
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f6e162af
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f6e162af

Branch: refs/heads/master
Commit: f6e162afe437eb1aed9dad74e5abebed9225f5d8
Parents: d5414d2
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Apr 3 16:29:08 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 09:23:10 2015 +0200

----------------------------------------------------------------------
 .../resource/XenServer610Resource.java          | 36 +-------------------
 .../wrapper/XenServer610WrapperTest.java        | 27 +++++++++++++++
 2 files changed, 28 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f6e162af/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
index 261ace0..212b41b 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
@@ -30,18 +30,14 @@ import org.apache.xmlrpc.XmlRpcException;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
-import com.cloud.agent.api.MigrateWithStorageCompleteAnswer;
-import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
 import com.cloud.agent.api.storage.MigrateVolumeAnswer;
 import com.cloud.agent.api.storage.MigrateVolumeCommand;
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.agent.api.to.StorageFilerTO;
-import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.resource.ServerResource;
 import com.cloud.storage.Volume;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
 import com.xensource.xenapi.SR;
 import com.xensource.xenapi.Task;
 import com.xensource.xenapi.Types;
@@ -58,9 +54,7 @@ public class XenServer610Resource extends XenServer600Resource {
 
     @Override
     public Answer executeRequest(final Command cmd) {
-        if (cmd instanceof MigrateWithStorageCompleteCommand) {
-            return execute((MigrateWithStorageCompleteCommand)cmd);
-        } else if (cmd instanceof MigrateVolumeCommand) {
+        if (cmd instanceof MigrateVolumeCommand) {
             return execute((MigrateVolumeCommand)cmd);
         } else {
             return super.executeRequest(cmd);
@@ -102,34 +96,6 @@ public class XenServer610Resource extends XenServer600Resource {
         return volumeToList;
     }
 
-    protected MigrateWithStorageCompleteAnswer execute(final MigrateWithStorageCompleteCommand cmd) {
-        final Connection connection = getConnection();
-        final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
-
-        try {
-            final Host host = Host.getByUuid(connection, _host.getUuid());
-            final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
-            final VM migratedVm = vms.iterator().next();
-
-            // Check the vm is present on the new host.
-            if (migratedVm == null) {
-                throw new CloudRuntimeException("Couldn't find the migrated vm " + vmSpec.getName() + " on the destination host.");
-            }
-
-            // Volume paths would have changed. Return that information.
-            final List<VolumeObjectTO> volumeToSet = getUpdatedVolumePathsOfMigratedVm(connection, migratedVm, vmSpec.getDisks());
-            migratedVm.setAffinity(connection, host);
-
-            return new MigrateWithStorageCompleteAnswer(cmd, volumeToSet);
-        } catch (final CloudRuntimeException e) {
-            s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
-            return new MigrateWithStorageCompleteAnswer(cmd, e);
-        } catch (final Exception e) {
-            s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
-            return new MigrateWithStorageCompleteAnswer(cmd, e);
-        }
-    }
-
     protected MigrateVolumeAnswer execute(final MigrateVolumeCommand cmd) {
         final Connection connection = getConnection();
         final String volumeUUID = cmd.getVolumePath();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f6e162af/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
index 7f17ed4..3e04782 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
@@ -39,6 +39,7 @@ import org.powermock.modules.junit4.PowerMockRunner;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CheckNetworkCommand;
 import com.cloud.agent.api.MigrateWithStorageCommand;
+import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
 import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
 import com.cloud.agent.api.MigrateWithStorageSendCommand;
 import com.cloud.agent.api.SetupCommand;
@@ -433,4 +434,30 @@ public class XenServer610WrapperTest {
 
         assertFalse(answer.getResult());
     }
+
+    @Test
+    public void testMigrateWithStorageCompleteCommand() {
+        final String vmName = "small";
+        final String uuid = "206b21a7-c6ec-40e2-b5e2-f861b9612f04";
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final XsHost xsHost = Mockito.mock(XsHost.class);
+
+        final VirtualMachineTO vm = Mockito.mock(VirtualMachineTO.class);
+
+        final MigrateWithStorageCompleteCommand createStorageCommand = new MigrateWithStorageCompleteCommand(vm);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer610Resource.getConnection()).thenReturn(conn);
+        when(vm.getName()).thenReturn(vmName);
+        when(xenServer610Resource.getHost()).thenReturn(xsHost);
+        when(xsHost.getUuid()).thenReturn(uuid);
+
+        final Answer answer = wrapper.execute(createStorageCommand, xenServer610Resource);
+        verify(xenServer610Resource, times(1)).getConnection();
+
+        assertFalse(answer.getResult());
+    }
 }
\ No newline at end of file


[7/8] git commit: updated refs/heads/master to 096d1b9

Posted by ek...@apache.org.
Refactoring the MigrateVolumeCommand wrapper in order to cope with new design
   - Unit tests added: 43.1% coverage
   - It's a bit difficult to test the Xen API classes due to their static nature


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/02d1cdd4
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/02d1cdd4
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/02d1cdd4

Branch: refs/heads/master
Commit: 02d1cdd49a1d7e7d2f4493cfeafd97b35eff92a0
Parents: f6e162a
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Apr 3 16:57:07 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 09:23:10 2015 +0200

----------------------------------------------------------------------
 .../resource/XenServer610Resource.java          | 44 +-----------
 .../resource/wrapper/CitrixRequestWrapper.java  |  2 +
 ...XenServer610MigrateVolumeCommandWrapper.java | 71 ++++++++++++++++++++
 .../wrapper/XenServer610WrapperTest.java        | 62 +++++++++++++++++
 4 files changed, 136 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02d1cdd4/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
index 212b41b..68a5acf 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
@@ -28,18 +28,11 @@ import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.storage.MigrateVolumeAnswer;
-import com.cloud.agent.api.storage.MigrateVolumeCommand;
 import com.cloud.agent.api.to.DiskTO;
-import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.resource.ServerResource;
 import com.cloud.storage.Volume;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.SR;
-import com.xensource.xenapi.Task;
 import com.xensource.xenapi.Types;
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VBD;
@@ -52,15 +45,6 @@ public class XenServer610Resource extends XenServer600Resource {
 
     private static final Logger s_logger = Logger.getLogger(XenServer610Resource.class);
 
-    @Override
-    public Answer executeRequest(final Command cmd) {
-        if (cmd instanceof MigrateVolumeCommand) {
-            return execute((MigrateVolumeCommand)cmd);
-        } else {
-            return super.executeRequest(cmd);
-        }
-    }
-
     public List<VolumeObjectTO> getUpdatedVolumePathsOfMigratedVm(final Connection connection, final VM migratedVm, final DiskTO[] volumes) throws CloudRuntimeException {
         final List<VolumeObjectTO> volumeToList = new ArrayList<VolumeObjectTO>();
 
@@ -96,34 +80,8 @@ public class XenServer610Resource extends XenServer600Resource {
         return volumeToList;
     }
 
-    protected MigrateVolumeAnswer execute(final MigrateVolumeCommand cmd) {
-        final Connection connection = getConnection();
-        final String volumeUUID = cmd.getVolumePath();
-        final StorageFilerTO poolTO = cmd.getPool();
-
-        try {
-            final SR destinationPool = getStorageRepository(connection, poolTO.getUuid());
-            final VDI srcVolume = getVDIbyUuid(connection, volumeUUID);
-            final Map<String, String> other = new HashMap<String, String>();
-            other.put("live", "true");
-
-            // Live migrate the vdi across pool.
-            final Task task = srcVolume.poolMigrateAsync(connection, destinationPool, other);
-            final long timeout = _migratewait * 1000L;
-            waitForTask(connection, task, 1000, timeout);
-            checkForSuccess(connection, task);
-            final VDI dvdi = Types.toVDI(task, connection);
-
-            return new MigrateVolumeAnswer(cmd, true, null, dvdi.getUuid(connection));
-        } catch (final Exception e) {
-            final String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
-            s_logger.error(msg, e);
-            return new MigrateVolumeAnswer(cmd, false, msg, null);
-        }
-    }
-
     @Override
     protected void plugDom0Vif(final Connection conn, final VIF dom0Vif) throws XmlRpcException, XenAPIException {
         // do nothing. In xenserver 6.1 and beyond this step isn't needed.
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02d1cdd4/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
index b0376c7..8128f23 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -86,6 +86,7 @@ import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand;
 import com.cloud.agent.api.routing.NetworkElementCommand;
 import com.cloud.agent.api.storage.CreateCommand;
 import com.cloud.agent.api.storage.DestroyCommand;
+import com.cloud.agent.api.storage.MigrateVolumeCommand;
 import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
 import com.cloud.agent.api.storage.ResizeVolumeCommand;
 import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
@@ -201,6 +202,7 @@ public class CitrixRequestWrapper extends RequestWrapper {
         xenServer610Commands.put(MigrateWithStorageReceiveCommand.class, new XenServer610MigrateWithStorageReceiveCommandWrapper());
         xenServer610Commands.put(MigrateWithStorageSendCommand.class, new XenServer610MigrateWithStorageSendCommandWrapper());
         xenServer610Commands.put(MigrateWithStorageCompleteCommand.class, new XenServer610MigrateWithStorageCompleteCommandWrapper());
+        xenServer610Commands.put(MigrateVolumeCommand.class, new XenServer610MigrateVolumeCommandWrapper());
         resources.put(XenServer610Resource.class, xenServer610Commands);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02d1cdd4/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateVolumeCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateVolumeCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateVolumeCommandWrapper.java
new file mode 100644
index 0000000..284ec89
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateVolumeCommandWrapper.java
@@ -0,0 +1,71 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.MigrateVolumeAnswer;
+import com.cloud.agent.api.storage.MigrateVolumeCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Task;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VDI;
+
+public final class XenServer610MigrateVolumeCommandWrapper extends CommandWrapper<MigrateVolumeCommand, Answer, XenServer610Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer610MigrateVolumeCommandWrapper.class);
+
+    @Override
+    public Answer execute(final MigrateVolumeCommand command, final XenServer610Resource xenServer610Resource) {
+        final Connection connection = xenServer610Resource.getConnection();
+        final String volumeUUID = command.getVolumePath();
+        final StorageFilerTO poolTO = command.getPool();
+
+        try {
+            String uuid = poolTO.getUuid();
+            final SR destinationPool = xenServer610Resource.getStorageRepository(connection, uuid);
+            final VDI srcVolume = xenServer610Resource.getVDIbyUuid(connection, volumeUUID);
+            final Map<String, String> other = new HashMap<String, String>();
+            other.put("live", "true");
+
+            // Live migrate the vdi across pool.
+            final Task task = srcVolume.poolMigrateAsync(connection, destinationPool, other);
+            final long timeout = xenServer610Resource.getMigrateWait() * 1000L;
+            xenServer610Resource.waitForTask(connection, task, 1000, timeout);
+            xenServer610Resource.checkForSuccess(connection, task);
+
+            final VDI dvdi = Types.toVDI(task, connection);
+
+            return new MigrateVolumeAnswer(command, true, null, dvdi.getUuid(connection));
+        } catch (final Exception e) {
+            final String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();
+            s_logger.error(msg, e);
+            return new MigrateVolumeAnswer(command, false, msg, null);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/02d1cdd4/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
index 3e04782..0a539e9 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
@@ -43,6 +43,7 @@ import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
 import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
 import com.cloud.agent.api.MigrateWithStorageSendCommand;
 import com.cloud.agent.api.SetupCommand;
+import com.cloud.agent.api.storage.MigrateVolumeCommand;
 import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
@@ -53,9 +54,12 @@ import com.cloud.hypervisor.xenserver.resource.XsHost;
 import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.PhysicalNetworkSetupInfo;
+import com.cloud.storage.StoragePool;
 import com.xensource.xenapi.Connection;
 import com.xensource.xenapi.Network;
 import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Task;
+import com.xensource.xenapi.Types.BadServerResponse;
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VDI;
 import com.xensource.xenapi.VIF;
@@ -456,8 +460,66 @@ public class XenServer610WrapperTest {
         when(xsHost.getUuid()).thenReturn(uuid);
 
         final Answer answer = wrapper.execute(createStorageCommand, xenServer610Resource);
+
         verify(xenServer610Resource, times(1)).getConnection();
 
         assertFalse(answer.getResult());
     }
+
+    @Test
+    public void testXenServer610MigrateVolumeCommandWrapper() {
+        final String uuid = "206b21a7-c6ec-40e2-b5e2-f861b9612f04";
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final SR destinationPool = Mockito.mock(SR.class);
+        final VDI srcVolume = Mockito.mock(VDI.class);
+        final Task task = Mockito.mock(Task.class);
+
+        final long volumeId = 1l;
+        final String volumePath = "206b21a7-c6ec-40e2-b5e2-f861b9612f04";
+        final StoragePool pool = Mockito.mock(StoragePool.class);
+        final int timeout = 120;
+
+        final Map<String, String> other = new HashMap<String, String>();
+        other.put("live", "true");
+
+        final MigrateVolumeCommand createStorageCommand = new MigrateVolumeCommand(volumeId, volumePath, pool, timeout);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer610Resource.getConnection()).thenReturn(conn);
+        when(pool.getUuid()).thenReturn(uuid);
+        when(xenServer610Resource.getStorageRepository(conn, uuid)).thenReturn(destinationPool);
+        when(xenServer610Resource.getVDIbyUuid(conn, volumePath)).thenReturn(srcVolume);
+
+        try {
+            when(srcVolume.poolMigrateAsync(conn, destinationPool, other)).thenReturn(task);
+        } catch (final BadServerResponse e) {
+            fail(e.getMessage());
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        when(xenServer610Resource.getMigrateWait()).thenReturn(120);
+
+        final Answer answer = wrapper.execute(createStorageCommand, xenServer610Resource);
+
+        verify(xenServer610Resource, times(1)).getConnection();
+
+        //        try {
+        //            verify(xenServer610Resource, times(1)).waitForTask(conn, task, 1000, timeout);
+        //            verify(xenServer610Resource, times(1)).checkForSuccess(conn, task);
+        //        } catch (final XenAPIException e) {
+        //            fail(e.getMessage());
+        //        } catch (final XmlRpcException e) {
+        //            fail(e.getMessage());
+        //        } catch (final TimeoutException e) {
+        //            fail(e.getMessage());
+        //        }
+
+        assertFalse(answer.getResult());
+    }
 }
\ No newline at end of file


[2/8] git commit: updated refs/heads/master to 096d1b9

Posted by ek...@apache.org.
Refactoring the MigrateWithStorageCommand wrapper in order to cope with new design
   - Unit tests added: 30.1% coverage
   - It's a bit difficult to test the Xen API classes due to their static nature


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/858b87f0
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/858b87f0
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/858b87f0

Branch: refs/heads/master
Commit: 858b87f01c079f48ed557864be4842d6becaa55c
Parents: 240bcb8
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Apr 3 14:39:35 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 09:23:09 2015 +0200

----------------------------------------------------------------------
 .../xenserver/resource/CitrixResourceBase.java  |   4 +
 .../resource/XenServer610Resource.java          |   6 +-
 .../resource/wrapper/CitrixRequestWrapper.java  |  10 +-
 ...rver610MigrateWithStorageCommandWrapper.java | 135 +++++++++++++++++++
 .../wrapper/XenServer610WrapperTest.java        |  84 ++++++++++++
 5 files changed, 234 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858b87f0/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index 7729636..bf0ea6c 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -2004,6 +2004,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         return _host;
     }
 
+    public int getMigrateWait() {
+        return _migratewait;
+    }
+
     protected boolean getHostInfo(final Connection conn) throws IllegalArgumentException {
         try {
             final Host myself = Host.getByUuid(conn, _host.getUuid());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858b87f0/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
index b372ef7..7f5dfdb 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
@@ -68,9 +68,7 @@ public class XenServer610Resource extends XenServer600Resource {
 
     @Override
     public Answer executeRequest(final Command cmd) {
-        if (cmd instanceof MigrateWithStorageCommand) {
-            return execute((MigrateWithStorageCommand)cmd);
-        } else if (cmd instanceof MigrateWithStorageReceiveCommand) {
+        if (cmd instanceof MigrateWithStorageReceiveCommand) {
             return execute((MigrateWithStorageReceiveCommand)cmd);
         } else if (cmd instanceof MigrateWithStorageSendCommand) {
             return execute((MigrateWithStorageSendCommand)cmd);
@@ -83,7 +81,7 @@ public class XenServer610Resource extends XenServer600Resource {
         }
     }
 
-    private List<VolumeObjectTO> getUpdatedVolumePathsOfMigratedVm(final Connection connection, final VM migratedVm, final DiskTO[] volumes) throws CloudRuntimeException {
+    public List<VolumeObjectTO> getUpdatedVolumePathsOfMigratedVm(final Connection connection, final VM migratedVm, final DiskTO[] volumes) throws CloudRuntimeException {
         final List<VolumeObjectTO> volumeToList = new ArrayList<VolumeObjectTO>();
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858b87f0/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
index e7e238f..59d1a5f 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -44,6 +44,7 @@ import com.cloud.agent.api.GetVmStatsCommand;
 import com.cloud.agent.api.GetVncPortCommand;
 import com.cloud.agent.api.MaintainCommand;
 import com.cloud.agent.api.MigrateCommand;
+import com.cloud.agent.api.MigrateWithStorageCommand;
 import com.cloud.agent.api.ModifySshKeysCommand;
 import com.cloud.agent.api.ModifyStoragePoolCommand;
 import com.cloud.agent.api.NetworkRulesSystemVmCommand;
@@ -87,6 +88,8 @@ import com.cloud.agent.api.storage.ResizeVolumeCommand;
 import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
 import com.cloud.hypervisor.xenserver.resource.XenServer56FP1Resource;
 import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.hypervisor.xenserver.resource.XenServer620SP1Resource;
 import com.cloud.resource.CommandWrapper;
 import com.cloud.resource.RequestWrapper;
 import com.cloud.resource.ServerResource;
@@ -187,7 +190,12 @@ public class CitrixRequestWrapper extends RequestWrapper {
         // XenServer620SP1Resource commands
         final Hashtable<Class<? extends Command>, CommandWrapper> xenServer620SP1Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
         xenServer620SP1Commands.put(GetGPUStatsCommand.class, new XenServer620SP1GetGPUStatsCommandWrapper());
-        resources.put(XenServer56FP1Resource.class, xenServer620SP1Commands);
+        resources.put(XenServer620SP1Resource.class, xenServer620SP1Commands);
+
+        // XenServer610Resource commands
+        final Hashtable<Class<? extends Command>, CommandWrapper> xenServer610Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
+        xenServer610Commands.put(MigrateWithStorageCommand.class, new XenServer610MigrateWithStorageCommandWrapper());
+        resources.put(XenServer610Resource.class, xenServer610Commands);
     }
 
     public static CitrixRequestWrapper getInstance() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858b87f0/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java
new file mode 100644
index 0000000..0d1cac4
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCommandWrapper.java
@@ -0,0 +1,135 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.MigrateWithStorageAnswer;
+import com.cloud.agent.api.MigrateWithStorageCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.hypervisor.xenserver.resource.XsHost;
+import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Task;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VIF;
+import com.xensource.xenapi.VM;
+
+public final class XenServer610MigrateWithStorageCommandWrapper extends CommandWrapper<MigrateWithStorageCommand, Answer, XenServer610Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer610MigrateWithStorageCommandWrapper.class);
+
+    @Override
+    public Answer execute(final MigrateWithStorageCommand command, final XenServer610Resource xenServer610Resource) {
+        final Connection connection = xenServer610Resource.getConnection();
+        final VirtualMachineTO vmSpec = command.getVirtualMachine();
+        final Map<VolumeTO, StorageFilerTO> volumeToFiler = command.getVolumeToFiler();
+        final String vmName = vmSpec.getName();
+        Task task = null;
+
+        final XsHost xsHost = xenServer610Resource.getHost();
+        final String uuid = xsHost.getUuid();
+        try {
+            xenServer610Resource.prepareISO(connection, vmName);
+
+            // Get the list of networks and recreate VLAN, if required.
+            for (final NicTO nicTo : vmSpec.getNics()) {
+                xenServer610Resource.getNetwork(connection, nicTo);
+            }
+
+            final Map<String, String> other = new HashMap<String, String>();
+            other.put("live", "true");
+
+            final XsLocalNetwork nativeNetworkForTraffic = xenServer610Resource.getNativeNetworkForTraffic(connection, TrafficType.Storage, null);
+            final Network networkForSm = nativeNetworkForTraffic.getNetwork();
+
+            // Create the vif map. The vm stays in the same cluster so we have to pass an empty vif map.
+            final Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
+            final Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
+            for (final Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
+                vdiMap.put(xenServer610Resource.getVDIbyUuid(connection, entry.getKey().getPath()), xenServer610Resource.getStorageRepository(connection, entry.getValue().getUuid()));
+            }
+
+            // Get the vm to migrate.
+            final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
+            final VM vmToMigrate = vms.iterator().next();
+
+            // Check migration with storage is possible.
+            final Host host = Host.getByUuid(connection, uuid);
+            final Map<String, String> token = host.migrateReceive(connection, networkForSm, other);
+            task = vmToMigrate.assertCanMigrateAsync(connection, token, true, vdiMap, vifMap, other);
+            try {
+                // poll every 1 seconds
+                final long timeout = xenServer610Resource.getMigrateWait() * 1000L;
+                xenServer610Resource.waitForTask(connection, task, 1000, timeout);
+                xenServer610Resource.checkForSuccess(connection, task);
+            } catch (final Types.HandleInvalid e) {
+                s_logger.error("Error while checking if vm " + vmName + " can be migrated to the destination host " + host, e);
+                throw new CloudRuntimeException("Error while checking if vm " + vmName + " can be migrated to the " + "destination host " + host, e);
+            }
+
+            // Migrate now.
+            task = vmToMigrate.migrateSendAsync(connection, token, true, vdiMap, vifMap, other);
+            try {
+                // poll every 1 seconds.
+                final long timeout = xenServer610Resource.getMigrateWait() * 1000L;
+                xenServer610Resource.waitForTask(connection, task, 1000, timeout);
+                xenServer610Resource.checkForSuccess(connection, task);
+            } catch (final Types.HandleInvalid e) {
+                s_logger.error("Error while migrating vm " + vmName + " to the destination host " + host, e);
+                throw new CloudRuntimeException("Error while migrating vm " + vmName + " to the destination host " + host, e);
+            }
+
+            // Volume paths would have changed. Return that information.
+            final List<VolumeObjectTO> volumeToList = xenServer610Resource.getUpdatedVolumePathsOfMigratedVm(connection, vmToMigrate, vmSpec.getDisks());
+            vmToMigrate.setAffinity(connection, host);
+            return new MigrateWithStorageAnswer(command, volumeToList);
+        } catch (final Exception e) {
+            s_logger.warn("Catch Exception " + e.getClass().getName() + ". Storage motion failed due to " + e.toString(), e);
+            return new MigrateWithStorageAnswer(command, e);
+        } finally {
+            if (task != null) {
+                try {
+                    task.destroy(connection);
+                } catch (final Exception e) {
+                    s_logger.debug("Unable to destroy task " + task.toString() + " on host " + uuid + " due to " + e.toString());
+                }
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/858b87f0/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
index e8a64de..a708684 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
@@ -17,25 +17,47 @@
 package com.cloud.hypervisor.xenserver.resource.wrapper;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.xmlrpc.XmlRpcException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CheckNetworkCommand;
+import com.cloud.agent.api.MigrateWithStorageCommand;
 import com.cloud.agent.api.SetupCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.host.HostEnvironment;
 import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.hypervisor.xenserver.resource.XsHost;
+import com.cloud.hypervisor.xenserver.resource.XsLocalNetwork;
+import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.PhysicalNetworkSetupInfo;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.Types.XenAPIException;
 
 @RunWith(PowerMockRunner.class)
+@PrepareForTest({Host.class})
 public class XenServer610WrapperTest {
 
     @Mock
@@ -69,4 +91,66 @@ public class XenServer610WrapperTest {
 
         assertFalse(answer.getResult());
     }
+
+    @Test
+    public void testMigrateWithStorageCommand() {
+        final String vmName = "small";
+        final String uuid = "206b21a7-c6ec-40e2-b5e2-f861b9612f04";
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final VirtualMachineTO vmSpec = Mockito.mock(VirtualMachineTO.class);
+        final Map<VolumeTO, StorageFilerTO> volumeToFiler = new  HashMap<VolumeTO, StorageFilerTO>();
+
+        final NicTO nicTO1 = Mockito.mock(NicTO.class);
+        final NicTO nicTO2 = Mockito.mock(NicTO.class);
+        final NicTO nicTO3 = Mockito.mock(NicTO.class);
+        final NicTO [] nicTOs = {nicTO1, nicTO2, nicTO3};
+
+        final XsLocalNetwork nativeNetworkForTraffic = Mockito.mock(XsLocalNetwork.class);
+        final Network networkForSm = Mockito.mock(Network.class);
+
+        final XsHost xsHost = Mockito.mock(XsHost.class);
+        final Host host = Mockito.mock(Host.class);
+
+        final MigrateWithStorageCommand gpuStats = new MigrateWithStorageCommand(vmSpec, volumeToFiler);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer610Resource.getConnection()).thenReturn(conn);
+        when(vmSpec.getName()).thenReturn(vmName);
+        when(vmSpec.getNics()).thenReturn(nicTOs);
+
+        try {
+            when(xenServer610Resource.getHost()).thenReturn(xsHost);
+            when(xsHost.getUuid()).thenReturn(uuid);
+
+            when(xenServer610Resource.getNativeNetworkForTraffic(conn, TrafficType.Storage, null)).thenReturn(nativeNetworkForTraffic);
+            when(nativeNetworkForTraffic.getNetwork()).thenReturn(networkForSm);
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        final Answer answer = wrapper.execute(gpuStats, xenServer610Resource);
+
+        verify(xenServer610Resource, times(1)).getConnection();
+
+        try {
+            verify(xenServer610Resource, times(1)).prepareISO(conn, vmName);
+            verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO1);
+            verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO2);
+            verify(xenServer610Resource, times(1)).getNetwork(conn, nicTO3);
+
+            verify(xenServer610Resource, times(1)).getNativeNetworkForTraffic(conn, TrafficType.Storage, null);
+            verify(nativeNetworkForTraffic, times(1)).getNetwork();
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        assertFalse(answer.getResult());
+    }
 }
\ No newline at end of file


[8/8] git commit: updated refs/heads/master to 096d1b9

Posted by ek...@apache.org.
This closes #146

Refactoring the NetworkUsageCommand wrapper in order to cope with new design
   - Unit tests added: 100% coverage


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/096d1b93
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/096d1b93
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/096d1b93

Branch: refs/heads/master
Commit: 096d1b93b019d5232c2478ca63fc16eb6794fbe2
Parents: 02d1cdd
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Apr 3 17:23:16 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 13:24:45 2015 +0200

----------------------------------------------------------------------
 .../xenserver/resource/XcpServerResource.java   |  30 -----
 .../xenserver/resource/XenServer56Resource.java |  18 ---
 .../resource/wrapper/CitrixRequestWrapper.java  |   6 +
 .../XcpServerNetworkUsageCommandWrapper.java    |  52 +++++++++
 .../resource/wrapper/XcpServerWrapperTest.java  | 116 +++++++++++++++++++
 5 files changed, 174 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/096d1b93/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
index 0cb4206..03d9bf1 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
@@ -25,10 +25,6 @@ import javax.ejb.Local;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.NetworkUsageAnswer;
-import com.cloud.agent.api.NetworkUsageCommand;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
@@ -44,15 +40,6 @@ public class XcpServerResource extends CitrixResourceBase {
     private final static long mem_32m = 33554432L;
 
     @Override
-    public Answer executeRequest(final Command cmd) {
-        if (cmd instanceof NetworkUsageCommand) {
-            return execute((NetworkUsageCommand)cmd);
-        } else {
-            return super.executeRequest(cmd);
-        }
-    }
-
-    @Override
     protected List<File> getPatchFiles() {
         final List<File> files = new ArrayList<File>();
         final String patch = "scripts/vm/hypervisor/xenserver/xcpserver/patch";
@@ -65,23 +52,6 @@ public class XcpServerResource extends CitrixResourceBase {
         return files;
     }
 
-    protected NetworkUsageAnswer execute(final NetworkUsageCommand cmd) {
-        try {
-            final Connection conn = getConnection();
-            if (cmd.getOption() != null && cmd.getOption().equals("create")) {
-                final String result = networkUsage(conn, cmd.getPrivateIP(), "create", null);
-                final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L);
-                return answer;
-            }
-            final long[] stats = getNetworkStats(conn, cmd.getPrivateIP());
-            final NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]);
-            return answer;
-        } catch (final Exception ex) {
-            s_logger.warn("Failed to get network usage stats due to ", ex);
-            return new NetworkUsageAnswer(cmd, ex);
-        }
-    }
-
     /**
      XCP provides four memory configuration fields through which
      administrators can control this behaviour:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/096d1b93/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
index 3a30dae..12e4fc5 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56Resource.java
@@ -25,10 +25,7 @@ import javax.ejb.Local;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
 import com.cloud.agent.api.StartupCommand;
-import com.cloud.hypervisor.xenserver.resource.wrapper.CitrixRequestWrapper;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
@@ -46,17 +43,6 @@ public class XenServer56Resource extends CitrixResourceBase {
     private final static Logger s_logger = Logger.getLogger(XenServer56Resource.class);
 
     @Override
-    public Answer executeRequest(final Command cmd) {
-
-        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
-        try {
-            return wrapper.execute(cmd, this);
-        } catch (final Exception e) {
-            return super.executeRequest(cmd);
-        }
-    }
-
-    @Override
     protected List<File> getPatchFiles() {
         final List<File> files = new ArrayList<File>();
         final String patch = "scripts/vm/hypervisor/xenserver/xenserver56/patch";
@@ -193,8 +179,4 @@ public class XenServer56Resource extends CitrixResourceBase {
         final StartupCommand[] cmds = super.initialize();
         return cmds;
     }
-
-    public XenServer56Resource() {
-        super();
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/096d1b93/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
index 8128f23..4537b2a 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -90,6 +90,7 @@ import com.cloud.agent.api.storage.MigrateVolumeCommand;
 import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
 import com.cloud.agent.api.storage.ResizeVolumeCommand;
 import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.hypervisor.xenserver.resource.XcpServerResource;
 import com.cloud.hypervisor.xenserver.resource.XenServer56FP1Resource;
 import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
 import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
@@ -204,6 +205,11 @@ public class CitrixRequestWrapper extends RequestWrapper {
         xenServer610Commands.put(MigrateWithStorageCompleteCommand.class, new XenServer610MigrateWithStorageCompleteCommandWrapper());
         xenServer610Commands.put(MigrateVolumeCommand.class, new XenServer610MigrateVolumeCommandWrapper());
         resources.put(XenServer610Resource.class, xenServer610Commands);
+
+        // XcpServerResource commands
+        final Hashtable<Class<? extends Command>, CommandWrapper> xcpServerResourceCommand = new Hashtable<Class<? extends Command>, CommandWrapper>();
+        xcpServerResourceCommand.put(NetworkUsageCommand.class, new XcpServerNetworkUsageCommandWrapper());
+        resources.put(XcpServerResource.class, xcpServerResourceCommand);
     }
 
     public static CitrixRequestWrapper getInstance() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/096d1b93/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerNetworkUsageCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerNetworkUsageCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerNetworkUsageCommandWrapper.java
new file mode 100644
index 0000000..d22c608
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerNetworkUsageCommandWrapper.java
@@ -0,0 +1,52 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.NetworkUsageAnswer;
+import com.cloud.agent.api.NetworkUsageCommand;
+import com.cloud.hypervisor.xenserver.resource.XcpServerResource;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class XcpServerNetworkUsageCommandWrapper extends CommandWrapper<NetworkUsageCommand, Answer, XcpServerResource> {
+
+    private static final Logger s_logger = Logger.getLogger(XcpServerNetworkUsageCommandWrapper.class);
+
+    @Override
+    public Answer execute(final NetworkUsageCommand command, final XcpServerResource xcpServerResource) {
+        try {
+            final Connection conn = xcpServerResource.getConnection();
+            if (command.getOption() != null && command.getOption().equals("create")) {
+                final String result = xcpServerResource.networkUsage(conn, command.getPrivateIP(), "create", null);
+                final NetworkUsageAnswer answer = new NetworkUsageAnswer(command, result, 0L, 0L);
+                return answer;
+            }
+            final long[] stats = xcpServerResource.getNetworkStats(conn, command.getPrivateIP());
+            final NetworkUsageAnswer answer = new NetworkUsageAnswer(command, "", stats[0], stats[1]);
+            return answer;
+        } catch (final Exception ex) {
+            s_logger.warn("Failed to get network usage stats due to ", ex);
+            return new NetworkUsageAnswer(command, ex);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/096d1b93/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerWrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerWrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerWrapperTest.java
new file mode 100644
index 0000000..358d670
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XcpServerWrapperTest.java
@@ -0,0 +1,116 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.NetworkUsageCommand;
+import com.cloud.hypervisor.xenserver.resource.XcpServerResource;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+
+@RunWith(PowerMockRunner.class)
+public class XcpServerWrapperTest {
+
+    @Mock
+    protected XcpServerResource XcpServerResource;
+
+
+    @Test
+    public void testNetworkUsageCommandCreate() {
+        final Connection conn = Mockito.mock(Connection.class);
+
+        final String privateIP = "192.168.0.10";
+        final String domRName = "dom";
+        final String option = "create";
+        final boolean forVpc = true;
+
+        final NetworkUsageCommand usageCommand = new NetworkUsageCommand(privateIP, domRName, option, forVpc);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(XcpServerResource.getConnection()).thenReturn(conn);
+        when(XcpServerResource.networkUsage(conn, usageCommand.getPrivateIP(), "create", null)).thenReturn("success");
+
+        final Answer answer = wrapper.execute(usageCommand, XcpServerResource);
+
+        verify(XcpServerResource, times(1)).getConnection();
+
+        assertTrue(answer.getResult());
+    }
+
+    @Test
+    public void testNetworkUsageCommandGet() {
+        final Connection conn = Mockito.mock(Connection.class);
+
+        final String privateIP = "192.168.0.10";
+        final String domRName = "dom";
+        final boolean forVpc = true;
+        final String gatewayIp = "172.16.0.10";
+
+        final NetworkUsageCommand usageCommand = new NetworkUsageCommand(privateIP, domRName, forVpc, gatewayIp);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(XcpServerResource.getConnection()).thenReturn(conn);
+        when(XcpServerResource.getNetworkStats(conn, usageCommand.getPrivateIP())).thenReturn(new long[]{1l, 1l});
+
+        final Answer answer = wrapper.execute(usageCommand, XcpServerResource);
+
+        verify(XcpServerResource, times(1)).getConnection();
+
+        assertTrue(answer.getResult());
+    }
+
+    @Test
+    public void testNetworkUsageCommandExceptiopn() {
+        final Connection conn = Mockito.mock(Connection.class);
+
+        final String privateIP = "192.168.0.10";
+        final String domRName = "dom";
+        final String option = null;
+        final boolean forVpc = true;
+
+        final NetworkUsageCommand usageCommand = new NetworkUsageCommand(privateIP, domRName, option, forVpc);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(XcpServerResource.getConnection()).thenReturn(conn);
+        when(XcpServerResource.networkUsage(conn, usageCommand.getPrivateIP(), "create", null)).thenThrow(new CloudRuntimeException("FAILED"));
+
+        final Answer answer = wrapper.execute(usageCommand, XcpServerResource);
+
+        verify(XcpServerResource, times(1)).getConnection();
+
+        assertFalse(answer.getResult());
+    }
+}
\ No newline at end of file


[6/8] git commit: updated refs/heads/master to 096d1b9

Posted by ek...@apache.org.
Refactoring the MigrateWithStorageSendCommand wrapper in order to cope with new design
   - Unit tests added: 47.2% coverage
   - It's a bit difficult to test the Xen API classes due to their static nature


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d5414d26
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d5414d26
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d5414d26

Branch: refs/heads/master
Commit: d5414d26b48ef5da0a5906d39b7e785c13e286a4
Parents: c5a2f92
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Apr 3 16:13:09 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 09:23:10 2015 +0200

----------------------------------------------------------------------
 .../resource/XenServer610Resource.java          | 207 +------------------
 .../resource/wrapper/CitrixRequestWrapper.java  |   4 +
 ...igrateWithStorageCompleteCommandWrapper.java |  81 ++++++++
 ...610MigrateWithStorageSendCommandWrapper.java | 143 +++++++++++++
 .../wrapper/XenServer610WrapperTest.java        | 164 +++++++++++++++
 5 files changed, 393 insertions(+), 206 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d5414d26/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
index 7f5dfdb..261ace0 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
@@ -30,28 +30,18 @@ import org.apache.xmlrpc.XmlRpcException;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
-import com.cloud.agent.api.MigrateWithStorageAnswer;
-import com.cloud.agent.api.MigrateWithStorageCommand;
 import com.cloud.agent.api.MigrateWithStorageCompleteAnswer;
 import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
-import com.cloud.agent.api.MigrateWithStorageReceiveAnswer;
-import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
-import com.cloud.agent.api.MigrateWithStorageSendAnswer;
-import com.cloud.agent.api.MigrateWithStorageSendCommand;
 import com.cloud.agent.api.storage.MigrateVolumeAnswer;
 import com.cloud.agent.api.storage.MigrateVolumeCommand;
 import com.cloud.agent.api.to.DiskTO;
-import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.agent.api.to.VolumeTO;
-import com.cloud.network.Networks.TrafficType;
 import com.cloud.resource.ServerResource;
 import com.cloud.storage.Volume;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.xensource.xenapi.Connection;
 import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Network;
 import com.xensource.xenapi.SR;
 import com.xensource.xenapi.Task;
 import com.xensource.xenapi.Types;
@@ -68,11 +58,7 @@ public class XenServer610Resource extends XenServer600Resource {
 
     @Override
     public Answer executeRequest(final Command cmd) {
-        if (cmd instanceof MigrateWithStorageReceiveCommand) {
-            return execute((MigrateWithStorageReceiveCommand)cmd);
-        } else if (cmd instanceof MigrateWithStorageSendCommand) {
-            return execute((MigrateWithStorageSendCommand)cmd);
-        } else if (cmd instanceof MigrateWithStorageCompleteCommand) {
+        if (cmd instanceof MigrateWithStorageCompleteCommand) {
             return execute((MigrateWithStorageCompleteCommand)cmd);
         } else if (cmd instanceof MigrateVolumeCommand) {
             return execute((MigrateVolumeCommand)cmd);
@@ -116,197 +102,6 @@ public class XenServer610Resource extends XenServer600Resource {
         return volumeToList;
     }
 
-    protected MigrateWithStorageAnswer execute(final MigrateWithStorageCommand cmd) {
-        final Connection connection = getConnection();
-        final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
-        final Map<VolumeTO, StorageFilerTO> volumeToFiler = cmd.getVolumeToFiler();
-        final String vmName = vmSpec.getName();
-        Task task = null;
-
-        try {
-            prepareISO(connection, vmSpec.getName());
-
-            // Get the list of networks and recreate VLAN, if required.
-            for (final NicTO nicTo : vmSpec.getNics()) {
-                getNetwork(connection, nicTo);
-            }
-
-            final Map<String, String> other = new HashMap<String, String>();
-            other.put("live", "true");
-            final Network networkForSm = getNativeNetworkForTraffic(connection, TrafficType.Storage, null).getNetwork();
-            final Host host = Host.getByUuid(connection, _host.getUuid());
-            final Map<String, String> token = host.migrateReceive(connection, networkForSm, other);
-
-            // Get the vm to migrate.
-            final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
-            final VM vmToMigrate = vms.iterator().next();
-
-            // Create the vif map. The vm stays in the same cluster so we have to pass an empty vif map.
-            final Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
-            final Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
-            for (final Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
-                vdiMap.put(getVDIbyUuid(connection, entry.getKey().getPath()), getStorageRepository(connection, entry.getValue().getUuid()));
-            }
-
-            // Check migration with storage is possible.
-            task = vmToMigrate.assertCanMigrateAsync(connection, token, true, vdiMap, vifMap, other);
-            try {
-                // poll every 1 seconds
-                final long timeout = _migratewait * 1000L;
-                waitForTask(connection, task, 1000, timeout);
-                checkForSuccess(connection, task);
-            } catch (final Types.HandleInvalid e) {
-                s_logger.error("Error while checking if vm " + vmName + " can be migrated to the destination host " + host, e);
-                throw new CloudRuntimeException("Error while checking if vm " + vmName + " can be migrated to the " + "destination host " + host, e);
-            }
-
-            // Migrate now.
-            task = vmToMigrate.migrateSendAsync(connection, token, true, vdiMap, vifMap, other);
-            try {
-                // poll every 1 seconds.
-                final long timeout = _migratewait * 1000L;
-                waitForTask(connection, task, 1000, timeout);
-                checkForSuccess(connection, task);
-            } catch (final Types.HandleInvalid e) {
-                s_logger.error("Error while migrating vm " + vmName + " to the destination host " + host, e);
-                throw new CloudRuntimeException("Error while migrating vm " + vmName + " to the destination host " + host, e);
-            }
-
-            // Volume paths would have changed. Return that information.
-            final List<VolumeObjectTO> volumeToList = getUpdatedVolumePathsOfMigratedVm(connection, vmToMigrate, vmSpec.getDisks());
-            vmToMigrate.setAffinity(connection, host);
-            return new MigrateWithStorageAnswer(cmd, volumeToList);
-        } catch (final Exception e) {
-            s_logger.warn("Catch Exception " + e.getClass().getName() + ". Storage motion failed due to " + e.toString(), e);
-            return new MigrateWithStorageAnswer(cmd, e);
-        } finally {
-            if (task != null) {
-                try {
-                    task.destroy(connection);
-                } catch (final Exception e) {
-                    s_logger.debug("Unable to destroy task " + task.toString() + " on host " + _host.getUuid() + " due to " + e.toString());
-                }
-            }
-        }
-    }
-
-    protected MigrateWithStorageReceiveAnswer execute(final MigrateWithStorageReceiveCommand cmd) {
-        final Connection connection = getConnection();
-        final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
-        final Map<VolumeTO, StorageFilerTO> volumeToFiler = cmd.getVolumeToFiler();
-
-        try {
-            // Get a map of all the SRs to which the vdis will be migrated.
-            final Map<VolumeTO, Object> volumeToSr = new HashMap<VolumeTO, Object>();
-            for (final Map.Entry<VolumeTO, StorageFilerTO> entry : volumeToFiler.entrySet()) {
-                final SR sr = getStorageRepository(connection, entry.getValue().getUuid());
-                volumeToSr.put(entry.getKey(), sr);
-            }
-
-            // Get the list of networks to which the vifs will attach.
-            final Map<NicTO, Object> nicToNetwork = new HashMap<NicTO, Object>();
-            for (final NicTO nicTo : vmSpec.getNics()) {
-                final Network network = getNetwork(connection, nicTo);
-                nicToNetwork.put(nicTo, network);
-            }
-
-            final Map<String, String> other = new HashMap<String, String>();
-            other.put("live", "true");
-            final Network network = getNativeNetworkForTraffic(connection, TrafficType.Storage, null).getNetwork();
-            final Host host = Host.getByUuid(connection, _host.getUuid());
-            final Map<String, String> token = host.migrateReceive(connection, network, other);
-
-            return new MigrateWithStorageReceiveAnswer(cmd, volumeToSr, nicToNetwork, token);
-        } catch (final CloudRuntimeException e) {
-            s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
-            return new MigrateWithStorageReceiveAnswer(cmd, e);
-        } catch (final Exception e) {
-            s_logger.error("Migration of vm " + vmSpec.getName() + " with storage failed due to " + e.toString(), e);
-            return new MigrateWithStorageReceiveAnswer(cmd, e);
-        }
-    }
-
-    protected MigrateWithStorageSendAnswer execute(final MigrateWithStorageSendCommand cmd) {
-        final Connection connection = getConnection();
-        final VirtualMachineTO vmSpec = cmd.getVirtualMachine();
-        final Map<VolumeTO, Object> volumeToSr = cmd.getVolumeToSr();
-        final Map<NicTO, Object> nicToNetwork = cmd.getNicToNetwork();
-        final Map<String, String> token = cmd.getToken();
-        final String vmName = vmSpec.getName();
-        final Set<VolumeTO> volumeToSet = null;
-        Task task = null;
-        try {
-            final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
-            final VM vmToMigrate = vms.iterator().next();
-            final Map<String, String> other = new HashMap<String, String>();
-            other.put("live", "true");
-
-            // Create the vdi map which tells what volumes of the vm need to go on which sr on the destination.
-            final Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
-            for (final Map.Entry<VolumeTO, Object> entry : volumeToSr.entrySet()) {
-                if (entry.getValue() instanceof SR) {
-                    final SR sr = (SR)entry.getValue();
-                    final VDI vdi = getVDIbyUuid(connection, entry.getKey().getPath());
-                    vdiMap.put(vdi, sr);
-                } else {
-                    throw new CloudRuntimeException("The object " + entry.getValue() + " passed is not of type SR.");
-                }
-            }
-
-            // Create the vif map.
-            final Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
-            for (final Map.Entry<NicTO, Object> entry : nicToNetwork.entrySet()) {
-                if (entry.getValue() instanceof Network) {
-                    final Network network = (Network)entry.getValue();
-                    final VIF vif = getVifByMac(connection, vmToMigrate, entry.getKey().getMac());
-                    vifMap.put(vif, network);
-                } else {
-                    throw new CloudRuntimeException("The object " + entry.getValue() + " passed is not of type Network.");
-                }
-            }
-
-            // Check migration with storage is possible.
-            task = vmToMigrate.assertCanMigrateAsync(connection, token, true, vdiMap, vifMap, other);
-            try {
-                // poll every 1 seconds.
-                final long timeout = _migratewait * 1000L;
-                waitForTask(connection, task, 1000, timeout);
-                checkForSuccess(connection, task);
-            } catch (final Types.HandleInvalid e) {
-                s_logger.error("Error while checking if vm " + vmName + " can be migrated.", e);
-                throw new CloudRuntimeException("Error while checking if vm " + vmName + " can be migrated.", e);
-            }
-
-            // Migrate now.
-            task = vmToMigrate.migrateSendAsync(connection, token, true, vdiMap, vifMap, other);
-            try {
-                // poll every 1 seconds.
-                final long timeout = _migratewait * 1000L;
-                waitForTask(connection, task, 1000, timeout);
-                checkForSuccess(connection, task);
-            } catch (final Types.HandleInvalid e) {
-                s_logger.error("Error while migrating vm " + vmName, e);
-                throw new CloudRuntimeException("Error while migrating vm " + vmName, e);
-            }
-
-            return new MigrateWithStorageSendAnswer(cmd, volumeToSet);
-        } catch (final CloudRuntimeException e) {
-            s_logger.error("Migration of vm " + vmName + " with storage failed due to " + e.toString(), e);
-            return new MigrateWithStorageSendAnswer(cmd, e);
-        } catch (final Exception e) {
-            s_logger.error("Migration of vm " + vmName + " with storage failed due to " + e.toString(), e);
-            return new MigrateWithStorageSendAnswer(cmd, e);
-        } finally {
-            if (task != null) {
-                try {
-                    task.destroy(connection);
-                } catch (final Exception e) {
-                    s_logger.debug("Unable to destroy task " + task.toString() + " on host " + _host.getUuid() + " due to " + e.toString());
-                }
-            }
-        }
-    }
-
     protected MigrateWithStorageCompleteAnswer execute(final MigrateWithStorageCompleteCommand cmd) {
         final Connection connection = getConnection();
         final VirtualMachineTO vmSpec = cmd.getVirtualMachine();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d5414d26/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
index e89d926..b0376c7 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -45,7 +45,9 @@ import com.cloud.agent.api.GetVncPortCommand;
 import com.cloud.agent.api.MaintainCommand;
 import com.cloud.agent.api.MigrateCommand;
 import com.cloud.agent.api.MigrateWithStorageCommand;
+import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
 import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
+import com.cloud.agent.api.MigrateWithStorageSendCommand;
 import com.cloud.agent.api.ModifySshKeysCommand;
 import com.cloud.agent.api.ModifyStoragePoolCommand;
 import com.cloud.agent.api.NetworkRulesSystemVmCommand;
@@ -197,6 +199,8 @@ public class CitrixRequestWrapper extends RequestWrapper {
         final Hashtable<Class<? extends Command>, CommandWrapper> xenServer610Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
         xenServer610Commands.put(MigrateWithStorageCommand.class, new XenServer610MigrateWithStorageCommandWrapper());
         xenServer610Commands.put(MigrateWithStorageReceiveCommand.class, new XenServer610MigrateWithStorageReceiveCommandWrapper());
+        xenServer610Commands.put(MigrateWithStorageSendCommand.class, new XenServer610MigrateWithStorageSendCommandWrapper());
+        xenServer610Commands.put(MigrateWithStorageCompleteCommand.class, new XenServer610MigrateWithStorageCompleteCommandWrapper());
         resources.put(XenServer610Resource.class, xenServer610Commands);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d5414d26/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCompleteCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCompleteCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCompleteCommandWrapper.java
new file mode 100644
index 0000000..e993b96
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageCompleteCommandWrapper.java
@@ -0,0 +1,81 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.MigrateWithStorageCompleteAnswer;
+import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.hypervisor.xenserver.resource.XsHost;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.VM;
+
+public final class XenServer610MigrateWithStorageCompleteCommandWrapper extends CommandWrapper<MigrateWithStorageCompleteCommand, Answer, XenServer610Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer610MigrateWithStorageCompleteCommandWrapper.class);
+
+    @Override
+    public Answer execute(final MigrateWithStorageCompleteCommand command, final XenServer610Resource xenServer610Resource) {
+        final Connection connection = xenServer610Resource.getConnection();
+        final VirtualMachineTO vmSpec = command.getVirtualMachine();
+
+        final String name = vmSpec.getName();
+        try {
+            final XsHost xsHost = xenServer610Resource.getHost();
+            final String uuid = xsHost.getUuid();
+
+            final Set<VM> vms = VM.getByNameLabel(connection, name);
+            // Check if VMs can be found by label.
+            if (vms == null) {
+                throw new CloudRuntimeException("Couldn't find VMs by label " + name + " on the destination host.");
+            }
+            final VM migratedVm = vms.iterator().next();
+
+            // Check the vm is present on the new host.
+            if (migratedVm == null) {
+                throw new CloudRuntimeException("Couldn't find the migrated vm " + name + " on the destination host.");
+            }
+
+            final Host host = Host.getByUuid(connection, uuid);
+            migratedVm.setAffinity(connection, host);
+
+            // Volume paths would have changed. Return that information.
+            final List<VolumeObjectTO> volumeToSet = xenServer610Resource.getUpdatedVolumePathsOfMigratedVm(connection, migratedVm, vmSpec.getDisks());
+
+            return new MigrateWithStorageCompleteAnswer(command, volumeToSet);
+        } catch (final CloudRuntimeException e) {
+            s_logger.error("Migration of vm " + name + " with storage failed due to " + e.toString(), e);
+            return new MigrateWithStorageCompleteAnswer(command, e);
+        } catch (final Exception e) {
+            s_logger.error("Migration of vm " + name + " with storage failed due to " + e.toString(), e);
+            return new MigrateWithStorageCompleteAnswer(command, e);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d5414d26/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageSendCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageSendCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageSendCommandWrapper.java
new file mode 100644
index 0000000..267f528
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610MigrateWithStorageSendCommandWrapper.java
@@ -0,0 +1,143 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.MigrateWithStorageSendAnswer;
+import com.cloud.agent.api.MigrateWithStorageSendCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.api.to.VolumeTO;
+import com.cloud.hypervisor.xenserver.resource.XenServer610Resource;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Network;
+import com.xensource.xenapi.SR;
+import com.xensource.xenapi.Task;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VIF;
+import com.xensource.xenapi.VM;
+
+public final class XenServer610MigrateWithStorageSendCommandWrapper extends CommandWrapper<MigrateWithStorageSendCommand, Answer, XenServer610Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer610MigrateWithStorageSendCommandWrapper.class);
+
+    @Override
+    public Answer execute(final MigrateWithStorageSendCommand command, final XenServer610Resource xenServer610Resource) {
+        final Connection connection = xenServer610Resource.getConnection();
+
+        final VirtualMachineTO vmSpec = command.getVirtualMachine();
+        final Map<VolumeTO, Object> volumeToSr = command.getVolumeToSr();
+        final Map<NicTO, Object> nicToNetwork = command.getNicToNetwork();
+        final Map<String, String> token = command.getToken();
+        final String vmName = vmSpec.getName();
+
+        Task task = null;
+        try {
+
+            final Map<String, String> other = new HashMap<String, String>();
+            other.put("live", "true");
+
+            // Create the vdi map which tells what volumes of the vm need to go
+            // on which sr on the destination.
+            final Map<VDI, SR> vdiMap = new HashMap<VDI, SR>();
+            for (final Map.Entry<VolumeTO, Object> entry : volumeToSr.entrySet()) {
+                final Object srObj = entry.getValue();
+                if (srObj instanceof SR) {
+                    final SR sr = (SR) srObj;
+                    final VolumeTO volume = entry.getKey();
+                    final VDI vdi = xenServer610Resource.getVDIbyUuid(connection, volume.getPath());
+                    vdiMap.put(vdi, sr);
+                } else {
+                    throw new CloudRuntimeException("The object " + srObj + " passed is not of type SR.");
+                }
+            }
+
+            final Set<VM> vms = VM.getByNameLabel(connection, vmSpec.getName());
+            VM vmToMigrate = null;
+            if (vms != null) {
+                vmToMigrate = vms.iterator().next();
+            }
+
+            // Create the vif map.
+            final Map<VIF, Network> vifMap = new HashMap<VIF, Network>();
+            for (final Map.Entry<NicTO, Object> entry : nicToNetwork.entrySet()) {
+                Object networkObj = entry.getValue();
+                if (networkObj instanceof Network) {
+                    final Network network = (Network) networkObj;
+                    NicTO nic = entry.getKey();
+                    final VIF vif = xenServer610Resource.getVifByMac(connection, vmToMigrate, nic.getMac());
+                    vifMap.put(vif, network);
+                } else {
+                    throw new CloudRuntimeException("The object " + networkObj + " passed is not of type Network.");
+                }
+            }
+
+            // Check migration with storage is possible.
+            task = vmToMigrate.assertCanMigrateAsync(connection, token, true, vdiMap, vifMap, other);
+            try {
+                // poll every 1 seconds.
+                final long timeout = xenServer610Resource.getMigrateWait() * 1000L;
+                xenServer610Resource.waitForTask(connection, task, 1000, timeout);
+                xenServer610Resource.checkForSuccess(connection, task);
+            } catch (final Types.HandleInvalid e) {
+                s_logger.error("Error while checking if vm " + vmName + " can be migrated.", e);
+                throw new CloudRuntimeException("Error while checking if vm " + vmName + " can be migrated.", e);
+            }
+
+            // Migrate now.
+            task = vmToMigrate.migrateSendAsync(connection, token, true, vdiMap, vifMap, other);
+            try {
+                // poll every 1 seconds.
+                final long timeout = xenServer610Resource.getMigrateWait() * 1000L;
+                xenServer610Resource.waitForTask(connection, task, 1000, timeout);
+                xenServer610Resource.checkForSuccess(connection, task);
+            } catch (final Types.HandleInvalid e) {
+                s_logger.error("Error while migrating vm " + vmName, e);
+                throw new CloudRuntimeException("Error while migrating vm " + vmName, e);
+            }
+
+            final Set<VolumeTO> volumeToSet = null;
+            return new MigrateWithStorageSendAnswer(command, volumeToSet);
+        } catch (final CloudRuntimeException e) {
+            s_logger.error("Migration of vm " + vmName + " with storage failed due to " + e.toString(), e);
+            return new MigrateWithStorageSendAnswer(command, e);
+        } catch (final Exception e) {
+            s_logger.error("Migration of vm " + vmName + " with storage failed due to " + e.toString(), e);
+            return new MigrateWithStorageSendAnswer(command, e);
+        } finally {
+            if (task != null) {
+                try {
+                    task.destroy(connection);
+                } catch (final Exception e) {
+                    s_logger.debug("Unable to destroy task " + task.toString() + " on host " + xenServer610Resource.getHost().getUuid() + " due to " + e.toString());
+                }
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d5414d26/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
index 649dd1f..7f17ed4 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer610WrapperTest.java
@@ -40,6 +40,7 @@ import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CheckNetworkCommand;
 import com.cloud.agent.api.MigrateWithStorageCommand;
 import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
+import com.cloud.agent.api.MigrateWithStorageSendCommand;
 import com.cloud.agent.api.SetupCommand;
 import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.StorageFilerTO;
@@ -56,6 +57,7 @@ import com.xensource.xenapi.Network;
 import com.xensource.xenapi.SR;
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VIF;
 
 @RunWith(PowerMockRunner.class)
 public class XenServer610WrapperTest {
@@ -269,4 +271,166 @@ public class XenServer610WrapperTest {
 
         assertFalse(answer.getResult());
     }
+
+    @Test
+    public void testMigrateWithStorageSendCommand() {
+        final String vmName = "small";
+        final String path = "/";
+        final String mac = "3c:15:c2:c4:4f:18";
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final VirtualMachineTO vmSpec = Mockito.mock(VirtualMachineTO.class);
+
+        final VolumeTO volume1 = Mockito.mock(VolumeTO.class);
+        final VolumeTO volume2 = Mockito.mock(VolumeTO.class);
+
+        final SR sr1 = Mockito.mock(SR.class);
+        final SR sr2 = Mockito.mock(SR.class);
+
+        final VDI vdi1 = Mockito.mock(VDI.class);
+        final VDI vdi2 = Mockito.mock(VDI.class);
+
+        final NicTO nic1 = Mockito.mock(NicTO.class);
+        final NicTO nic2 = Mockito.mock(NicTO.class);
+
+        final Network network1 = Mockito.mock(Network.class);
+        final Network network2 = Mockito.mock(Network.class);
+
+        final Map<VolumeTO, Object> volumeToSr = new HashMap<VolumeTO, Object>();
+        volumeToSr.put(volume1, sr1);
+        volumeToSr.put(volume2, sr2);
+
+        final Map<NicTO, Object> nicToNetwork = new HashMap<NicTO, Object>();
+        nicToNetwork.put(nic1, network1);
+        nicToNetwork.put(nic2, network2);
+
+        final Map<String, String> token = new HashMap<String, String>();
+
+        final VIF vif1 = Mockito.mock(VIF.class);
+        final VIF vif2 = Mockito.mock(VIF.class);
+
+        final MigrateWithStorageSendCommand migrateStorageCommand = new MigrateWithStorageSendCommand(vmSpec, volumeToSr, nicToNetwork, token);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer610Resource.getConnection()).thenReturn(conn);
+        when(vmSpec.getName()).thenReturn(vmName);
+
+        when(volume1.getPath()).thenReturn(path);
+        when(volume2.getPath()).thenReturn(path);
+
+        when(nic1.getMac()).thenReturn(mac);
+        when(nic2.getMac()).thenReturn(mac);
+
+        when(xenServer610Resource.getVDIbyUuid(conn, volume1.getPath())).thenReturn(vdi1);
+        when(xenServer610Resource.getVDIbyUuid(conn, volume2.getPath())).thenReturn(vdi2);
+
+        try {
+            when(xenServer610Resource.getVifByMac(conn, null, nic1.getMac())).thenReturn(vif1);
+            when(xenServer610Resource.getVifByMac(conn, null, nic2.getMac())).thenReturn(vif2);
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        final Answer answer = wrapper.execute(migrateStorageCommand, xenServer610Resource);
+
+        verify(xenServer610Resource, times(1)).getConnection();
+
+        try {
+            verify(xenServer610Resource, times(2)).getVDIbyUuid(conn, volume1.getPath());
+            verify(xenServer610Resource, times(2)).getVifByMac(conn, null, nic1.getMac());
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        assertFalse(answer.getResult());
+    }
+
+    @Test
+    public void testMigrateWithStorageSendCommandSRException() {
+        final String vmName = "small";
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final VirtualMachineTO vmSpec = Mockito.mock(VirtualMachineTO.class);
+
+        final VolumeTO volume1 = Mockito.mock(VolumeTO.class);
+        final VolumeTO volume2 = Mockito.mock(VolumeTO.class);
+
+        final Map<VolumeTO, Object> volumeToSr = new HashMap<VolumeTO, Object>();
+        volumeToSr.put(volume1, new String("a"));
+        volumeToSr.put(volume2, new String("b"));
+
+        final Map<NicTO, Object> nicToNetwork = new HashMap<NicTO, Object>();
+        final Map<String, String> token = new HashMap<String, String>();
+
+        final MigrateWithStorageSendCommand migrateStorageCommand = new MigrateWithStorageSendCommand(vmSpec, volumeToSr, nicToNetwork, token);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer610Resource.getConnection()).thenReturn(conn);
+        when(vmSpec.getName()).thenReturn(vmName);
+
+        final Answer answer = wrapper.execute(migrateStorageCommand, xenServer610Resource);
+
+        verify(xenServer610Resource, times(1)).getConnection();
+
+        assertFalse(answer.getResult());
+    }
+
+    @Test
+    public void testMigrateWithStorageSendCommandNetException() {
+        final String vmName = "small";
+        final String path = "/";
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final VirtualMachineTO vmSpec = Mockito.mock(VirtualMachineTO.class);
+
+        final VolumeTO volume1 = Mockito.mock(VolumeTO.class);
+        final VolumeTO volume2 = Mockito.mock(VolumeTO.class);
+
+        final SR sr1 = Mockito.mock(SR.class);
+        final SR sr2 = Mockito.mock(SR.class);
+
+        final VDI vdi1 = Mockito.mock(VDI.class);
+        final VDI vdi2 = Mockito.mock(VDI.class);
+
+        final NicTO nic1 = Mockito.mock(NicTO.class);
+        final NicTO nic2 = Mockito.mock(NicTO.class);
+
+        final Map<VolumeTO, Object> volumeToSr = new HashMap<VolumeTO, Object>();
+        volumeToSr.put(volume1, sr1);
+        volumeToSr.put(volume2, sr2);
+
+        final Map<NicTO, Object> nicToNetwork = new HashMap<NicTO, Object>();
+        nicToNetwork.put(nic1, new String("a"));
+        nicToNetwork.put(nic2, new String("b"));
+
+        final Map<String, String> token = new HashMap<String, String>();
+
+        final MigrateWithStorageSendCommand migrateStorageCommand = new MigrateWithStorageSendCommand(vmSpec, volumeToSr, nicToNetwork, token);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer610Resource.getConnection()).thenReturn(conn);
+        when(vmSpec.getName()).thenReturn(vmName);
+
+        when(volume1.getPath()).thenReturn(path);
+        when(volume2.getPath()).thenReturn(path);
+
+        when(xenServer610Resource.getVDIbyUuid(conn, volume1.getPath())).thenReturn(vdi1);
+        when(xenServer610Resource.getVDIbyUuid(conn, volume2.getPath())).thenReturn(vdi2);
+
+        final Answer answer = wrapper.execute(migrateStorageCommand, xenServer610Resource);
+
+        verify(xenServer610Resource, times(1)).getConnection();
+
+        assertFalse(answer.getResult());
+    }
 }
\ No newline at end of file


[3/8] git commit: updated refs/heads/master to 096d1b9

Posted by ek...@apache.org.
Refactoring the GetGPUStatsCommand wrapper in order to cope with new design

   - Unit tests added: 100% coverage


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/240bcb81
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/240bcb81
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/240bcb81

Branch: refs/heads/master
Commit: 240bcb8120d709897baaade2d4e2cb29c5c482f9
Parents: bcee728
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Fri Apr 3 11:52:53 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 09:23:09 2015 +0200

----------------------------------------------------------------------
 .../com/cloud/agent/api/GetGPUStatsAnswer.java  |  10 +-
 .../resource/XenServer620SP1Resource.java       |  26 -----
 .../resource/Xenserver625Resource.java          |   5 +-
 .../resource/wrapper/CitrixRequestWrapper.java  |  10 +-
 ...enServer620SP1GetGPUStatsCommandWrapper.java |  51 ++++++++
 .../wrapper/CitrixRequestWrapperTest.java       |   1 +
 .../wrapper/XenServer620SP1WrapperTest.java     | 115 +++++++++++++++++++
 7 files changed, 181 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/240bcb81/core/src/com/cloud/agent/api/GetGPUStatsAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/GetGPUStatsAnswer.java b/core/src/com/cloud/agent/api/GetGPUStatsAnswer.java
index dbe9ae1..38bb930 100644
--- a/core/src/com/cloud/agent/api/GetGPUStatsAnswer.java
+++ b/core/src/com/cloud/agent/api/GetGPUStatsAnswer.java
@@ -28,12 +28,16 @@ public class GetGPUStatsAnswer extends Answer {
 
     private HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails;
 
-    public GetGPUStatsAnswer(GetGPUStatsCommand cmd, HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails) {
+    public GetGPUStatsAnswer(final GetGPUStatsCommand cmd, final HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails) {
         super(cmd);
         this.groupDetails = groupDetails;
     }
 
+    public GetGPUStatsAnswer(final GetGPUStatsCommand cmd, final boolean success, final String details) {
+        super(cmd, success, details);
+    }
+
     public HashMap<String, HashMap<String, VgpuTypesInfo>> getGroupDetails() {
-        return this.groupDetails;
+        return groupDetails;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/240bcb81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
index 88e42c0..b9022b9 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
@@ -28,10 +28,6 @@ import javax.ejb.Local;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.GetGPUStatsAnswer;
-import com.cloud.agent.api.GetGPUStatsCommand;
 import com.cloud.agent.api.StartCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
 import com.cloud.agent.api.VgpuTypesInfo;
@@ -53,28 +49,6 @@ public class XenServer620SP1Resource extends XenServer620Resource {
     private static final Logger s_logger = Logger.getLogger(XenServer620SP1Resource.class);
 
     @Override
-    public Answer executeRequest(final Command cmd) {
-        final Class<? extends Command> clazz = cmd.getClass();
-        if (clazz == GetGPUStatsCommand.class) {
-            return execute((GetGPUStatsCommand) cmd);
-        } else {
-            return super.executeRequest(cmd);
-        }
-    }
-
-    protected GetGPUStatsAnswer execute(final GetGPUStatsCommand cmd) {
-        final Connection conn = getConnection();
-        HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = new HashMap<String, HashMap<String, VgpuTypesInfo>>();
-        try {
-            groupDetails = getGPUGroupDetails(conn);
-        } catch (final Exception e) {
-            final String msg = "Unable to get GPU stats" + e.toString();
-            s_logger.warn(msg, e);
-        }
-        return new GetGPUStatsAnswer(cmd, groupDetails);
-    }
-
-    @Override
     protected void fillHostInfo(final Connection conn, final StartupRoutingCommand cmd) {
         super.fillHostInfo(conn, cmd);
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/240bcb81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
index 6a78287..58d64eb 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625Resource.java
@@ -41,11 +41,8 @@ import com.xensource.xenapi.VM;
 
 @Local(value=ServerResource.class)
 public class Xenserver625Resource extends XenServerResourceNewBase {
-    private static final Logger s_logger = Logger.getLogger(Xenserver625Resource.class);
 
-    public Xenserver625Resource() {
-        super();
-    }
+    private static final Logger s_logger = Logger.getLogger(Xenserver625Resource.class);
 
     @Override
     protected List<File> getPatchFiles() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/240bcb81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
index b68ef38..e7e238f 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapper.java
@@ -21,8 +21,6 @@ package com.cloud.hypervisor.xenserver.resource.wrapper;
 
 import java.util.Hashtable;
 
-import org.apache.log4j.Logger;
-
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.AttachIsoCommand;
 import com.cloud.agent.api.AttachVolumeCommand;
@@ -38,6 +36,7 @@ import com.cloud.agent.api.CreateVMSnapshotCommand;
 import com.cloud.agent.api.DeleteStoragePoolCommand;
 import com.cloud.agent.api.DeleteVMSnapshotCommand;
 import com.cloud.agent.api.FenceCommand;
+import com.cloud.agent.api.GetGPUStatsCommand;
 import com.cloud.agent.api.GetHostStatsCommand;
 import com.cloud.agent.api.GetStorageStatsCommand;
 import com.cloud.agent.api.GetVmDiskStatsCommand;
@@ -94,8 +93,6 @@ import com.cloud.resource.ServerResource;
 
 public class CitrixRequestWrapper extends RequestWrapper {
 
-    private static final Logger s_logger = Logger.getLogger(CitrixRequestWrapper.class);
-
     private static CitrixRequestWrapper instance;
 
     static {
@@ -186,6 +183,11 @@ public class CitrixRequestWrapper extends RequestWrapper {
         final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56P1Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
         xenServer56P1Commands.put(FenceCommand.class, new XenServer56FP1FenceCommandWrapper());
         resources.put(XenServer56FP1Resource.class, xenServer56P1Commands);
+
+        // XenServer620SP1Resource commands
+        final Hashtable<Class<? extends Command>, CommandWrapper> xenServer620SP1Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
+        xenServer620SP1Commands.put(GetGPUStatsCommand.class, new XenServer620SP1GetGPUStatsCommandWrapper());
+        resources.put(XenServer56FP1Resource.class, xenServer620SP1Commands);
     }
 
     public static CitrixRequestWrapper getInstance() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/240bcb81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1GetGPUStatsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1GetGPUStatsCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1GetGPUStatsCommandWrapper.java
new file mode 100644
index 0000000..e177256
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1GetGPUStatsCommandWrapper.java
@@ -0,0 +1,51 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import java.util.HashMap;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetGPUStatsAnswer;
+import com.cloud.agent.api.GetGPUStatsCommand;
+import com.cloud.agent.api.VgpuTypesInfo;
+import com.cloud.hypervisor.xenserver.resource.XenServer620SP1Resource;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+
+public final class XenServer620SP1GetGPUStatsCommandWrapper extends CommandWrapper<GetGPUStatsCommand, Answer, XenServer620SP1Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer620SP1GetGPUStatsCommandWrapper.class);
+
+    @Override
+    public Answer execute(final GetGPUStatsCommand command, final XenServer620SP1Resource xenServer620SP1Resource) {
+        final Connection conn = xenServer620SP1Resource.getConnection();
+        HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = new HashMap<String, HashMap<String, VgpuTypesInfo>>();
+        try {
+            groupDetails = xenServer620SP1Resource.getGPUGroupDetails(conn);
+        } catch (final Exception e) {
+            final String msg = "Unable to get GPU stats" + e.toString();
+            s_logger.warn(msg, e);
+            return new GetGPUStatsAnswer(command, false, msg);
+        }
+        return new GetGPUStatsAnswer(command, groupDetails);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/240bcb81/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
index f32e2d4..060d3b5 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/CitrixRequestWrapperTest.java
@@ -589,6 +589,7 @@ public class CitrixRequestWrapperTest {
             when(client.execute("host.get_by_uuid", new Object[] { "befc4dcd", uuid })).thenReturn(spiedMap);
             PowerMockito.when(conn, "dispatch", "host.get_by_uuid", params).thenReturn(spiedMap);
         } catch (final Exception e) {
+            fail(e.getMessage());
         }
 
         // try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/240bcb81/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1WrapperTest.java
new file mode 100644
index 0000000..67795fe
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer620SP1WrapperTest.java
@@ -0,0 +1,115 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.HashMap;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetGPUStatsCommand;
+import com.cloud.agent.api.VgpuTypesInfo;
+import com.cloud.hypervisor.xenserver.resource.XenServer620SP1Resource;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+
+@RunWith(PowerMockRunner.class)
+public class XenServer620SP1WrapperTest {
+
+    @Mock
+    private XenServer620SP1Resource xenServer620SP1Resource;
+
+    @Test
+    public void testGetGPUStatsCommand() {
+        final String guuid = "246a5b75-05ed-4bbc-a171-2d1fe94a1b0e";
+
+        final Connection conn = Mockito.mock(Connection.class);
+
+        final GetGPUStatsCommand gpuStats = new GetGPUStatsCommand(guuid, "xen");
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer620SP1Resource.getConnection()).thenReturn(conn);
+        try {
+            when(xenServer620SP1Resource.getGPUGroupDetails(conn)).thenReturn(new HashMap<String, HashMap<String, VgpuTypesInfo>>());
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        final Answer answer = wrapper.execute(gpuStats, xenServer620SP1Resource);
+        verify(xenServer620SP1Resource, times(1)).getConnection();
+        try {
+            verify(xenServer620SP1Resource, times(1)).getGPUGroupDetails(conn);
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        assertTrue(answer.getResult());
+    }
+
+    @Test
+    public void testGetGPUStatsCommandFailure() {
+        final String guuid = "246a5b75-05ed-4bbc-a171-2d1fe94a1b0e";
+
+        final Connection conn = Mockito.mock(Connection.class);
+
+        final GetGPUStatsCommand gpuStats = new GetGPUStatsCommand(guuid, "xen");
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer620SP1Resource.getConnection()).thenReturn(conn);
+        try {
+            when(xenServer620SP1Resource.getGPUGroupDetails(conn)).thenThrow(new CloudRuntimeException("Failed!"));
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        final Answer answer = wrapper.execute(gpuStats, xenServer620SP1Resource);
+        verify(xenServer620SP1Resource, times(1)).getConnection();
+        try {
+            verify(xenServer620SP1Resource, times(1)).getGPUGroupDetails(conn);
+        } catch (final XenAPIException e) {
+            fail(e.getMessage());
+        } catch (final XmlRpcException e) {
+            fail(e.getMessage());
+        }
+
+        assertFalse(answer.getResult());
+    }
+}
\ No newline at end of file


[4/8] git commit: updated refs/heads/master to 096d1b9

Posted by ek...@apache.org.
Started refctoring the remaining XenServer resources

   - Just cleaning the formating


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/bcee7281
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/bcee7281
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/bcee7281

Branch: refs/heads/master
Commit: bcee7281c6e961a726a0543ebeb939694d05a819
Parents: c59308b
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Thu Apr 2 23:31:52 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Sun Apr 5 09:23:09 2015 +0200

----------------------------------------------------------------------
 .../cloud/hypervisor/xenserver/resource/XcpOssResource.java   | 2 ++
 .../hypervisor/xenserver/resource/XcpServerResource.java      | 7 ++-----
 .../hypervisor/xenserver/resource/XenServer56FP1Resource.java | 4 ----
 .../hypervisor/xenserver/resource/XenServer610Resource.java   | 5 +----
 .../hypervisor/xenserver/resource/XenServer620Resource.java   | 5 +----
 .../xenserver/resource/XenServer620SP1Resource.java           | 5 +----
 6 files changed, 7 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bcee7281/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
index 540044e..b159064 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpOssResource.java
@@ -51,7 +51,9 @@ import com.xensource.xenapi.VM;
 
 @Local(value = ServerResource.class)
 public class XcpOssResource extends CitrixResourceBase {
+
     private final static Logger s_logger = Logger.getLogger(XcpOssResource.class);
+
     private static final long mem_32m = 33554432L;
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bcee7281/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
index 4b2936e..0cb4206 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
@@ -39,12 +39,9 @@ import com.xensource.xenapi.VM;
 
 @Local(value = ServerResource.class)
 public class XcpServerResource extends CitrixResourceBase {
-    private final static Logger s_logger = Logger.getLogger(XcpServerResource.class);
-    private static final long mem_32m = 33554432L;
 
-    public XcpServerResource() {
-        super();
-    }
+    private final static Logger s_logger = Logger.getLogger(XcpServerResource.class);
+    private final static long mem_32m = 33554432L;
 
     @Override
     public Answer executeRequest(final Command cmd) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bcee7281/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
index 1143528..f3d281a 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer56FP1Resource.java
@@ -35,10 +35,6 @@ import com.xensource.xenapi.Types.XenAPIException;
 @Local(value = ServerResource.class)
 public class XenServer56FP1Resource extends XenServer56Resource {
 
-    public XenServer56FP1Resource() {
-        super();
-    }
-
     @Override
     protected List<File> getPatchFiles() {
         final List<File> files = new ArrayList<File>();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bcee7281/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
index e71a97d..b372ef7 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer610Resource.java
@@ -63,11 +63,8 @@ import com.xensource.xenapi.VM;
 
 @Local(value = ServerResource.class)
 public class XenServer610Resource extends XenServer600Resource {
-    private static final Logger s_logger = Logger.getLogger(XenServer610Resource.class);
 
-    public XenServer610Resource() {
-        super();
-    }
+    private static final Logger s_logger = Logger.getLogger(XenServer610Resource.class);
 
     @Override
     public Answer executeRequest(final Command cmd) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bcee7281/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
index 858fc15..8cb9314 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620Resource.java
@@ -32,11 +32,8 @@ import com.xensource.xenapi.PoolPatch;
 
 @Local(value = ServerResource.class)
 public class XenServer620Resource extends XenServer610Resource {
-    private static final Logger s_logger = Logger.getLogger(XenServer620Resource.class);
 
-    public XenServer620Resource() {
-        super();
-    }
+    private static final Logger s_logger = Logger.getLogger(XenServer620Resource.class);
 
     protected boolean hostHasHotFix(final Connection conn, final String hotFixUuid) {
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bcee7281/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
index 0704e8e..88e42c0 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServer620SP1Resource.java
@@ -49,11 +49,8 @@ import com.xensource.xenapi.VM;
 
 @Local(value=ServerResource.class)
 public class XenServer620SP1Resource extends XenServer620Resource {
-    private static final Logger s_logger = Logger.getLogger(XenServer620SP1Resource.class);
 
-    public XenServer620SP1Resource() {
-        super();
-    }
+    private static final Logger s_logger = Logger.getLogger(XenServer620SP1Resource.class);
 
     @Override
     public Answer executeRequest(final Command cmd) {