github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/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 TestConvertEndpointSpec(t *testing.T) {
   147  	source := []composetypes.ServicePortConfig{
   148  		{
   149  			Protocol:  "udp",
   150  			Target:    53,
   151  			Published: 1053,
   152  			Mode:      "host",
   153  		},
   154  		{
   155  			Target:    8080,
   156  			Published: 80,
   157  		},
   158  	}
   159  	endpoint, err := convertEndpointSpec(source)
   160  
   161  	expected := swarm.EndpointSpec{
   162  		Ports: []swarm.PortConfig{
   163  			{
   164  				TargetPort:    8080,
   165  				PublishedPort: 80,
   166  			},
   167  			{
   168  				Protocol:      "udp",
   169  				TargetPort:    53,
   170  				PublishedPort: 1053,
   171  				PublishMode:   "host",
   172  			},
   173  		},
   174  	}
   175  
   176  	assert.NilError(t, err)
   177  	assert.DeepEqual(t, *endpoint, expected)
   178  }
   179  
   180  func TestConvertServiceNetworksOnlyDefault(t *testing.T) {
   181  	networkConfigs := networkMap{}
   182  	networks := map[string]*composetypes.ServiceNetworkConfig{}
   183  
   184  	configs, err := convertServiceNetworks(
   185  		networks, networkConfigs, NewNamespace("foo"), "service")
   186  
   187  	expected := []swarm.NetworkAttachmentConfig{
   188  		{
   189  			Target:  "foo_default",
   190  			Aliases: []string{"service"},
   191  		},
   192  	}
   193  
   194  	assert.NilError(t, err)
   195  	assert.DeepEqual(t, configs, expected)
   196  }
   197  
   198  func TestConvertServiceNetworks(t *testing.T) {
   199  	networkConfigs := networkMap{
   200  		"front": composetypes.NetworkConfig{
   201  			External: composetypes.External{
   202  				External: true,
   203  				Name:     "fronttier",
   204  			},
   205  		},
   206  		"back": composetypes.NetworkConfig{},
   207  	}
   208  	networks := map[string]*composetypes.ServiceNetworkConfig{
   209  		"front": {
   210  			Aliases: []string{"something"},
   211  		},
   212  		"back": {
   213  			Aliases: []string{"other"},
   214  		},
   215  	}
   216  
   217  	configs, err := convertServiceNetworks(
   218  		networks, networkConfigs, NewNamespace("foo"), "service")
   219  
   220  	expected := []swarm.NetworkAttachmentConfig{
   221  		{
   222  			Target:  "foo_back",
   223  			Aliases: []string{"other", "service"},
   224  		},
   225  		{
   226  			Target:  "fronttier",
   227  			Aliases: []string{"something", "service"},
   228  		},
   229  	}
   230  
   231  	sortedConfigs := byTargetSort(configs)
   232  	sort.Sort(&sortedConfigs)
   233  
   234  	assert.NilError(t, err)
   235  	assert.DeepEqual(t, []swarm.NetworkAttachmentConfig(sortedConfigs), expected)
   236  }
   237  
   238  type byTargetSort []swarm.NetworkAttachmentConfig
   239  
   240  func (s byTargetSort) Len() int {
   241  	return len(s)
   242  }
   243  
   244  func (s byTargetSort) Less(i, j int) bool {
   245  	return strings.Compare(s[i].Target, s[j].Target) < 0
   246  }
   247  
   248  func (s byTargetSort) Swap(i, j int) {
   249  	s[i], s[j] = s[j], s[i]
   250  }