github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/domain/infra/abi/secrets.go (about)

     1  package abi
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"io/ioutil"
     7  	"path/filepath"
     8  
     9  	"github.com/hanks177/podman/v4/pkg/domain/entities"
    10  	"github.com/hanks177/podman/v4/pkg/domain/utils"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  func (ic *ContainerEngine) SecretCreate(ctx context.Context, name string, reader io.Reader, options entities.SecretCreateOptions) (*entities.SecretCreateReport, error) {
    15  	data, _ := ioutil.ReadAll(reader)
    16  	secretsPath := ic.Libpod.GetSecretsStorageDir()
    17  	manager, err := ic.Libpod.SecretsManager()
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	// set defaults from config for the case they are not set by an upper layer
    23  	// (-> i.e. tests that talk directly to the api)
    24  	cfg, err := ic.Libpod.GetConfigNoCopy()
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  	if options.Driver == "" {
    29  		options.Driver = cfg.Secrets.Driver
    30  	}
    31  	if len(options.DriverOpts) == 0 {
    32  		options.DriverOpts = cfg.Secrets.Opts
    33  	}
    34  	if options.DriverOpts == nil {
    35  		options.DriverOpts = make(map[string]string)
    36  	}
    37  
    38  	if options.Driver == "file" {
    39  		if _, ok := options.DriverOpts["path"]; !ok {
    40  			options.DriverOpts["path"] = filepath.Join(secretsPath, "filedriver")
    41  		}
    42  	}
    43  
    44  	secretID, err := manager.Store(name, data, options.Driver, options.DriverOpts)
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  	return &entities.SecretCreateReport{
    49  		ID: secretID,
    50  	}, nil
    51  }
    52  
    53  func (ic *ContainerEngine) SecretInspect(ctx context.Context, nameOrIDs []string) ([]*entities.SecretInfoReport, []error, error) {
    54  	manager, err := ic.Libpod.SecretsManager()
    55  	if err != nil {
    56  		return nil, nil, err
    57  	}
    58  	errs := make([]error, 0, len(nameOrIDs))
    59  	reports := make([]*entities.SecretInfoReport, 0, len(nameOrIDs))
    60  	for _, nameOrID := range nameOrIDs {
    61  		secret, err := manager.Lookup(nameOrID)
    62  		if err != nil {
    63  			if errors.Cause(err).Error() == "no such secret" {
    64  				errs = append(errs, err)
    65  				continue
    66  			} else {
    67  				return nil, nil, errors.Wrapf(err, "error inspecting secret %s", nameOrID)
    68  			}
    69  		}
    70  		report := &entities.SecretInfoReport{
    71  			ID:        secret.ID,
    72  			CreatedAt: secret.CreatedAt,
    73  			UpdatedAt: secret.CreatedAt,
    74  			Spec: entities.SecretSpec{
    75  				Name: secret.Name,
    76  				Driver: entities.SecretDriverSpec{
    77  					Name:    secret.Driver,
    78  					Options: secret.DriverOptions,
    79  				},
    80  			},
    81  		}
    82  		reports = append(reports, report)
    83  	}
    84  
    85  	return reports, errs, nil
    86  }
    87  
    88  func (ic *ContainerEngine) SecretList(ctx context.Context, opts entities.SecretListRequest) ([]*entities.SecretInfoReport, error) {
    89  	manager, err := ic.Libpod.SecretsManager()
    90  	if err != nil {
    91  		return nil, err
    92  	}
    93  	secretList, err := manager.List()
    94  	if err != nil {
    95  		return nil, err
    96  	}
    97  	report := make([]*entities.SecretInfoReport, 0, len(secretList))
    98  	for _, secret := range secretList {
    99  		result, err := utils.IfPassesSecretsFilter(secret, opts.Filters)
   100  		if err != nil {
   101  			return nil, err
   102  		}
   103  		if result {
   104  			reportItem := entities.SecretInfoReport{
   105  				ID:        secret.ID,
   106  				CreatedAt: secret.CreatedAt,
   107  				UpdatedAt: secret.CreatedAt,
   108  				Spec: entities.SecretSpec{
   109  					Name: secret.Name,
   110  					Driver: entities.SecretDriverSpec{
   111  						Name:    secret.Driver,
   112  						Options: secret.DriverOptions,
   113  					},
   114  				},
   115  			}
   116  			report = append(report, &reportItem)
   117  		}
   118  	}
   119  	return report, nil
   120  }
   121  
   122  func (ic *ContainerEngine) SecretRm(ctx context.Context, nameOrIDs []string, options entities.SecretRmOptions) ([]*entities.SecretRmReport, error) {
   123  	var (
   124  		err      error
   125  		toRemove []string
   126  		reports  = []*entities.SecretRmReport{}
   127  	)
   128  	manager, err := ic.Libpod.SecretsManager()
   129  	if err != nil {
   130  		return nil, err
   131  	}
   132  	toRemove = nameOrIDs
   133  	if options.All {
   134  		allSecrs, err := manager.List()
   135  		if err != nil {
   136  			return nil, err
   137  		}
   138  		for _, secr := range allSecrs {
   139  			toRemove = append(toRemove, secr.ID)
   140  		}
   141  	}
   142  	for _, nameOrID := range toRemove {
   143  		deletedID, err := manager.Delete(nameOrID)
   144  		if err == nil || errors.Cause(err).Error() == "no such secret" {
   145  			reports = append(reports, &entities.SecretRmReport{
   146  				Err: err,
   147  				ID:  deletedID,
   148  			})
   149  			continue
   150  		} else {
   151  			return nil, err
   152  		}
   153  	}
   154  
   155  	return reports, nil
   156  }