convert_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. "os"
  16. "testing"
  17. "github.com/Azure/azure-sdk-for-go/profiles/latest/containerinstance/mgmt/containerinstance"
  18. "github.com/Azure/go-autorest/autorest/to"
  19. "github.com/compose-spec/compose-go/types"
  20. "github.com/docker/api/containers"
  21. "github.com/docker/api/context/store"
  22. . "github.com/onsi/gomega"
  23. "github.com/stretchr/testify/require"
  24. "github.com/stretchr/testify/suite"
  25. )
  26. type ConvertTestSuite struct {
  27. suite.Suite
  28. ctx store.AciContext
  29. }
  30. func (suite *ConvertTestSuite) BeforeTest(suiteName, testName string) {
  31. suite.ctx = store.AciContext{
  32. SubscriptionID: "subID",
  33. ResourceGroup: "rg",
  34. Location: "eu",
  35. }
  36. }
  37. func (suite *ConvertTestSuite) TestProjectName() {
  38. project := types.Project{
  39. Name: "TEST",
  40. }
  41. containerGroup, err := ToContainerGroup(suite.ctx, project)
  42. require.NoError(suite.T(), err)
  43. require.Equal(suite.T(), *containerGroup.Name, "test")
  44. }
  45. func (suite *ConvertTestSuite) TestContainerGroupToContainer() {
  46. myContainerGroup := containerinstance.ContainerGroup{
  47. ContainerGroupProperties: &containerinstance.ContainerGroupProperties{
  48. IPAddress: &containerinstance.IPAddress{
  49. Ports: &[]containerinstance.Port{{
  50. Port: to.Int32Ptr(80),
  51. }},
  52. IP: to.StringPtr("42.42.42.42"),
  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. }
  95. container, err := ContainerGroupToContainer("myContainerID", myContainerGroup, myContainer)
  96. Expect(err).To(BeNil())
  97. Expect(container).To(Equal(expectedContainer))
  98. }
  99. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerWithDnsSideCarSide() {
  100. project := types.Project{
  101. Services: []types.ServiceConfig{
  102. {
  103. Name: "service1",
  104. Image: "image1",
  105. },
  106. {
  107. Name: "service2",
  108. Image: "image2",
  109. },
  110. },
  111. }
  112. group, err := ToContainerGroup(suite.ctx, project)
  113. Expect(err).To(BeNil())
  114. Expect(len(*group.Containers)).To(Equal(3))
  115. Expect(*(*group.Containers)[0].Name).To(Equal("service1"))
  116. Expect(*(*group.Containers)[1].Name).To(Equal("service2"))
  117. Expect(*(*group.Containers)[2].Name).To(Equal(ComposeDNSSidecarName))
  118. 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"}))
  119. Expect(*(*group.Containers)[0].Image).To(Equal("image1"))
  120. Expect(*(*group.Containers)[1].Image).To(Equal("image2"))
  121. Expect(*(*group.Containers)[2].Image).To(Equal(dnsSidecarImage))
  122. }
  123. func (suite *ConvertTestSuite) TestComposeSingleContainerGroupToContainerNoDnsSideCarSide() {
  124. project := types.Project{
  125. Services: []types.ServiceConfig{
  126. {
  127. Name: "service1",
  128. Image: "image1",
  129. },
  130. },
  131. }
  132. group, err := ToContainerGroup(suite.ctx, project)
  133. Expect(err).To(BeNil())
  134. Expect(len(*group.Containers)).To(Equal(1))
  135. Expect(*(*group.Containers)[0].Name).To(Equal("service1"))
  136. Expect(*(*group.Containers)[0].Image).To(Equal("image1"))
  137. }
  138. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerMultiplePorts() {
  139. project := types.Project{
  140. Services: []types.ServiceConfig{
  141. {
  142. Name: "service1",
  143. Image: "image1",
  144. Ports: []types.ServicePortConfig{
  145. {
  146. Published: 80,
  147. Target: 80,
  148. },
  149. },
  150. },
  151. {
  152. Name: "service2",
  153. Image: "image2",
  154. Ports: []types.ServicePortConfig{
  155. {
  156. Published: 8080,
  157. Target: 8080,
  158. },
  159. },
  160. },
  161. },
  162. }
  163. group, err := ToContainerGroup(suite.ctx, project)
  164. Expect(err).To(BeNil())
  165. Expect(len(*group.Containers)).To(Equal(3))
  166. container1 := (*group.Containers)[0]
  167. container2 := (*group.Containers)[1]
  168. Expect(*container1.Name).To(Equal("service1"))
  169. Expect(*container1.Image).To(Equal("image1"))
  170. portsC1 := *container1.Ports
  171. Expect(*portsC1[0].Port).To(Equal(int32(80)))
  172. Expect(*container2.Name).To(Equal("service2"))
  173. Expect(*container2.Image).To(Equal("image2"))
  174. portsC2 := *container2.Ports
  175. Expect(*portsC2[0].Port).To(Equal(int32(8080)))
  176. groupPorts := *group.IPAddress.Ports
  177. Expect(len(groupPorts)).To(Equal(2))
  178. Expect(*groupPorts[0].Port).To(Equal(int32(80)))
  179. Expect(*groupPorts[1].Port).To(Equal(int32(8080)))
  180. }
  181. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerResourceLimits() {
  182. _0_1Gb := 0.1 * 1024 * 1024 * 1024
  183. project := types.Project{
  184. Services: []types.ServiceConfig{
  185. {
  186. Name: "service1",
  187. Image: "image1",
  188. Deploy: &types.DeployConfig{
  189. Resources: types.Resources{
  190. Limits: &types.Resource{
  191. NanoCPUs: "0.1",
  192. MemoryBytes: types.UnitBytes(_0_1Gb),
  193. },
  194. },
  195. },
  196. },
  197. },
  198. }
  199. group, err := ToContainerGroup(suite.ctx, project)
  200. Expect(err).To(BeNil())
  201. container1 := (*group.Containers)[0]
  202. limits := *container1.Resources.Limits
  203. Expect(*limits.CPU).To(Equal(float64(0.1)))
  204. Expect(*limits.MemoryInGB).To(Equal(float64(0.1)))
  205. }
  206. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerResourceLimitsDefaults() {
  207. project := types.Project{
  208. Services: []types.ServiceConfig{
  209. {
  210. Name: "service1",
  211. Image: "image1",
  212. Deploy: &types.DeployConfig{
  213. Resources: types.Resources{
  214. Limits: &types.Resource{
  215. NanoCPUs: "",
  216. MemoryBytes: 0,
  217. },
  218. },
  219. },
  220. },
  221. },
  222. }
  223. group, err := ToContainerGroup(suite.ctx, project)
  224. Expect(err).To(BeNil())
  225. container1 := (*group.Containers)[0]
  226. limits := *container1.Resources.Limits
  227. Expect(*limits.CPU).To(Equal(float64(1)))
  228. Expect(*limits.MemoryInGB).To(Equal(float64(1)))
  229. }
  230. func (suite *ConvertTestSuite) TestComposeContainerGroupToContainerenvVar() {
  231. err := os.Setenv("key2", "value2")
  232. Expect(err).To(BeNil())
  233. project := types.Project{
  234. Services: []types.ServiceConfig{
  235. {
  236. Name: "service1",
  237. Image: "image1",
  238. Environment: types.MappingWithEquals{
  239. "key1": to.StringPtr("value1"),
  240. "key2": nil,
  241. },
  242. },
  243. },
  244. }
  245. group, err := ToContainerGroup(suite.ctx, project)
  246. Expect(err).To(BeNil())
  247. container1 := (*group.Containers)[0]
  248. envVars := *container1.EnvironmentVariables
  249. Expect(len(envVars)).To(Equal(2))
  250. Expect(envVars).To(ContainElement(containerinstance.EnvironmentVariable{Name: to.StringPtr("key1"), Value: to.StringPtr("value1")}))
  251. Expect(envVars).To(ContainElement(containerinstance.EnvironmentVariable{Name: to.StringPtr("key2"), Value: to.StringPtr("value2")}))
  252. }
  253. func TestConvertTestSuite(t *testing.T) {
  254. RegisterTestingT(t)
  255. suite.Run(t, new(ConvertTestSuite))
  256. }