You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/11/05 00:51:27 UTC

[39/63] [abbrv] Changes for switching all wmi calls to V2 namespace. V1 namespace is deprecated so it is better to be on v2 namespace.

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1601498b/plugins/hypervisors/hyperv/DotNet/ServerResource/ServerResource.Tests/HypervResourceController1Test.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/ServerResource.Tests/HypervResourceController1Test.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/ServerResource.Tests/HypervResourceController1Test.cs
index 1226561..6cc5748 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/ServerResource.Tests/HypervResourceController1Test.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/ServerResource.Tests/HypervResourceController1Test.cs
@@ -1,321 +1,320 @@
-// 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.
-using System;
-using CloudStack.Plugin.WmiWrappers.ROOT.VIRTUALIZATION;
-using System.Management;
-using Newtonsoft.Json.Linq;
-using Newtonsoft.Json;
-using System.IO;
-using log4net;
-using HypervResource;
-using CloudStack.Plugin.AgentShell;
-using System.Collections.Generic;
-using NSubstitute;
-using System.Web.Http;
-using Xunit;
-
-namespace ServerResource.Tests
-{
-    public class HypervResourceController1Test
-    {
-
-        protected static string testCifsUrl = AgentSettings.Default.testCifsUrl;
-        protected static string testCifsPath = AgentSettings.Default.testCifsPath;
-        protected static String testPrimaryDataStoreHost = HypervResourceController.config.StorageIpAddress;
-        protected static String testS3TemplateName = AgentSettings.Default.testS3TemplateName;
-        protected static String testCifsTemplateName = AgentSettings.Default.testS3TemplateName;
-        protected static String testSystemVMTemplateName = AgentSettings.Default.testSystemVMTemplateName;
-        protected static String testSystemVMTemplateNameNoExt = AgentSettings.Default.testSystemVMTemplateNameNoExt;
-        protected static String testLocalStoreUUID = "5fe2bad3-d785-394e-9949-89786b8a63d2";
-        protected static String testLocalStorePath = Path.Combine(AgentSettings.Default.hyperv_plugin_root, "var", "test", "storagepool");
-        protected static String testSecondaryStoreLocalPath = Path.Combine(AgentSettings.Default.hyperv_plugin_root, "var", "test", "secondary");
-
-        // TODO: differentiate between NFS and HTTP template URLs.
-        protected static String testSampleTemplateUUID = "TestCopiedLocalTemplate.vhdx";
-        protected static String testSampleTemplateURL = testSampleTemplateUUID;
-
-        // test volumes are both a minimal size vhdx.  Changing the extension to .vhd makes on corrupt.
-        protected static String testSampleVolumeWorkingUUID = "TestVolumeLegit.vhdx";
-        protected static String testSampleVolumeCorruptUUID = "TestVolumeCorrupt.vhd";
-        protected static String testSampleVolumeTempUUID = "TestVolumeTemp.vhdx";
-        protected static String testSampleVolumeTempUUIDNoExt = "TestVolumeTemp";
-        protected static String testSampleVolumeWorkingURIJSON;
-        protected static String testSampleVolumeCorruptURIJSON;
-        protected static String testSampleVolumeTempURIJSON;
-
-        protected static String testSampleTemplateURLJSON;
-        protected static String testLocalStorePathJSON;
-
-        protected static IWmiCalls wmiCalls;
-
-
-        private static ILog s_logger = LogManager.GetLogger(typeof(HypervResourceController1Test));
-
-        /// <summary>
-        /// Test WmiCalls to which incoming HTTP POST requests are dispatched.
-        /// 
-        /// TODO: revise beyond first approximation
-        /// First approximation is a quick port of the existing Java tests for Hyper-V server resource.
-        /// A second approximation would use the AgentShell settings files directly.
-        /// A third approximation would look to invoke ServerResource methods via an HTTP request
-        /// </summary>
-
-        public HypervResourceController1Test()
-        {
-            wmiCalls = Substitute.For<IWmiCalls>();
-            //AgentService.ConfigServerResource();
-            HypervResourceController.config.PrivateMacAddress = AgentSettings.Default.private_mac_address;
-            HypervResourceController.config.PrivateNetmask = AgentSettings.Default.private_ip_netmask;
-            HypervResourceController.config.StorageIpAddress = HypervResourceController.config.PrivateIpAddress;
-            HypervResourceController.config.StorageMacAddress = HypervResourceController.config.PrivateMacAddress;
-            HypervResourceController.config.StorageNetmask = HypervResourceController.config.PrivateNetmask;
-
-
-            // Used to create existing StoragePool in preparation for the ModifyStoragePool
-            testLocalStoreUUID = AgentSettings.Default.local_storage_uuid.ToString();
-
-            // Make sure secondary store is available.
-            string fullPath = Path.GetFullPath(testSecondaryStoreLocalPath);
-            s_logger.Info("Test secondary storage in " + fullPath);
-            DirectoryInfo testSecondarStoreDir = new DirectoryInfo(fullPath);
-            if (!testSecondarStoreDir.Exists)
-            {
-                try
-                {
-                    testSecondarStoreDir.Create();
-                }
-                catch (System.IO.IOException ex)
-                {
-                    throw new NotImplementedException("Need to be able to create the folder " + testSecondarStoreDir.FullName + " failed due to " + ex.Message);
-                }
-            }
-
-            // Convert to secondary storage string to canonical path
-            testSecondaryStoreLocalPath = testSecondarStoreDir.FullName;
-            AgentSettings.Default.local_secondary_storage_path = testSecondaryStoreLocalPath;
-
-            // Make sure local primary storage is available
-            DirectoryInfo testPoolDir = new DirectoryInfo(testLocalStorePath);
-            //Assert.True(testPoolDir.Exists, "To simulate local file system Storage Pool, you need folder at " + testPoolDir.FullName);
-
-            // Convert to local primary storage string to canonical path
-            testLocalStorePath = testPoolDir.FullName;
-            AgentSettings.Default.local_storage_path = testLocalStorePath;
-
-            // Clean up old test files in local storage folder
-            FileInfo testVolWorks = new FileInfo(Path.Combine(testLocalStorePath, testSampleVolumeWorkingUUID));
-            // Assert.True(testVolWorks.Exists, "Create a working virtual disk at " + testVolWorks.FullName);           
-            
-            testSampleTemplateURLJSON = JsonConvert.SerializeObject(testSampleTemplateUUID);
-            s_logger.Info("Created " + testSampleTemplateURLJSON + " in local storage.");           
-
-
-            // Capture other JSON encoded paths
-            testSampleVolumeWorkingURIJSON = Newtonsoft.Json.JsonConvert.SerializeObject(testVolWorks.FullName);
-            testLocalStorePathJSON = JsonConvert.SerializeObject(testLocalStorePath);
-
-            // TODO: may need to initialise the server resource in future.
-            //    s_hypervresource.initialize();
-
-            // Verify sample template is in place storage pool
-            s_logger.Info("setUp complete, sample StoragePool at " + testLocalStorePathJSON
-                      + " sample template at " + testSampleTemplateURLJSON);
-        }
-
-        private String CreateTestDiskImageFromExistingImage(FileInfo srcFile,
-        String dstPath,
-        String dstFileName)
-        {
-            var newFullname = Path.Combine(dstPath, dstFileName);
-            var newFileInfo = new FileInfo(newFullname);
-            if (!newFileInfo.Exists)
-            {
-                newFileInfo = srcFile.CopyTo(newFullname);
-            }
-            newFileInfo.Refresh();
-            Assert.True(newFileInfo.Exists, "Attempted to create " + newFullname + " from " + newFileInfo.FullName);
-
-            return JsonConvert.SerializeObject(newFileInfo.FullName);
-        }
-        
-        [Fact]
-        public void TestCreateCommand()
-        {
-            DirectoryInfo localStorePath = new DirectoryInfo(testLocalStorePath);
-            if (!localStorePath.Exists)
-            {
-                try
-                {
-                    localStorePath.Create();
-                }
-                catch (System.IO.IOException ex)
-                {
-                    throw new NotImplementedException("Need to be able to create the folder " + localStorePath.FullName + " failed due to " + ex.Message);
-                }
-            }
-
-            FileInfo sampleTemplateFile = new FileInfo(Path.Combine(testLocalStorePath, testSampleTemplateUUID));
-            if (!sampleTemplateFile.Exists)
-            {
-                //Create a file to write to.
-                using (StreamWriter sw = sampleTemplateFile.CreateText())
-                {
-                    sw.WriteLine("This is fake template file for test");
-                }
-            }
-            var counter = 0;
-            wmiCalls.When(x => x.CreateDynamicVirtualHardDisk(Arg.Any<ulong>(), Arg.Any<String>())).Do(x => counter++);
-            // TODO: Need sample to update the test.
-            // Arrange
-            String createCmd = "{\"volId\":10,\"pool\":{\"id\":201,\"uuid\":\"" + testLocalStoreUUID + "\",\"host\":\"" + HypervResourceController.config.StorageIpAddress + "\"" +
-                            ",\"path\":" + testLocalStorePathJSON + ",\"port\":0,\"type\":\"Filesystem\"},\"diskCharacteristics\":{\"size\":0," +
-                            "\"tags\":[],\"type\":\"ROOT\",\"name\":\"ROOT-9\",\"useLocalStorage\":true,\"recreatable\":true,\"diskOfferingId\":11," +
-                            "\"volumeId\":10,\"hyperType\":\"Hyperv\"},\"templateUrl\":" + testSampleTemplateURLJSON + ",\"contextMap\":{},\"wait\":0}";
-            dynamic jsonCreateCmd = JsonConvert.DeserializeObject(createCmd);
-            HypervResourceController rsrcServer = new HypervResourceController();
-            HypervResourceController.wmiCalls = wmiCalls;
-
-            Assert.True(Directory.Exists(testLocalStorePath), testLocalStorePath + " does not exist ");
-            string filePath = Path.Combine(testLocalStorePath, (string)JsonConvert.DeserializeObject(testSampleTemplateURLJSON));
-            Assert.True(File.Exists(filePath), "The template we make volumes from is missing from path " + filePath);
-            int fileCount = Directory.GetFiles(testLocalStorePath).Length;
-            s_logger.Debug(" test local store has " + fileCount + "files");
-
-            // Act
-            // Test requires there to be a template at the tempalteUrl, which is its location in the local file system.
-            dynamic jsonResult = rsrcServer.CreateCommand(jsonCreateCmd);
-            s_logger.Debug("CreateDynamicVirtualHardDisk method is called " + counter + " times");
-
-            //Assert.Equal(counter, 1);
-
-            JObject ansAsProperty2 = jsonResult[0];
-            dynamic ans = ansAsProperty2.GetValue(CloudStackTypes.CreateAnswer);
-            Assert.NotNull(ans);
-            Assert.True((bool)ans.result, "Failed to CreateCommand due to " + (string)ans.result);
-            Assert.Equal(Directory.GetFiles(testLocalStorePath).Length, fileCount + 1);
-            FileInfo newFile = new FileInfo((string)ans.volume.path);
-            Assert.True(newFile.Length > 0, "The new file should have a size greater than zero");
-            newFile.Delete();
-            sampleTemplateFile.Delete();
-        }
-
-        /// <summary>
-        /// Possible additional tests:  place an ISO in the drive
-        /// </summary>        
-
-        [Fact]
-        public void TestStartCommand()
-        {
-            ComputerSystem system = new ComputerSystem();
-            wmiCalls.DeployVirtualMachine(Arg.Any<Object>(), Arg.Any<string>()).Returns(system);
-
-            // Arrange
-            HypervResourceController rsrcServer = new HypervResourceController();
-            HypervResourceController.wmiCalls = wmiCalls;
-            String sample = getSampleStartCommand();
-
-
-            dynamic jsonStartCmd = JsonConvert.DeserializeObject(sample);
-
-            // Act
-            dynamic startAns = rsrcServer.StartCommand(jsonStartCmd);
-
-            // Assert
-            Assert.NotNull(startAns[0][CloudStackTypes.StartAnswer]);
-            Assert.True((bool)startAns[0][CloudStackTypes.StartAnswer].result, "StartCommand did not succeed " + startAns[0][CloudStackTypes.StartAnswer].details);
-
-            Assert.Null((string)startAns[0][CloudStackTypes.StartAnswer].details);            
-        }
-
-        [Fact]
-        public void TestStopCommand()
-        {
-            //string vmName = "Test VM";
-            var counter = 0;
-            wmiCalls.When(x => x.DestroyVm(Arg.Any<Object>())).Do(x => counter++);
-
-            // Arrange
-            HypervResourceController rsrcServer = new HypervResourceController();
-            HypervResourceController.wmiCalls = wmiCalls;
-
-            String sampleStop = "{\"isProxy\":false,\"vmName\":\"i-2-17-VM\",\"contextMap\":{},\"wait\":0}";
-            dynamic jsonStopCmd = JsonConvert.DeserializeObject(sampleStop);
-
-            // Act
-            dynamic stopAns = rsrcServer.StopCommand(jsonStopCmd);
-
-            // Assert VM is gone!
-            Assert.NotNull(stopAns[0][CloudStackTypes.StopAnswer]);
-            Assert.True((bool)stopAns[0][CloudStackTypes.StopAnswer].result, "StopCommand did not succeed " + stopAns[0][CloudStackTypes.StopAnswer].details);
-
-            Assert.Null((string)stopAns[0][CloudStackTypes.StopAnswer].details);
-            Assert.Equal<int>(counter, 1);
-        }
-
-        public static String getSamplePrimaryDataStoreInfo()
-        {
-            String samplePrimaryDataStoreInfo =
-            "{\"org.apache.cloudstack.storage.to.PrimaryDataStoreTO\":" +
-                "{\"uuid\":\"" + testLocalStoreUUID + "\"," +
-                "\"id\":201," +
-                "\"host\":\"" + testPrimaryDataStoreHost + "\"," +
-                "\"type\":\"Filesystem\"," +  // Not used in PrimaryDataStoreTO
-                "\"poolType\":\"Filesystem\"," +  // Not used in PrimaryDataStoreTO
-                "\"path\":" + testLocalStorePathJSON + "," +
-                "\"port\":0}" +
-            "}";
-            return samplePrimaryDataStoreInfo;
-        }
-
-        public static String getSampleVolumeObjectTO()
-        {
-            String sampleVolumeObjectTO =
-                    "{\"org.apache.cloudstack.storage.to.VolumeObjectTO\":" +
-                        "{\"uuid\":\"19ae8e67-cb2c-4ab4-901e-e0b864272b59\"," +
-                        "\"volumeType\":\"ROOT\"," +
-                        "\"format\":\"VHDX\"," +
-                        "\"dataStore\":" + getSamplePrimaryDataStoreInfo() + "," +
-                        "\"name\":\"" + testSampleVolumeTempUUIDNoExt + "\"," +
-                        "\"size\":52428800," +
-                        "\"volumeId\":10," +
-                //                            "\"vmName\":\"i-3-5-VM\"," +  // TODO: do we have to fill in the vmName?
-                        "\"accountId\":3,\"id\":10}" +
-                    "}";  // end of destTO 
-            return sampleVolumeObjectTO;
-        }
-
-        public static String getSampleStartCommand()
-        {
-            String sample = "{\"vm\":{\"id\":17,\"name\":\"i-2-17-VM\",\"type\":\"User\",\"cpus\":1,\"speed\":500," +
-                                "\"minRam\":536870912,\"maxRam\":536870912,\"arch\":\"x86_64\"," +
-                                "\"os\":\"CentOS 6.0 (64-bit)\",\"bootArgs\":\"\",\"rebootOnCrash\":false," +
-                                "\"enableHA\":false,\"limitCpuUse\":false,\"vncPassword\":\"31f82f29aff646eb\"," +
-                                "\"params\":{},\"uuid\":\"8b030b6a-0243-440a-8cc5-45d08815ca11\"" +
-                            ",\"disks\":[" +
-                               "{\"data\":" + getSampleVolumeObjectTO() + ",\"diskSeq\":0,\"type\":\"ROOT\"}," +
-                               "{\"diskSeq\":1,\"type\":\"ISO\"}" +
-                            "]," +
-                            "\"nics\":[" +
-                                    "{\"deviceId\":0,\"networkRateMbps\":100,\"defaultNic\":true,\"uuid\":\"99cb4813-23af-428c-a87a-2d1899be4f4b\"," +
-                                    "\"ip\":\"10.1.1.67\",\"netmask\":\"255.255.255.0\",\"gateway\":\"10.1.1.1\"," +
-                                    "\"mac\":\"02:00:51:2c:00:0e\",\"dns1\":\"4.4.4.4\",\"broadcastType\":\"Vlan\",\"type\":\"Guest\"," +
-                                    "\"broadcastUri\":\"vlan://261\",\"isolationUri\":\"vlan://261\",\"isSecurityGroupEnabled\":false}" +
-                            "]},\"contextMap\":{},\"wait\":0}";
-            return sample;
-        }        
-    }
-}
+// 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.
+using System;
+using CloudStack.Plugin.WmiWrappers.ROOT.VIRTUALIZATION.V2;
+using System.Management;
+using Newtonsoft.Json.Linq;
+using Newtonsoft.Json;
+using System.IO;
+using log4net;
+using HypervResource;
+using CloudStack.Plugin.AgentShell;
+using System.Collections.Generic;
+using NSubstitute;
+using System.Web.Http;
+using Xunit;
+
+namespace ServerResource.Tests
+{
+    public class HypervResourceController1Test
+    {
+        protected static string testCifsUrl = AgentSettings.Default.testCifsUrl;
+        protected static string testCifsPath = AgentSettings.Default.testCifsPath;
+        protected static String testPrimaryDataStoreHost = HypervResourceController.config.StorageIpAddress;
+        protected static String testS3TemplateName = AgentSettings.Default.testS3TemplateName;
+        protected static String testCifsTemplateName = AgentSettings.Default.testS3TemplateName;
+        protected static String testSystemVMTemplateName = AgentSettings.Default.testSystemVMTemplateName;
+        protected static String testSystemVMTemplateNameNoExt = AgentSettings.Default.testSystemVMTemplateNameNoExt;
+        protected static String testLocalStoreUUID = "5fe2bad3-d785-394e-9949-89786b8a63d2";
+        protected static String testLocalStorePath = Path.Combine(AgentSettings.Default.hyperv_plugin_root, "var", "test", "storagepool");
+        protected static String testSecondaryStoreLocalPath = Path.Combine(AgentSettings.Default.hyperv_plugin_root, "var", "test", "secondary");
+
+        // TODO: differentiate between NFS and HTTP template URLs.
+        protected static String testSampleTemplateUUID = "TestCopiedLocalTemplate.vhdx";
+        protected static String testSampleTemplateURL = testSampleTemplateUUID;
+
+        // test volumes are both a minimal size vhdx.  Changing the extension to .vhd makes on corrupt.
+        protected static String testSampleVolumeWorkingUUID = "TestVolumeLegit.vhdx";
+        protected static String testSampleVolumeCorruptUUID = "TestVolumeCorrupt.vhd";
+        protected static String testSampleVolumeTempUUID = "TestVolumeTemp.vhdx";
+        protected static String testSampleVolumeTempUUIDNoExt = "TestVolumeTemp";
+        protected static String testSampleVolumeWorkingURIJSON;
+        protected static String testSampleVolumeCorruptURIJSON;
+        protected static String testSampleVolumeTempURIJSON;
+
+        protected static String testSampleTemplateURLJSON;
+        protected static String testLocalStorePathJSON;
+
+        protected static IWmiCallsV2 wmiCallsV2;
+
+
+        private static ILog s_logger = LogManager.GetLogger(typeof(HypervResourceController1Test));
+
+        /// <summary>
+        /// Test WmiCalls to which incoming HTTP POST requests are dispatched.
+        /// 
+        /// TODO: revise beyond first approximation
+        /// First approximation is a quick port of the existing Java tests for Hyper-V server resource.
+        /// A second approximation would use the AgentShell settings files directly.
+        /// A third approximation would look to invoke ServerResource methods via an HTTP request
+        /// </summary>
+
+        public HypervResourceController1Test()
+        {
+            wmiCallsV2 = Substitute.For<IWmiCallsV2>();
+            //AgentService.ConfigServerResource();
+            HypervResourceController.config.PrivateMacAddress = AgentSettings.Default.private_mac_address;
+            HypervResourceController.config.PrivateNetmask = AgentSettings.Default.private_ip_netmask;
+            HypervResourceController.config.StorageIpAddress = HypervResourceController.config.PrivateIpAddress;
+            HypervResourceController.config.StorageMacAddress = HypervResourceController.config.PrivateMacAddress;
+            HypervResourceController.config.StorageNetmask = HypervResourceController.config.PrivateNetmask;
+
+
+            // Used to create existing StoragePool in preparation for the ModifyStoragePool
+            testLocalStoreUUID = AgentSettings.Default.local_storage_uuid.ToString();
+
+            // Make sure secondary store is available.
+            string fullPath = Path.GetFullPath(testSecondaryStoreLocalPath);
+            s_logger.Info("Test secondary storage in " + fullPath);
+            DirectoryInfo testSecondarStoreDir = new DirectoryInfo(fullPath);
+            if (!testSecondarStoreDir.Exists)
+            {
+                try
+                {
+                    testSecondarStoreDir.Create();
+                }
+                catch (System.IO.IOException ex)
+                {
+                    throw new NotImplementedException("Need to be able to create the folder " + testSecondarStoreDir.FullName + " failed due to " + ex.Message);
+                }
+            }
+
+            // Convert to secondary storage string to canonical path
+            testSecondaryStoreLocalPath = testSecondarStoreDir.FullName;
+            AgentSettings.Default.local_secondary_storage_path = testSecondaryStoreLocalPath;
+
+            // Make sure local primary storage is available
+            DirectoryInfo testPoolDir = new DirectoryInfo(testLocalStorePath);
+            //Assert.True(testPoolDir.Exists, "To simulate local file system Storage Pool, you need folder at " + testPoolDir.FullName);
+
+            // Convert to local primary storage string to canonical path
+            testLocalStorePath = testPoolDir.FullName;
+            AgentSettings.Default.local_storage_path = testLocalStorePath;
+
+            // Clean up old test files in local storage folder
+            FileInfo testVolWorks = new FileInfo(Path.Combine(testLocalStorePath, testSampleVolumeWorkingUUID));
+            // Assert.True(testVolWorks.Exists, "Create a working virtual disk at " + testVolWorks.FullName);           
+            
+            testSampleTemplateURLJSON = JsonConvert.SerializeObject(testSampleTemplateUUID);
+            s_logger.Info("Created " + testSampleTemplateURLJSON + " in local storage.");           
+
+
+            // Capture other JSON encoded paths
+            testSampleVolumeWorkingURIJSON = Newtonsoft.Json.JsonConvert.SerializeObject(testVolWorks.FullName);
+            testLocalStorePathJSON = JsonConvert.SerializeObject(testLocalStorePath);
+
+            // TODO: may need to initialise the server resource in future.
+            //    s_hypervresource.initialize();
+
+            // Verify sample template is in place storage pool
+            s_logger.Info("setUp complete, sample StoragePool at " + testLocalStorePathJSON
+                      + " sample template at " + testSampleTemplateURLJSON);
+        }
+
+        private String CreateTestDiskImageFromExistingImage(FileInfo srcFile,
+        String dstPath,
+        String dstFileName)
+        {
+            var newFullname = Path.Combine(dstPath, dstFileName);
+            var newFileInfo = new FileInfo(newFullname);
+            if (!newFileInfo.Exists)
+            {
+                newFileInfo = srcFile.CopyTo(newFullname);
+            }
+            newFileInfo.Refresh();
+            Assert.True(newFileInfo.Exists, "Attempted to create " + newFullname + " from " + newFileInfo.FullName);
+
+            return JsonConvert.SerializeObject(newFileInfo.FullName);
+        }
+        
+        [Fact]
+        public void TestCreateCommand()
+        {
+            DirectoryInfo localStorePath = new DirectoryInfo(testLocalStorePath);
+            if (!localStorePath.Exists)
+            {
+                try
+                {
+                    localStorePath.Create();
+                }
+                catch (System.IO.IOException ex)
+                {
+                    throw new NotImplementedException("Need to be able to create the folder " + localStorePath.FullName + " failed due to " + ex.Message);
+                }
+            }
+
+            FileInfo sampleTemplateFile = new FileInfo(Path.Combine(testLocalStorePath, testSampleTemplateUUID));
+            if (!sampleTemplateFile.Exists)
+            {
+                //Create a file to write to.
+                using (StreamWriter sw = sampleTemplateFile.CreateText())
+                {
+                    sw.WriteLine("This is fake template file for test");
+                }
+            }
+            var counter = 0;
+            wmiCallsV2.When(x => x.CreateDynamicVirtualHardDisk(Arg.Any<ulong>(), Arg.Any<String>())).Do(x => counter++);
+            // TODO: Need sample to update the test.
+            // Arrange
+            String createCmd = "{\"volId\":10,\"pool\":{\"id\":201,\"uuid\":\"" + testLocalStoreUUID + "\",\"host\":\"" + HypervResourceController.config.StorageIpAddress + "\"" +
+                            ",\"path\":" + testLocalStorePathJSON + ",\"port\":0,\"type\":\"Filesystem\"},\"diskCharacteristics\":{\"size\":0," +
+                            "\"tags\":[],\"type\":\"ROOT\",\"name\":\"ROOT-9\",\"useLocalStorage\":true,\"recreatable\":true,\"diskOfferingId\":11," +
+                            "\"volumeId\":10,\"hyperType\":\"Hyperv\"},\"templateUrl\":" + testSampleTemplateURLJSON + ",\"contextMap\":{},\"wait\":0}";
+            dynamic jsonCreateCmd = JsonConvert.DeserializeObject(createCmd);
+            HypervResourceController rsrcServer = new HypervResourceController();
+            HypervResourceController.wmiCallsV2 = wmiCallsV2;
+
+            Assert.True(Directory.Exists(testLocalStorePath), testLocalStorePath + " does not exist ");
+            string filePath = Path.Combine(testLocalStorePath, (string)JsonConvert.DeserializeObject(testSampleTemplateURLJSON));
+            Assert.True(File.Exists(filePath), "The template we make volumes from is missing from path " + filePath);
+            int fileCount = Directory.GetFiles(testLocalStorePath).Length;
+            s_logger.Debug(" test local store has " + fileCount + "files");
+
+            // Act
+            // Test requires there to be a template at the tempalteUrl, which is its location in the local file system.
+            dynamic jsonResult = rsrcServer.CreateCommand(jsonCreateCmd);
+            s_logger.Debug("CreateDynamicVirtualHardDisk method is called " + counter + " times");
+
+            //Assert.Equal(counter, 1);
+
+            JObject ansAsProperty2 = jsonResult[0];
+            dynamic ans = ansAsProperty2.GetValue(CloudStackTypes.CreateAnswer);
+            Assert.NotNull(ans);
+            Assert.True((bool)ans.result, "Failed to CreateCommand due to " + (string)ans.result);
+            Assert.Equal(Directory.GetFiles(testLocalStorePath).Length, fileCount + 1);
+            FileInfo newFile = new FileInfo((string)ans.volume.path);
+            Assert.True(newFile.Length > 0, "The new file should have a size greater than zero");
+            newFile.Delete();
+            sampleTemplateFile.Delete();
+        }
+
+        /// <summary>
+        /// Possible additional tests:  place an ISO in the drive
+        /// </summary>        
+
+        [Fact]
+        public void TestStartCommand()
+        {
+            ComputerSystem system = new ComputerSystem();
+            wmiCallsV2.DeployVirtualMachine(Arg.Any<Object>(), Arg.Any<string>()).Returns(system);
+
+            // Arrange
+            HypervResourceController rsrcServer = new HypervResourceController();
+            HypervResourceController.wmiCallsV2 = wmiCallsV2;
+            String sample = getSampleStartCommand();
+
+
+            dynamic jsonStartCmd = JsonConvert.DeserializeObject(sample);
+
+            // Act
+            dynamic startAns = rsrcServer.StartCommand(jsonStartCmd);
+
+            // Assert
+            Assert.NotNull(startAns[0][CloudStackTypes.StartAnswer]);
+            Assert.True((bool)startAns[0][CloudStackTypes.StartAnswer].result, "StartCommand did not succeed " + startAns[0][CloudStackTypes.StartAnswer].details);
+
+            Assert.Null((string)startAns[0][CloudStackTypes.StartAnswer].details);            
+        }
+
+        [Fact]
+        public void TestStopCommand()
+        {
+            //string vmName = "Test VM";
+            var counter = 0;
+            wmiCallsV2.When(x => x.DestroyVm(Arg.Any<Object>())).Do(x => counter++);
+
+            // Arrange
+            HypervResourceController rsrcServer = new HypervResourceController();
+            HypervResourceController.wmiCallsV2 = wmiCallsV2;
+
+            String sampleStop = "{\"isProxy\":false,\"vmName\":\"i-2-17-VM\",\"contextMap\":{},\"wait\":0}";
+            dynamic jsonStopCmd = JsonConvert.DeserializeObject(sampleStop);
+
+            // Act
+            dynamic stopAns = rsrcServer.StopCommand(jsonStopCmd);
+
+            // Assert VM is gone!
+            Assert.NotNull(stopAns[0][CloudStackTypes.StopAnswer]);
+            Assert.True((bool)stopAns[0][CloudStackTypes.StopAnswer].result, "StopCommand did not succeed " + stopAns[0][CloudStackTypes.StopAnswer].details);
+
+            Assert.Null((string)stopAns[0][CloudStackTypes.StopAnswer].details);
+            Assert.Equal<int>(counter, 1);
+        }
+
+        public static String getSamplePrimaryDataStoreInfo()
+        {
+            String samplePrimaryDataStoreInfo =
+            "{\"org.apache.cloudstack.storage.to.PrimaryDataStoreTO\":" +
+                "{\"uuid\":\"" + testLocalStoreUUID + "\"," +
+                "\"id\":201," +
+                "\"host\":\"" + testPrimaryDataStoreHost + "\"," +
+                "\"type\":\"Filesystem\"," +  // Not used in PrimaryDataStoreTO
+                "\"poolType\":\"Filesystem\"," +  // Not used in PrimaryDataStoreTO
+                "\"path\":" + testLocalStorePathJSON + "," +
+                "\"port\":0}" +
+            "}";
+            return samplePrimaryDataStoreInfo;
+        }
+
+        public static String getSampleVolumeObjectTO()
+        {
+            String sampleVolumeObjectTO =
+                    "{\"org.apache.cloudstack.storage.to.VolumeObjectTO\":" +
+                        "{\"uuid\":\"19ae8e67-cb2c-4ab4-901e-e0b864272b59\"," +
+                        "\"volumeType\":\"ROOT\"," +
+                        "\"format\":\"VHDX\"," +
+                        "\"dataStore\":" + getSamplePrimaryDataStoreInfo() + "," +
+                        "\"name\":\"" + testSampleVolumeTempUUIDNoExt + "\"," +
+                        "\"size\":52428800," +
+                        "\"volumeId\":10," +
+                //                            "\"vmName\":\"i-3-5-VM\"," +  // TODO: do we have to fill in the vmName?
+                        "\"accountId\":3,\"id\":10}" +
+                    "}";  // end of destTO 
+            return sampleVolumeObjectTO;
+        }
+
+        public static String getSampleStartCommand()
+        {
+            String sample = "{\"vm\":{\"id\":17,\"name\":\"i-2-17-VM\",\"type\":\"User\",\"cpus\":1,\"speed\":500," +
+                                "\"minRam\":536870912,\"maxRam\":536870912,\"arch\":\"x86_64\"," +
+                                "\"os\":\"CentOS 6.0 (64-bit)\",\"bootArgs\":\"\",\"rebootOnCrash\":false," +
+                                "\"enableHA\":false,\"limitCpuUse\":false,\"vncPassword\":\"31f82f29aff646eb\"," +
+                                "\"params\":{},\"uuid\":\"8b030b6a-0243-440a-8cc5-45d08815ca11\"" +
+                            ",\"disks\":[" +
+                               "{\"data\":" + getSampleVolumeObjectTO() + ",\"diskSeq\":0,\"type\":\"ROOT\"}," +
+                               "{\"diskSeq\":1,\"type\":\"ISO\"}" +
+                            "]," +
+                            "\"nics\":[" +
+                                    "{\"deviceId\":0,\"networkRateMbps\":100,\"defaultNic\":true,\"uuid\":\"99cb4813-23af-428c-a87a-2d1899be4f4b\"," +
+                                    "\"ip\":\"10.1.1.67\",\"netmask\":\"255.255.255.0\",\"gateway\":\"10.1.1.1\"," +
+                                    "\"mac\":\"02:00:51:2c:00:0e\",\"dns1\":\"4.4.4.4\",\"broadcastType\":\"Vlan\",\"type\":\"Guest\"," +
+                                    "\"broadcastUri\":\"vlan://261\",\"isolationUri\":\"vlan://261\",\"isSecurityGroupEnabled\":false}" +
+                            "]},\"contextMap\":{},\"wait\":0}";
+            return sample;
+        }        
+    }
+}