github.com/openshift/moby-moby@v1.13.2-0.20170601211448-f5ec1e2936dc/cli/compose/convert/service_test.go (about) 1 package convert 2 3 import ( 4 "sort" 5 "strings" 6 "testing" 7 "time" 8 9 "github.com/docker/docker/api/types/container" 10 "github.com/docker/docker/api/types/swarm" 11 composetypes "github.com/docker/docker/cli/compose/types" 12 "github.com/docker/docker/pkg/testutil/assert" 13 ) 14 15 func TestConvertRestartPolicyFromNone(t *testing.T) { 16 policy, err := convertRestartPolicy("no", nil) 17 assert.NilError(t, err) 18 assert.Equal(t, policy, (*swarm.RestartPolicy)(nil)) 19 } 20 21 func TestConvertRestartPolicyFromUnknown(t *testing.T) { 22 _, err := convertRestartPolicy("unknown", nil) 23 assert.Error(t, err, "unknown restart policy: unknown") 24 } 25 26 func TestConvertRestartPolicyFromAlways(t *testing.T) { 27 policy, err := convertRestartPolicy("always", nil) 28 expected := &swarm.RestartPolicy{ 29 Condition: swarm.RestartPolicyConditionAny, 30 } 31 assert.NilError(t, err) 32 assert.DeepEqual(t, policy, expected) 33 } 34 35 func TestConvertRestartPolicyFromFailure(t *testing.T) { 36 policy, err := convertRestartPolicy("on-failure:4", nil) 37 attempts := uint64(4) 38 expected := &swarm.RestartPolicy{ 39 Condition: swarm.RestartPolicyConditionOnFailure, 40 MaxAttempts: &attempts, 41 } 42 assert.NilError(t, err) 43 assert.DeepEqual(t, policy, expected) 44 } 45 46 func TestConvertEnvironment(t *testing.T) { 47 source := map[string]string{ 48 "foo": "bar", 49 "key": "value", 50 } 51 env := convertEnvironment(source) 52 sort.Strings(env) 53 assert.DeepEqual(t, env, []string{"foo=bar", "key=value"}) 54 } 55 56 func TestConvertResourcesFull(t *testing.T) { 57 source := composetypes.Resources{ 58 Limits: &composetypes.Resource{ 59 NanoCPUs: "0.003", 60 MemoryBytes: composetypes.UnitBytes(300000000), 61 }, 62 Reservations: &composetypes.Resource{ 63 NanoCPUs: "0.002", 64 MemoryBytes: composetypes.UnitBytes(200000000), 65 }, 66 } 67 resources, err := convertResources(source) 68 assert.NilError(t, err) 69 70 expected := &swarm.ResourceRequirements{ 71 Limits: &swarm.Resources{ 72 NanoCPUs: 3000000, 73 MemoryBytes: 300000000, 74 }, 75 Reservations: &swarm.Resources{ 76 NanoCPUs: 2000000, 77 MemoryBytes: 200000000, 78 }, 79 } 80 assert.DeepEqual(t, resources, expected) 81 } 82 83 func TestConvertResourcesOnlyMemory(t *testing.T) { 84 source := composetypes.Resources{ 85 Limits: &composetypes.Resource{ 86 MemoryBytes: composetypes.UnitBytes(300000000), 87 }, 88 Reservations: &composetypes.Resource{ 89 MemoryBytes: composetypes.UnitBytes(200000000), 90 }, 91 } 92 resources, err := convertResources(source) 93 assert.NilError(t, err) 94 95 expected := &swarm.ResourceRequirements{ 96 Limits: &swarm.Resources{ 97 MemoryBytes: 300000000, 98 }, 99 Reservations: &swarm.Resources{ 100 MemoryBytes: 200000000, 101 }, 102 } 103 assert.DeepEqual(t, resources, expected) 104 } 105 106 func TestConvertHealthcheck(t *testing.T) { 107 retries := uint64(10) 108 source := &composetypes.HealthCheckConfig{ 109 Test: []string{"EXEC", "touch", "/foo"}, 110 Timeout: "30s", 111 Interval: "2ms", 112 Retries: &retries, 113 } 114 expected := &container.HealthConfig{ 115 Test: source.Test, 116 Timeout: 30 * time.Second, 117 Interval: 2 * time.Millisecond, 118 Retries: 10, 119 } 120 121 healthcheck, err := convertHealthcheck(source) 122 assert.NilError(t, err) 123 assert.DeepEqual(t, healthcheck, expected) 124 } 125 126 func TestConvertHealthcheckDisable(t *testing.T) { 127 source := &composetypes.HealthCheckConfig{Disable: true} 128 expected := &container.HealthConfig{ 129 Test: []string{"NONE"}, 130 } 131 132 healthcheck, err := convertHealthcheck(source) 133 assert.NilError(t, err) 134 assert.DeepEqual(t, healthcheck, expected) 135 } 136 137 func TestConvertHealthcheckDisableWithTest(t *testing.T) { 138 source := &composetypes.HealthCheckConfig{ 139 Disable: true, 140 Test: []string{"EXEC", "touch"}, 141 } 142 _, err := convertHealthcheck(source) 143 assert.Error(t, err, "test and disable can't be set") 144 } 145 146 func TestConvertServiceNetworksOnlyDefault(t *testing.T) { 147 networkConfigs := networkMap{} 148 149 configs, err := convertServiceNetworks( 150 nil, networkConfigs, NewNamespace("foo"), "service") 151 152 expected := []swarm.NetworkAttachmentConfig{ 153 { 154 Target: "foo_default", 155 Aliases: []string{"service"}, 156 }, 157 } 158 159 assert.NilError(t, err) 160 assert.DeepEqual(t, configs, expected) 161 } 162 163 func TestConvertServiceNetworks(t *testing.T) { 164 networkConfigs := networkMap{ 165 "front": composetypes.NetworkConfig{ 166 External: composetypes.External{ 167 External: true, 168 Name: "fronttier", 169 }, 170 }, 171 "back": composetypes.NetworkConfig{}, 172 } 173 networks := map[string]*composetypes.ServiceNetworkConfig{ 174 "front": { 175 Aliases: []string{"something"}, 176 }, 177 "back": { 178 Aliases: []string{"other"}, 179 }, 180 } 181 182 configs, err := convertServiceNetworks( 183 networks, networkConfigs, NewNamespace("foo"), "service") 184 185 expected := []swarm.NetworkAttachmentConfig{ 186 { 187 Target: "foo_back", 188 Aliases: []string{"other", "service"}, 189 }, 190 { 191 Target: "fronttier", 192 Aliases: []string{"something", "service"}, 193 }, 194 } 195 196 sortedConfigs := byTargetSort(configs) 197 sort.Sort(&sortedConfigs) 198 199 assert.NilError(t, err) 200 assert.DeepEqual(t, []swarm.NetworkAttachmentConfig(sortedConfigs), expected) 201 } 202 203 func TestConvertServiceNetworksCustomDefault(t *testing.T) { 204 networkConfigs := networkMap{ 205 "default": composetypes.NetworkConfig{ 206 External: composetypes.External{ 207 External: true, 208 Name: "custom", 209 }, 210 }, 211 } 212 networks := map[string]*composetypes.ServiceNetworkConfig{} 213 214 configs, err := convertServiceNetworks( 215 networks, networkConfigs, NewNamespace("foo"), "service") 216 217 expected := []swarm.NetworkAttachmentConfig{ 218 { 219 Target: "custom", 220 Aliases: []string{"service"}, 221 }, 222 } 223 224 assert.NilError(t, err) 225 assert.DeepEqual(t, []swarm.NetworkAttachmentConfig(configs), expected) 226 } 227 228 type byTargetSort []swarm.NetworkAttachmentConfig 229 230 func (s byTargetSort) Len() int { 231 return len(s) 232 } 233 234 func (s byTargetSort) Less(i, j int) bool { 235 return strings.Compare(s[i].Target, s[j].Target) < 0 236 } 237 238 func (s byTargetSort) Swap(i, j int) { 239 s[i], s[j] = s[j], s[i] 240 }