github.com/openshift/moby-moby@v1.13.2-0.20170601211448-f5ec1e2936dc/cli/command/service/parse.go (about) 1 package service 2 3 import ( 4 "fmt" 5 6 "github.com/docker/docker/api/types" 7 "github.com/docker/docker/api/types/filters" 8 swarmtypes "github.com/docker/docker/api/types/swarm" 9 "github.com/docker/docker/client" 10 "golang.org/x/net/context" 11 ) 12 13 // ParseSecrets retrieves the secrets from the requested names and converts 14 // them to secret references to use with the spec 15 func ParseSecrets(client client.SecretAPIClient, requestedSecrets []*types.SecretRequestOption) ([]*swarmtypes.SecretReference, error) { 16 secretRefs := make(map[string]*swarmtypes.SecretReference) 17 ctx := context.Background() 18 19 for _, secret := range requestedSecrets { 20 if _, exists := secretRefs[secret.Target]; exists { 21 return nil, fmt.Errorf("duplicate secret target for %s not allowed", secret.Source) 22 } 23 secretRef := &swarmtypes.SecretReference{ 24 File: &swarmtypes.SecretReferenceFileTarget{ 25 Name: secret.Target, 26 UID: secret.UID, 27 GID: secret.GID, 28 Mode: secret.Mode, 29 }, 30 SecretName: secret.Source, 31 } 32 33 secretRefs[secret.Target] = secretRef 34 } 35 36 args := filters.NewArgs() 37 for _, s := range secretRefs { 38 args.Add("names", s.SecretName) 39 } 40 41 secrets, err := client.SecretList(ctx, types.SecretListOptions{ 42 Filters: args, 43 }) 44 if err != nil { 45 return nil, err 46 } 47 48 foundSecrets := make(map[string]string) 49 for _, secret := range secrets { 50 foundSecrets[secret.Spec.Annotations.Name] = secret.ID 51 } 52 53 addedSecrets := []*swarmtypes.SecretReference{} 54 55 for _, ref := range secretRefs { 56 id, ok := foundSecrets[ref.SecretName] 57 if !ok { 58 return nil, fmt.Errorf("secret not found: %s", ref.SecretName) 59 } 60 61 // set the id for the ref to properly assign in swarm 62 // since swarm needs the ID instead of the name 63 ref.SecretID = id 64 addedSecrets = append(addedSecrets, ref) 65 } 66 67 return addedSecrets, nil 68 }