github.com/AliyunContainerService/cli@v0.0.0-20181009023821-814ced4b30d0/internal/containerizedengine/update_test.go (about)

     1  package containerizedengine
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/containerd/containerd"
    12  	"github.com/containerd/containerd/cio"
    13  	"github.com/containerd/containerd/errdefs"
    14  	"github.com/docker/cli/cli/command"
    15  	"github.com/docker/cli/internal/versions"
    16  	clitypes "github.com/docker/cli/types"
    17  	"github.com/docker/docker/api/types"
    18  	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
    19  	"gotest.tools/assert"
    20  )
    21  
    22  func TestActivateImagePermutations(t *testing.T) {
    23  	ctx := context.Background()
    24  	lookedup := "not called yet"
    25  	expectedError := fmt.Errorf("expected error")
    26  	client := baseClient{
    27  		cclient: &fakeContainerdClient{
    28  			getImageFunc: func(ctx context.Context, ref string) (containerd.Image, error) {
    29  				lookedup = ref
    30  				return nil, expectedError
    31  			},
    32  		},
    33  	}
    34  	tmpdir, err := ioutil.TempDir("", "enginedir")
    35  	assert.NilError(t, err)
    36  	defer os.RemoveAll(tmpdir)
    37  	metadata := clitypes.RuntimeMetadata{EngineImage: clitypes.EnterpriseEngineImage}
    38  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
    39  	assert.NilError(t, err)
    40  
    41  	opts := clitypes.EngineInitOptions{
    42  		EngineVersion:      "engineversiongoeshere",
    43  		RegistryPrefix:     "registryprefixgoeshere",
    44  		ConfigFile:         "/tmp/configfilegoeshere",
    45  		RuntimeMetadataDir: tmpdir,
    46  	}
    47  
    48  	err = client.ActivateEngine(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
    49  	assert.ErrorContains(t, err, expectedError.Error())
    50  	assert.Equal(t, lookedup, fmt.Sprintf("%s/%s:%s", opts.RegistryPrefix, clitypes.EnterpriseEngineImage, opts.EngineVersion))
    51  
    52  	metadata = clitypes.RuntimeMetadata{EngineImage: clitypes.CommunityEngineImage}
    53  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
    54  	assert.NilError(t, err)
    55  	err = client.ActivateEngine(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
    56  	assert.ErrorContains(t, err, expectedError.Error())
    57  	assert.Equal(t, lookedup, fmt.Sprintf("%s/%s:%s", opts.RegistryPrefix, clitypes.EnterpriseEngineImage, opts.EngineVersion))
    58  
    59  	metadata = clitypes.RuntimeMetadata{EngineImage: clitypes.CommunityEngineImage + "-dm"}
    60  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
    61  	assert.NilError(t, err)
    62  	err = client.ActivateEngine(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
    63  	assert.ErrorContains(t, err, expectedError.Error())
    64  	assert.Equal(t, lookedup, fmt.Sprintf("%s/%s:%s", opts.RegistryPrefix, clitypes.EnterpriseEngineImage+"-dm", opts.EngineVersion))
    65  }
    66  
    67  func TestActivateConfigFailure(t *testing.T) {
    68  	ctx := context.Background()
    69  	registryPrefix := "registryprefixgoeshere"
    70  	image := &fakeImage{
    71  		nameFunc: func() string {
    72  			return registryPrefix + "/" + clitypes.EnterpriseEngineImage + ":engineversion"
    73  		},
    74  		configFunc: func(ctx context.Context) (ocispec.Descriptor, error) {
    75  			return ocispec.Descriptor{}, fmt.Errorf("config lookup failure")
    76  		},
    77  	}
    78  	container := &fakeContainer{
    79  		imageFunc: func(context.Context) (containerd.Image, error) {
    80  			return image, nil
    81  		},
    82  		taskFunc: func(context.Context, cio.Attach) (containerd.Task, error) {
    83  			return nil, errdefs.ErrNotFound
    84  		},
    85  		labelsFunc: func(context.Context) (map[string]string, error) {
    86  			return map[string]string{}, nil
    87  		},
    88  	}
    89  	client := baseClient{
    90  		cclient: &fakeContainerdClient{
    91  			containersFunc: func(ctx context.Context, filters ...string) ([]containerd.Container, error) {
    92  				return []containerd.Container{container}, nil
    93  			},
    94  			getImageFunc: func(ctx context.Context, ref string) (containerd.Image, error) {
    95  				return image, nil
    96  			},
    97  		},
    98  	}
    99  	tmpdir, err := ioutil.TempDir("", "engindir")
   100  	assert.NilError(t, err)
   101  	defer os.RemoveAll(tmpdir)
   102  	metadata := clitypes.RuntimeMetadata{EngineImage: clitypes.CommunityEngineImage}
   103  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
   104  	assert.NilError(t, err)
   105  	opts := clitypes.EngineInitOptions{
   106  		EngineVersion:      "engineversiongoeshere",
   107  		RegistryPrefix:     "registryprefixgoeshere",
   108  		ConfigFile:         "/tmp/configfilegoeshere",
   109  		EngineImage:        clitypes.EnterpriseEngineImage,
   110  		RuntimeMetadataDir: tmpdir,
   111  	}
   112  
   113  	err = client.ActivateEngine(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
   114  	assert.ErrorContains(t, err, "config lookup failure")
   115  }
   116  
   117  func TestActivateDoUpdateFail(t *testing.T) {
   118  	ctx := context.Background()
   119  	registryPrefix := "registryprefixgoeshere"
   120  	image := &fakeImage{
   121  		nameFunc: func() string {
   122  			return registryPrefix + "/ce-engine:engineversion"
   123  		},
   124  	}
   125  	container := &fakeContainer{
   126  		imageFunc: func(context.Context) (containerd.Image, error) {
   127  			return image, nil
   128  		},
   129  	}
   130  	client := baseClient{
   131  		cclient: &fakeContainerdClient{
   132  			containersFunc: func(ctx context.Context, filters ...string) ([]containerd.Container, error) {
   133  				return []containerd.Container{container}, nil
   134  			},
   135  			getImageFunc: func(ctx context.Context, ref string) (containerd.Image, error) {
   136  				return nil, fmt.Errorf("something went wrong")
   137  
   138  			},
   139  		},
   140  	}
   141  	tmpdir, err := ioutil.TempDir("", "enginedir")
   142  	assert.NilError(t, err)
   143  	defer os.RemoveAll(tmpdir)
   144  	metadata := clitypes.RuntimeMetadata{EngineImage: clitypes.CommunityEngineImage}
   145  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
   146  	assert.NilError(t, err)
   147  	opts := clitypes.EngineInitOptions{
   148  		EngineVersion:      "engineversiongoeshere",
   149  		RegistryPrefix:     "registryprefixgoeshere",
   150  		ConfigFile:         "/tmp/configfilegoeshere",
   151  		EngineImage:        clitypes.EnterpriseEngineImage,
   152  		RuntimeMetadataDir: tmpdir,
   153  	}
   154  
   155  	err = client.ActivateEngine(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
   156  	assert.ErrorContains(t, err, "check for image")
   157  	assert.ErrorContains(t, err, "something went wrong")
   158  }
   159  
   160  func TestDoUpdateNoVersion(t *testing.T) {
   161  	tmpdir, err := ioutil.TempDir("", "enginedir")
   162  	assert.NilError(t, err)
   163  	defer os.RemoveAll(tmpdir)
   164  	metadata := clitypes.RuntimeMetadata{EngineImage: clitypes.EnterpriseEngineImage}
   165  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
   166  	assert.NilError(t, err)
   167  	ctx := context.Background()
   168  	opts := clitypes.EngineInitOptions{
   169  		EngineVersion:      "",
   170  		RegistryPrefix:     "registryprefixgoeshere",
   171  		ConfigFile:         "/tmp/configfilegoeshere",
   172  		EngineImage:        clitypes.EnterpriseEngineImage,
   173  		RuntimeMetadataDir: tmpdir,
   174  	}
   175  
   176  	client := baseClient{}
   177  	err = client.DoUpdate(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
   178  	assert.ErrorContains(t, err, "pick the version you")
   179  }
   180  
   181  func TestDoUpdateImageMiscError(t *testing.T) {
   182  	ctx := context.Background()
   183  	tmpdir, err := ioutil.TempDir("", "enginedir")
   184  	assert.NilError(t, err)
   185  	defer os.RemoveAll(tmpdir)
   186  	metadata := clitypes.RuntimeMetadata{EngineImage: clitypes.EnterpriseEngineImage}
   187  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
   188  	assert.NilError(t, err)
   189  	opts := clitypes.EngineInitOptions{
   190  		EngineVersion:      "engineversiongoeshere",
   191  		RegistryPrefix:     "registryprefixgoeshere",
   192  		ConfigFile:         "/tmp/configfilegoeshere",
   193  		EngineImage:        "testnamegoeshere",
   194  		RuntimeMetadataDir: tmpdir,
   195  	}
   196  	client := baseClient{
   197  		cclient: &fakeContainerdClient{
   198  			getImageFunc: func(ctx context.Context, ref string) (containerd.Image, error) {
   199  				return nil, fmt.Errorf("something went wrong")
   200  
   201  			},
   202  		},
   203  	}
   204  
   205  	err = client.DoUpdate(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
   206  	assert.ErrorContains(t, err, "check for image")
   207  	assert.ErrorContains(t, err, "something went wrong")
   208  }
   209  
   210  func TestDoUpdatePullFail(t *testing.T) {
   211  	ctx := context.Background()
   212  	tmpdir, err := ioutil.TempDir("", "enginedir")
   213  	assert.NilError(t, err)
   214  	defer os.RemoveAll(tmpdir)
   215  	metadata := clitypes.RuntimeMetadata{EngineImage: clitypes.EnterpriseEngineImage}
   216  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
   217  	assert.NilError(t, err)
   218  	opts := clitypes.EngineInitOptions{
   219  		EngineVersion:      "engineversiongoeshere",
   220  		RegistryPrefix:     "registryprefixgoeshere",
   221  		ConfigFile:         "/tmp/configfilegoeshere",
   222  		EngineImage:        "testnamegoeshere",
   223  		RuntimeMetadataDir: tmpdir,
   224  	}
   225  	client := baseClient{
   226  		cclient: &fakeContainerdClient{
   227  			getImageFunc: func(ctx context.Context, ref string) (containerd.Image, error) {
   228  				return nil, errdefs.ErrNotFound
   229  
   230  			},
   231  			pullFunc: func(ctx context.Context, ref string, opts ...containerd.RemoteOpt) (containerd.Image, error) {
   232  				return nil, fmt.Errorf("pull failure")
   233  			},
   234  		},
   235  	}
   236  
   237  	err = client.DoUpdate(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
   238  	assert.ErrorContains(t, err, "unable to pull")
   239  	assert.ErrorContains(t, err, "pull failure")
   240  }
   241  
   242  func TestActivateDoUpdateVerifyImageName(t *testing.T) {
   243  	ctx := context.Background()
   244  	registryPrefix := "registryprefixgoeshere"
   245  	image := &fakeImage{
   246  		nameFunc: func() string {
   247  			return registryPrefix + "/ce-engine:engineversion"
   248  		},
   249  	}
   250  	container := &fakeContainer{
   251  		imageFunc: func(context.Context) (containerd.Image, error) {
   252  			return image, nil
   253  		},
   254  	}
   255  	requestedImage := "unset"
   256  	client := baseClient{
   257  		cclient: &fakeContainerdClient{
   258  			containersFunc: func(ctx context.Context, filters ...string) ([]containerd.Container, error) {
   259  				return []containerd.Container{container}, nil
   260  			},
   261  			getImageFunc: func(ctx context.Context, ref string) (containerd.Image, error) {
   262  				requestedImage = ref
   263  				return nil, fmt.Errorf("something went wrong")
   264  
   265  			},
   266  		},
   267  	}
   268  	tmpdir, err := ioutil.TempDir("", "enginedir")
   269  	assert.NilError(t, err)
   270  	defer os.RemoveAll(tmpdir)
   271  	metadata := clitypes.RuntimeMetadata{EngineImage: clitypes.EnterpriseEngineImage}
   272  	err = versions.WriteRuntimeMetadata(tmpdir, &metadata)
   273  	assert.NilError(t, err)
   274  
   275  	opts := clitypes.EngineInitOptions{
   276  		EngineVersion:      "engineversiongoeshere",
   277  		RegistryPrefix:     "registryprefixgoeshere",
   278  		EngineImage:        "testnamegoeshere",
   279  		ConfigFile:         "/tmp/configfilegoeshere",
   280  		RuntimeMetadataDir: tmpdir,
   281  	}
   282  
   283  	err = client.ActivateEngine(ctx, opts, command.NewOutStream(&bytes.Buffer{}), &types.AuthConfig{})
   284  	assert.ErrorContains(t, err, "check for image")
   285  	assert.ErrorContains(t, err, "something went wrong")
   286  	expectedImage := fmt.Sprintf("%s/%s:%s", opts.RegistryPrefix, opts.EngineImage, opts.EngineVersion)
   287  	assert.Assert(t, requestedImage == expectedImage, "%s != %s", requestedImage, expectedImage)
   288  }
   289  
   290  func TestGetReleaseNotesURL(t *testing.T) {
   291  	imageName := "bogus image name #$%&@!"
   292  	url := getReleaseNotesURL(imageName)
   293  	assert.Equal(t, url, clitypes.ReleaseNotePrefix+"/")
   294  	imageName = "foo.bar/valid/repowithouttag"
   295  	url = getReleaseNotesURL(imageName)
   296  	assert.Equal(t, url, clitypes.ReleaseNotePrefix+"/")
   297  	imageName = "foo.bar/valid/repowithouttag:tag123"
   298  	url = getReleaseNotesURL(imageName)
   299  	assert.Equal(t, url, clitypes.ReleaseNotePrefix+"/tag123")
   300  }