You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2015/04/02 20:23:17 UTC

[36/39] git commit: updated refs/heads/master to 3e28747

Refactoring XenServer56 and 56FP1 Resources in order to cope with new FenceCommandWrapper
   - Unit tests added

Also removed an unit test that was doing nothing.


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

Branch: refs/heads/master
Commit: f3842c81f8ae35b21131abe8d88c8cbc3b201b1c
Parents: 4600eef
Author: wilderrodrigues <wr...@schubergphilis.com>
Authored: Tue Mar 31 07:44:39 2015 +0200
Committer: wilderrodrigues <wr...@schubergphilis.com>
Committed: Tue Mar 31 10:38:33 2015 +0200

----------------------------------------------------------------------
 .../resource/XenServer56FP1Resource.java        | 56 ------------
 .../xenserver/resource/XenServer56Resource.java | 36 +-------
 .../resource/wrapper/CitrixRequestWrapper.java  |  8 ++
 .../XenServer56FP1FenceCommandWrapper.java      | 92 ++++++++++++++++++++
 .../wrapper/XenServer56FenceCommandWrapper.java | 71 +++++++++++++++
 .../test/com/cloud/ha/XenServerFencerTest.java  | 39 ---------
 .../wrapper/XenServer56FP1WrapperTest.java      | 49 +++++++++++
 .../wrapper/XenServer56WrapperTest.java         | 34 +++++++-
 8 files changed, 251 insertions(+), 134 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/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 26f148e..1143528 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
@@ -18,32 +18,22 @@ package com.cloud.hypervisor.xenserver.resource;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.ejb.Local;
 
-import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 
-import com.cloud.agent.api.FenceAnswer;
-import com.cloud.agent.api.FenceCommand;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 import com.xensource.xenapi.Connection;
 import com.xensource.xenapi.Host;
 import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VBD;
-import com.xensource.xenapi.VDI;
-import com.xensource.xenapi.VM;
 
 @Local(value = ServerResource.class)
 public class XenServer56FP1Resource extends XenServer56Resource {
-    private static final long mem_128m = 134217728L;
-    private static final Logger s_logger = Logger.getLogger(XenServer56FP1Resource.class);
 
     public XenServer56FP1Resource() {
         super();
@@ -62,52 +52,6 @@ public class XenServer56FP1Resource extends XenServer56Resource {
         return files;
     }
 
-    @Override
-    protected FenceAnswer execute(final FenceCommand cmd) {
-        final Connection conn = getConnection();
-        try {
-            final Boolean alive = checkHeartbeat(cmd.getHostGuid());
-            if ( alive == null ) {
-                s_logger.debug("Failed to check heartbeat,  so unable to fence");
-                return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
-            }
-            if ( alive ) {
-                s_logger.debug("Heart beat is still going so unable to fence");
-                return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
-            }
-            final Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
-            for (final VM vm : vms) {
-                final Set<VDI> vdis = new HashSet<VDI>();
-                final Set<VBD> vbds = vm.getVBDs(conn);
-                for (final VBD vbd : vbds) {
-                    final VDI vdi = vbd.getVDI(conn);
-                    if (!isRefNull(vdi)) {
-                        vdis.add(vdi);
-                    }
-                }
-                s_logger.info("Fence command for VM " + cmd.getVmName());
-                vm.powerStateReset(conn);
-                vm.destroy(conn);
-                for (final VDI vdi : vdis) {
-                    final Map<String, String> smConfig = vdi.getSmConfig(conn);
-                    for (final String key : smConfig.keySet()) {
-                        if (key.startsWith("host_")) {
-                            vdi.removeFromSmConfig(conn, key);
-                            break;
-                        }
-                    }
-                }
-            }
-            return new FenceAnswer(cmd);
-        } catch (final XmlRpcException e) {
-            s_logger.warn("Unable to fence", e);
-            return new FenceAnswer(cmd, false, e.getMessage());
-        } catch (final XenAPIException e) {
-            s_logger.warn("Unable to fence", e);
-            return new FenceAnswer(cmd, false, e.getMessage());
-        }
-    }
-
     /**
      * When Dynamic Memory Control (DMC) is enabled -
      * xenserver allows scaling the guest memory while the guest is running

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/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 85cdf04..3a9baf1 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
@@ -19,7 +19,6 @@ package com.cloud.hypervisor.xenserver.resource;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 import javax.ejb.Local;
 
@@ -28,8 +27,6 @@ import org.apache.xmlrpc.XmlRpcException;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
-import com.cloud.agent.api.FenceAnswer;
-import com.cloud.agent.api.FenceCommand;
 import com.cloud.agent.api.NetworkUsageAnswer;
 import com.cloud.agent.api.NetworkUsageCommand;
 import com.cloud.agent.api.StartupCommand;
@@ -46,7 +43,6 @@ import com.xensource.xenapi.PIF;
 import com.xensource.xenapi.Types.IpConfigurationMode;
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VLAN;
-import com.xensource.xenapi.VM;
 
 @Local(value = ServerResource.class)
 public class XenServer56Resource extends CitrixResourceBase {
@@ -63,9 +59,7 @@ public class XenServer56Resource extends CitrixResourceBase {
             // Ignore this for now. Still working on converting the other commands.
         }
 
-        if (cmd instanceof FenceCommand) {
-            return execute((FenceCommand) cmd);
-        } else if (cmd instanceof NetworkUsageCommand) {
+        if (cmd instanceof NetworkUsageCommand) {
             return execute((NetworkUsageCommand) cmd);
         } else {
             return super.executeRequest(cmd);
@@ -238,34 +232,6 @@ public class XenServer56Resource extends CitrixResourceBase {
         }
     }
 
-    protected FenceAnswer execute(final FenceCommand cmd) {
-        final Connection conn = getConnection();
-        try {
-            final Boolean alive = checkHeartbeat(cmd.getHostGuid());
-            if (alive == null) {
-                s_logger.debug("Failed to check heartbeat,  so unable to fence");
-                return new FenceAnswer(cmd, false, "Failed to check heartbeat, so unable to fence");
-            }
-            if (alive) {
-                s_logger.debug("Heart beat is still going so unable to fence");
-                return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
-            }
-            final Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
-            for (final VM vm : vms) {
-                s_logger.info("Fence command for VM " + cmd.getVmName());
-                vm.powerStateReset(conn);
-                vm.destroy(conn);
-            }
-            return new FenceAnswer(cmd);
-        } catch (final XmlRpcException e) {
-            s_logger.warn("Unable to fence", e);
-            return new FenceAnswer(cmd, false, e.getMessage());
-        } catch (final XenAPIException e) {
-            s_logger.warn("Unable to fence", e);
-            return new FenceAnswer(cmd, false, e.getMessage());
-        }
-    }
-
     @Override
     public boolean transferManagementNetwork(final Connection conn, final Host host, final PIF src, final PIF.Record spr, final PIF dest) throws XmlRpcException, XenAPIException {
         dest.reconfigureIp(conn, spr.ipConfigurationMode, spr.IP, spr.netmask, spr.gateway, spr.DNS);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/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 05caabd..a5ca115 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
@@ -35,6 +35,7 @@ import com.cloud.agent.api.CreateStoragePoolCommand;
 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.GetHostStatsCommand;
 import com.cloud.agent.api.GetStorageStatsCommand;
 import com.cloud.agent.api.GetVmDiskStatsCommand;
@@ -82,6 +83,7 @@ import com.cloud.agent.api.storage.DestroyCommand;
 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.XenServer56FP1Resource;
 import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
 import com.cloud.resource.CommandWrapper;
 import com.cloud.resource.RequestWrapper;
@@ -173,8 +175,14 @@ public class CitrixRequestWrapper extends RequestWrapper {
         // XenServer56Resource commands
         final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
         xenServer56Commands.put(CheckOnHostCommand.class, new XenServer56CheckOnHostCommandWrapper());
+        xenServer56Commands.put(FenceCommand.class, new XenServer56FenceCommandWrapper());
         resources.put(XenServer56Resource.class, xenServer56Commands);
 
+        // XenServer56FP1Resource commands
+        final Hashtable<Class<? extends Command>, CommandWrapper> xenServer56P1Commands = new Hashtable<Class<? extends Command>, CommandWrapper>();
+        xenServer56P1Commands.put(FenceCommand.class, new XenServer56FP1FenceCommandWrapper());
+        resources.put(XenServer56FP1Resource.class, xenServer56P1Commands);
+
         initialised = true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java
new file mode 100644
index 0000000..b169636
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1FenceCommandWrapper.java
@@ -0,0 +1,92 @@
+//
+// 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.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.FenceAnswer;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VBD;
+import com.xensource.xenapi.VDI;
+import com.xensource.xenapi.VM;
+
+public final class XenServer56FP1FenceCommandWrapper extends CommandWrapper<FenceCommand, Answer, XenServer56Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer56FP1FenceCommandWrapper.class);
+
+    @Override
+    public Answer execute(final FenceCommand command, final XenServer56Resource xenServer56) {
+        final Connection conn = xenServer56.getConnection();
+        try {
+            final Boolean alive = xenServer56.checkHeartbeat(command.getHostGuid());
+            if ( alive == null ) {
+                s_logger.debug("Failed to check heartbeat,  so unable to fence");
+                return new FenceAnswer(command, false, "Failed to check heartbeat, so unable to fence");
+            }
+            if ( alive ) {
+                s_logger.debug("Heart beat is still going so unable to fence");
+                return new FenceAnswer(command, false, "Heartbeat is still going on unable to fence");
+            }
+            final Set<VM> vms = VM.getByNameLabel(conn, command.getVmName());
+            for (final VM vm : vms) {
+                final Set<VDI> vdis = new HashSet<VDI>();
+                final Set<VBD> vbds = vm.getVBDs(conn);
+                for (final VBD vbd : vbds) {
+                    final VDI vdi = vbd.getVDI(conn);
+                    if (!xenServer56.isRefNull(vdi)) {
+                        vdis.add(vdi);
+                    }
+                }
+                s_logger.info("Fence command for VM " + command.getVmName());
+                vm.powerStateReset(conn);
+                vm.destroy(conn);
+                for (final VDI vdi : vdis) {
+                    final Map<String, String> smConfig = vdi.getSmConfig(conn);
+                    for (final String key : smConfig.keySet()) {
+                        if (key.startsWith("host_")) {
+                            vdi.removeFromSmConfig(conn, key);
+                            break;
+                        }
+                    }
+                }
+            }
+            return new FenceAnswer(command);
+        } catch (final XmlRpcException e) {
+            s_logger.warn("Unable to fence", e);
+            return new FenceAnswer(command, false, e.getMessage());
+        } catch (final XenAPIException e) {
+            s_logger.warn("Unable to fence", e);
+            return new FenceAnswer(command, false, e.getMessage());
+        } catch (final Exception e) {
+            s_logger.warn("Unable to fence", e);
+            return new FenceAnswer(command, false, e.getMessage());
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.java
new file mode 100644
index 0000000..ece3329
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FenceCommandWrapper.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.Set;
+
+import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.FenceAnswer;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.resource.CommandWrapper;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.VM;
+
+public final class XenServer56FenceCommandWrapper extends CommandWrapper<FenceCommand, Answer, XenServer56Resource> {
+
+    private static final Logger s_logger = Logger.getLogger(XenServer56FenceCommandWrapper.class);
+
+    @Override
+    public Answer execute(final FenceCommand command, final XenServer56Resource xenServer56) {
+        final Connection conn = xenServer56.getConnection();
+        try {
+            final Boolean alive = xenServer56.checkHeartbeat(command.getHostGuid());
+            if (alive == null) {
+                s_logger.debug("Failed to check heartbeat,  so unable to fence");
+                return new FenceAnswer(command, false, "Failed to check heartbeat, so unable to fence");
+            }
+            if (alive) {
+                s_logger.debug("Heart beat is still going so unable to fence");
+                return new FenceAnswer(command, false, "Heartbeat is still going on unable to fence");
+            }
+            final Set<VM> vms = VM.getByNameLabel(conn, command.getVmName());
+            for (final VM vm : vms) {
+                s_logger.info("Fence command for VM " + command.getVmName());
+                vm.powerStateReset(conn);
+                vm.destroy(conn);
+            }
+            return new FenceAnswer(command);
+        } catch (final XmlRpcException e) {
+            s_logger.warn("Unable to fence", e);
+            return new FenceAnswer(command, false, e.getMessage());
+        } catch (final XenAPIException e) {
+            s_logger.warn("Unable to fence", e);
+            return new FenceAnswer(command, false, e.getMessage());
+        } catch (final Exception e) {
+            s_logger.warn("Unable to fence", e);
+            return new FenceAnswer(command, false, e.getMessage());
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java b/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java
deleted file mode 100644
index bd1d8f8..0000000
--- a/plugins/hypervisors/xenserver/test/com/cloud/ha/XenServerFencerTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.ha;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-
-public class XenServerFencerTest {
-
-    @Test
-    public void testSetAndGetName() throws Exception {
-        XenServerFencer xenServerFencer = new XenServerFencer();
-        String name = "name";
-
-        xenServerFencer.setName(name);
-        String actual = xenServerFencer.getName();
-
-        assertEquals(name, actual);
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java
new file mode 100644
index 0000000..578302e
--- /dev/null
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56FP1WrapperTest.java
@@ -0,0 +1,49 @@
+package com.cloud.hypervisor.xenserver.resource.wrapper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+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.FenceCommand;
+import com.cloud.host.Host;
+import com.cloud.hypervisor.xenserver.resource.XenServer56FP1Resource;
+import com.cloud.vm.VMInstanceVO;
+import com.xensource.xenapi.Connection;
+
+@RunWith(PowerMockRunner.class)
+public class XenServer56FP1WrapperTest {
+
+    @Mock
+    private XenServer56FP1Resource xenServer56Resource;
+
+    @Test
+    public void testFenceCommand() {
+        final VMInstanceVO vm = Mockito.mock(VMInstanceVO.class);
+        final Host host = Mockito.mock(Host.class);
+
+        final Connection conn = Mockito.mock(Connection.class);
+
+        final FenceCommand fenceCommand = new FenceCommand(vm, host);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer56Resource.getConnection()).thenReturn(conn);
+
+        final Answer answer = wrapper.execute(fenceCommand, xenServer56Resource);
+
+        verify(xenServer56Resource, times(1)).getConnection();
+        verify(xenServer56Resource, times(1)).checkHeartbeat(fenceCommand.getHostGuid());
+
+        assertFalse(answer.getResult());
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3842c81/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
index b8f43df..f93a836 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/XenServer56WrapperTest.java
@@ -1,23 +1,27 @@
 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.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CheckOnHostCommand;
+import com.cloud.agent.api.FenceCommand;
+import com.cloud.host.Host;
 import com.cloud.hypervisor.xenserver.resource.XenServer56Resource;
+import com.cloud.vm.VMInstanceVO;
 import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
 
 @RunWith(PowerMockRunner.class)
-@PrepareForTest({ Connection.class, Host.Record.class })
 public class XenServer56WrapperTest {
 
     @Mock
@@ -35,4 +39,26 @@ public class XenServer56WrapperTest {
 
         assertTrue(answer.getResult());
     }
-}
+
+    @Test
+    public void testFenceCommand() {
+        final VMInstanceVO vm = Mockito.mock(VMInstanceVO.class);
+        final Host host = Mockito.mock(Host.class);
+
+        final Connection conn = Mockito.mock(Connection.class);
+
+        final FenceCommand fenceCommand = new FenceCommand(vm, host);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+        when(xenServer56Resource.getConnection()).thenReturn(conn);
+
+        final Answer answer = wrapper.execute(fenceCommand, xenServer56Resource);
+
+        verify(xenServer56Resource, times(1)).getConnection();
+        verify(xenServer56Resource, times(1)).checkHeartbeat(fenceCommand.getHostGuid());
+
+        assertFalse(answer.getResult());
+    }
+}
\ No newline at end of file