convert_test.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  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.2),
  76. },
  77. Requests: &containerinstance.ResourceRequests{
  78. CPU: to.Float64Ptr(2),
  79. MemoryInGB: to.Float64Ptr(0.1),
  80. },
  81. },
  82. },
  83. }
  84. var expectedContainer = containers.Container{
  85. ID: "myContainerID",
  86. Status: "Running",
  87. Image: "sha256:666",
  88. Command: "mycommand",
  89. Platform: "Linux",
  90. Ports: []containers.Port{{
  91. HostPort: uint32(80),
  92. ContainerPort: uint32(80),
  93. Protocol: "tcp",
  94. HostIP: "42.42.42.42",
  95. }},
  96. Config: &containers.RuntimeConfig{
  97. FQDN: "myapp.eastus.azurecontainer.io",
  98. },
  99. HostConfig: &containers.HostConfig{
  100. CPULimit: 3,
  101. CPUReservation: 2,
  102. MemoryLimit: gbToBytes(0.2),
  103. MemoryReservation: gbToBytes(0.1),
  104. RestartPolicy: "any",
  105. },
  106. }
  107. container := ContainerGroupToContainer("myContainerID", myContainerGroup, myContainer, "eastus")
  108. assert.DeepEqual(t, container, expectedContainer)
  109. }
  110. func TestContainerGroupToServiceStatus(t *testing.T) {
  111. myContainerGroup := containerinstance.ContainerGroup{
  112. ContainerGroupProperties: &containerinstance.ContainerGroupProperties{
  113. IPAddress: &containerinstance.IPAddress{
  114. Ports: &[]containerinstance.Port{{
  115. Port: to.Int32Ptr(80),
  116. }},
  117. IP: to.StringPtr("42.42.42.42"),
  118. },
  119. },
  120. }
  121. myContainer := containerinstance.Container{
  122. Name: to.StringPtr("myContainerID"),
  123. ContainerProperties: &containerinstance.ContainerProperties{
  124. Ports: &[]containerinstance.ContainerPort{{
  125. Port: to.Int32Ptr(80),
  126. }},
  127. InstanceView: &containerinstance.ContainerPropertiesInstanceView{
  128. RestartCount: nil,
  129. CurrentState: &containerinstance.ContainerState{
  130. State: to.StringPtr("Running"),
  131. },
  132. },
  133. },
  134. }
  135. var expectedService = compose.ServiceStatus{
  136. ID: "myContainerID",
  137. Name: "myContainerID",
  138. Ports: []string{"42.42.42.42:80->80/tcp"},
  139. Replicas: 1,
  140. Desired: 1,
  141. }
  142. container := ContainerGroupToServiceStatus("myContainerID", myContainerGroup, myContainer, "eastus")
  143. assert.DeepEqual(t, container, expectedService)
  144. }
  145. func TestComposeContainerGroupToContainerWithDnsSideCarSide(t *testing.T) {
  146. project := types.Project{
  147. Services: []types.ServiceConfig{
  148. {
  149. Name: "service1",
  150. Image: "image1",
  151. },
  152. {
  153. Name: "service2",
  154. Image: "image2",
  155. },
  156. },
  157. }
  158. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  159. assert.NilError(t, err)
  160. assert.Assert(t, is.Len(*group.Containers, 3))
  161. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  162. assert.Equal(t, *(*group.Containers)[1].Name, "service2")
  163. assert.Equal(t, *(*group.Containers)[2].Name, ComposeDNSSidecarName)
  164. 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"})
  165. assert.Equal(t, *(*group.Containers)[0].Image, "image1")
  166. assert.Equal(t, *(*group.Containers)[1].Image, "image2")
  167. assert.Equal(t, *(*group.Containers)[2].Image, dnsSidecarImage)
  168. }
  169. func TestComposeSingleContainerGroupToContainerNoDnsSideCarSide(t *testing.T) {
  170. project := types.Project{
  171. Services: []types.ServiceConfig{
  172. {
  173. Name: "service1",
  174. Image: "image1",
  175. },
  176. },
  177. }
  178. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  179. assert.NilError(t, err)
  180. assert.Assert(t, is.Len(*group.Containers, 1))
  181. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  182. assert.Equal(t, *(*group.Containers)[0].Image, "image1")
  183. }
  184. func TestComposeVolumes(t *testing.T) {
  185. ctx := context.TODO()
  186. accountName := "myAccount"
  187. mockStorageHelper.On("GetAzureStorageAccountKey", ctx, accountName).Return("123456", nil)
  188. project := types.Project{
  189. Services: []types.ServiceConfig{
  190. {
  191. Name: "service1",
  192. Image: "image1",
  193. },
  194. },
  195. Volumes: types.Volumes{
  196. "vol1": types.VolumeConfig{
  197. Driver: "azure_file",
  198. DriverOpts: map[string]string{
  199. "share_name": "myFileshare",
  200. "storage_account_name": accountName,
  201. },
  202. },
  203. },
  204. }
  205. group, err := ToContainerGroup(ctx, convertCtx, project, mockStorageHelper)
  206. assert.NilError(t, err)
  207. assert.Assert(t, is.Len(*group.Containers, 1))
  208. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  209. expectedGroupVolume := containerinstance.Volume{
  210. Name: to.StringPtr("vol1"),
  211. AzureFile: &containerinstance.AzureFileVolume{
  212. ShareName: to.StringPtr("myFileshare"),
  213. StorageAccountName: &accountName,
  214. StorageAccountKey: to.StringPtr("123456"),
  215. ReadOnly: to.BoolPtr(false),
  216. },
  217. }
  218. assert.Equal(t, len(*group.Volumes), 1)
  219. assert.DeepEqual(t, (*group.Volumes)[0], expectedGroupVolume)
  220. }
  221. func TestComposeVolumesRO(t *testing.T) {
  222. ctx := context.TODO()
  223. accountName := "myAccount"
  224. mockStorageHelper.On("GetAzureStorageAccountKey", ctx, accountName).Return("123456", nil)
  225. project := types.Project{
  226. Services: []types.ServiceConfig{
  227. {
  228. Name: "service1",
  229. Image: "image1",
  230. },
  231. },
  232. Volumes: types.Volumes{
  233. "vol1": types.VolumeConfig{
  234. Driver: "azure_file",
  235. DriverOpts: map[string]string{
  236. "share_name": "myFileshare",
  237. "storage_account_name": accountName,
  238. "read_only": "true",
  239. },
  240. },
  241. },
  242. }
  243. group, err := ToContainerGroup(ctx, convertCtx, project, mockStorageHelper)
  244. assert.NilError(t, err)
  245. assert.Assert(t, is.Len(*group.Containers, 1))
  246. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  247. expectedGroupVolume := containerinstance.Volume{
  248. Name: to.StringPtr("vol1"),
  249. AzureFile: &containerinstance.AzureFileVolume{
  250. ShareName: to.StringPtr("myFileshare"),
  251. StorageAccountName: &accountName,
  252. StorageAccountKey: to.StringPtr("123456"),
  253. ReadOnly: to.BoolPtr(true),
  254. },
  255. }
  256. assert.Equal(t, len(*group.Volumes), 1)
  257. assert.DeepEqual(t, (*group.Volumes)[0], expectedGroupVolume)
  258. }
  259. type mockStorageLogin struct {
  260. mock.Mock
  261. }
  262. func (s *mockStorageLogin) GetAzureStorageAccountKey(ctx context.Context, accountName string) (string, error) {
  263. args := s.Called(ctx, accountName)
  264. return args.String(0), args.Error(1)
  265. }
  266. func TestComposeSingleContainerRestartPolicy(t *testing.T) {
  267. project := types.Project{
  268. Services: []types.ServiceConfig{
  269. {
  270. Name: "service1",
  271. Image: "image1",
  272. Deploy: &types.DeployConfig{
  273. RestartPolicy: &types.RestartPolicy{
  274. Condition: "on-failure",
  275. },
  276. },
  277. },
  278. },
  279. }
  280. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  281. assert.NilError(t, err)
  282. assert.Assert(t, is.Len(*group.Containers, 1))
  283. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  284. assert.Equal(t, group.RestartPolicy, containerinstance.OnFailure)
  285. }
  286. func TestComposeMultiContainerRestartPolicy(t *testing.T) {
  287. project := types.Project{
  288. Services: []types.ServiceConfig{
  289. {
  290. Name: "service1",
  291. Image: "image1",
  292. Deploy: &types.DeployConfig{
  293. RestartPolicy: &types.RestartPolicy{
  294. Condition: "on-failure",
  295. },
  296. },
  297. },
  298. {
  299. Name: "service2",
  300. Image: "image2",
  301. Deploy: &types.DeployConfig{
  302. RestartPolicy: &types.RestartPolicy{
  303. Condition: "on-failure",
  304. },
  305. },
  306. },
  307. },
  308. }
  309. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  310. assert.NilError(t, err)
  311. assert.Assert(t, is.Len(*group.Containers, 3))
  312. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  313. assert.Equal(t, group.RestartPolicy, containerinstance.OnFailure)
  314. assert.Equal(t, *(*group.Containers)[1].Name, "service2")
  315. assert.Equal(t, group.RestartPolicy, containerinstance.OnFailure)
  316. }
  317. func TestComposeInconsistentMultiContainerRestartPolicy(t *testing.T) {
  318. project := types.Project{
  319. Services: []types.ServiceConfig{
  320. {
  321. Name: "service1",
  322. Image: "image1",
  323. Deploy: &types.DeployConfig{
  324. RestartPolicy: &types.RestartPolicy{
  325. Condition: "any",
  326. },
  327. },
  328. },
  329. {
  330. Name: "service2",
  331. Image: "image2",
  332. Deploy: &types.DeployConfig{
  333. RestartPolicy: &types.RestartPolicy{
  334. Condition: "on-failure",
  335. },
  336. },
  337. },
  338. },
  339. }
  340. _, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  341. assert.Error(t, err, "ACI integration does not support specifying different restart policies on services in the same compose application")
  342. }
  343. func TestLabelsErrorMessage(t *testing.T) {
  344. project := types.Project{
  345. Services: []types.ServiceConfig{
  346. {
  347. Name: "service1",
  348. Image: "image1",
  349. Labels: map[string]string{
  350. "label1": "value1",
  351. },
  352. },
  353. },
  354. }
  355. _, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  356. assert.Error(t, err, "ACI integration does not support labels in compose applications")
  357. }
  358. func TestComposeSingleContainerGroupToContainerDefaultRestartPolicy(t *testing.T) {
  359. project := types.Project{
  360. Services: []types.ServiceConfig{
  361. {
  362. Name: "service1",
  363. Image: "image1",
  364. },
  365. },
  366. }
  367. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  368. assert.NilError(t, err)
  369. assert.Assert(t, is.Len(*group.Containers, 1))
  370. assert.Equal(t, *(*group.Containers)[0].Name, "service1")
  371. assert.Equal(t, group.RestartPolicy, containerinstance.Always)
  372. }
  373. func TestComposeContainerGroupToContainerMultiplePorts(t *testing.T) {
  374. project := types.Project{
  375. Services: []types.ServiceConfig{
  376. {
  377. Name: "service1",
  378. Image: "image1",
  379. Ports: []types.ServicePortConfig{
  380. {
  381. Published: 80,
  382. Target: 80,
  383. },
  384. },
  385. },
  386. {
  387. Name: "service2",
  388. Image: "image2",
  389. Ports: []types.ServicePortConfig{
  390. {
  391. Published: 8080,
  392. Target: 8080,
  393. },
  394. },
  395. },
  396. },
  397. }
  398. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  399. assert.NilError(t, err)
  400. assert.Assert(t, is.Len(*group.Containers, 3))
  401. container1 := (*group.Containers)[0]
  402. assert.Equal(t, *container1.Name, "service1")
  403. assert.Equal(t, *container1.Image, "image1")
  404. assert.Equal(t, *(*container1.Ports)[0].Port, int32(80))
  405. container2 := (*group.Containers)[1]
  406. assert.Equal(t, *container2.Name, "service2")
  407. assert.Equal(t, *container2.Image, "image2")
  408. assert.Equal(t, *(*container2.Ports)[0].Port, int32(8080))
  409. groupPorts := *group.IPAddress.Ports
  410. assert.Assert(t, is.Len(groupPorts, 2))
  411. assert.Equal(t, *groupPorts[0].Port, int32(80))
  412. assert.Equal(t, *groupPorts[1].Port, int32(8080))
  413. assert.Assert(t, group.IPAddress.DNSNameLabel == nil)
  414. }
  415. func TestComposeContainerGroupToContainerWithDomainName(t *testing.T) {
  416. project := types.Project{
  417. Services: []types.ServiceConfig{
  418. {
  419. Name: "service1",
  420. Image: "image1",
  421. Ports: []types.ServicePortConfig{
  422. {
  423. Published: 80,
  424. Target: 80,
  425. },
  426. },
  427. DomainName: "myApp",
  428. },
  429. {
  430. Name: "service2",
  431. Image: "image2",
  432. Ports: []types.ServicePortConfig{
  433. {
  434. Published: 8080,
  435. Target: 8080,
  436. },
  437. },
  438. },
  439. },
  440. }
  441. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  442. assert.NilError(t, err)
  443. assert.Assert(t, is.Len(*group.Containers, 3))
  444. groupPorts := *group.IPAddress.Ports
  445. assert.Assert(t, is.Len(groupPorts, 2))
  446. assert.Equal(t, *groupPorts[0].Port, int32(80))
  447. assert.Equal(t, *groupPorts[1].Port, int32(8080))
  448. assert.Equal(t, *group.IPAddress.DNSNameLabel, "myApp")
  449. }
  450. func TestComposeContainerGroupToContainerErrorWhenSeveralDomainNames(t *testing.T) {
  451. project := types.Project{
  452. Services: []types.ServiceConfig{
  453. {
  454. Name: "service1",
  455. Image: "image1",
  456. DomainName: "myApp",
  457. },
  458. {
  459. Name: "service2",
  460. Image: "image2",
  461. DomainName: "myApp2",
  462. },
  463. },
  464. }
  465. _, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  466. assert.Error(t, err, "ACI integration does not support specifying different domain names on services in the same compose application")
  467. }
  468. // ACI fails if group definition IPAddress has no ports
  469. func TestComposeContainerGroupToContainerIgnoreDomainNameWithoutPorts(t *testing.T) {
  470. project := types.Project{
  471. Services: []types.ServiceConfig{
  472. {
  473. Name: "service1",
  474. Image: "image1",
  475. DomainName: "myApp",
  476. },
  477. {
  478. Name: "service2",
  479. Image: "image2",
  480. DomainName: "myApp",
  481. },
  482. },
  483. }
  484. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  485. assert.NilError(t, err)
  486. assert.Assert(t, is.Len(*group.Containers, 3))
  487. assert.Assert(t, group.IPAddress == nil)
  488. }
  489. var _0_1Gb = gbToBytes(0.1)
  490. func TestComposeContainerGroupToContainerResourceRequests(t *testing.T) {
  491. project := types.Project{
  492. Services: []types.ServiceConfig{
  493. {
  494. Name: "service1",
  495. Image: "image1",
  496. Deploy: &types.DeployConfig{
  497. Resources: types.Resources{
  498. Reservations: &types.Resource{
  499. NanoCPUs: "0.1",
  500. MemoryBytes: types.UnitBytes(_0_1Gb),
  501. },
  502. },
  503. },
  504. },
  505. },
  506. }
  507. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  508. assert.NilError(t, err)
  509. request := *((*group.Containers)[0]).Resources.Requests
  510. assert.Equal(t, *request.CPU, float64(0.1))
  511. assert.Equal(t, *request.MemoryInGB, float64(0.1))
  512. limits := *((*group.Containers)[0]).Resources.Limits
  513. assert.Equal(t, *limits.CPU, float64(0.1))
  514. assert.Equal(t, *limits.MemoryInGB, float64(0.1))
  515. }
  516. func TestComposeContainerGroupToContainerResourceRequestsAndLimits(t *testing.T) {
  517. project := types.Project{
  518. Services: []types.ServiceConfig{
  519. {
  520. Name: "service1",
  521. Image: "image1",
  522. Deploy: &types.DeployConfig{
  523. Resources: types.Resources{
  524. Reservations: &types.Resource{
  525. NanoCPUs: "0.1",
  526. MemoryBytes: types.UnitBytes(_0_1Gb),
  527. },
  528. Limits: &types.Resource{
  529. NanoCPUs: "0.3",
  530. MemoryBytes: types.UnitBytes(2 * _0_1Gb),
  531. },
  532. },
  533. },
  534. },
  535. },
  536. }
  537. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  538. assert.NilError(t, err)
  539. request := *((*group.Containers)[0]).Resources.Requests
  540. assert.Equal(t, *request.CPU, float64(0.1))
  541. assert.Equal(t, *request.MemoryInGB, float64(0.1))
  542. limits := *((*group.Containers)[0]).Resources.Limits
  543. assert.Equal(t, *limits.CPU, float64(0.3))
  544. assert.Equal(t, *limits.MemoryInGB, float64(0.2))
  545. }
  546. func TestComposeContainerGroupToContainerResourceLimitsOnly(t *testing.T) {
  547. project := types.Project{
  548. Services: []types.ServiceConfig{
  549. {
  550. Name: "service1",
  551. Image: "image1",
  552. Deploy: &types.DeployConfig{
  553. Resources: types.Resources{
  554. Limits: &types.Resource{
  555. NanoCPUs: "0.3",
  556. MemoryBytes: types.UnitBytes(2 * _0_1Gb),
  557. },
  558. },
  559. },
  560. },
  561. },
  562. }
  563. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  564. assert.NilError(t, err)
  565. request := *((*group.Containers)[0]).Resources.Requests
  566. assert.Equal(t, *request.CPU, float64(0.3))
  567. assert.Equal(t, *request.MemoryInGB, float64(0.2))
  568. limits := *((*group.Containers)[0]).Resources.Limits
  569. assert.Equal(t, *limits.CPU, float64(0.3))
  570. assert.Equal(t, *limits.MemoryInGB, float64(0.2))
  571. }
  572. func TestComposeContainerGroupToContainerResourceRequestsDefaults(t *testing.T) {
  573. project := types.Project{
  574. Services: []types.ServiceConfig{
  575. {
  576. Name: "service1",
  577. Image: "image1",
  578. Deploy: &types.DeployConfig{
  579. Resources: types.Resources{
  580. Reservations: &types.Resource{
  581. NanoCPUs: "",
  582. MemoryBytes: 0,
  583. },
  584. },
  585. },
  586. },
  587. },
  588. }
  589. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  590. assert.NilError(t, err)
  591. request := *((*group.Containers)[0]).Resources.Requests
  592. assert.Equal(t, *request.CPU, float64(1))
  593. assert.Equal(t, *request.MemoryInGB, float64(1))
  594. }
  595. func TestComposeContainerGroupToContainerenvVar(t *testing.T) {
  596. err := os.Setenv("key2", "value2")
  597. assert.NilError(t, err)
  598. project := types.Project{
  599. Services: []types.ServiceConfig{
  600. {
  601. Name: "service1",
  602. Image: "image1",
  603. Environment: types.MappingWithEquals{
  604. "key1": to.StringPtr("value1"),
  605. "key2": nil,
  606. },
  607. },
  608. },
  609. }
  610. group, err := ToContainerGroup(context.TODO(), convertCtx, project, mockStorageHelper)
  611. assert.NilError(t, err)
  612. envVars := *((*group.Containers)[0]).EnvironmentVariables
  613. assert.Assert(t, is.Len(envVars, 2))
  614. assert.Assert(t, is.Contains(envVars, containerinstance.EnvironmentVariable{Name: to.StringPtr("key1"), Value: to.StringPtr("value1")}))
  615. assert.Assert(t, is.Contains(envVars, containerinstance.EnvironmentVariable{Name: to.StringPtr("key2"), Value: to.StringPtr("value2")}))
  616. }
  617. func TestConvertToAciRestartPolicyCondition(t *testing.T) {
  618. assert.Equal(t, toAciRestartPolicy("none"), containerinstance.Never)
  619. assert.Equal(t, toAciRestartPolicy("always"), containerinstance.Always)
  620. assert.Equal(t, toAciRestartPolicy("on-failure"), containerinstance.OnFailure)
  621. assert.Equal(t, toAciRestartPolicy("on-failure:5"), containerinstance.Always)
  622. }
  623. func TestConvertToDockerRestartPolicyCondition(t *testing.T) {
  624. assert.Equal(t, toContainerRestartPolicy(containerinstance.Never), "none")
  625. assert.Equal(t, toContainerRestartPolicy(containerinstance.Always), "any")
  626. assert.Equal(t, toContainerRestartPolicy(containerinstance.OnFailure), "on-failure")
  627. assert.Equal(t, toContainerRestartPolicy(""), "any")
  628. }
  629. func TestConvertContainerGroupStatus(t *testing.T) {
  630. assert.Equal(t, "Running", GetStatus(container(to.StringPtr("Running")), group(to.StringPtr("Started"))))
  631. assert.Equal(t, "Terminated", GetStatus(container(to.StringPtr("Terminated")), group(to.StringPtr("Stopped"))))
  632. assert.Equal(t, "Node Stopped", GetStatus(container(nil), group(to.StringPtr("Stopped"))))
  633. assert.Equal(t, "Node Started", GetStatus(container(nil), group(to.StringPtr("Started"))))
  634. assert.Equal(t, "Running", GetStatus(container(to.StringPtr("Running")), group(nil)))
  635. assert.Equal(t, "Unknown", GetStatus(container(nil), group(nil)))
  636. }
  637. func container(status *string) containerinstance.Container {
  638. var state *containerinstance.ContainerState = nil
  639. if status != nil {
  640. state = &containerinstance.ContainerState{
  641. State: status,
  642. }
  643. }
  644. return containerinstance.Container{
  645. ContainerProperties: &containerinstance.ContainerProperties{
  646. InstanceView: &containerinstance.ContainerPropertiesInstanceView{
  647. CurrentState: state,
  648. },
  649. },
  650. }
  651. }
  652. func group(status *string) containerinstance.ContainerGroup {
  653. var view *containerinstance.ContainerGroupPropertiesInstanceView = nil
  654. if status != nil {
  655. view = &containerinstance.ContainerGroupPropertiesInstanceView{
  656. State: status,
  657. }
  658. }
  659. return containerinstance.ContainerGroup{
  660. ContainerGroupProperties: &containerinstance.ContainerGroupProperties{
  661. InstanceView: view,
  662. },
  663. }
  664. }