github.com/moby/docker@v26.1.3+incompatible/daemon/cluster/configs.go (about)

     1  package cluster // import "github.com/docker/docker/daemon/cluster"
     2  
     3  import (
     4  	"context"
     5  
     6  	apitypes "github.com/docker/docker/api/types"
     7  	types "github.com/docker/docker/api/types/swarm"
     8  	"github.com/docker/docker/daemon/cluster/convert"
     9  	swarmapi "github.com/moby/swarmkit/v2/api"
    10  	"google.golang.org/grpc"
    11  )
    12  
    13  // GetConfig returns a config from a managed swarm cluster
    14  func (c *Cluster) GetConfig(input string) (types.Config, error) {
    15  	var config *swarmapi.Config
    16  
    17  	if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
    18  		s, err := getConfig(ctx, state.controlClient, input)
    19  		if err != nil {
    20  			return err
    21  		}
    22  		config = s
    23  		return nil
    24  	}); err != nil {
    25  		return types.Config{}, err
    26  	}
    27  	return convert.ConfigFromGRPC(config), nil
    28  }
    29  
    30  // GetConfigs returns all configs of a managed swarm cluster.
    31  func (c *Cluster) GetConfigs(options apitypes.ConfigListOptions) ([]types.Config, error) {
    32  	c.mu.RLock()
    33  	defer c.mu.RUnlock()
    34  
    35  	state := c.currentNodeState()
    36  	if !state.IsActiveManager() {
    37  		return nil, c.errNoManager(state)
    38  	}
    39  
    40  	filters, err := newListConfigsFilters(options.Filters)
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	ctx := context.TODO()
    46  	ctx, cancel := c.getRequestContext(ctx)
    47  	defer cancel()
    48  
    49  	r, err := state.controlClient.ListConfigs(ctx,
    50  		&swarmapi.ListConfigsRequest{Filters: filters},
    51  		grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse))
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  
    56  	configs := []types.Config{}
    57  
    58  	for _, config := range r.Configs {
    59  		configs = append(configs, convert.ConfigFromGRPC(config))
    60  	}
    61  
    62  	return configs, nil
    63  }
    64  
    65  // CreateConfig creates a new config in a managed swarm cluster.
    66  func (c *Cluster) CreateConfig(s types.ConfigSpec) (string, error) {
    67  	var resp *swarmapi.CreateConfigResponse
    68  	if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
    69  		configSpec := convert.ConfigSpecToGRPC(s)
    70  
    71  		r, err := state.controlClient.CreateConfig(ctx,
    72  			&swarmapi.CreateConfigRequest{Spec: &configSpec})
    73  		if err != nil {
    74  			return err
    75  		}
    76  		resp = r
    77  		return nil
    78  	}); err != nil {
    79  		return "", err
    80  	}
    81  	return resp.Config.ID, nil
    82  }
    83  
    84  // RemoveConfig removes a config from a managed swarm cluster.
    85  func (c *Cluster) RemoveConfig(input string) 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  
    92  		req := &swarmapi.RemoveConfigRequest{
    93  			ConfigID: config.ID,
    94  		}
    95  
    96  		_, err = state.controlClient.RemoveConfig(ctx, req)
    97  		return err
    98  	})
    99  }
   100  
   101  // UpdateConfig updates a config in a managed swarm cluster.
   102  // Note: this is not exposed to the CLI but is available from the API only
   103  func (c *Cluster) UpdateConfig(input string, version uint64, spec types.ConfigSpec) error {
   104  	return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
   105  		config, err := getConfig(ctx, state.controlClient, input)
   106  		if err != nil {
   107  			return err
   108  		}
   109  
   110  		configSpec := convert.ConfigSpecToGRPC(spec)
   111  
   112  		_, err = state.controlClient.UpdateConfig(ctx,
   113  			&swarmapi.UpdateConfigRequest{
   114  				ConfigID: config.ID,
   115  				ConfigVersion: &swarmapi.Version{
   116  					Index: version,
   117  				},
   118  				Spec: &configSpec,
   119  			})
   120  		return err
   121  	})
   122  }