trust sign: add --local flag

Signed-off-by: Kyle Spiers <kyle@spiers.me>
This commit is contained in:
Kyle Spiers 2017-09-29 09:51:45 -07:00
parent 107f6c6ab2
commit f5a50650d6
3 changed files with 31 additions and 5 deletions

View File

@ -18,19 +18,29 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
type signOptions struct {
local bool
imageName string
}
func newSignCommand(dockerCli command.Cli) *cobra.Command { func newSignCommand(dockerCli command.Cli) *cobra.Command {
options := signOptions{}
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "sign IMAGE:TAG", Use: "sign IMAGE:TAG",
Short: "Sign an image", Short: "Sign an image",
Args: cli.ExactArgs(1), Args: cli.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
return runSignImage(dockerCli, args[0]) options.imageName = args[0]
return runSignImage(dockerCli, options)
}, },
} }
flags := cmd.Flags()
flags.BoolVar(&options.local, "local", false, "Sign a locally tagged image")
return cmd return cmd
} }
func runSignImage(cli command.Cli, imageName string) error { func runSignImage(cli command.Cli, options signOptions) error {
imageName := options.imageName
ctx := context.Background() ctx := context.Background()
imgRefAndAuth, err := trust.GetImageReferencesAndAuth(ctx, image.AuthResolver(cli), imageName) imgRefAndAuth, err := trust.GetImageReferencesAndAuth(ctx, image.AuthResolver(cli), imageName)
if err != nil { if err != nil {
@ -71,13 +81,15 @@ func runSignImage(cli command.Cli, imageName string) error {
} }
requestPrivilege := command.RegistryAuthenticationPrivilegedFunc(cli, imgRefAndAuth.RepoInfo().Index, "push") requestPrivilege := command.RegistryAuthenticationPrivilegedFunc(cli, imgRefAndAuth.RepoInfo().Index, "push")
target, err := createTarget(notaryRepo, imgRefAndAuth.Tag()) target, err := createTarget(notaryRepo, imgRefAndAuth.Tag())
if err != nil { if err != nil || options.local {
switch err := err.(type) { switch err := err.(type) {
case client.ErrNoSuchTarget, client.ErrRepositoryNotExist: // If the error is nil then the local flag is set
case client.ErrNoSuchTarget, client.ErrRepositoryNotExist, nil:
// Fail fast if the image doesn't exist locally // Fail fast if the image doesn't exist locally
if err := checkLocalImageExistence(ctx, cli, imageName); err != nil { if err := checkLocalImageExistence(ctx, cli, imageName); err != nil {
return err return err
} }
fmt.Fprintf(cli.Err(), "Signing and pushing trust data for local image %s, may overwrite remote trust data\n", imageName)
return image.TrustedPush(ctx, cli, imgRefAndAuth.RepoInfo(), imgRefAndAuth.Reference(), *imgRefAndAuth.AuthConfig(), requestPrivilege) return image.TrustedPush(ctx, cli, imgRefAndAuth.RepoInfo(), imgRefAndAuth.Reference(), *imgRefAndAuth.AuthConfig(), requestPrivilege)
default: default:
return err return err

View File

@ -295,3 +295,13 @@ func TestSignCommandChangeListIsCleanedOnError(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, len(cl.List()), 0) assert.Equal(t, len(cl.List()), 0)
} }
func TestSignCommandLocalFlag(t *testing.T) {
cli := test.NewFakeCli(&fakeClient{})
cli.SetNotaryClient(getEmptyTargetsNotaryRepository)
cmd := newSignCommand(cli)
cmd.SetArgs([]string{"--local", "reg-name.io/image:red"})
cmd.SetOutput(ioutil.Discard)
testutil.ErrorContains(t, cmd.Execute(), "error during connect: Get /images/reg-name.io/image:red/json: unsupported protocol scheme")
}

View File

@ -16,10 +16,14 @@ keywords: "sign, notary, trust"
# trust sign # trust sign
```markdown ```markdown
Usage: docker trust sign IMAGE:TAG Usage: docker trust sign [OPTIONS] IMAGE:TAG
Sign an image Sign an image
Options:
--help print usage
--local force the signing of a local image
``` ```
## Description ## Description