PageRenderTime 62ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://gitlab.com/rekby-archive/onlyoffice-CommunityServer
C# | 856 lines | 725 code | 131 blank | 0 comment | 2 complexity | 04a7ac8250e7dec68461b738dea7bdb2 MD5 | raw file
  1. using System;
  2. using System.Linq;
  3. using System.Net;
  4. using Newtonsoft.Json;
  5. using Newtonsoft.Json.Linq;
  6. using OpenStack.Compute.v2_1.Serialization;
  7. using OpenStack.Serialization;
  8. using OpenStack.Synchronous;
  9. using OpenStack.Testing;
  10. using Xunit;
  11. namespace OpenStack.Compute.v2_1
  12. {
  13. public class ServerTests
  14. {
  15. private readonly ComputeService _compute;
  16. public ServerTests()
  17. {
  18. _compute = new ComputeService(Stubs.AuthenticationProvider, "region");
  19. }
  20. [Fact]
  21. public void SerializeServerWithSchedulerHints()
  22. {
  23. string expectedJson = JObject.Parse(@"{'server':{'name':'name','imageRef':'00000000-0000-0000-0000-000000000000','flavorRef':'00000000-0000-0000-0000-000000000000'},'os:scheduler_hints':{'group':'groupId'}}")
  24. .ToString(Formatting.None);
  25. var server = new ServerCreateDefinition("name", Guid.Empty, Guid.Empty);
  26. server.SchedulerHints = new SchedulerHints();
  27. server.SchedulerHints.Add("group", "groupId");
  28. var json = OpenStackNet.Serialize(server);
  29. Assert.Equal(expectedJson, json);
  30. }
  31. [Fact]
  32. public void SerializeServerWithoutSchedulerHints()
  33. {
  34. string expectedJson = JObject.Parse(@"{'server':{'name':'name','imageRef':'00000000-0000-0000-0000-000000000000','flavorRef':'00000000-0000-0000-0000-000000000000'}}")
  35. .ToString(Formatting.None);
  36. var server = new ServerCreateDefinition("name", Guid.Empty, Guid.Empty);
  37. var json = OpenStackNet.Serialize(server);
  38. Assert.Equal(expectedJson, json);
  39. }
  40. [Fact]
  41. public void SerializeListServerOptionsInUrl()
  42. {
  43. using (var httpTest = new HttpTest())
  44. {
  45. httpTest.RespondWithJson(new ServerSummaryCollection());
  46. _compute.ListServerSummaries(new ServerListOptions());
  47. httpTest.ShouldNotHaveCalled("*metadata*");
  48. }
  49. }
  50. [Fact]
  51. public void CreateServer()
  52. {
  53. using (var httpTest = new HttpTest())
  54. {
  55. Identifier serverId = Guid.NewGuid();
  56. httpTest.RespondWithJson(new Server {Id = serverId});
  57. var definition = new ServerCreateDefinition("{name}", Guid.NewGuid(), "{flavor-id}");
  58. var result = _compute.CreateServer(definition);
  59. httpTest.ShouldHaveCalled("*/servers");
  60. Assert.NotNull(result);
  61. Assert.Equal(serverId,result.Id);
  62. Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
  63. }
  64. }
  65. [Fact]
  66. public void CreateServerMetadata()
  67. {
  68. using (var httpTest = new HttpTest())
  69. {
  70. const string key = "stuff";
  71. Identifier serverId = "1";
  72. httpTest.RespondWithJson(new Server { Id = serverId });
  73. var server = _compute.GetServer(serverId);
  74. server.Metadata.Create(key, "things");
  75. Assert.True(server.Metadata.ContainsKey(key));
  76. httpTest.ShouldHaveCalled($"*/servers/{serverId}/metadata/{key}");
  77. }
  78. }
  79. [Fact]
  80. public void GetServer()
  81. {
  82. using (var httpTest = new HttpTest())
  83. {
  84. Identifier serverId = Guid.NewGuid();
  85. httpTest.RespondWithJson(new Server { Id = serverId });
  86. var result = _compute.GetServer(serverId);
  87. httpTest.ShouldHaveCalled($"*/servers/{serverId}");
  88. Assert.NotNull(result);
  89. Assert.Equal(serverId, result.Id);
  90. Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
  91. }
  92. }
  93. [Fact]
  94. public void GetServerExtension()
  95. {
  96. using (var httpTest = new HttpTest())
  97. {
  98. Identifier serverId = Guid.NewGuid();
  99. httpTest.RespondWithJson(new ServerSummaryCollection
  100. {
  101. Items = { new ServerSummary { Id = serverId } }
  102. });
  103. httpTest.RespondWithJson(new Server { Id = serverId });
  104. var serverRef = _compute.ListServerSummaries().First();
  105. var result = serverRef.GetServer();
  106. Assert.NotNull(result);
  107. Assert.Equal(serverId, result.Id);
  108. }
  109. }
  110. [Fact]
  111. public void GetServerMetadata()
  112. {
  113. using (var httpTest = new HttpTest())
  114. {
  115. Identifier serverId = "1";
  116. httpTest.RespondWithJson(new ServerSummaryCollection { new ServerSummary { Id = serverId } });
  117. httpTest.RespondWithJson(new ServerMetadata { ["stuff"] = "things" });
  118. var servers = _compute.ListServerSummaries();
  119. ServerMetadata result = servers.First().GetMetadata();
  120. httpTest.ShouldHaveCalled($"*/servers/{serverId}/metadata");
  121. Assert.NotNull(result);
  122. Assert.Single(result);
  123. Assert.True(result.ContainsKey("stuff"));
  124. Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
  125. }
  126. }
  127. [Fact]
  128. public void GetServerMetadataItem()
  129. {
  130. using (var httpTest = new HttpTest())
  131. {
  132. Identifier serverId = "1";
  133. httpTest.RespondWithJson(new ServerSummaryCollection { new ServerSummary { Id = serverId } });
  134. httpTest.RespondWithJson(new
  135. {
  136. meta = new
  137. {
  138. stuff = "things"
  139. }
  140. });
  141. var servers = _compute.ListServerSummaries();
  142. string result = servers.First().GetMetadataItem("stuff");
  143. httpTest.ShouldHaveCalled($"*/servers/{serverId}/metadata");
  144. Assert.NotNull(result);
  145. Assert.Equal("things", result);
  146. }
  147. }
  148. [Fact]
  149. public void WaitForServerActive()
  150. {
  151. using (var httpTest = new HttpTest())
  152. {
  153. Identifier serverId = Guid.NewGuid();
  154. httpTest.RespondWithJson(new Server { Id = serverId, Status = ServerStatus.Building});
  155. httpTest.RespondWithJson(new Server { Id = serverId, Status = ServerStatus.Active });
  156. var result = _compute.GetServer(serverId);
  157. result.WaitUntilActive();
  158. httpTest.ShouldHaveCalled($"*/servers/{serverId}");
  159. Assert.NotNull(result);
  160. Assert.Equal(serverId, result.Id);
  161. Assert.Equal(ServerStatus.Active, result.Status);
  162. Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
  163. }
  164. }
  165. [Fact]
  166. public void ListServerSummaries()
  167. {
  168. using (var httpTest = new HttpTest())
  169. {
  170. Identifier serverId = Guid.NewGuid();
  171. httpTest.RespondWithJson(new ServerSummaryCollection
  172. {
  173. Items = { new ServerSummary { Id = serverId}},
  174. Links = { new PageLink("next", "http://api.com/next") }
  175. });
  176. var results = _compute.ListServerSummaries();
  177. httpTest.ShouldHaveCalled("*/servers");
  178. Assert.Single(results);
  179. var result = results.First();
  180. Assert.Equal(serverId, result.Id);
  181. Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
  182. }
  183. }
  184. [Fact]
  185. public void ListServerSummariesWithFilter()
  186. {
  187. using (var httpTest = new HttpTest())
  188. {
  189. httpTest.RespondWithJson(new ServerCollection());
  190. const string name = "foo";
  191. const string flavorId = "1";
  192. Identifier imageId = Guid.NewGuid();
  193. var lastModified = DateTimeOffset.Now.AddDays(-1);
  194. ServerStatus status = ServerStatus.Active;
  195. _compute.ListServerSummaries(new ServerListOptions { Name = name, FlavorId = flavorId, ImageId = imageId, UpdatedAfter = lastModified, Status = status});
  196. httpTest.ShouldHaveCalled($"*name={name}");
  197. httpTest.ShouldHaveCalled($"*flavor={flavorId}");
  198. httpTest.ShouldHaveCalled($"*image={imageId}");
  199. httpTest.ShouldHaveCalled($"*status={status}");
  200. httpTest.ShouldHaveCalled("*changes-since=");
  201. }
  202. }
  203. [Fact]
  204. public void ListServerSummariesWithPaging()
  205. {
  206. using (var httpTest = new HttpTest())
  207. {
  208. httpTest.RespondWithJson(new ServerCollection
  209. {
  210. Items = {new Server()},
  211. Links = {new PageLink("next", "http://example.com")}
  212. });
  213. Identifier startingAt = Guid.NewGuid();
  214. const int pageSize = 10;
  215. _compute.ListServerSummaries(new ServerListOptions { PageSize = pageSize, StartingAt = startingAt });
  216. httpTest.ShouldHaveCalled($"*marker={startingAt}*");
  217. httpTest.ShouldHaveCalled($"*limit={pageSize}*");
  218. }
  219. }
  220. [Fact]
  221. public void UpdateServer()
  222. {
  223. using (var httpTest = new HttpTest())
  224. {
  225. Identifier serverId = Guid.NewGuid();
  226. httpTest.RespondWithJson(new Server { Id = serverId, Name = "{new-name}"});
  227. var request = new ServerUpdateDefinition {Name = "{new-name}"};
  228. var result = _compute.UpdateServer(serverId, request);
  229. httpTest.ShouldHaveCalled($"*/servers/{serverId}");
  230. Assert.NotNull(result);
  231. Assert.Equal(serverId, result.Id);
  232. Assert.Equal(request.Name, result.Name);
  233. Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
  234. }
  235. }
  236. [Fact]
  237. public void UpdateServerExtension()
  238. {
  239. using (var httpTest = new HttpTest())
  240. {
  241. Identifier serverId = Guid.NewGuid();
  242. httpTest.RespondWithJson(new Server { Id = serverId, Name = "{old-name}" });
  243. var lastModified = DateTimeOffset.Now;
  244. httpTest.RespondWithJson(new Server { Id = serverId, Name = "{new-name}", LastModified = lastModified});
  245. var server = _compute.GetServer(serverId);
  246. server.Name = "{new-name}";
  247. server.Update();
  248. Assert.Equal(serverId, server.Id);
  249. Assert.Equal("{new-name}", server.Name);
  250. Assert.Equal(lastModified, server.LastModified);
  251. Assert.IsType<ComputeApi>(((IServiceResource)server).Owner);
  252. }
  253. }
  254. [Theory]
  255. [InlineData(false, "POST")]
  256. [InlineData(true, "PUT")]
  257. public void UpdateServerMetadata(bool overwrite, string expectedHttpVerb)
  258. {
  259. using (var httpTest = new HttpTest())
  260. {
  261. Identifier serverId = "1";
  262. httpTest.RespondWithJson(new Server { Id = serverId });
  263. httpTest.RespondWithJson(new ServerMetadata { ["stuff"] = "things" });
  264. var server = _compute.GetServer(serverId);
  265. server.Metadata["color"] = "blue";
  266. server.Metadata.Update(overwrite);
  267. httpTest.ShouldHaveCalled($"*/servers/{serverId}/metadata");
  268. Assert.Equal(expectedHttpVerb, httpTest.CallLog.Last().Request.Method.Method);
  269. Assert.True(server.Metadata.ContainsKey("stuff"));
  270. }
  271. }
  272. [Fact]
  273. public void DeleteServer()
  274. {
  275. using (var httpTest = new HttpTest())
  276. {
  277. Identifier serverId = Guid.NewGuid();
  278. httpTest.RespondWith((int)HttpStatusCode.NoContent, "All gone!");
  279. _compute.DeleteServer(serverId);
  280. httpTest.ShouldHaveCalled($"*/servers/{serverId}");
  281. }
  282. }
  283. [Fact]
  284. public void DeleteServerExtension()
  285. {
  286. using (var httpTest = new HttpTest())
  287. {
  288. Identifier serverId = Guid.NewGuid();
  289. httpTest.RespondWithJson(new Server {Id = serverId});
  290. httpTest.RespondWith((int)HttpStatusCode.NoContent, "All gone!");
  291. httpTest.RespondWithJson(new Server { Id = serverId, Status = ServerStatus.Deleted});
  292. var server =_compute.GetServer(serverId);
  293. server.Delete();
  294. Assert.NotEqual(server.Status, ServerStatus.Deleted);
  295. server.WaitUntilDeleted();
  296. Assert.Equal(server.Status, ServerStatus.Deleted);
  297. }
  298. }
  299. [Fact]
  300. public void WhenDeleteServer_Returns404NotFound_ShouldConsiderRequestSuccessful()
  301. {
  302. using (var httpTest = new HttpTest())
  303. {
  304. Identifier serverId = Guid.NewGuid();
  305. httpTest.RespondWith((int)HttpStatusCode.NotFound, "Not here, boss...");
  306. _compute.DeleteServer(serverId);
  307. httpTest.ShouldHaveCalled($"*/servers/{serverId}");
  308. }
  309. }
  310. [Theory]
  311. [InlineData(HttpStatusCode.Accepted)]
  312. [InlineData(HttpStatusCode.NotFound)]
  313. public void DeleteServerMetadata(HttpStatusCode responseCode)
  314. {
  315. using (var httpTest = new HttpTest())
  316. {
  317. Identifier serverId = Guid.NewGuid();
  318. const string key = "stuff";
  319. httpTest.RespondWithJson(new Server
  320. {
  321. Id = serverId,
  322. Metadata =
  323. {
  324. [key] = "things"
  325. }
  326. });
  327. httpTest.RespondWith((int)responseCode, "All gone!");
  328. var server = _compute.GetServer(serverId);
  329. server.Metadata.Delete(key);
  330. Assert.False(server.Metadata.ContainsKey(key));
  331. httpTest.ShouldHaveCalled($"*/servers/{serverId}/metadata/{key}");
  332. }
  333. }
  334. [Fact]
  335. public void WaitForServerDeleted()
  336. {
  337. using (var httpTest = new HttpTest())
  338. {
  339. Identifier serverId = Guid.NewGuid();
  340. httpTest.RespondWithJson(new Server { Id = serverId, Status = ServerStatus.Active });
  341. httpTest.RespondWith((int)HttpStatusCode.NoContent, "All gone!");
  342. httpTest.RespondWithJson(new Server { Id = serverId, Status = ServerStatus.Deleted });
  343. var result = _compute.GetServer(serverId);
  344. result.Delete();
  345. result.WaitUntilDeleted();
  346. Assert.Equal(ServerStatus.Deleted, result.Status);
  347. }
  348. }
  349. [Fact]
  350. public void WaitForServerDeleted_Returns404NotFound_ShouldConsiderRequestSuccessful()
  351. {
  352. using (var httpTest = new HttpTest())
  353. {
  354. Identifier serverId = Guid.NewGuid();
  355. httpTest.RespondWithJson(new Server { Id = serverId, Status = ServerStatus.Active });
  356. httpTest.RespondWith((int)HttpStatusCode.NoContent, "All gone!");
  357. httpTest.RespondWith((int)HttpStatusCode.NotFound, "Nothing here, boss");
  358. var result = _compute.GetServer(serverId);
  359. result.Delete();
  360. result.WaitUntilDeleted();
  361. Assert.Equal(ServerStatus.Deleted, result.Status);
  362. }
  363. }
  364. [Fact]
  365. public void SnapshotServer()
  366. {
  367. using (var httpTest = new HttpTest())
  368. {
  369. Identifier serverId = Guid.NewGuid();
  370. Identifier imageId = Guid.NewGuid();
  371. httpTest.RespondWithJson(new Server { Id = serverId });
  372. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, boss");
  373. httpTest.ResponseQueue.Last().Headers.Location = new Uri($"http://api.example.com/images/{imageId}");
  374. httpTest.RespondWithJson(new Image { Id = imageId });
  375. var server = _compute.GetServer(serverId);
  376. Image result = server.Snapshot(new SnapshotServerRequest("{image-name"));
  377. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  378. Assert.Contains("createImage", httpTest.CallLog.First(x => x.Url.EndsWith("/action")).RequestBody);
  379. Assert.NotNull(result);
  380. Assert.Equal(imageId, result.Id);
  381. }
  382. }
  383. [Fact]
  384. public void StartServer()
  385. {
  386. using (var httpTest = new HttpTest())
  387. {
  388. Identifier serverId = Guid.NewGuid();
  389. httpTest.RespondWithJson(new Server { Id = serverId });
  390. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, boss");
  391. var server = _compute.GetServer(serverId);
  392. server.Start();
  393. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  394. Assert.Contains("os-start", httpTest.CallLog.Last().RequestBody);
  395. }
  396. }
  397. [Fact]
  398. public void StopServer()
  399. {
  400. using (var httpTest = new HttpTest())
  401. {
  402. Identifier serverId = Guid.NewGuid();
  403. httpTest.RespondWithJson(new Server { Id = serverId });
  404. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, boss");
  405. var server = _compute.GetServer(serverId);
  406. server.Stop();
  407. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  408. Assert.Contains("os-stop", httpTest.CallLog.Last().RequestBody);
  409. }
  410. }
  411. [Fact]
  412. public void SuspendServer()
  413. {
  414. using (var httpTest = new HttpTest())
  415. {
  416. Identifier serverId = Guid.NewGuid();
  417. httpTest.RespondWithJson(new Server { Id = serverId });
  418. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, boss");
  419. var server = _compute.GetServer(serverId);
  420. server.Suspend();
  421. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  422. Assert.Contains("suspend", httpTest.CallLog.Last().RequestBody);
  423. }
  424. }
  425. [Fact]
  426. public void ResumeServer()
  427. {
  428. using (var httpTest = new HttpTest())
  429. {
  430. Identifier serverId = Guid.NewGuid();
  431. httpTest.RespondWithJson(new Server { Id = serverId });
  432. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, boss");
  433. var server = _compute.GetServer(serverId);
  434. server.Resume();
  435. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  436. Assert.Contains("resume", httpTest.CallLog.Last().RequestBody);
  437. }
  438. }
  439. [Fact]
  440. public void RebootServer()
  441. {
  442. using (var httpTest = new HttpTest())
  443. {
  444. Identifier serverId = Guid.NewGuid();
  445. httpTest.RespondWithJson(new Server { Id = serverId });
  446. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, boss");
  447. var server = _compute.GetServer(serverId);
  448. server.Reboot(new RebootServerRequest {Type = RebootType.Hard});
  449. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  450. string lastRequest = httpTest.CallLog.Last().RequestBody;
  451. Assert.Contains("reboot", lastRequest);
  452. Assert.Contains("HARD", lastRequest);
  453. }
  454. }
  455. [Fact]
  456. public void AttachVolume()
  457. {
  458. using (var httpTest = new HttpTest())
  459. {
  460. Identifier volumeId = Guid.NewGuid();
  461. Identifier serverId = Guid.NewGuid();
  462. httpTest.RespondWithJson(new Server { Id = serverId });
  463. httpTest.RespondWithJson(new ServerVolume {Id = volumeId, DeviceName = "/dev/vdd"});
  464. var server = _compute.GetServer(serverId);
  465. var result = server.AttachVolume(new ServerVolumeDefinition(volumeId));
  466. httpTest.ShouldHaveCalled($"*/servers/{serverId}/os-volume_attachments");
  467. Assert.NotNull(result);
  468. Assert.Equal(volumeId, result.Id);
  469. Assert.Contains(server.AttachedVolumes, v => v.Id == volumeId);
  470. Assert.IsType<ComputeApi>(((IServiceResource)result).Owner);
  471. }
  472. }
  473. [Fact]
  474. public void DetachVolume()
  475. {
  476. using (var httpTest = new HttpTest())
  477. {
  478. Identifier volumeId = Guid.NewGuid();
  479. Identifier serverId = Guid.NewGuid();
  480. httpTest.RespondWithJson(new Server
  481. {
  482. Id = serverId,
  483. AttachedVolumes = { new ServerVolume { Id = volumeId, DeviceName = "/dev/vdd" } }
  484. });
  485. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, good buddy");
  486. var server = _compute.GetServer(serverId);
  487. ServerVolumeReference attachedVolume = server.AttachedVolumes[0];
  488. attachedVolume.Detach();
  489. httpTest.ShouldHaveCalled($"*/servers/{serverId}/os-volume_attachments/{volumeId}");
  490. Assert.DoesNotContain(server.AttachedVolumes, v => v.Id == volumeId);
  491. }
  492. }
  493. [Fact]
  494. public void GetVolume()
  495. {
  496. using (var httpTest = new HttpTest())
  497. {
  498. Identifier volumeId = Guid.NewGuid();
  499. Identifier serverId = Guid.NewGuid();
  500. httpTest.RespondWithJson(new Server {Id = serverId, AttachedVolumes = {new ServerVolumeReference {Id = volumeId}}});
  501. httpTest.RespondWithJson(new ServerVolume {Id = volumeId, DeviceName = "/dev/vdd"});
  502. var server = _compute.GetServer(serverId);
  503. var result = server.AttachedVolumes[0].GetServerVolume();
  504. httpTest.ShouldHaveCalled($"*/servers/{serverId}/os-volume_attachments/{volumeId}");
  505. Assert.NotNull(result);
  506. Assert.Equal(volumeId, result.Id);
  507. }
  508. }
  509. [Fact]
  510. public void ListVolumes()
  511. {
  512. using (var httpTest = new HttpTest())
  513. {
  514. Identifier volumeId = Guid.NewGuid();
  515. Identifier serverId = Guid.NewGuid();
  516. httpTest.RespondWithJson(new Server {Id = serverId});
  517. httpTest.RespondWithJson(new ServerVolumeCollection
  518. {
  519. new ServerVolume
  520. {
  521. Id = volumeId, DeviceName = "/dev/vdd"
  522. }
  523. });
  524. var server = _compute.GetServer(serverId);
  525. var results = server.ListVolumes();
  526. httpTest.ShouldHaveCalled($"*/servers/{serverId}/os-volume_attachments");
  527. Assert.NotNull(results);
  528. Assert.Single(results);
  529. Assert.Equal(volumeId, results.First().Id);
  530. }
  531. }
  532. [Theory]
  533. [InlineData("novnc")]
  534. [InlineData("xvpvnc")]
  535. public void GetVncConsole(string typeName)
  536. {
  537. var type = StringEnumeration.FromDisplayName<RemoteConsoleType>(typeName);
  538. using (var httpTest = new HttpTest())
  539. {
  540. Identifier serverId = Guid.NewGuid();
  541. httpTest.RespondWithJson(new Server {Id = serverId});
  542. httpTest.RespondWithJson(new RemoteConsole {Type = type});
  543. var server = _compute.GetServer(serverId);
  544. var result = server.GetVncConsole(RemoteConsoleType.NoVnc);
  545. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  546. Assert.Contains("os-getVNCConsole", httpTest.CallLog.Last().RequestBody);
  547. Assert.NotNull(result);
  548. Assert.Equal(type, result.Type);
  549. }
  550. }
  551. [Fact]
  552. public void GetSpiceConsole()
  553. {
  554. using (var httpTest = new HttpTest())
  555. {
  556. Identifier serverId = Guid.NewGuid();
  557. httpTest.RespondWithJson(new Server { Id = serverId });
  558. httpTest.RespondWithJson(new RemoteConsole { Type = RemoteConsoleType.SpiceHtml5 });
  559. var server = _compute.GetServer(serverId);
  560. var result = server.GetSpiceConsole();
  561. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  562. Assert.Contains("os-getSPICEConsole", httpTest.CallLog.Last().RequestBody);
  563. Assert.NotNull(result);
  564. Assert.Equal(RemoteConsoleType.SpiceHtml5, result.Type);
  565. }
  566. }
  567. [Fact]
  568. public void GetSerialConsole()
  569. {
  570. using (var httpTest = new HttpTest())
  571. {
  572. Identifier serverId = Guid.NewGuid();
  573. httpTest.RespondWithJson(new Server { Id = serverId });
  574. httpTest.RespondWithJson(new RemoteConsole { Type = RemoteConsoleType.Serial });
  575. var server = _compute.GetServer(serverId);
  576. var result = server.GetSerialConsole();
  577. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  578. Assert.Contains("os-getSerialConsole", httpTest.CallLog.Last().RequestBody);
  579. Assert.NotNull(result);
  580. Assert.Equal(RemoteConsoleType.Serial, result.Type);
  581. }
  582. }
  583. [Fact]
  584. public void GetRdpConsole()
  585. {
  586. using (var httpTest = new HttpTest())
  587. {
  588. Identifier serverId = Guid.NewGuid();
  589. httpTest.RespondWithJson(new Server { Id = serverId });
  590. httpTest.RespondWithJson(new RemoteConsole { Type = RemoteConsoleType.RdpHtml5 });
  591. var server = _compute.GetServer(serverId);
  592. var result = server.GetRdpConsole();
  593. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  594. Assert.Contains("os-getRDPConsole", httpTest.CallLog.Last().RequestBody);
  595. Assert.NotNull(result);
  596. Assert.Equal(RemoteConsoleType.RdpHtml5, result.Type);
  597. }
  598. }
  599. [Fact]
  600. public void GetConsoleOutput()
  601. {
  602. const string output = "FAKE CONSOLE OUTPUT\nANOTHER\nLAST LINE";
  603. using (var httpTest = new HttpTest())
  604. {
  605. Identifier serverId = Guid.NewGuid();
  606. httpTest.RespondWithJson(new Server { Id = serverId });
  607. httpTest.RespondWith(JObject.Parse("{'output': '" + output + "'}").ToString());
  608. var server = _compute.GetServer(serverId);
  609. var result = server.GetConsoleOutput();
  610. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  611. Assert.Contains("os-getConsoleOutput", httpTest.CallLog.Last().RequestBody);
  612. Assert.Equal(output, result);
  613. }
  614. }
  615. [Fact]
  616. public void RescueServer()
  617. {
  618. using (var httpTest = new HttpTest())
  619. {
  620. Identifier serverId = Guid.NewGuid();
  621. httpTest.RespondWithJson(new Server {Id = serverId});
  622. httpTest.RespondWithJson(new {adminPass = "top-secret"});
  623. var server = _compute.GetServer(serverId);
  624. server.Rescue();
  625. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  626. Assert.Contains("rescue", httpTest.CallLog.Last().RequestBody);
  627. }
  628. }
  629. [Fact]
  630. public void UnrescueServer()
  631. {
  632. using (var httpTest = new HttpTest())
  633. {
  634. Identifier serverId = Guid.NewGuid();
  635. httpTest.RespondWithJson(new Server { Id = serverId });
  636. httpTest.RespondWithJson(new { adminPass = "top-secret" });
  637. var server = _compute.GetServer(serverId);
  638. server.UnrescueAsync();
  639. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  640. Assert.Contains("unrescue", httpTest.CallLog.Last().RequestBody);
  641. }
  642. }
  643. [Fact]
  644. public void ResizeServer()
  645. {
  646. using (var httpTest = new HttpTest())
  647. {
  648. Identifier flavorId = "1";
  649. Identifier serverId = Guid.NewGuid();
  650. httpTest.RespondWithJson(new Server { Id = serverId });
  651. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, good buddy!");
  652. var server = _compute.GetServer(serverId);
  653. server.Resize(flavorId);
  654. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  655. Assert.Contains("resize", httpTest.CallLog.Last().RequestBody);
  656. }
  657. }
  658. [Fact]
  659. public void ConfirmResizeServer()
  660. {
  661. using (var httpTest = new HttpTest())
  662. {
  663. Identifier flavorId = "1";
  664. Identifier serverId = Guid.NewGuid();
  665. httpTest.RespondWithJson(new Server { Id = serverId });
  666. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, good buddy!");
  667. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, good buddy!");
  668. var server = _compute.GetServer(serverId);
  669. server.Resize(flavorId);
  670. server.ConfirmResize();
  671. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  672. Assert.Contains("confirmResize", httpTest.CallLog.Last().RequestBody);
  673. }
  674. }
  675. [Fact]
  676. public void CancelResizeServer()
  677. {
  678. using (var httpTest = new HttpTest())
  679. {
  680. Identifier flavorId = "1";
  681. Identifier serverId = Guid.NewGuid();
  682. httpTest.RespondWithJson(new Server { Id = serverId });
  683. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, good buddy!");
  684. httpTest.RespondWith((int)HttpStatusCode.Accepted, "Roger that, good buddy!");
  685. var server = _compute.GetServer(serverId);
  686. server.Resize(flavorId);
  687. server.CancelResize();
  688. httpTest.ShouldHaveCalled($"*/servers/{serverId}/action");
  689. Assert.Contains("revertResize", httpTest.CallLog.Last().RequestBody);
  690. }
  691. }
  692. [Fact]
  693. public void ListServerActions()
  694. {
  695. using (var httpTest = new HttpTest())
  696. {
  697. Identifier serverId = Guid.NewGuid();
  698. Identifier actionId = Guid.NewGuid();
  699. httpTest.RespondWithJson(new Server { Id = serverId });
  700. httpTest.RespondWithJson(new ServerActionSummaryCollection {new ServerActionSummary {Id = actionId, ServerId = serverId, Name = "create"}});
  701. httpTest.RespondWithJson(new ServerAction
  702. {
  703. Id = actionId,
  704. Name = "create",
  705. Events = {new ServerEvent {Name = "create_instance"}}
  706. });
  707. var server = _compute.GetServer(serverId);
  708. var results = server.ListActionSummaries();
  709. httpTest.ShouldHaveCalled($"*/servers/{serverId}/os-instance-actions");
  710. Assert.NotNull(results);
  711. Assert.Single(results);
  712. var actionRef = results.First();
  713. Assert.Equal(actionId, actionRef.Id);
  714. Assert.NotNull(actionRef.Name);
  715. var action = actionRef.GetAction();
  716. httpTest.ShouldHaveCalled($"*/servers/{serverId}/os-instance-actions/{actionId}");
  717. Assert.NotNull(action);
  718. Assert.NotNull(action.Name);
  719. Assert.NotNull(action.Events);
  720. Assert.Equal(1, action.Events.Count);
  721. Assert.NotNull(action.Events.First().Name);
  722. }
  723. }
  724. }
  725. }