PageRenderTime 43ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/ServiceManagement/Services/Commands.Test/WAPackIaaS/Operations/VirtualMachineOperationsTests.cs

https://gitlab.com/jslee1/azure-powershell
C# | 429 lines | 328 code | 79 blank | 22 comment | 4 complexity | 1d46dff2bc80dfbbd1b5f4e6de9137d7 MD5 | raw file
  1. // ----------------------------------------------------------------------------------
  2. //
  3. // Copyright Microsoft Corporation
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. // ----------------------------------------------------------------------------------
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Net;
  18. using System.Net.Http;
  19. using Microsoft.WindowsAzure.Commands.ScenarioTest;
  20. using Xunit;
  21. using Microsoft.WindowsAzure.Commands.Test.WAPackIaaS.Mocks;
  22. using Microsoft.WindowsAzure.Commands.Utilities.WAPackIaaS;
  23. using Microsoft.WindowsAzure.Commands.Utilities.WAPackIaaS.DataContract;
  24. using Microsoft.WindowsAzure.Commands.Utilities.WAPackIaaS.Exceptions;
  25. using Microsoft.WindowsAzure.Commands.Utilities.WAPackIaaS.Operations;
  26. using Microsoft.WindowsAzure.Commands.Utilities.WAPackIaaS.WebClient;
  27. namespace Microsoft.WindowsAzure.Commands.Test.WAPackIaaS.Operations
  28. {
  29. public class VirtualMachineOperationsTests
  30. {
  31. [Fact]
  32. [Trait(Category.AcceptanceType, Category.CheckIn)]
  33. [Trait("Type", "WAPackIaaS-Negative")]
  34. [Trait("Type", "WAPackIaaS-All")]
  35. [Trait("Type", "WAPackIaaS-Unit")]
  36. public void ShouldReturnEmptyOnNoResult()
  37. {
  38. var vmOperations = new VirtualMachineOperations(new WebClientFactory(
  39. new Subscription(),
  40. MockRequestChannel.Create()));
  41. Assert.False(vmOperations.Read().Any());
  42. }
  43. [Fact]
  44. [Trait(Category.AcceptanceType, Category.CheckIn)]
  45. [Trait("Type", "WAPackIaaS-All")]
  46. [Trait("Type", "WAPackIaaS-Unit")]
  47. public void ShouldReturnOneVM()
  48. {
  49. var vmOperations = new VirtualMachineOperations(new WebClientFactory(
  50. new Subscription(),
  51. MockRequestChannel.Create()
  52. .AddReturnObject(new VirtualMachine { Name = "vm1", ID = Guid.NewGuid() })));
  53. Assert.Equal(1, vmOperations.Read().Count);
  54. }
  55. [Fact]
  56. [Trait(Category.AcceptanceType, Category.CheckIn)]
  57. [Trait("Type", "WAPackIaaS-Negative")]
  58. [Trait("Type", "WAPackIaaS-All")]
  59. [Trait("Type", "WAPackIaaS-Unit")]
  60. public void ShouldThrowGetByIdNoResult()
  61. {
  62. var vmOperations = new VirtualMachineOperations(new WebClientFactory(
  63. new Subscription(),
  64. MockRequestChannel.Create()));
  65. Assert.Throws<WAPackOperationException>(()=>vmOperations.Read(Guid.NewGuid()));
  66. }
  67. [Fact]
  68. [Trait(Category.AcceptanceType, Category.CheckIn)]
  69. [Trait("Type", "WAPackIaaS-All")]
  70. [Trait("Type", "WAPackIaaS-Unit")]
  71. public void ShouldReturnOneVMGetById()
  72. {
  73. var expectedVmId = Guid.NewGuid();
  74. var vmOperations = new VirtualMachineOperations(new WebClientFactory(
  75. new Subscription(),
  76. MockRequestChannel.Create()
  77. .AddReturnObject(new VirtualMachine { Name = "vm1", ID = expectedVmId })));
  78. var vm = vmOperations.Read(expectedVmId);
  79. Assert.Equal(expectedVmId, vm.ID);
  80. }
  81. [Fact]
  82. [Trait(Category.AcceptanceType, Category.CheckIn)]
  83. [Trait("Type", "WAPackIaaS-All")]
  84. [Trait("Type", "WAPackIaaS-Unit")]
  85. public void ShouldReturnMultipleVMsGetByName()
  86. {
  87. const string expectedVmName = "myVM";
  88. var expectedVmIds = new[] { Guid.NewGuid(), Guid.NewGuid() };
  89. var vmOperations = new VirtualMachineOperations(new WebClientFactory(
  90. new Subscription(),
  91. new MockRequestChannel()
  92. .AddReturnObject(new List<object>
  93. {new VirtualMachine { Name = expectedVmName, ID = expectedVmIds[1] },
  94. new VirtualMachine { Name = expectedVmName, ID = expectedVmIds[0] }})));
  95. var vmList = vmOperations.Read(expectedVmName);
  96. Assert.Equal(expectedVmIds.Length, vmList.Count);
  97. Assert.True(vmList.All(vm => vm.Name == expectedVmName));
  98. Assert.Equal(expectedVmIds.OrderBy(g => g), vmList.Select(v => v.ID).OrderBy(g => g).ToArray());
  99. }
  100. [Fact]
  101. [Trait(Category.AcceptanceType, Category.CheckIn)]
  102. [Trait("Type", "WAPackIaaS-All")]
  103. [Trait("Type", "WAPackIaaS-Unit")]
  104. public void CreateVMFromVHD()
  105. {
  106. var mockChannel = new MockRequestChannel();
  107. var testCloud = new Cloud { ID = Guid.NewGuid(), StampId = Guid.NewGuid() };
  108. mockChannel.AddReturnObject(testCloud);
  109. var vmToCreate = new VirtualMachine { VirtualHardDiskId = Guid.NewGuid(), Name = "Test" };
  110. var vmToReturn = new VirtualMachine
  111. {
  112. ID = Guid.NewGuid(),
  113. Name = vmToCreate.Name,
  114. CloudId = testCloud.ID,
  115. StampId = testCloud.StampId
  116. };
  117. mockChannel.AddReturnObject(vmToReturn, new WebHeaderCollection { "x-ms-request-id:" + Guid.NewGuid() });
  118. var vmOps = new VirtualMachineOperations(new WebClientFactory(new Subscription(), mockChannel));
  119. Guid? jobOut;
  120. var resultVM = vmOps.Create(vmToCreate, out jobOut);
  121. //Check the results that client returns
  122. Assert.NotNull(resultVM);
  123. Assert.True(resultVM is VirtualMachine);
  124. Assert.Equal(resultVM.ID, vmToReturn.ID);
  125. Assert.Equal(resultVM.Name, vmToReturn.Name);
  126. Assert.Equal(resultVM.CloudId, vmToReturn.CloudId);
  127. Assert.Equal(resultVM.StampId, vmToReturn.StampId);
  128. //Check the requests that the client made
  129. var requestList = mockChannel.ClientRequests;
  130. Assert.Equal(requestList.Count, 2);
  131. Assert.Equal(requestList[1].Item1.Method, HttpMethod.Post.ToString());
  132. Assert.True(requestList[1].Item1.RequestUri.ToString().TrimEnd(new[]{'/'}).EndsWith("/VirtualMachines"));
  133. var sentVM = mockChannel.DeserializeClientPayload<VirtualMachine>(requestList[1].Item2);
  134. Assert.NotNull(sentVM);
  135. Assert.True(sentVM.Count == 1);
  136. Assert.Equal(sentVM[0].CloudId, testCloud.ID);
  137. Assert.Equal(sentVM[0].StampId, testCloud.StampId);
  138. Assert.Equal(sentVM[0].Name, vmToCreate.Name);
  139. Assert.Equal(sentVM[0].VirtualHardDiskId, vmToCreate.VirtualHardDiskId);
  140. }
  141. [Fact]
  142. [Trait(Category.AcceptanceType, Category.CheckIn)]
  143. [Trait("Type", "WAPackIaaS-All")]
  144. [Trait("Type", "WAPackIaaS-Unit")]
  145. public void CreateVMFromTemplate()
  146. {
  147. var mockChannel = new MockRequestChannel();
  148. var testCloud = new Cloud { ID = Guid.NewGuid(), StampId = Guid.NewGuid() };
  149. mockChannel.AddReturnObject(testCloud);
  150. var vmToCreate = new VirtualMachine { VMTemplateId = Guid.NewGuid(), Name = "Test" };
  151. var vmToReturn = new VirtualMachine
  152. {
  153. ID = Guid.NewGuid(),
  154. Name = vmToCreate.Name,
  155. CloudId = testCloud.ID,
  156. StampId = testCloud.StampId
  157. };
  158. mockChannel.AddReturnObject(vmToReturn, new WebHeaderCollection { "x-ms-request-id:" + Guid.NewGuid() });
  159. var vmOps = new VirtualMachineOperations(new WebClientFactory(new Subscription(), mockChannel));
  160. Guid? jobOut;
  161. var resultVM = vmOps.Create(vmToCreate, out jobOut);
  162. //Check the results that client returns
  163. Assert.NotNull(resultVM);
  164. Assert.True(resultVM is VirtualMachine);
  165. Assert.Equal(resultVM.ID, vmToReturn.ID);
  166. Assert.Equal(resultVM.Name, vmToReturn.Name);
  167. Assert.Equal(resultVM.CloudId, vmToReturn.CloudId);
  168. Assert.Equal(resultVM.StampId, vmToReturn.StampId);
  169. //Check the requests that the client made
  170. var requestList = mockChannel.ClientRequests;
  171. Assert.Equal(requestList.Count, 2);
  172. Assert.Equal(requestList[1].Item1.Method, HttpMethod.Post.ToString());
  173. Assert.True(requestList[1].Item1.RequestUri.ToString().TrimEnd(new[] { '/' }).EndsWith("/VirtualMachines"));
  174. var sentVM = mockChannel.DeserializeClientPayload<VirtualMachine>(requestList[1].Item2);
  175. Assert.NotNull(sentVM);
  176. Assert.True(sentVM.Count == 1);
  177. Assert.Equal(sentVM[0].CloudId, testCloud.ID);
  178. Assert.Equal(sentVM[0].StampId, testCloud.StampId);
  179. Assert.Equal(sentVM[0].Name, vmToCreate.Name);
  180. Assert.Equal(sentVM[0].VMTemplateId, vmToCreate.VMTemplateId);
  181. }
  182. [Fact]
  183. [Trait(Category.AcceptanceType, Category.CheckIn)]
  184. [Trait("Type", "WAPackIaaS-Negative")]
  185. [Trait("Type", "WAPackIaaS-All")]
  186. [Trait("Type", "WAPackIaaS-Unit")]
  187. public void VmCreateShouldThrowIfNoVhdAndNoTemplateSupplied()
  188. {
  189. var channel = new MockRequestChannel();
  190. var testCloud = new Cloud { ID = Guid.NewGuid(), StampId = Guid.NewGuid() };
  191. channel.AddReturnObject(testCloud);
  192. var sub = new Subscription();
  193. var vmOps = new VirtualMachineOperations(new WebClientFactory(sub, channel));
  194. var vmToCreate = new VirtualMachine {Name = "Test"};
  195. Guid? jobOut;
  196. Assert.Throws<WAPackOperationException>(() => vmOps.Create(vmToCreate, out jobOut));
  197. }
  198. [Fact]
  199. [Trait(Category.AcceptanceType, Category.CheckIn)]
  200. [Trait("Type", "WAPackIaaS-Negative")]
  201. [Trait("Type", "WAPackIaaS-All")]
  202. [Trait("Type", "WAPackIaaS-Unit")]
  203. public void VmCreateShouldThrowWhenNoObjectReturned()
  204. {
  205. var mockChannel = new MockRequestChannel();
  206. var testCloud = new Cloud { ID = Guid.NewGuid(), StampId = Guid.NewGuid() };
  207. mockChannel.AddReturnObject(testCloud);
  208. var vmOps = new VirtualMachineOperations(new WebClientFactory(new Subscription(), mockChannel));
  209. var vmToCreate = new VirtualMachine { VirtualHardDiskId = Guid.NewGuid(), Name = "Test" };
  210. Guid? jobOut;
  211. Assert.Throws<WAPackOperationException>(() => vmOps.Create(vmToCreate, out jobOut));
  212. }
  213. [Fact]
  214. [Trait(Category.AcceptanceType, Category.CheckIn)]
  215. [Trait("Type", "WAPackIaaS-Negative")]
  216. [Trait("Type", "WAPackIaaS-All")]
  217. [Trait("Type", "WAPackIaaS-Unit")]
  218. public void VmUpdateShouldThrowWhenNoObjectReturned()
  219. {
  220. var mockChannel = new MockRequestChannel();
  221. var vmOps = new VirtualMachineOperations(new WebClientFactory(new Subscription(), mockChannel));
  222. var vmToUpdate = new VirtualMachine { VirtualHardDiskId = Guid.NewGuid(), Name = "Test" };
  223. Guid? jobOut;
  224. Assert.Throws<WAPackOperationException>(() => vmOps.Update(vmToUpdate, out jobOut));
  225. }
  226. [Fact]
  227. [Trait(Category.AcceptanceType, Category.CheckIn)]
  228. [Trait("Type", "WAPackIaaS-All")]
  229. [Trait("Type", "WAPackIaaS-Unit")]
  230. public void DeleteVM()
  231. {
  232. var sub = new Subscription();
  233. var channel = new MockRequestChannel();
  234. //Response to client getting /Clouds (client needs stampId, gets it from clouds)
  235. var testCloud = new Cloud { ID = Guid.NewGuid(), StampId = Guid.NewGuid() };
  236. channel.AddReturnObject(testCloud);
  237. //Response to the DELETE
  238. channel.AddReturnObject(null, new WebHeaderCollection {"x-ms-request-id:" + Guid.NewGuid()});
  239. var vmOps = new VirtualMachineOperations(new WebClientFactory(sub, channel));
  240. Guid toDelete = Guid.NewGuid();
  241. Guid? jobOut;
  242. vmOps.Delete(toDelete, out jobOut);
  243. //Check the requests the client generated
  244. Assert.Equal(channel.ClientRequests.Count, 2);
  245. Assert.Equal(channel.ClientRequests[1].Item1.Method, HttpMethod.Delete.ToString());
  246. }
  247. [Fact]
  248. [Trait(Category.AcceptanceType, Category.CheckIn)]
  249. [Trait("Type", "WAPackIaaS-All")]
  250. [Trait("Type", "WAPackIaaS-Unit")]
  251. public void StartVM()
  252. {
  253. var mockChannel = new MockRequestChannel();
  254. VirtualMachineOperations vmOperations;
  255. var testVM = InitVirtualMachineOperation(mockChannel, out vmOperations);
  256. Guid? jobOut;
  257. vmOperations.Start(testVM.ID, out jobOut);
  258. CheckVirtualMachineOperationResult("Start", mockChannel, testVM);
  259. }
  260. [Fact]
  261. [Trait(Category.AcceptanceType, Category.CheckIn)]
  262. [Trait("Type", "WAPackIaaS-All")]
  263. [Trait("Type", "WAPackIaaS-Unit")]
  264. public void StopVM()
  265. {
  266. var mockChannel = new MockRequestChannel();
  267. VirtualMachineOperations vmOperations;
  268. var testVM = InitVirtualMachineOperation(mockChannel, out vmOperations);
  269. Guid? jobOut;
  270. vmOperations.Stop(testVM.ID, out jobOut);
  271. CheckVirtualMachineOperationResult("Stop", mockChannel, testVM);
  272. }
  273. [Fact]
  274. [Trait(Category.AcceptanceType, Category.CheckIn)]
  275. [Trait("Type", "WAPackIaaS-All")]
  276. [Trait("Type", "WAPackIaaS-Unit")]
  277. public void RestartVM()
  278. {
  279. var mockChannel = new MockRequestChannel();
  280. VirtualMachineOperations vmOperations;
  281. var testVM = InitVirtualMachineOperation(mockChannel, out vmOperations);
  282. Guid? jobOut;
  283. vmOperations.Restart(testVM.ID, out jobOut);
  284. CheckVirtualMachineOperationResult("Reset", mockChannel, testVM);
  285. }
  286. [Fact]
  287. [Trait(Category.AcceptanceType, Category.CheckIn)]
  288. [Trait("Type", "WAPackIaaS-All")]
  289. [Trait("Type", "WAPackIaaS-Unit")]
  290. public void ShutdownVM()
  291. {
  292. var mockChannel = new MockRequestChannel();
  293. VirtualMachineOperations vmOperations;
  294. var testVM = InitVirtualMachineOperation(mockChannel, out vmOperations);
  295. Guid? jobOut;
  296. vmOperations.Shutdown(testVM.ID, out jobOut);
  297. CheckVirtualMachineOperationResult("Shutdown", mockChannel, testVM);
  298. }
  299. [Fact]
  300. [Trait(Category.AcceptanceType, Category.CheckIn)]
  301. [Trait("Type", "WAPackIaaS-All")]
  302. [Trait("Type", "WAPackIaaS-Unit")]
  303. public void SuspendVM()
  304. {
  305. var mockChannel = new MockRequestChannel();
  306. VirtualMachineOperations vmOperations;
  307. var testVM = InitVirtualMachineOperation(mockChannel, out vmOperations);
  308. Guid? jobOut;
  309. vmOperations.Suspend(testVM.ID, out jobOut);
  310. CheckVirtualMachineOperationResult("Suspend", mockChannel, testVM);
  311. }
  312. [Fact]
  313. [Trait(Category.AcceptanceType, Category.CheckIn)]
  314. [Trait("Type", "WAPackIaaS-All")]
  315. [Trait("Type", "WAPackIaaS-Unit")]
  316. public void ResumeVM()
  317. {
  318. var mockChannel = new MockRequestChannel();
  319. VirtualMachineOperations vmOperations;
  320. var testVM = InitVirtualMachineOperation(mockChannel, out vmOperations);
  321. Guid? jobOut;
  322. vmOperations.Resume(testVM.ID, out jobOut);
  323. CheckVirtualMachineOperationResult("Resume", mockChannel, testVM);
  324. }
  325. private static VirtualMachine InitVirtualMachineOperation(MockRequestChannel mockChannel, out VirtualMachineOperations vmOperations)
  326. {
  327. //Cloud for return value of first request (client gets cloud to get stampId)
  328. var testCloud = new Cloud {ID = Guid.NewGuid(), StampId = Guid.NewGuid()};
  329. mockChannel.AddReturnObject(testCloud);
  330. //VM for return value of second request (client updates VM with operation)
  331. var testVM = new VirtualMachine {ID = Guid.NewGuid(), StampId = testCloud.StampId};
  332. mockChannel.AddReturnObject(testVM, new WebHeaderCollection {"x-ms-request-id:" + Guid.NewGuid()});
  333. var factory = new WebClientFactory(new Subscription(), mockChannel);
  334. vmOperations = new VirtualMachineOperations(factory);
  335. return testVM;
  336. }
  337. private static void CheckVirtualMachineOperationResult(string operation, MockRequestChannel mockChannel, VirtualMachine testVM)
  338. {
  339. var requests = mockChannel.ClientRequests;
  340. Assert.Equal(requests.Count, 2);
  341. Assert.Equal(requests[1].Item1.Method, HttpMethod.Put.ToString());
  342. var clientSentVM = mockChannel.DeserializeClientPayload<VirtualMachine>(requests[1].Item2);
  343. Assert.NotNull(clientSentVM);
  344. Assert.True(clientSentVM.Count == 1);
  345. Assert.Equal(testVM.ID, clientSentVM[0].ID);
  346. Assert.Equal(testVM.StampId, clientSentVM[0].StampId);
  347. Assert.Equal(clientSentVM[0].Operation, operation);
  348. }
  349. }
  350. }