Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 13FAD102E8 for ; Wed, 30 Oct 2013 07:50:43 +0000 (UTC) Received: (qmail 10193 invoked by uid 500); 30 Oct 2013 07:49:52 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 10003 invoked by uid 500); 30 Oct 2013 07:49:49 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 9742 invoked by uid 99); 30 Oct 2013 07:49:41 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 30 Oct 2013 07:49:41 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 93AFE8902D2; Wed, 30 Oct 2013 07:49:41 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: devdeep@apache.org To: commits@cloudstack.apache.org Date: Wed, 30 Oct 2013 07:50:13 -0000 Message-Id: <6cb0e19a79f149a8bf74a784ac7e3368@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [39/46] 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/d0035fcc/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)); - - /// - /// 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 - /// - - public HypervResourceController1Test() - { - wmiCalls = Substitute.For(); - //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(), Arg.Any())).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(); - } - - /// - /// Possible additional tests: place an ISO in the drive - /// - - [Fact] - public void TestStartCommand() - { - ComputerSystem system = new ComputerSystem(); - wmiCalls.DeployVirtualMachine(Arg.Any(), Arg.Any()).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())).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(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)); + + /// + /// 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 + /// + + public HypervResourceController1Test() + { + wmiCallsV2 = Substitute.For(); + //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(), Arg.Any())).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(); + } + + /// + /// Possible additional tests: place an ISO in the drive + /// + + [Fact] + public void TestStartCommand() + { + ComputerSystem system = new ComputerSystem(); + wmiCallsV2.DeployVirtualMachine(Arg.Any(), Arg.Any()).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())).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(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; + } + } +}