...

Source file src/github.com/docker/distribution/registry/storage/vacuum.go

Documentation: github.com/docker/distribution/registry/storage

     1  package storage
     2  
     3  import (
     4  	"context"
     5  	"path"
     6  
     7  	dcontext "github.com/docker/distribution/context"
     8  	"github.com/docker/distribution/registry/storage/driver"
     9  	"github.com/opencontainers/go-digest"
    10  )
    11  
    12  // vacuum contains functions for cleaning up repositories and blobs
    13  // These functions will only reliably work on strongly consistent
    14  // storage systems.
    15  // https://en.wikipedia.org/wiki/Consistency_model
    16  
    17  // NewVacuum creates a new Vacuum
    18  func NewVacuum(ctx context.Context, driver driver.StorageDriver) Vacuum {
    19  	return Vacuum{
    20  		ctx:    ctx,
    21  		driver: driver,
    22  	}
    23  }
    24  
    25  // Vacuum removes content from the filesystem
    26  type Vacuum struct {
    27  	driver driver.StorageDriver
    28  	ctx    context.Context
    29  }
    30  
    31  // RemoveBlob removes a blob from the filesystem
    32  func (v Vacuum) RemoveBlob(dgst string) error {
    33  	d, err := digest.Parse(dgst)
    34  	if err != nil {
    35  		return err
    36  	}
    37  
    38  	blobPath, err := pathFor(blobPathSpec{digest: d})
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	dcontext.GetLogger(v.ctx).Infof("Deleting blob: %s", blobPath)
    44  
    45  	err = v.driver.Delete(v.ctx, blobPath)
    46  	if err != nil {
    47  		return err
    48  	}
    49  
    50  	return nil
    51  }
    52  
    53  // RemoveManifest removes a manifest from the filesystem
    54  func (v Vacuum) RemoveManifest(name string, dgst digest.Digest, tags []string) error {
    55  	// remove a tag manifest reference, in case of not found continue to next one
    56  	for _, tag := range tags {
    57  
    58  		tagsPath, err := pathFor(manifestTagIndexEntryPathSpec{name: name, revision: dgst, tag: tag})
    59  		if err != nil {
    60  			return err
    61  		}
    62  
    63  		_, err = v.driver.Stat(v.ctx, tagsPath)
    64  		if err != nil {
    65  			switch err := err.(type) {
    66  			case driver.PathNotFoundError:
    67  				continue
    68  			default:
    69  				return err
    70  			}
    71  		}
    72  		dcontext.GetLogger(v.ctx).Infof("deleting manifest tag reference: %s", tagsPath)
    73  		err = v.driver.Delete(v.ctx, tagsPath)
    74  		if err != nil {
    75  			return err
    76  		}
    77  	}
    78  
    79  	manifestPath, err := pathFor(manifestRevisionPathSpec{name: name, revision: dgst})
    80  	if err != nil {
    81  		return err
    82  	}
    83  	dcontext.GetLogger(v.ctx).Infof("deleting manifest: %s", manifestPath)
    84  	return v.driver.Delete(v.ctx, manifestPath)
    85  }
    86  
    87  // RemoveRepository removes a repository directory from the
    88  // filesystem
    89  func (v Vacuum) RemoveRepository(repoName string) error {
    90  	rootForRepository, err := pathFor(repositoriesRootPathSpec{})
    91  	if err != nil {
    92  		return err
    93  	}
    94  	repoDir := path.Join(rootForRepository, repoName)
    95  	dcontext.GetLogger(v.ctx).Infof("Deleting repo: %s", repoDir)
    96  	err = v.driver.Delete(v.ctx, repoDir)
    97  	if err != nil {
    98  		return err
    99  	}
   100  
   101  	return nil
   102  }
   103  

View as plain text