PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/redistributable/openstack.net/src/testing/integration/Compute/v2_1/ServerTests.cs

https://gitlab.com/rekby-archive/onlyoffice-CommunityServer
C# | 473 lines | 383 code | 80 blank | 10 comment | 9 complexity | b543c446bcf2f7853ee1abbb995989e4 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Flurl.Http;
  7. using Xunit;
  8. using Xunit.Abstractions;
  9. using VolumeState = net.openstack.Core.Domain.VolumeState;
  10. namespace OpenStack.Compute.v2_1
  11. {
  12. public class ServerTests : IDisposable
  13. {
  14. private readonly ComputeService _compute;
  15. private readonly ComputeTestDataManager _testData;
  16. public ServerTests(ITestOutputHelper testLog)
  17. {
  18. var testOutput = new XunitTraceListener(testLog);
  19. Trace.Listeners.Add(testOutput);
  20. OpenStackNet.Tracing.Http.Listeners.Add(testOutput);
  21. var authenticationProvider = TestIdentityProvider.GetIdentityProvider();
  22. _compute = new ComputeService(authenticationProvider, "RegionOne");
  23. _testData = new ComputeTestDataManager(_compute);
  24. }
  25. public void Dispose()
  26. {
  27. _testData.Dispose();
  28. Trace.Listeners.Clear();
  29. OpenStackNet.Tracing.Http.Listeners.Clear();
  30. }
  31. [Fact]
  32. public async Task CreateServerTest()
  33. {
  34. var definition = _testData.BuildServer();
  35. Trace.WriteLine($"Creating server named: {definition.Name}");
  36. var server = await _testData.CreateServer(definition);
  37. await server.WaitUntilActiveAsync();
  38. Trace.WriteLine("Verifying server matches requested definition...");
  39. Assert.NotNull(server);
  40. Assert.Equal(definition.Name, server.Name);
  41. Assert.NotNull(server.Flavor);
  42. Assert.Equal(definition.FlavorId, server.Flavor.Id);
  43. Assert.NotNull(server.AdminPassword);
  44. Assert.NotNull(server.Image);
  45. Assert.Equal(definition.ImageId, server.Image.Id);
  46. Assert.Equal(server.Status, ServerStatus.Active);
  47. Assert.NotNull(server.AvailabilityZone);
  48. Assert.NotNull(server.Created);
  49. Assert.NotNull(server.LastModified);
  50. Assert.NotNull(server.Launched);
  51. Assert.NotNull(server.DiskConfig);
  52. Assert.NotNull(server.HostId);
  53. Assert.NotNull(server.PowerState);
  54. Assert.NotNull(server.VMState);
  55. Assert.NotNull(server.SecurityGroups);
  56. var history = await server.ListActionSummariesAsync();
  57. Assert.NotNull(history);
  58. var createRef = history.FirstOrDefault(a => a.Name == "create");
  59. Assert.NotNull(createRef);
  60. Assert.NotNull(createRef.Id);
  61. Assert.NotNull(createRef.Name);
  62. Assert.NotNull(createRef.ServerId);
  63. Assert.NotNull(createRef.UserId);
  64. var createAction = await createRef.GetActionAsync();
  65. Assert.NotNull(createAction);
  66. Assert.NotNull(createAction.Id);
  67. Assert.NotNull(createAction.Name);
  68. Assert.NotNull(createAction.Events);
  69. }
  70. [Fact]
  71. [Trait("ci", "false")] // TODO: Run with CI tests once we've implemented cinder
  72. public async Task BootFromVolume()
  73. {
  74. var definition = _testData.BuildServer();
  75. definition.ConfigureBootFromVolume("30ca5d77-c519-48ea-a56c-7c4e0ca0894d");
  76. Trace.WriteLine("Booting new server from volume...");
  77. var server = await _testData.CreateServer(definition);
  78. await server.WaitUntilActiveAsync();
  79. Assert.NotEmpty(server.AttachedVolumes);
  80. Assert.Contains(server.AttachedVolumes, x => x.Id == definition.BlockDeviceMapping[0].SourceId);
  81. }
  82. [Fact]
  83. [Trait("ci", "false")] // TODO: Run with CI tests once we've implemented cinder
  84. public async Task BootFromVolumeCopy()
  85. {
  86. var definition = _testData.BuildServer();
  87. definition.ConfigureBootFromNewVolume("30ca5d77-c519-48ea-a56c-7c4e0ca0894d", volumeSize: 1, deleteVolumeWithServer: true);
  88. Trace.WriteLine("Booting new server from a new volume created from an existing volume...");
  89. var server = await _testData.CreateServer(definition);
  90. await server.WaitUntilActiveAsync();
  91. Assert.NotEmpty(server.AttachedVolumes);
  92. Assert.Contains(server.AttachedVolumes, x => x.Id == definition.BlockDeviceMapping[0].SourceId);
  93. }
  94. [Fact]
  95. public async Task BootFromImageCopy()
  96. {
  97. var definition = _testData.BuildServer();
  98. definition.ConfigureBootFromNewVolume(volumeSize: 1, deleteVolumeWithServer: true);
  99. Trace.WriteLine("Booting new server from a new volume created from an existing image...");
  100. var server = await _testData.CreateServer(definition);
  101. await server.WaitUntilActiveAsync();
  102. Assert.NotEmpty(server.AttachedVolumes);
  103. Assert.Contains(server.AttachedVolumes, x => x.Id != definition.BlockDeviceMapping[0].SourceId);
  104. }
  105. [Fact]
  106. public async Task ListServerReferencesTest()
  107. {
  108. var results = await _compute.ListServerSummariesAsync(new ServerListOptions {PageSize = 1});
  109. while (results.Any())
  110. {
  111. var result = results.First();
  112. Assert.NotNull(result.Name);
  113. results = await results.GetNextPageAsync();
  114. }
  115. Assert.NotNull(results);
  116. }
  117. [Fact]
  118. public async Task FindServersTest()
  119. {
  120. var servers = await _testData.CreateServers();
  121. await Task.WhenAll(servers.Select(x => x.WaitUntilActiveAsync()));
  122. var serverWithMetadata = servers.First();
  123. var fooValue = Guid.NewGuid().ToString();
  124. await serverWithMetadata.Metadata.CreateAsync("foo", fooValue);
  125. var serversNames = new HashSet<string>(servers.Select(s => s.Name));
  126. var results = await _compute.ListServerSummariesAsync(new ServerListOptions {Name = "ci-*"});
  127. var resultNames = new HashSet<string>(results.Select(s => s.Name));
  128. Assert.Subset(resultNames, serversNames);
  129. Trace.WriteLine("Filtering servers by their metadata...");
  130. results = await _compute.ListServerSummariesAsync(new ServerListOptions
  131. {
  132. Metadata =
  133. {
  134. {"foo", fooValue}
  135. }
  136. });
  137. Assert.Contains(serverWithMetadata.Id, results.Select(x => x.Id));
  138. }
  139. [Fact]
  140. public async Task ListServersTest()
  141. {
  142. var results = await _compute.ListServersAsync(new ServerListOptions { PageSize = 1 });
  143. while (results.Any())
  144. {
  145. var result = results.First();
  146. Assert.NotNull(result.Image);
  147. results = await results.GetNextPageAsync();
  148. }
  149. Assert.NotNull(results);
  150. }
  151. [Fact]
  152. public async Task UpdateServerTest()
  153. {
  154. var server = await _testData.CreateServer();
  155. await server.WaitUntilActiveAsync();
  156. Trace.WriteLine($"Created server named: {server.Name}");
  157. var desiredName = server.Name + "UPDATED";
  158. server.Name = desiredName;
  159. Trace.WriteLine($"Updating server name to: {server.Name}...");
  160. await server.UpdateAsync();
  161. Trace.WriteLine("Verifying server instance was updated...");
  162. Assert.NotNull(server);
  163. Assert.Equal(desiredName, server.Name);
  164. Trace.WriteLine("Verifying server matches updated definition...");
  165. server = await _compute.GetServerAsync(server.Id);
  166. Assert.Equal(desiredName, server.Name);
  167. }
  168. [Fact]
  169. public async Task EditServerMetadataTest()
  170. {
  171. Trace.WriteLine("Creating a test server...");
  172. var definition = _testData.BuildServer();
  173. definition.Metadata = new ServerMetadata
  174. {
  175. ["category"] = "ci_test",
  176. ["bad_key"] = "value"
  177. };
  178. var server = await _testData.CreateServer(definition);
  179. await server.WaitUntilActiveAsync();
  180. Assert.True(server.Metadata.ContainsKey("category"));
  181. // Edit immediately
  182. Trace.WriteLine("Adding a key...");
  183. await server.Metadata.CreateAsync("new_key", "value");
  184. Assert.True(server.Metadata.ContainsKey("new_key"));
  185. Trace.WriteLine("Removing a key...");
  186. await server.Metadata.DeleteAsync("bad_key");
  187. Assert.False(server.Metadata.ContainsKey("bad_key"));
  188. // Verify edits were persisted
  189. Trace.WriteLine("Retrieving metadata...");
  190. var metadata = await server.GetMetadataAsync();
  191. Assert.True(metadata.ContainsKey("category"));
  192. Assert.True(metadata.ContainsKey("new_key"));
  193. Assert.False(metadata.ContainsKey("bad_key"));
  194. // Batch edit
  195. metadata.Remove("new_key");
  196. metadata["category"] = "updated";
  197. Trace.WriteLine("Updating edited metadata...");
  198. await metadata.UpdateAsync(overwrite: true);
  199. Assert.Equal("updated", metadata["category"]);
  200. Assert.False(metadata.ContainsKey("new_key"));
  201. }
  202. [Fact]
  203. public async Task DeleteServerTest()
  204. {
  205. var server = await _testData.CreateServer();
  206. await server.WaitUntilActiveAsync();
  207. Trace.WriteLine($"Created server named: {server.Name}");
  208. await server.DeleteAsync();
  209. await server.WaitUntilDeletedAsync();
  210. await Assert.ThrowsAsync<FlurlHttpException>(() => _compute.GetServerAsync(server.Id));
  211. }
  212. [Fact]
  213. public async Task LookupServerAddressesTest()
  214. {
  215. var server = await _testData.CreateServer();
  216. await server.WaitUntilActiveAsync();
  217. Trace.WriteLine($"Created server named: {server.Name}");
  218. var results = await server.ListAddressesAsync();
  219. Assert.NotEmpty(results);
  220. var networkLabel = results.First().Key;
  221. var result = (await server.GetAddressAsync(networkLabel)).First();
  222. Assert.NotNull(result.IP);
  223. }
  224. [Fact]
  225. public async Task SnapshotServerTest()
  226. {
  227. var server = await _testData.CreateServer();
  228. await server.WaitUntilActiveAsync();
  229. Trace.WriteLine($"Created server named: {server.Name}");
  230. var request = new SnapshotServerRequest(server.Name + "-SNAPSHOT")
  231. {
  232. Metadata =
  233. {
  234. ["category"] = "ci"
  235. }
  236. };
  237. Trace.WriteLine("Taking a snapshot of the server...");
  238. var image = await server.SnapshotAsync(request);
  239. _testData.Register(image);
  240. await image.WaitUntilActiveAsync();
  241. Assert.NotNull(image);
  242. Assert.Equal(request.Name, image.Name);
  243. Assert.True(image.Metadata["category"] == "ci");
  244. }
  245. [Fact]
  246. public async Task RestartServerTest()
  247. {
  248. var server = await _testData.CreateServer();
  249. await server.WaitUntilActiveAsync();
  250. Trace.WriteLine($"Created server named: {server.Name}");
  251. Trace.WriteLine("Stopping the server...");
  252. await server.StopAsync();
  253. await server.WaitForStatusAsync(ServerStatus.Stopped);
  254. Assert.Equal(server.Status, ServerStatus.Stopped);
  255. Trace.WriteLine("Starting the server...");
  256. await server.StartAsync();
  257. await server.WaitUntilActiveAsync();
  258. Assert.Equal(server.Status, ServerStatus.Active);
  259. }
  260. [Fact]
  261. public async Task RebootServerTest()
  262. {
  263. var server = await _testData.CreateServer();
  264. await server.WaitUntilActiveAsync();
  265. Trace.WriteLine($"Created server named: {server.Name}");
  266. Trace.WriteLine("Rebooting the server...");
  267. await server.RebootAsync();
  268. await server.WaitForStatusAsync(ServerStatus.Reboot);
  269. await server.WaitUntilActiveAsync();
  270. }
  271. [Fact]
  272. public async Task ResumeServerTest()
  273. {
  274. Trace.WriteLine("Creating server...");
  275. var server = await _testData.CreateServer();
  276. await server.WaitUntilActiveAsync();
  277. Trace.WriteLine("Suspending the server...");
  278. await server.SuspendAsync();
  279. await server.WaitForStatusAsync(ServerStatus.Suspended);
  280. Trace.WriteLine("Resuming the server...");
  281. await server.ResumeAsync();
  282. await server.WaitUntilActiveAsync();
  283. }
  284. [Fact]
  285. public async Task ServerVolumesTest()
  286. {
  287. var server = await _testData.CreateServer();
  288. await server.WaitUntilActiveAsync();
  289. Trace.WriteLine($"Created server named: {server.Name}");
  290. Trace.WriteLine("Creating a test volume...");
  291. var volume = await _testData.CreateVolume();
  292. Identifier volumeId = volume.Id;
  293. _testData.BlockStorage.StorageProvider.WaitForVolumeAvailable(volumeId);
  294. Trace.WriteLine("Attaching the volume...");
  295. await server.AttachVolumeAsync(new ServerVolumeDefinition(volumeId));
  296. _testData.BlockStorage.StorageProvider.WaitForVolumeState(volumeId, VolumeState.InUse, new[] { VolumeState.Error });
  297. var volumeRef = server.AttachedVolumes.FirstOrDefault();
  298. Assert.NotNull(volumeRef);
  299. Trace.WriteLine("Verifying volume was attached successfully...");
  300. var attachedVolumes = await server.ListVolumesAsync();
  301. var attachedVolume = attachedVolumes.FirstOrDefault(v => v.Id == volumeId);
  302. Assert.NotNull(attachedVolume);
  303. Trace.WriteLine("Retrieving attached volume details...");
  304. var serverVolume = await volumeRef.GetServerVolumeAsync();
  305. Assert.Equal(volumeId, serverVolume.VolumeId);
  306. Assert.Equal(server.Id, serverVolume.ServerId);
  307. Trace.WriteLine("Detaching the volume...");
  308. await volumeRef.DetachAsync();
  309. Assert.DoesNotContain(server.AttachedVolumes, v => v.Id == volumeId);
  310. _testData.BlockStorage.StorageProvider.WaitForVolumeAvailable(volumeId);
  311. }
  312. [Fact]
  313. public async Task GetConsoleTest()
  314. {
  315. var server = await _testData.CreateServer();
  316. await server.WaitUntilActiveAsync();
  317. Trace.WriteLine($"Created server named: {server.Name}");
  318. Trace.WriteLine("Getting a VNC console...");
  319. // This is a silly hack to verify that our message passed validation
  320. // Since we don't have VNC setup, it won't actually pass
  321. try
  322. {
  323. await server.GetVncConsoleAsync(RemoteConsoleType.NoVnc);
  324. }
  325. catch (FlurlHttpException httpError) when (httpError.Call.ErrorResponseBody.Contains("Unavailable console type novnc"))
  326. {
  327. }
  328. Trace.WriteLine("Getting a SPICE console...");
  329. var spiceConsole = await server.GetSpiceConsoleAsync();
  330. Assert.NotNull(spiceConsole);
  331. Assert.NotNull(spiceConsole.Url);
  332. Assert.Equal(RemoteConsoleType.SpiceHtml5, spiceConsole.Type);
  333. Trace.WriteLine("Getting a Serial console...");
  334. // This is a silly hack to verify that our message passed validation
  335. // Since we don't have serial setup, it won't actually pass
  336. try
  337. {
  338. await server.GetSerialConsoleAsync();
  339. }
  340. catch (FlurlHttpException httpError) when (httpError.Call.ErrorResponseBody.Contains("Unavailable console type serial"))
  341. {
  342. }
  343. Trace.WriteLine("Getting a RDP console...");
  344. // This is a silly hack to verify that our message passed validation
  345. // Since we don't have windows/RDP setup, it won't actually pass
  346. try
  347. {
  348. await server.GetRdpConsoleAsync();
  349. }
  350. catch (FlurlHttpException httpError) when (httpError.Call.ErrorResponseBody.Contains("Unavailable console type rdp-html5"))
  351. {
  352. }
  353. // Not testing GetConsoleOutput because it only returns a 404 on my OpenStack installation...
  354. }
  355. [Fact]
  356. public async Task RescueServerTest()
  357. {
  358. var server = await _testData.CreateServer();
  359. await server.WaitUntilActiveAsync();
  360. Trace.WriteLine($"Created server named: {server.Name}");
  361. Trace.WriteLine("Rescuing the server...");
  362. await server.RescueAsync();
  363. await server.WaitForStatusAsync(ServerStatus.Rescue);
  364. Trace.WriteLine("Unrescuing the server...");
  365. await server.UnrescueAsync();
  366. await server.WaitUntilActiveAsync();
  367. }
  368. [Fact]
  369. [Trait("ci", "false")]
  370. public async Task ResizeServerTest()
  371. {
  372. var flavors = await _compute.ListFlavorSummariesAsync();
  373. var small = flavors.First(f => f.Name.Contains("small")).Id;
  374. var medium = flavors.First(f => f.Name.Contains("medium")).Id;
  375. var server = await _testData.CreateServer();
  376. await server.WaitUntilActiveAsync();
  377. Trace.WriteLine($"Created server named: {server.Name}");
  378. Trace.WriteLine("Resizing the server to medium...");
  379. await server.ResizeAsync(medium);
  380. await server.WaitForStatusAsync(ServerStatus.VerifyResize);
  381. Trace.WriteLine("Canceling the resize of the server...");
  382. await server.CancelResizeAsync();
  383. await server.WaitUntilActiveAsync();
  384. Trace.WriteLine("Resizing the server to small...");
  385. await server.ResizeAsync(small);
  386. await server.WaitForStatusAsync(ServerStatus.VerifyResize);
  387. Trace.WriteLine("Confirming the resize of the server...");
  388. await server.ConfirmResizeAsync();
  389. await server.WaitForStatusAsync(new [] {ServerStatus.Resizing, ServerStatus.Active}); // resizing is quick, or maybe doesn't happen at all, so wait for either
  390. await server.WaitUntilActiveAsync();
  391. }
  392. }
  393. }