convert_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*
  2. Copyright 2020 Docker, Inc.
  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. "testing"
  16. "github.com/Azure/azure-sdk-for-go/profiles/latest/containerinstance/mgmt/containerinstance"
  17. "github.com/Azure/go-autorest/autorest/to"
  18. "github.com/compose-spec/compose-go/types"
  19. "github.com/docker/api/containers"
  20. "github.com/docker/api/context/store"
  21. . "github.com/onsi/gomega"
  22. "github.com/stretchr/testify/require"
  23. "github.com/stretchr/testify/suite"
  24. )
  25. type ConvertTestSuite struct {
  26. suite.Suite
  27. ctx store.AciContext
  28. }
  29. func (suite *ConvertTestSuite) BeforeTest(suiteName, testName string) {
  30. suite.ctx = store.AciContext{
  31. SubscriptionID: "subID",
  32. ResourceGroup: "rg",
  33. Location: "eu",
  34. }
  35. }
  36. func (suite *ConvertTestSuite) TestProjectName() {
  37. project := types.Project{
  38. Name: "TEST",
  39. }
  40. containerGroup, err := ToContainerGroup(suite.ctx, project)
  41. require.NoError(suite.T(), err)
  42. require.Equal(suite.T(), *containerGroup.Name, "test")
  43. }
  44. func (suite *ConvertTestSuite) TestContainerGroupToContainer() {
  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. },
  53. },
  54. }
  55. myContainer := containerinstance.Container{
  56. Name: to.StringPtr("myContainerID"),
  57. ContainerProperties: &containerinstance.ContainerProperties{
  58. Image: to.StringPtr("sha256:666"),
  59. Command: to.StringSlicePtr([]string{"mycommand"}),
  60. Ports: &[]containerinstance.ContainerPort{{
  61. Port: to.Int32Ptr(80),
  62. }},
  63. EnvironmentVariables: nil,
  64. InstanceView: &containerinstance.ContainerPropertiesInstanceView{
  65. RestartCount: nil,
  66. CurrentState: &containerinstance.ContainerState{
  67. State: to.StringPtr("Running"),
  68. },
  69. },
  70. Resources: &containerinstance.ResourceRequirements{
  71. Limits: &containerinstance.ResourceLimits{
  72. CPU: to.Float64Ptr(3),
  73. MemoryInGB: to.Float64Ptr(0.1),
  74. },
  75. },
  76. },
  77. }
  78. var expectedContainer = containers.Container{
  79. ID: "myContainerID",
  80. Status: "Running",
  81. Image: "sha256:666",
  82. Command: "mycommand",
  83. CPULimit: 3,
  84. MemoryLimit: 107374182,
  85. Ports: []containers.Port{{
  86. HostPort: uint32(80),
  87. ContainerPort: uint32(80),
  88. Protocol: "tcp",
  89. HostIP: "42.42.42.42",
  90. }},
  91. }
  92. container, err := ContainerGroupToContainer("myContainerID", myContainerGroup, myContainer)
  93. Expect(err).To(BeNil())
  94. Expect(container).To(Equal(expectedContainer))
  95. }
  96. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerWithDnsSideCarSide() {
  97. project := types.Project{
  98. Services: []types.ServiceConfig{
  99. {
  100. Name: "service1",
  101. Image: "image1",
  102. },
  103. {
  104. Name: "service2",
  105. Image: "image2",
  106. },
  107. },
  108. }
  109. group, err := ToContainerGroup(suite.ctx, project)
  110. Expect(err).To(BeNil())
  111. Expect(len(*group.Containers)).To(Equal(3))
  112. Expect(*(*group.Containers)[0].Name).To(Equal("service1"))
  113. Expect(*(*group.Containers)[1].Name).To(Equal("service2"))
  114. Expect(*(*group.Containers)[2].Name).To(Equal(ComposeDNSSidecarName))
  115. Expect(*(*group.Containers)[2].Command).To(Equal([]string{"sh", "-c", "echo 127.0.0.1 service1 >> /etc/hosts;echo 127.0.0.1 service2 >> /etc/hosts;sleep infinity"}))
  116. Expect(*(*group.Containers)[0].Image).To(Equal("image1"))
  117. Expect(*(*group.Containers)[1].Image).To(Equal("image2"))
  118. Expect(*(*group.Containers)[2].Image).To(Equal(dnsSidecarImage))
  119. }
  120. func (suite *ConvertTestSuite) TestComposeSingleContainerGroupToContainerNoDnsSideCarSide() {
  121. project := types.Project{
  122. Services: []types.ServiceConfig{
  123. {
  124. Name: "service1",
  125. Image: "image1",
  126. },
  127. },
  128. }
  129. group, err := ToContainerGroup(suite.ctx, project)
  130. Expect(err).To(BeNil())
  131. Expect(len(*group.Containers)).To(Equal(1))
  132. Expect(*(*group.Containers)[0].Name).To(Equal("service1"))
  133. Expect(*(*group.Containers)[0].Image).To(Equal("image1"))
  134. }
  135. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerMultiplePorts() {
  136. project := types.Project{
  137. Services: []types.ServiceConfig{
  138. {
  139. Name: "service1",
  140. Image: "image1",
  141. Ports: []types.ServicePortConfig{
  142. {
  143. Published: 80,
  144. Target: 80,
  145. },
  146. },
  147. },
  148. {
  149. Name: "service2",
  150. Image: "image2",
  151. Ports: []types.ServicePortConfig{
  152. {
  153. Published: 8080,
  154. Target: 8080,
  155. },
  156. },
  157. },
  158. },
  159. }
  160. group, err := ToContainerGroup(suite.ctx, project)
  161. Expect(err).To(BeNil())
  162. Expect(len(*group.Containers)).To(Equal(3))
  163. container1 := (*group.Containers)[0]
  164. container2 := (*group.Containers)[1]
  165. Expect(*container1.Name).To(Equal("service1"))
  166. Expect(*container1.Image).To(Equal("image1"))
  167. portsC1 := *container1.Ports
  168. Expect(*portsC1[0].Port).To(Equal(int32(80)))
  169. Expect(*container2.Name).To(Equal("service2"))
  170. Expect(*container2.Image).To(Equal("image2"))
  171. portsC2 := *container2.Ports
  172. Expect(*portsC2[0].Port).To(Equal(int32(8080)))
  173. groupPorts := *group.IPAddress.Ports
  174. Expect(len(groupPorts)).To(Equal(2))
  175. Expect(*groupPorts[0].Port).To(Equal(int32(80)))
  176. Expect(*groupPorts[1].Port).To(Equal(int32(8080)))
  177. }
  178. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerResourceLimits() {
  179. _0_1Gb := 0.1 * 1024 * 1024 * 1024
  180. project := types.Project{
  181. Services: []types.ServiceConfig{
  182. {
  183. Name: "service1",
  184. Image: "image1",
  185. Deploy: &types.DeployConfig{
  186. Resources: types.Resources{
  187. Limits: &types.Resource{
  188. NanoCPUs: "0.1",
  189. MemoryBytes: types.UnitBytes(_0_1Gb),
  190. },
  191. },
  192. },
  193. },
  194. },
  195. }
  196. group, err := ToContainerGroup(suite.ctx, project)
  197. Expect(err).To(BeNil())
  198. container1 := (*group.Containers)[0]
  199. limits := *container1.Resources.Limits
  200. Expect(*limits.CPU).To(Equal(float64(0.1)))
  201. Expect(*limits.MemoryInGB).To(Equal(float64(0.1)))
  202. }
  203. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerResourceLimitsDefaults() {
  204. project := types.Project{
  205. Services: []types.ServiceConfig{
  206. {
  207. Name: "service1",
  208. Image: "image1",
  209. Deploy: &types.DeployConfig{
  210. Resources: types.Resources{
  211. Limits: &types.Resource{
  212. NanoCPUs: "",
  213. MemoryBytes: 0,
  214. },
  215. },
  216. },
  217. },
  218. },
  219. }
  220. group, err := ToContainerGroup(suite.ctx, project)
  221. Expect(err).To(BeNil())
  222. container1 := (*group.Containers)[0]
  223. limits := *container1.Resources.Limits
  224. Expect(*limits.CPU).To(Equal(float64(1)))
  225. Expect(*limits.MemoryInGB).To(Equal(float64(1)))
  226. }
  227. func TestConvertTestSuite(t *testing.T) {
  228. RegisterTestingT(t)
  229. suite.Run(t, new(ConvertTestSuite))
  230. }