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 }