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  }