secrets.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package cluster
  2. import (
  3. apitypes "github.com/docker/docker/api/types"
  4. types "github.com/docker/docker/api/types/swarm"
  5. "github.com/docker/docker/daemon/cluster/convert"
  6. swarmapi "github.com/docker/swarmkit/api"
  7. "golang.org/x/net/context"
  8. )
  9. // GetSecret returns a secret from a managed swarm cluster
  10. func (c *Cluster) GetSecret(input string) (types.Secret, error) {
  11. var secret *swarmapi.Secret
  12. if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  13. s, err := getSecret(ctx, state.controlClient, input)
  14. if err != nil {
  15. return err
  16. }
  17. secret = s
  18. return nil
  19. }); err != nil {
  20. return types.Secret{}, err
  21. }
  22. return convert.SecretFromGRPC(secret), nil
  23. }
  24. // GetSecrets returns all secrets of a managed swarm cluster.
  25. func (c *Cluster) GetSecrets(options apitypes.SecretListOptions) ([]types.Secret, error) {
  26. c.mu.RLock()
  27. defer c.mu.RUnlock()
  28. state := c.currentNodeState()
  29. if !state.IsActiveManager() {
  30. return nil, c.errNoManager(state)
  31. }
  32. filters, err := newListSecretsFilters(options.Filters)
  33. if err != nil {
  34. return nil, err
  35. }
  36. ctx, cancel := c.getRequestContext()
  37. defer cancel()
  38. r, err := state.controlClient.ListSecrets(ctx,
  39. &swarmapi.ListSecretsRequest{Filters: filters})
  40. if err != nil {
  41. return nil, err
  42. }
  43. secrets := make([]types.Secret, 0, len(r.Secrets))
  44. for _, secret := range r.Secrets {
  45. secrets = append(secrets, convert.SecretFromGRPC(secret))
  46. }
  47. return secrets, nil
  48. }
  49. // CreateSecret creates a new secret in a managed swarm cluster.
  50. func (c *Cluster) CreateSecret(s types.SecretSpec) (string, error) {
  51. var resp *swarmapi.CreateSecretResponse
  52. if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  53. secretSpec := convert.SecretSpecToGRPC(s)
  54. r, err := state.controlClient.CreateSecret(ctx,
  55. &swarmapi.CreateSecretRequest{Spec: &secretSpec})
  56. if err != nil {
  57. return err
  58. }
  59. resp = r
  60. return nil
  61. }); err != nil {
  62. return "", err
  63. }
  64. return resp.Secret.ID, nil
  65. }
  66. // RemoveSecret removes a secret from a managed swarm cluster.
  67. func (c *Cluster) RemoveSecret(input string) error {
  68. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  69. secret, err := getSecret(ctx, state.controlClient, input)
  70. if err != nil {
  71. return err
  72. }
  73. req := &swarmapi.RemoveSecretRequest{
  74. SecretID: secret.ID,
  75. }
  76. _, err = state.controlClient.RemoveSecret(ctx, req)
  77. return err
  78. })
  79. }
  80. // UpdateSecret updates a secret in a managed swarm cluster.
  81. // Note: this is not exposed to the CLI but is available from the API only
  82. func (c *Cluster) UpdateSecret(input string, version uint64, spec types.SecretSpec) error {
  83. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  84. secret, err := getSecret(ctx, state.controlClient, input)
  85. if err != nil {
  86. return err
  87. }
  88. secretSpec := convert.SecretSpecToGRPC(spec)
  89. _, err = state.controlClient.UpdateSecret(ctx,
  90. &swarmapi.UpdateSecretRequest{
  91. SecretID: secret.ID,
  92. SecretVersion: &swarmapi.Version{
  93. Index: version,
  94. },
  95. Spec: &secretSpec,
  96. })
  97. return err
  98. })
  99. }