service_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package composetransform
  2. import (
  3. "sort"
  4. "strings"
  5. "testing"
  6. "time"
  7. composetypes "github.com/aanand/compose-file/types"
  8. "github.com/docker/docker/api/types/container"
  9. "github.com/docker/docker/api/types/swarm"
  10. "github.com/docker/docker/pkg/testutil/assert"
  11. )
  12. func TestConvertRestartPolicyFromNone(t *testing.T) {
  13. policy, err := convertRestartPolicy("no", nil)
  14. assert.NilError(t, err)
  15. assert.Equal(t, policy, (*swarm.RestartPolicy)(nil))
  16. }
  17. func TestConvertRestartPolicyFromUnknown(t *testing.T) {
  18. _, err := convertRestartPolicy("unknown", nil)
  19. assert.Error(t, err, "unknown restart policy: unknown")
  20. }
  21. func TestConvertRestartPolicyFromAlways(t *testing.T) {
  22. policy, err := convertRestartPolicy("always", nil)
  23. expected := &swarm.RestartPolicy{
  24. Condition: swarm.RestartPolicyConditionAny,
  25. }
  26. assert.NilError(t, err)
  27. assert.DeepEqual(t, policy, expected)
  28. }
  29. func TestConvertRestartPolicyFromFailure(t *testing.T) {
  30. policy, err := convertRestartPolicy("on-failure:4", nil)
  31. attempts := uint64(4)
  32. expected := &swarm.RestartPolicy{
  33. Condition: swarm.RestartPolicyConditionOnFailure,
  34. MaxAttempts: &attempts,
  35. }
  36. assert.NilError(t, err)
  37. assert.DeepEqual(t, policy, expected)
  38. }
  39. func TestConvertEnvironment(t *testing.T) {
  40. source := map[string]string{
  41. "foo": "bar",
  42. "key": "value",
  43. }
  44. env := convertEnvironment(source)
  45. sort.Strings(env)
  46. assert.DeepEqual(t, env, []string{"foo=bar", "key=value"})
  47. }
  48. func TestConvertResourcesFull(t *testing.T) {
  49. source := composetypes.Resources{
  50. Limits: &composetypes.Resource{
  51. NanoCPUs: "0.003",
  52. MemoryBytes: composetypes.UnitBytes(300000000),
  53. },
  54. Reservations: &composetypes.Resource{
  55. NanoCPUs: "0.002",
  56. MemoryBytes: composetypes.UnitBytes(200000000),
  57. },
  58. }
  59. resources, err := convertResources(source)
  60. assert.NilError(t, err)
  61. expected := &swarm.ResourceRequirements{
  62. Limits: &swarm.Resources{
  63. NanoCPUs: 3000000,
  64. MemoryBytes: 300000000,
  65. },
  66. Reservations: &swarm.Resources{
  67. NanoCPUs: 2000000,
  68. MemoryBytes: 200000000,
  69. },
  70. }
  71. assert.DeepEqual(t, resources, expected)
  72. }
  73. func TestConvertHealthcheck(t *testing.T) {
  74. retries := uint64(10)
  75. source := &composetypes.HealthCheckConfig{
  76. Test: []string{"EXEC", "touch", "/foo"},
  77. Timeout: "30s",
  78. Interval: "2ms",
  79. Retries: &retries,
  80. }
  81. expected := &container.HealthConfig{
  82. Test: source.Test,
  83. Timeout: 30 * time.Second,
  84. Interval: 2 * time.Millisecond,
  85. Retries: 10,
  86. }
  87. healthcheck, err := convertHealthcheck(source)
  88. assert.NilError(t, err)
  89. assert.DeepEqual(t, healthcheck, expected)
  90. }
  91. func TestConvertHealthcheckDisable(t *testing.T) {
  92. source := &composetypes.HealthCheckConfig{Disable: true}
  93. expected := &container.HealthConfig{
  94. Test: []string{"NONE"},
  95. }
  96. healthcheck, err := convertHealthcheck(source)
  97. assert.NilError(t, err)
  98. assert.DeepEqual(t, healthcheck, expected)
  99. }
  100. func TestConvertHealthcheckDisableWithTest(t *testing.T) {
  101. source := &composetypes.HealthCheckConfig{
  102. Disable: true,
  103. Test: []string{"EXEC", "touch"},
  104. }
  105. _, err := convertHealthcheck(source)
  106. assert.Error(t, err, "test and disable can't be set")
  107. }
  108. func TestConvertServiceNetworksOnlyDefault(t *testing.T) {
  109. networkConfigs := networkMap{}
  110. networks := map[string]*composetypes.ServiceNetworkConfig{}
  111. configs, err := convertServiceNetworks(
  112. networks, networkConfigs, NewNamespace("foo"), "service")
  113. expected := []swarm.NetworkAttachmentConfig{
  114. {
  115. Target: "foo_default",
  116. Aliases: []string{"service"},
  117. },
  118. }
  119. assert.NilError(t, err)
  120. assert.DeepEqual(t, configs, expected)
  121. }
  122. func TestConvertServiceNetworks(t *testing.T) {
  123. networkConfigs := networkMap{
  124. "front": composetypes.NetworkConfig{
  125. External: composetypes.External{
  126. External: true,
  127. Name: "fronttier",
  128. },
  129. },
  130. "back": composetypes.NetworkConfig{},
  131. }
  132. networks := map[string]*composetypes.ServiceNetworkConfig{
  133. "front": {
  134. Aliases: []string{"something"},
  135. },
  136. "back": {
  137. Aliases: []string{"other"},
  138. },
  139. }
  140. configs, err := convertServiceNetworks(
  141. networks, networkConfigs, NewNamespace("foo"), "service")
  142. expected := []swarm.NetworkAttachmentConfig{
  143. {
  144. Target: "foo_back",
  145. Aliases: []string{"other", "service"},
  146. },
  147. {
  148. Target: "fronttier",
  149. Aliases: []string{"something", "service"},
  150. },
  151. }
  152. sortedConfigs := byTargetSort(configs)
  153. sort.Sort(&sortedConfigs)
  154. assert.NilError(t, err)
  155. assert.DeepEqual(t, []swarm.NetworkAttachmentConfig(sortedConfigs), expected)
  156. }
  157. type byTargetSort []swarm.NetworkAttachmentConfig
  158. func (s byTargetSort) Len() int {
  159. return len(s)
  160. }
  161. func (s byTargetSort) Less(i, j int) bool {
  162. return strings.Compare(s[i].Target, s[j].Target) < 0
  163. }
  164. func (s byTargetSort) Swap(i, j int) {
  165. s[i], s[j] = s[j], s[i]
  166. }