add --from-file flag to docker-registry secret

This commit is contained in:
juanvallejo 2018-03-05 14:15:46 -05:00
parent 808545a8aa
commit ae51a45d70
No known key found for this signature in database
GPG Key ID: 7D2C958002D6448D
2 changed files with 42 additions and 23 deletions

View File

@ -171,6 +171,7 @@ func NewCmdCreateSecretDockerRegistry(f cmdutil.Factory, cmdOut io.Writer) *cobr
cmd.Flags().String("docker-email", "", i18n.T("Email for Docker registry")) cmd.Flags().String("docker-email", "", i18n.T("Email for Docker registry"))
cmd.Flags().String("docker-server", "https://index.docker.io/v1/", i18n.T("Server location for Docker registry")) cmd.Flags().String("docker-server", "https://index.docker.io/v1/", i18n.T("Server location for Docker registry"))
cmd.Flags().Bool("append-hash", false, "Append a hash of the secret to its name.") cmd.Flags().Bool("append-hash", false, "Append a hash of the secret to its name.")
cmd.Flags().StringSlice("from-file", []string{}, "Key files can be specified using their file path, in which case a default name will be given to them, or optionally with a name and file path, in which case the given name will be used. Specifying a directory will iterate each named file in the directory that is a valid secret key.")
cmdutil.AddInclude3rdPartyFlags(cmd) cmdutil.AddInclude3rdPartyFlags(cmd)
return cmd return cmd
@ -182,22 +183,27 @@ func CreateSecretDockerRegistry(f cmdutil.Factory, cmdOut io.Writer, cmd *cobra.
if err != nil { if err != nil {
return err return err
} }
requiredFlags := []string{"docker-username", "docker-password", "docker-server"} fromFileFlag := cmdutil.GetFlagStringSlice(cmd, "from-file")
for _, requiredFlag := range requiredFlags { if len(fromFileFlag) == 0 {
if value := cmdutil.GetFlagString(cmd, requiredFlag); len(value) == 0 { requiredFlags := []string{"docker-username", "docker-password", "docker-server"}
return cmdutil.UsageErrorf(cmd, "flag %s is required", requiredFlag) for _, requiredFlag := range requiredFlags {
if value := cmdutil.GetFlagString(cmd, requiredFlag); len(value) == 0 {
return cmdutil.UsageErrorf(cmd, "flag %s is required", requiredFlag)
}
} }
} }
var generator kubectl.StructuredGenerator var generator kubectl.StructuredGenerator
switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName {
case cmdutil.SecretForDockerRegistryV1GeneratorName: case cmdutil.SecretForDockerRegistryV1GeneratorName:
generator = &kubectl.SecretForDockerRegistryGeneratorV1{ generator = &kubectl.SecretForDockerRegistryGeneratorV1{
Name: name, Name: name,
Username: cmdutil.GetFlagString(cmd, "docker-username"), Username: cmdutil.GetFlagString(cmd, "docker-username"),
Email: cmdutil.GetFlagString(cmd, "docker-email"), Email: cmdutil.GetFlagString(cmd, "docker-email"),
Password: cmdutil.GetFlagString(cmd, "docker-password"), Password: cmdutil.GetFlagString(cmd, "docker-password"),
Server: cmdutil.GetFlagString(cmd, "docker-server"), Server: cmdutil.GetFlagString(cmd, "docker-server"),
AppendHash: cmdutil.GetFlagBool(cmd, "append-hash"), AppendHash: cmdutil.GetFlagBool(cmd, "append-hash"),
FileSources: cmdutil.GetFlagStringSlice(cmd, "from-file"),
} }
default: default:
return errUnsupportedGenerator(cmd, generatorName) return errUnsupportedGenerator(cmd, generatorName)

View File

@ -30,6 +30,8 @@ import (
type SecretForDockerRegistryGeneratorV1 struct { type SecretForDockerRegistryGeneratorV1 struct {
// Name of secret (required) // Name of secret (required)
Name string Name string
// FileSources to derive the secret from (optional)
FileSources []string
// Username for registry (required) // Username for registry (required)
Username string Username string
// Email for registry (optional) // Email for registry (optional)
@ -85,15 +87,22 @@ func (s SecretForDockerRegistryGeneratorV1) StructuredGenerate() (runtime.Object
if err := s.validate(); err != nil { if err := s.validate(); err != nil {
return nil, err return nil, err
} }
dockercfgJsonContent, err := handleDockerCfgJsonContent(s.Username, s.Password, s.Email, s.Server)
if err != nil {
return nil, err
}
secret := &v1.Secret{} secret := &v1.Secret{}
secret.Name = s.Name secret.Name = s.Name
secret.Type = v1.SecretTypeDockerConfigJson secret.Type = v1.SecretTypeDockerConfigJson
secret.Data = map[string][]byte{} secret.Data = map[string][]byte{}
secret.Data[v1.DockerConfigJsonKey] = dockercfgJsonContent if len(s.FileSources) > 0 {
if err := handleFromFileSources(secret, s.FileSources); err != nil {
return nil, err
}
}
if len(s.FileSources) == 0 {
dockercfgJsonContent, err := handleDockerCfgJsonContent(s.Username, s.Password, s.Email, s.Server)
if err != nil {
return nil, err
}
secret.Data[v1.DockerConfigJsonKey] = dockercfgJsonContent
}
if s.AppendHash { if s.AppendHash {
h, err := hash.SecretHash(secret) h, err := hash.SecretHash(secret)
if err != nil { if err != nil {
@ -108,6 +117,7 @@ func (s SecretForDockerRegistryGeneratorV1) StructuredGenerate() (runtime.Object
func (s SecretForDockerRegistryGeneratorV1) ParamNames() []GeneratorParam { func (s SecretForDockerRegistryGeneratorV1) ParamNames() []GeneratorParam {
return []GeneratorParam{ return []GeneratorParam{
{"name", true}, {"name", true},
{"from-file", false},
{"docker-username", true}, {"docker-username", true},
{"docker-email", false}, {"docker-email", false},
{"docker-password", true}, {"docker-password", true},
@ -121,14 +131,17 @@ func (s SecretForDockerRegistryGeneratorV1) validate() error {
if len(s.Name) == 0 { if len(s.Name) == 0 {
return fmt.Errorf("name must be specified") return fmt.Errorf("name must be specified")
} }
if len(s.Username) == 0 {
return fmt.Errorf("username must be specified") if len(s.FileSources) == 0 {
} if len(s.Username) == 0 {
if len(s.Password) == 0 { return fmt.Errorf("username must be specified")
return fmt.Errorf("password must be specified") }
} if len(s.Password) == 0 {
if len(s.Server) == 0 { return fmt.Errorf("password must be specified")
return fmt.Errorf("server must be specified") }
if len(s.Server) == 0 {
return fmt.Errorf("server must be specified")
}
} }
return nil return nil
} }