github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/e2e/images_test.go (about)

     1  package e2e
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"path/filepath"
     8  	"regexp"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/opencontainers/go-digest"
    13  
    14  	"gotest.tools/fs"
    15  
    16  	"gotest.tools/assert"
    17  	"gotest.tools/icmd"
    18  )
    19  
    20  func insertBundles(t *testing.T, cmd icmd.Cmd) {
    21  	// Push an application so that we can later pull it by digest
    22  	cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "my.registry:5000/c-myapp", filepath.Join("testdata", "push-pull"))
    23  	icmd.RunCmd(cmd).Assert(t, icmd.Success)
    24  	cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "b-simple-app", filepath.Join("testdata", "simple"))
    25  	icmd.RunCmd(cmd).Assert(t, icmd.Success)
    26  	cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "a-simple-app", filepath.Join("testdata", "simple"))
    27  	icmd.RunCmd(cmd).Assert(t, icmd.Success)
    28  }
    29  
    30  func assertImageListOutput(t *testing.T, cmd icmd.Cmd, expected string) {
    31  	result := icmd.RunCmd(cmd).Assert(t, icmd.Success)
    32  	stdout := result.Stdout()
    33  	match, err := regexp.MatchString(expected, stdout)
    34  	assert.NilError(t, err)
    35  	assert.Assert(t, match, expected, stdout)
    36  }
    37  
    38  func expectImageListOutput(t *testing.T, cmd icmd.Cmd, output string) {
    39  	cmd.Command = dockerCli.Command("app", "image", "ls")
    40  	assertImageListOutput(t, cmd, output)
    41  }
    42  
    43  func expectImageListDigestsOutput(t *testing.T, cmd icmd.Cmd, output string) {
    44  	cmd.Command = dockerCli.Command("app", "image", "ls", "--digests")
    45  	assertImageListOutput(t, cmd, output)
    46  }
    47  
    48  func verifyImageIDListOutput(t *testing.T, cmd icmd.Cmd, expectedCount int) {
    49  	cmd.Command = dockerCli.Command("app", "image", "ls", "-q")
    50  	result := icmd.RunCmd(cmd).Assert(t, icmd.Success)
    51  	scanner := bufio.NewScanner(strings.NewReader(result.Stdout()))
    52  	count := 0
    53  	for scanner.Scan() {
    54  		count++
    55  	}
    56  	if err := scanner.Err(); err != nil {
    57  		assert.Error(t, err, "Verification failed")
    58  	}
    59  	assert.Equal(t, expectedCount, count)
    60  }
    61  
    62  func TestImageList(t *testing.T) {
    63  	runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) {
    64  		cmd := info.configuredCmd
    65  
    66  		insertBundles(t, cmd)
    67  
    68  		expected := `REPOSITORY                 TAG                 APP IMAGE ID        APP NAME            
    69  a-simple-app               latest              [a-f0-9]{12}        simple              
    70  b-simple-app               latest              [a-f0-9]{12}        simple              
    71  my.registry:5000/c-myapp   latest              [a-f0-9]{12}        push-pull           
    72  `
    73  
    74  		expectImageListOutput(t, cmd, expected)
    75  	})
    76  }
    77  
    78  func TestImageListQuiet(t *testing.T) {
    79  	runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) {
    80  		cmd := info.configuredCmd
    81  		insertBundles(t, cmd)
    82  		verifyImageIDListOutput(t, cmd, 3)
    83  	})
    84  }
    85  
    86  func TestImageListDigests(t *testing.T) {
    87  	runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) {
    88  		cmd := info.configuredCmd
    89  		insertBundles(t, cmd)
    90  		expected := `REPOSITORY                 TAG                 DIGEST              APP IMAGE ID        APP NAME                                
    91  a-simple-app               latest              <none>              [a-f0-9]{12}        simple                                  
    92  b-simple-app               latest              <none>              [a-f0-9]{12}        simple                                  
    93  my.registry:5000/c-myapp   latest              <none>              [a-f0-9]{12}        push-pull                               
    94  `
    95  		expectImageListDigestsOutput(t, cmd, expected)
    96  	})
    97  }
    98  
    99  func TestImageRmForce(t *testing.T) {
   100  	runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) {
   101  		cmd := info.configuredCmd
   102  		iidfile := fs.NewFile(t, "iid").Path()
   103  
   104  		cmd.Command = dockerCli.Command("app", "build", "--no-resolve-image", "--tag", "a-simple-app", "--iidfile", iidfile, filepath.Join("testdata", "simple"))
   105  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   106  		cmd.Command = dockerCli.Command("app", "image", "tag", "a-simple-app", "b-simple-app")
   107  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   108  		cmd.Command = dockerCli.Command("app", "image", "tag", "a-simple-app", "c-simple-app")
   109  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   110  
   111  		bytes, err := ioutil.ReadFile(iidfile)
   112  		assert.NilError(t, err)
   113  
   114  		imageID := digest.Digest(bytes).Encoded()
   115  		cmd.Command = dockerCli.Command("app", "image", "rm", imageID)
   116  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   117  			ExitCode: 1,
   118  			Err:      fmt.Sprintf("Error: unable to delete %q - App is referenced in multiple repositories", imageID),
   119  		})
   120  
   121  		cmd.Command = dockerCli.Command("app", "image", "rm", "--force", imageID)
   122  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   123  
   124  		expectedOutput := "REPOSITORY          TAG                 APP IMAGE ID        APP NAME            \n"
   125  		expectImageListOutput(t, cmd, expectedOutput)
   126  	})
   127  }
   128  
   129  func TestImageRm(t *testing.T) {
   130  	runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) {
   131  		cmd := info.configuredCmd
   132  
   133  		insertBundles(t, cmd)
   134  
   135  		cmd.Command = dockerCli.Command("app", "image", "rm", "my.registry:5000/c-myapp:latest")
   136  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   137  			ExitCode: 0,
   138  			Out:      "Deleted: my.registry:5000/c-myapp:latest",
   139  		})
   140  
   141  		cmd.Command = dockerCli.Command("app", "image", "rm", "a-simple-app", "b-simple-app:latest")
   142  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   143  			ExitCode: 0,
   144  			Out: `Deleted: a-simple-app:latest
   145  Deleted: b-simple-app:latest`,
   146  		})
   147  
   148  		cmd.Command = dockerCli.Command("app", "image", "rm", "b-simple-app")
   149  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   150  			ExitCode: 1,
   151  			Err:      `b-simple-app: reference not found`,
   152  		})
   153  
   154  		expectedOutput := "REPOSITORY          TAG                 APP IMAGE ID        APP NAME            \n"
   155  		expectImageListOutput(t, cmd, expectedOutput)
   156  	})
   157  }
   158  
   159  func TestImageTag(t *testing.T) {
   160  	runWithDindSwarmAndRegistry(t, func(info dindSwarmAndRegistryInfo) {
   161  		cmd := info.configuredCmd
   162  
   163  		dockerAppImageTag := func(args ...string) {
   164  			cmdArgs := append([]string{"app", "image", "tag"}, args...)
   165  			cmd.Command = dockerCli.Command(cmdArgs...)
   166  		}
   167  
   168  		// given a first available image
   169  		cmd.Command = dockerCli.Command("app", "build", "--tag", "a-simple-app", filepath.Join("testdata", "simple"))
   170  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   171  
   172  		singleImageExpectation := `REPOSITORY          TAG                 APP IMAGE ID        APP NAME            
   173  a-simple-app        latest              [a-f0-9]{12}        simple              
   174  `
   175  		expectImageListOutput(t, cmd, singleImageExpectation)
   176  
   177  		// with no argument
   178  		dockerAppImageTag()
   179  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   180  			ExitCode: 1,
   181  			Err:      `"docker app image tag" requires exactly 2 arguments.`,
   182  		})
   183  
   184  		// with one argument
   185  		dockerAppImageTag("a-simple-app")
   186  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   187  			ExitCode: 1,
   188  			Err:      `"docker app image tag" requires exactly 2 arguments.`,
   189  		})
   190  
   191  		// with invalid src reference
   192  		dockerAppImageTag("a-simple-app$2", "b-simple-app")
   193  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   194  			ExitCode: 1,
   195  			Err:      `could not parse "a-simple-app$2" as a valid reference`,
   196  		})
   197  
   198  		// with invalid target reference
   199  		dockerAppImageTag("a-simple-app", "b@simple-app")
   200  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   201  			ExitCode: 1,
   202  			Err:      `could not parse "b@simple-app" as a valid reference`,
   203  		})
   204  
   205  		// with unexisting source image
   206  		dockerAppImageTag("b-simple-app", "target")
   207  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   208  			ExitCode: 1,
   209  			Err:      `could not tag "b-simple-app": no such App image`,
   210  		})
   211  
   212  		// with unexisting source tag
   213  		dockerAppImageTag("a-simple-app:not-a-tag", "target")
   214  		icmd.RunCmd(cmd).Assert(t, icmd.Expected{
   215  			ExitCode: 1,
   216  			Err:      `could not tag "a-simple-app:not-a-tag": no such App image`,
   217  		})
   218  
   219  		// tag image with only names
   220  		dockerAppImageTag("a-simple-app", "b-simple-app")
   221  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   222  		expectImageListOutput(t, cmd, `REPOSITORY          TAG                 APP IMAGE ID        APP NAME            
   223  a-simple-app        latest              [a-f0-9]{12}        simple              
   224  b-simple-app        latest              [a-f0-9]{12}        simple              
   225  `)
   226  
   227  		// target tag
   228  		dockerAppImageTag("a-simple-app", "a-simple-app:0.1")
   229  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   230  		expectImageListOutput(t, cmd, `REPOSITORY          TAG                 APP IMAGE ID        APP NAME            
   231  a-simple-app        0.1                 [a-f0-9]{12}        simple              
   232  a-simple-app        latest              [a-f0-9]{12}        simple              
   233  b-simple-app        latest              [a-f0-9]{12}        simple              
   234  `)
   235  
   236  		// source tag
   237  		dockerAppImageTag("a-simple-app:0.1", "c-simple-app")
   238  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   239  		expectImageListOutput(t, cmd, `REPOSITORY          TAG                 APP IMAGE ID        APP NAME            
   240  a-simple-app        0.1                 [a-f0-9]{12}        simple              
   241  a-simple-app        latest              [a-f0-9]{12}        simple              
   242  b-simple-app        latest              [a-f0-9]{12}        simple              
   243  c-simple-app        latest              [a-f0-9]{12}        simple              
   244  `)
   245  
   246  		// source and target tags
   247  		dockerAppImageTag("a-simple-app:0.1", "b-simple-app:0.2")
   248  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   249  		expectImageListOutput(t, cmd, `REPOSITORY          TAG                 APP IMAGE ID        APP NAME            
   250  a-simple-app        0.1                 [a-f0-9]{12}        simple              
   251  a-simple-app        latest              [a-f0-9]{12}        simple              
   252  b-simple-app        0.2                 [a-f0-9]{12}        simple              
   253  b-simple-app        latest              [a-f0-9]{12}        simple              
   254  c-simple-app        latest              [a-f0-9]{12}        simple              
   255  `)
   256  
   257  		// given a new application
   258  		cmd.Command = dockerCli.Command("app", "build", "--tag", "push-pull", filepath.Join("testdata", "push-pull"))
   259  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   260  		expectImageListOutput(t, cmd, `REPOSITORY          TAG                 APP IMAGE ID        APP NAME            
   261  a-simple-app        0.1                 [a-f0-9]{12}        simple              
   262  a-simple-app        latest              [a-f0-9]{12}        simple              
   263  b-simple-app        0.2                 [a-f0-9]{12}        simple              
   264  b-simple-app        latest              [a-f0-9]{12}        simple              
   265  c-simple-app        latest              [a-f0-9]{12}        simple              
   266  push-pull           latest              [a-f0-9]{12}        push-pull           
   267  `)
   268  
   269  		// can be tagged to an existing tag
   270  		dockerAppImageTag("push-pull", "b-simple-app:0.2")
   271  		icmd.RunCmd(cmd).Assert(t, icmd.Success)
   272  		expectImageListOutput(t, cmd, `REPOSITORY          TAG                 APP IMAGE ID        APP NAME            
   273  a-simple-app        0.1                 [a-f0-9]{12}        simple              
   274  a-simple-app        latest              [a-f0-9]{12}        simple              
   275  b-simple-app        0.2                 [a-f0-9]{12}        push-pull           
   276  b-simple-app        latest              [a-f0-9]{12}        simple              
   277  c-simple-app        latest              [a-f0-9]{12}        simple              
   278  push-pull           latest              [a-f0-9]{12}        push-pull           
   279  `)
   280  	})
   281  }