configs.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. // GetConfig returns a config from a managed swarm cluster
  11. func (c *Cluster) GetConfig(input string) (types.Config, error) {
  12. var config *swarmapi.Config
  13. if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  14. s, err := getConfig(ctx, state.controlClient, input)
  15. if err != nil {
  16. return err
  17. }
  18. config = s
  19. return nil
  20. }); err != nil {
  21. return types.Config{}, err
  22. }
  23. return convert.ConfigFromGRPC(config), nil
  24. }
  25. // GetConfigs returns all configs of a managed swarm cluster.
  26. func (c *Cluster) GetConfigs(options apitypes.ConfigListOptions) ([]types.Config, 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 := newListConfigsFilters(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.ListConfigs(ctx,
  41. &swarmapi.ListConfigsRequest{Filters: filters},
  42. grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse))
  43. if err != nil {
  44. return nil, err
  45. }
  46. configs := []types.Config{}
  47. for _, config := range r.Configs {
  48. configs = append(configs, convert.ConfigFromGRPC(config))
  49. }
  50. return configs, nil
  51. }
  52. // CreateConfig creates a new config in a managed swarm cluster.
  53. func (c *Cluster) CreateConfig(s types.ConfigSpec) (string, error) {
  54. var resp *swarmapi.CreateConfigResponse
  55. if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  56. configSpec := convert.ConfigSpecToGRPC(s)
  57. r, err := state.controlClient.CreateConfig(ctx,
  58. &swarmapi.CreateConfigRequest{Spec: &configSpec})
  59. if err != nil {
  60. return err
  61. }
  62. resp = r
  63. return nil
  64. }); err != nil {
  65. return "", err
  66. }
  67. return resp.Config.ID, nil
  68. }
  69. // RemoveConfig removes a config from a managed swarm cluster.
  70. func (c *Cluster) RemoveConfig(input string) error {
  71. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  72. config, err := getConfig(ctx, state.controlClient, input)
  73. if err != nil {
  74. return err
  75. }
  76. req := &swarmapi.RemoveConfigRequest{
  77. ConfigID: config.ID,
  78. }
  79. _, err = state.controlClient.RemoveConfig(ctx, req)
  80. return err
  81. })
  82. }
  83. // UpdateConfig updates a config 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) UpdateConfig(input string, version uint64, spec types.ConfigSpec) error {
  86. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  87. config, err := getConfig(ctx, state.controlClient, input)
  88. if err != nil {
  89. return err
  90. }
  91. configSpec := convert.ConfigSpecToGRPC(spec)
  92. _, err = state.controlClient.UpdateConfig(ctx,
  93. &swarmapi.UpdateConfigRequest{
  94. ConfigID: config.ID,
  95. ConfigVersion: &swarmapi.Version{
  96. Index: version,
  97. },
  98. Spec: &configSpec,
  99. })
  100. return err
  101. })
  102. }