push.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package plugin
  2. import (
  3. "fmt"
  4. "golang.org/x/net/context"
  5. "github.com/docker/distribution/reference"
  6. "github.com/docker/docker/cli"
  7. "github.com/docker/docker/cli/command"
  8. "github.com/docker/docker/cli/command/image"
  9. "github.com/docker/docker/pkg/jsonmessage"
  10. "github.com/docker/docker/registry"
  11. "github.com/spf13/cobra"
  12. )
  13. func newPushCommand(dockerCli *command.DockerCli) *cobra.Command {
  14. cmd := &cobra.Command{
  15. Use: "push [OPTIONS] PLUGIN[:TAG]",
  16. Short: "Push a plugin to a registry",
  17. Args: cli.ExactArgs(1),
  18. RunE: func(cmd *cobra.Command, args []string) error {
  19. return runPush(dockerCli, args[0])
  20. },
  21. }
  22. flags := cmd.Flags()
  23. command.AddTrustSigningFlags(flags)
  24. return cmd
  25. }
  26. func runPush(dockerCli *command.DockerCli, name string) error {
  27. named, err := reference.ParseNormalizedNamed(name)
  28. if err != nil {
  29. return err
  30. }
  31. if _, ok := named.(reference.Canonical); ok {
  32. return fmt.Errorf("invalid name: %s", name)
  33. }
  34. taggedRef, ok := named.(reference.NamedTagged)
  35. if !ok {
  36. taggedRef = reference.EnsureTagged(named)
  37. }
  38. ctx := context.Background()
  39. repoInfo, err := registry.ParseRepositoryInfo(named)
  40. if err != nil {
  41. return err
  42. }
  43. authConfig := command.ResolveAuthConfig(ctx, dockerCli, repoInfo.Index)
  44. encodedAuth, err := command.EncodeAuthToBase64(authConfig)
  45. if err != nil {
  46. return err
  47. }
  48. responseBody, err := dockerCli.Client().PluginPush(ctx, reference.FamiliarString(taggedRef), encodedAuth)
  49. if err != nil {
  50. return err
  51. }
  52. defer responseBody.Close()
  53. if command.IsTrusted() {
  54. repoInfo.Class = "plugin"
  55. return image.PushTrustedReference(dockerCli, repoInfo, named, authConfig, responseBody)
  56. }
  57. return jsonmessage.DisplayJSONMessagesToStream(responseBody, dockerCli.Out(), nil)
  58. }