parse.go 1.8 KB

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