get.porter.sh/porter@v1.3.0/pkg/generator/credentials.go (about) 1 package generator 2 3 import ( 4 "errors" 5 "fmt" 6 "sort" 7 "strings" 8 9 "get.porter.sh/porter/pkg/secrets" 10 "get.porter.sh/porter/pkg/storage" 11 "github.com/cnabio/cnab-go/bundle" 12 ) 13 14 // GenerateCredentialsOptions are the options to generate a Credential Set 15 type GenerateCredentialsOptions struct { 16 GenerateOptions 17 18 // Credentials from the bundle 19 Credentials map[string]bundle.Credential 20 } 21 22 // GenerateCredentials will generate a credential set based on the given options 23 func GenerateCredentials(opts GenerateCredentialsOptions) (storage.CredentialSet, error) { 24 if opts.Name == "" { 25 return storage.CredentialSet{}, errors.New("credentialset name is required") 26 } 27 generator := genSurvey 28 if opts.Silent { 29 generator = genEmptySet 30 } 31 credSet, err := genCredentialSet(opts.Namespace, opts.Name, opts.Credentials, generator) 32 if err != nil { 33 return storage.CredentialSet{}, err 34 } 35 36 credSet.Labels = opts.Labels 37 return credSet, nil 38 } 39 40 func genCredentialSet(namespace string, name string, creds map[string]bundle.Credential, fn generator) (storage.CredentialSet, error) { 41 cs := storage.NewCredentialSet(namespace, name) 42 cs.Credentials = []secrets.SourceMap{} 43 44 if strings.ContainsAny(name, "./\\") { 45 return cs, fmt.Errorf("credentialset name '%s' cannot contain the following characters: './\\'", name) 46 } 47 48 var credentialNames []string 49 for name := range creds { 50 credentialNames = append(credentialNames, name) 51 } 52 53 sort.Strings(credentialNames) 54 55 for _, name := range credentialNames { 56 c, err := fn(name, surveyCredentials, withRequired(creds[name].Required), withDescription(creds[name].Description)) 57 if err != nil { 58 return cs, err 59 } 60 cs.Credentials = append(cs.Credentials, c) 61 } 62 63 return cs, nil 64 }