convert_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. /*
  2. Copyright 2020 Docker Compose CLI authors
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package convert
  14. import (
  15. "context"
  16. "os"
  17. "testing"
  18. "github.com/stretchr/testify/mock"
  19. "github.com/Azure/azure-sdk-for-go/services/containerinstance/mgmt/2018-10-01/containerinstance"
  20. "github.com/Azure/go-autorest/autorest/to"
  21. "github.com/compose-spec/compose-go/types"
  22. "gotest.tools/v3/assert"
  23. is "gotest.tools/v3/assert/cmp"
  24. "github.com/docker/compose-cli/api/compose"
  25. "github.com/docker/compose-cli/api/containers"
  26. "github.com/docker/compose-cli/context/store"
  27. )
  28. var (
  29. convertCtx = store.AciContext{
  30. SubscriptionID: "subID",
  31. ResourceGroup: "rg",
  32. Location: "eu",
  33. }
  34. mockStorageHelper = &mockStorageLogin{}
  35. )
  36. func TestProjectName(t *testing.T) {
  37. project := types.Project{
  38. Name: "TEST",
  39. }
  40. containerGroup, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  41. assert.NilError(t, err)
  42. assert.Equal(t, *containerGroup.Name, "test")
  43. }
  44. func TestContainerGroupToContainer(t *testing.T) {
  45. myContainerGroup := containerinstance.ContainerGroup{
  46. ContainerGroupProperties: &containerinstance.ContainerGroupProperties{
  47. IPAddress: &containerinstance.IPAddress{
  48. Ports: &[]containerinstance.Port{{
  49. Port: to.Int32Ptr(80),
  50. }},
  51. IP: to.StringPtr("42.42.42.42"),
  52. DNSNameLabel: to.StringPtr("myapp"),
  53. },
  54. OsType: "Linux",
  55. },
  56. }
  57. myContainer := containerinstance.Container{
  58. Name: to.StringPtr("myContainerID"),
  59. ContainerProperties: &containerinstance.ContainerProperties{
  60. Image: to.StringPtr("sha256:666"),
  61. Command: to.StringSlicePtr([]string{"mycommand"}),
  62. Ports: &[]containerinstance.ContainerPort{{
  63. Port: to.Int32Ptr(80),
  64. }},
  65. EnvironmentVariables: nil,
  66. InstanceView: &containerinstance.ContainerPropertiesInstanceView{
  67. RestartCount: nil,
  68. CurrentState: &containerinstance.ContainerState{
  69. State: to.StringPtr("Running"),
  70. },
  71. },
  72. Resources: &containerinstance.ResourceRequirements{
  73. Limits: &containerinstance.ResourceLimits{
  74. CPU: to.Float64Ptr(3),
  75. MemoryInGB: to.Float64Ptr(0.1),
  76. },
  77. },
  78. },
  79. }
  80. var expectedContainer = containers.Container{
  81. ID: "myContainerID",
  82. Status: "Running",
  83. Image: "sha256:666",
  84. Command: "mycommand",
  85. CPULimit: 3,
  86. MemoryLimit: 107374182,
  87. Platform: "Linux",
  88. Ports: []containers.Port{{
  89. HostPort: uint32(80),
  90. ContainerPort: uint32(80),
  91. Protocol: "tcp",
  92. HostIP: "42.42.42.42",
  93. }},
  94. Config: &containers.RuntimeConfig{
  95. FQDN: "myapp.eastus.azurecontainer.io",
  96. },
  97. RestartPolicyCondition: "any",
  98. }
  99. container := ContainerGroupToContainer("myContainerID", myContainerGroup, myContainer, "eastus")
  100. assert.DeepEqual(t, container, expectedContainer)
  101. }
  102. func TestContainerGroupToServiceStatus(t *testing.T) {
  103. myContainerGroup := containerinstance.ContainerGroup{
  104. ContainerGroupProperties: &containerinstance.ContainerGroupProperties{
  105. IPAddress: &containerinstance.IPAddress{
  106. Ports: &[]containerinstance.Port{{
  107. Port: to.Int32Ptr(80),
  108. }},
  109. IP: to.StringPtr("42.42.42.42"),
  110. },
  111. },
  112. }
  113. myContainer := containerinstance.Container{
  114. Name: to.StringPtr("myContainerID"),
  115. ContainerProperties: &containerinstance.ContainerProperties{
  116. Ports: &[]containerinstance.ContainerPort{{
  117. Port: to.Int32Ptr(80),
  118. }},
  119. InstanceView: &containerinstance.ContainerPropertiesInstanceView{
  120. RestartCount: nil,
  121. CurrentState: &containerinstance.ContainerState{
  122. State: to.StringPtr("Running"),
  123. },
  124. },
  125. },
  126. }
  127. var expectedService = compose.ServiceStatus{
  128. ID: "myContainerID",
  129. Name: "myContainerID",
  130. Ports: []string{"42.42.42.42:80->80/tcp"},
  131. Replicas: 1,
  132. Desired: 1,
  133. }
  134. container := ContainerGroupToServiceStatus("myContainerID", myContainerGroup, myContainer, "eastus")
  135. assert.DeepEqual(t, container, expectedService)
  136. }
  137. func TestComposeContainerGroupToContainerWithDnsSideCarSide(t *testing.T) {
  138. project := types.Project{
  139. Services: []types.ServiceConfig{
  140. {
  141. Name: "service1",
  142. Image: "image1",
  143. },
  144. {
  145. Name: "service2",
  146. Image: "image2",
  147. },
  148. },
  149. }
  150. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  151. assert.NilError(t, err)
  152. assert.Assert(t, is.Len(*group.Containers, 3))
  153. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  154. assert.Equal(t, *(*group.Containers)[1].Name, "service2")
  155. assert.Equal(t, *(*group.Containers)[2].Name, ComposeDNSSidecarName)
  156. assert.DeepEqual(t, *(*group.Containers)[2].Command, []string{"sh", "-c", "echo 127.0.0.1 service1 >> /etc/hosts;echo 127.0.0.1 service2 >> /etc/hosts;sleep infinity"})
  157. assert.Equal(t, *(*group.Containers)[0].Image, "image1")
  158. assert.Equal(t, *(*group.Containers)[1].Image, "image2")
  159. assert.Equal(t, *(*group.Containers)[2].Image, dnsSidecarImage)
  160. }
  161. func TestComposeSingleContainerGroupToContainerNoDnsSideCarSide(t *testing.T) {
  162. project := types.Project{
  163. Services: []types.ServiceConfig{
  164. {
  165. Name: "service1",
  166. Image: "image1",
  167. },
  168. },
  169. }
  170. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  171. assert.NilError(t, err)
  172. assert.Assert(t, is.Len(*group.Containers, 1))
  173. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  174. assert.Equal(t, *(*group.Containers)[0].Image, "image1")
  175. }
  176. func TestComposeVolumes(t *testing.T) {
  177. ctx := context.TODO()
  178. accountName := "myAccount"
  179. mockStorageHelper.On("GetAzureStorageAccountKey", ctx, accountName).Return("123456", nil)
  180. project := types.Project{
  181. Services: []types.ServiceConfig{
  182. {
  183. Name: "service1",
  184. Image: "image1",
  185. },
  186. },
  187. Volumes: types.Volumes{
  188. "vol1": types.VolumeConfig{
  189. Driver: "azure_file",
  190. DriverOpts: map[string]string{
  191. "share_name": "myFileshare",
  192. "storage_account_name": accountName,
  193. },
  194. },
  195. },
  196. }
  197. group, err := ToContainerGroup(ctx, convertCtx, project, mockStorageHelper)
  198. assert.NilError(t, err)
  199. assert.Assert(t, is.Len(*group.Containers, 1))
  200. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  201. expectedGroupVolume := containerinstance.Volume{
  202. Name: to.StringPtr("vol1"),
  203. AzureFile: &containerinstance.AzureFileVolume{
  204. ShareName: to.StringPtr("myFileshare"),
  205. StorageAccountName: &accountName,
  206. StorageAccountKey: to.StringPtr("123456"),
  207. ReadOnly: to.BoolPtr(false),
  208. },
  209. }
  210. assert.Equal(t, len(*group.Volumes), 1)
  211. assert.DeepEqual(t, (*group.Volumes)[0], expectedGroupVolume)
  212. }
  213. func TestComposeVolumesRO(t *testing.T) {
  214. ctx := context.TODO()
  215. accountName := "myAccount"
  216. mockStorageHelper.On("GetAzureStorageAccountKey", ctx, accountName).Return("123456", nil)
  217. project := types.Project{
  218. Services: []types.ServiceConfig{
  219. {
  220. Name: "service1",
  221. Image: "image1",
  222. },
  223. },
  224. Volumes: types.Volumes{
  225. "vol1": types.VolumeConfig{
  226. Driver: "azure_file",
  227. DriverOpts: map[string]string{
  228. "share_name": "myFileshare",
  229. "storage_account_name": accountName,
  230. "read_only": "true",
  231. },
  232. },
  233. },
  234. }
  235. group, err := ToContainerGroup(ctx, convertCtx, project, mockStorageHelper)
  236. assert.NilError(t, err)
  237. assert.Assert(t, is.Len(*group.Containers, 1))
  238. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  239. expectedGroupVolume := containerinstance.Volume{
  240. Name: to.StringPtr("vol1"),
  241. AzureFile: &containerinstance.AzureFileVolume{
  242. ShareName: to.StringPtr("myFileshare"),
  243. StorageAccountName: &accountName,
  244. StorageAccountKey: to.StringPtr("123456"),
  245. ReadOnly: to.BoolPtr(true),
  246. },
  247. }
  248. assert.Equal(t, len(*group.Volumes), 1)
  249. assert.DeepEqual(t, (*group.Volumes)[0], expectedGroupVolume)
  250. }
  251. type mockStorageLogin struct {
  252. mock.Mock
  253. }
  254. func (s *mockStorageLogin) GetAzureStorageAccountKey(ctx context.Context, accountName string) (string, error) {
  255. args := s.Called(ctx, accountName)
  256. return args.String(0), args.Error(1)
  257. }
  258. func TestComposeSingleContainerRestartPolicy(t *testing.T) {
  259. project := types.Project{
  260. Services: []types.ServiceConfig{
  261. {
  262. Name: "service1",
  263. Image: "image1",
  264. Deploy: &types.DeployConfig{
  265. RestartPolicy: &types.RestartPolicy{
  266. Condition: "on-failure",
  267. },
  268. },
  269. },
  270. },
  271. }
  272. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  273. assert.NilError(t, err)
  274. assert.Assert(t, is.Len(*group.Containers, 1))
  275. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  276. assert.Equal(t, group.RestartPolicy, containerinstance.OnFailure)
  277. }
  278. func TestComposeMultiContainerRestartPolicy(t *testing.T) {
  279. project := types.Project{
  280. Services: []types.ServiceConfig{
  281. {
  282. Name: "service1",
  283. Image: "image1",
  284. Deploy: &types.DeployConfig{
  285. RestartPolicy: &types.RestartPolicy{
  286. Condition: "on-failure",
  287. },
  288. },
  289. },
  290. {
  291. Name: "service2",
  292. Image: "image2",
  293. Deploy: &types.DeployConfig{
  294. RestartPolicy: &types.RestartPolicy{
  295. Condition: "on-failure",
  296. },
  297. },
  298. },
  299. },
  300. }
  301. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  302. assert.NilError(t, err)
  303. assert.Assert(t, is.Len(*group.Containers, 3))
  304. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  305. assert.Equal(t, group.RestartPolicy, containerinstance.OnFailure)
  306. assert.Equal(t, *(*group.Containers)[1].Name, "service2")
  307. assert.Equal(t, group.RestartPolicy, containerinstance.OnFailure)
  308. }
  309. func TestComposeInconsistentMultiContainerRestartPolicy(t *testing.T) {
  310. project := types.Project{
  311. Services: []types.ServiceConfig{
  312. {
  313. Name: "service1",
  314. Image: "image1",
  315. Deploy: &types.DeployConfig{
  316. RestartPolicy: &types.RestartPolicy{
  317. Condition: "any",
  318. },
  319. },
  320. },
  321. {
  322. Name: "service2",
  323. Image: "image2",
  324. Deploy: &types.DeployConfig{
  325. RestartPolicy: &types.RestartPolicy{
  326. Condition: "on-failure",
  327. },
  328. },
  329. },
  330. },
  331. }
  332. _, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  333. assert.Error(t, err, "ACI integration does not support specifying different restart policies on services in the same compose application")
  334. }
  335. func TestLabelsErrorMessage(t *testing.T) {
  336. project := types.Project{
  337. Services: []types.ServiceConfig{
  338. {
  339. Name: "service1",
  340. Image: "image1",
  341. Labels: map[string]string{
  342. "label1": "value1",
  343. },
  344. },
  345. },
  346. }
  347. _, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  348. assert.Error(t, err, "ACI integration does not support labels in compose applications")
  349. }
  350. func TestComposeSingleContainerGroupToContainerDefaultRestartPolicy(t *testing.T) {
  351. project := types.Project{
  352. Services: []types.ServiceConfig{
  353. {
  354. Name: "service1",
  355. Image: "image1",
  356. },
  357. },
  358. }
  359. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  360. assert.NilError(t, err)
  361. assert.Assert(t, is.Len(*group.Containers, 1))
  362. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  363. assert.Equal(t, group.RestartPolicy, containerinstance.Always)
  364. }
  365. func TestComposeContainerGroupToContainerMultiplePorts(t *testing.T) {
  366. project := types.Project{
  367. Services: []types.ServiceConfig{
  368. {
  369. Name: "service1",
  370. Image: "image1",
  371. Ports: []types.ServicePortConfig{
  372. {
  373. Published: 80,
  374. Target: 80,
  375. },
  376. },
  377. },
  378. {
  379. Name: "service2",
  380. Image: "image2",
  381. Ports: []types.ServicePortConfig{
  382. {
  383. Published: 8080,
  384. Target: 8080,
  385. },
  386. },
  387. },
  388. },
  389. }
  390. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  391. assert.NilError(t, err)
  392. assert.Assert(t, is.Len(*group.Containers, 3))
  393. container1 := (*group.Containers)[0]
  394. assert.Equal(t, *container1.Name, "service1")
  395. assert.Equal(t, *container1.Image, "image1")
  396. assert.Equal(t, *(*container1.Ports)[0].Port, int32(80))
  397. container2 := (*group.Containers)[1]
  398. assert.Equal(t, *container2.Name, "service2")
  399. assert.Equal(t, *container2.Image, "image2")
  400. assert.Equal(t, *(*container2.Ports)[0].Port, int32(8080))
  401. groupPorts := *group.IPAddress.Ports
  402. assert.Assert(t, is.Len(groupPorts, 2))
  403. assert.Equal(t, *groupPorts[0].Port, int32(80))
  404. assert.Equal(t, *groupPorts[1].Port, int32(8080))
  405. assert.Assert(t, group.IPAddress.DNSNameLabel == nil)
  406. }
  407. func TestComposeContainerGroupToContainerWithDomainName(t *testing.T) {
  408. project := types.Project{
  409. Services: []types.ServiceConfig{
  410. {
  411. Name: "service1",
  412. Image: "image1",
  413. Ports: []types.ServicePortConfig{
  414. {
  415. Published: 80,
  416. Target: 80,
  417. },
  418. },
  419. DomainName: "myApp",
  420. },
  421. {
  422. Name: "service2",
  423. Image: "image2",
  424. Ports: []types.ServicePortConfig{
  425. {
  426. Published: 8080,
  427. Target: 8080,
  428. },
  429. },
  430. },
  431. },
  432. }
  433. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  434. assert.NilError(t, err)
  435. assert.Assert(t, is.Len(*group.Containers, 3))
  436. groupPorts := *group.IPAddress.Ports
  437. assert.Assert(t, is.Len(groupPorts, 2))
  438. assert.Equal(t, *groupPorts[0].Port, int32(80))
  439. assert.Equal(t, *groupPorts[1].Port, int32(8080))
  440. assert.Equal(t, *group.IPAddress.DNSNameLabel, "myApp")
  441. }
  442. func TestComposeContainerGroupToContainerErrorWhenSeveralDomainNames(t *testing.T) {
  443. project := types.Project{
  444. Services: []types.ServiceConfig{
  445. {
  446. Name: "service1",
  447. Image: "image1",
  448. DomainName: "myApp",
  449. },
  450. {
  451. Name: "service2",
  452. Image: "image2",
  453. DomainName: "myApp2",
  454. },
  455. },
  456. }
  457. _, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  458. assert.Error(t, err, "ACI integration does not support specifying different domain names on services in the same compose application")
  459. }
  460. // ACI fails if group definition IPAddress has no ports
  461. func TestComposeContainerGroupToContainerIgnoreDomainNameWithoutPorts(t *testing.T) {
  462. project := types.Project{
  463. Services: []types.ServiceConfig{
  464. {
  465. Name: "service1",
  466. Image: "image1",
  467. DomainName: "myApp",
  468. },
  469. {
  470. Name: "service2",
  471. Image: "image2",
  472. DomainName: "myApp",
  473. },
  474. },
  475. }
  476. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  477. assert.NilError(t, err)
  478. assert.Assert(t, is.Len(*group.Containers, 3))
  479. assert.Assert(t, group.IPAddress == nil)
  480. }
  481. func TestComposeContainerGroupToContainerResourceLimits(t *testing.T) {
  482. _0_1Gb := 0.1 * 1024 * 1024 * 1024
  483. project := types.Project{
  484. Services: []types.ServiceConfig{
  485. {
  486. Name: "service1",
  487. Image: "image1",
  488. Deploy: &types.DeployConfig{
  489. Resources: types.Resources{
  490. Limits: &types.Resource{
  491. NanoCPUs: "0.1",
  492. MemoryBytes: types.UnitBytes(_0_1Gb),
  493. },
  494. },
  495. },
  496. },
  497. },
  498. }
  499. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  500. assert.NilError(t, err)
  501. limits := *((*group.Containers)[0]).Resources.Limits
  502. assert.Equal(t, *limits.CPU, float64(0.1))
  503. assert.Equal(t, *limits.MemoryInGB, float64(0.1))
  504. }
  505. func TestComposeContainerGroupToContainerResourceLimitsDefaults(t *testing.T) {
  506. project := types.Project{
  507. Services: []types.ServiceConfig{
  508. {
  509. Name: "service1",
  510. Image: "image1",
  511. Deploy: &types.DeployConfig{
  512. Resources: types.Resources{
  513. Limits: &types.Resource{
  514. NanoCPUs: "",
  515. MemoryBytes: 0,
  516. },
  517. },
  518. },
  519. },
  520. },
  521. }
  522. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  523. assert.NilError(t, err)
  524. limits := *((*group.Containers)[0]).Resources.Limits
  525. assert.Equal(t, *limits.CPU, float64(1))
  526. assert.Equal(t, *limits.MemoryInGB, float64(1))
  527. }
  528. func TestComposeContainerGroupToContainerenvVar(t *testing.T) {
  529. err := os.Setenv("key2", "value2")
  530. assert.NilError(t, err)
  531. project := types.Project{
  532. Services: []types.ServiceConfig{
  533. {
  534. Name: "service1",
  535. Image: "image1",
  536. Environment: types.MappingWithEquals{
  537. "key1": to.StringPtr("value1"),
  538. "key2": nil,
  539. },
  540. },
  541. },
  542. }
  543. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  544. assert.NilError(t, err)
  545. envVars := *((*group.Containers)[0]).EnvironmentVariables
  546. assert.Assert(t, is.Len(envVars, 2))
  547. assert.Assert(t, is.Contains(envVars, containerinstance.EnvironmentVariable{Name: to.StringPtr("key1"), Value: to.StringPtr("value1")}))
  548. assert.Assert(t, is.Contains(envVars, containerinstance.EnvironmentVariable{Name: to.StringPtr("key2"), Value: to.StringPtr("value2")}))
  549. }
  550. func TestConvertToAciRestartPolicyCondition(t *testing.T) {
  551. assert.Equal(t, toAciRestartPolicy("none"), containerinstance.Never)
  552. assert.Equal(t, toAciRestartPolicy("always"), containerinstance.Always)
  553. assert.Equal(t, toAciRestartPolicy("on-failure"), containerinstance.OnFailure)
  554. assert.Equal(t, toAciRestartPolicy("on-failure:5"), containerinstance.Always)
  555. }
  556. func TestConvertToDockerRestartPolicyCondition(t *testing.T) {
  557. assert.Equal(t, toContainerRestartPolicy(containerinstance.Never), "none")
  558. assert.Equal(t, toContainerRestartPolicy(containerinstance.Always), "any")
  559. assert.Equal(t, toContainerRestartPolicy(containerinstance.OnFailure), "on-failure")
  560. assert.Equal(t, toContainerRestartPolicy(""), "any")
  561. }
  562. func TestConvertContainerGroupStatus(t *testing.T) {
  563. assert.Equal(t, "Running", GetStatus(container(to.StringPtr("Running")), group(to.StringPtr("Started"))))
  564. assert.Equal(t, "Terminated", GetStatus(container(to.StringPtr("Terminated")), group(to.StringPtr("Stopped"))))
  565. assert.Equal(t, "Node Stopped", GetStatus(container(nil), group(to.StringPtr("Stopped"))))
  566. assert.Equal(t, "Node Started", GetStatus(container(nil), group(to.StringPtr("Started"))))
  567. assert.Equal(t, "Running", GetStatus(container(to.StringPtr("Running")), group(nil)))
  568. assert.Equal(t, "Unknown", GetStatus(container(nil), group(nil)))
  569. }
  570. func container(status *string) containerinstance.Container {
  571. var state *containerinstance.ContainerState = nil
  572. if status != nil {
  573. state = &containerinstance.ContainerState{
  574. State: status,
  575. }
  576. }
  577. return containerinstance.Container{
  578. ContainerProperties: &containerinstance.ContainerProperties{
  579. InstanceView: &containerinstance.ContainerPropertiesInstanceView{
  580. CurrentState: state,
  581. },
  582. },
  583. }
  584. }
  585. func group(status *string) containerinstance.ContainerGroup {
  586. var view *containerinstance.ContainerGroupPropertiesInstanceView = nil
  587. if status != nil {
  588. view = &containerinstance.ContainerGroupPropertiesInstanceView{
  589. State: status,
  590. }
  591. }
  592. return containerinstance.ContainerGroup{
  593. ContainerGroupProperties: &containerinstance.ContainerGroupProperties{
  594. InstanceView: view,
  595. },
  596. }
  597. }