secrets.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 := context.TODO()
  38. ctx, cancel := c.getRequestContext(ctx)
  39. defer cancel()
  40. r, err := state.controlClient.ListSecrets(ctx,
  41. &swarmapi.ListSecretsRequest{Filters: filters},
  42. grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse),
  43. )
  44. if err != nil {
  45. return nil, err
  46. }
  47. secrets := make([]types.Secret, 0, len(r.Secrets))
  48. for _, secret := range r.Secrets {
  49. secrets = append(secrets, convert.SecretFromGRPC(secret))
  50. }
  51. return secrets, nil
  52. }
  53. // CreateSecret creates a new secret in a managed swarm cluster.
  54. func (c *Cluster) CreateSecret(s types.SecretSpec) (string, error) {
  55. var resp *swarmapi.CreateSecretResponse
  56. if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  57. secretSpec := convert.SecretSpecToGRPC(s)
  58. r, err := state.controlClient.CreateSecret(ctx,
  59. &swarmapi.CreateSecretRequest{Spec: &secretSpec})
  60. if err != nil {
  61. return err
  62. }
  63. resp = r
  64. return nil
  65. }); err != nil {
  66. return "", err
  67. }
  68. return resp.Secret.ID, nil
  69. }
  70. // RemoveSecret removes a secret from a managed swarm cluster.
  71. func (c *Cluster) RemoveSecret(input string) error {
  72. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  73. secret, err := getSecret(ctx, state.controlClient, input)
  74. if err != nil {
  75. return err
  76. }
  77. req := &swarmapi.RemoveSecretRequest{
  78. SecretID: secret.ID,
  79. }
  80. _, err = state.controlClient.RemoveSecret(ctx, req)
  81. return err
  82. })
  83. }
  84. // UpdateSecret updates a secret in a managed swarm cluster.
  85. // Note: this is not exposed to the CLI but is available from the API only
  86. func (c *Cluster) UpdateSecret(input string, version uint64, spec types.SecretSpec) error {
  87. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  88. secret, err := getSecret(ctx, state.controlClient, input)
  89. if err != nil {
  90. return err
  91. }
  92. secretSpec := convert.SecretSpecToGRPC(spec)
  93. _, err = state.controlClient.UpdateSecret(ctx,
  94. &swarmapi.UpdateSecretRequest{
  95. SecretID: secret.ID,
  96. SecretVersion: &swarmapi.Version{
  97. Index: version,
  98. },
  99. Spec: &secretSpec,
  100. })
  101. return err
  102. })
  103. }