github.com/olljanat/moby@v1.13.1/cli/command/service/parse.go (about)

     1  package service
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/docker/docker/api/types"
     7  	"github.com/docker/docker/api/types/filters"
     8  	swarmtypes "github.com/docker/docker/api/types/swarm"
     9  	"github.com/docker/docker/client"
    10  	"golang.org/x/net/context"
    11  )
    12  
    13  // ParseSecrets retrieves the secrets from the requested names and converts
    14  // them to secret references to use with the spec
    15  func ParseSecrets(client client.SecretAPIClient, requestedSecrets []*types.SecretRequestOption) ([]*swarmtypes.SecretReference, error) {
    16  	secretRefs := make(map[string]*swarmtypes.SecretReference)
    17  	ctx := context.Background()
    18  
    19  	for _, secret := range requestedSecrets {
    20  		if _, exists := secretRefs[secret.Target]; exists {
    21  			return nil, fmt.Errorf("duplicate secret target for %s not allowed", secret.Source)
    22  		}
    23  		secretRef := &swarmtypes.SecretReference{
    24  			File: &swarmtypes.SecretReferenceFileTarget{
    25  				Name: secret.Target,
    26  				UID:  secret.UID,
    27  				GID:  secret.GID,
    28  				Mode: secret.Mode,
    29  			},
    30  			SecretName: secret.Source,
    31  		}
    32  
    33  		secretRefs[secret.Target] = secretRef
    34  	}
    35  
    36  	args := filters.NewArgs()
    37  	for _, s := range secretRefs {
    38  		args.Add("names", s.SecretName)
    39  	}
    40  
    41  	secrets, err := client.SecretList(ctx, types.SecretListOptions{
    42  		Filters: args,
    43  	})
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  
    48  	foundSecrets := make(map[string]string)
    49  	for _, secret := range secrets {
    50  		foundSecrets[secret.Spec.Annotations.Name] = secret.ID
    51  	}
    52  
    53  	addedSecrets := []*swarmtypes.SecretReference{}
    54  
    55  	for _, ref := range secretRefs {
    56  		id, ok := foundSecrets[ref.SecretName]
    57  		if !ok {
    58  			return nil, fmt.Errorf("secret not found: %s", ref.SecretName)
    59  		}
    60  
    61  		// set the id for the ref to properly assign in swarm
    62  		// since swarm needs the ID instead of the name
    63  		ref.SecretID = id
    64  		addedSecrets = append(addedSecrets, ref)
    65  	}
    66  
    67  	return addedSecrets, nil
    68  }