secrets.go 3.2 KB

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