drone/registry/app/storage/storageservice.go

94 lines
2.6 KiB
Go

// Source: https://github.com/distribution/distribution
// Copyright 2014 https://github.com/distribution/distribution Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package storage
import (
"context"
"github.com/harness/gitness/registry/app/driver"
"github.com/opencontainers/go-digest"
)
type Service struct {
deleteEnabled bool
resumableDigestEnabled bool
redirect bool
driver driver.StorageDriver
}
// Option is the type used for functional options for NewRegistry.
type Option func(*Service) error
// EnableRedirect is a functional option for NewRegistry. It causes the backend
// blob server to attempt using (StorageDriver).RedirectURL to serve all blobs.
func EnableRedirect(registry *Service) error {
registry.redirect = true
return nil
}
// EnableDelete is a functional option for NewRegistry. It enables deletion on
// the registry.
func EnableDelete(registry *Service) error {
registry.deleteEnabled = true
return nil
}
func NewStorageService(driver driver.StorageDriver, options ...Option) (*Service, error) {
registry := &Service{
resumableDigestEnabled: true,
driver: driver,
}
for _, option := range options {
if err := option(registry); err != nil {
return nil, err
}
}
return registry, nil
}
func (storage *Service) OciBlobsStore(ctx context.Context, repoKey string, rootParentRef string) OciBlobStore {
return &ociBlobStore{
repoKey: repoKey,
ctx: ctx,
driver: storage.driver,
pathFn: PathFn,
redirect: storage.redirect,
deleteEnabled: storage.deleteEnabled,
resumableDigestEnabled: storage.resumableDigestEnabled,
rootParentRef: rootParentRef,
}
}
// path returns the canonical path for the blob identified by digest. The blob
// may or may not exist.
func PathFn(pathPrefix string, dgst digest.Digest) (string, error) {
bp, err := pathFor(
blobDataPathSpec{
digest: dgst,
path: pathPrefix,
},
)
if err != nil {
return "", err
}
return bp, nil
}