mirror of
https://github.com/goharbor/harbor.git
synced 2024-12-18 14:47:38 +01:00
Merge pull request #10736 from ywk253100/200216_cnab_resolver
Implement the resolver for CNAB
This commit is contained in:
commit
7ffa7cd940
@ -27,15 +27,8 @@ import (
|
|||||||
"github.com/goharbor/harbor/src/pkg/artifact"
|
"github.com/goharbor/harbor/src/pkg/artifact"
|
||||||
"github.com/goharbor/harbor/src/pkg/repository"
|
"github.com/goharbor/harbor/src/pkg/repository"
|
||||||
"github.com/opencontainers/image-spec/specs-go/v1"
|
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArtifactTypeUnknown defines the type for the unknown artifacts
|
|
||||||
const ArtifactTypeUnknown = "UNKNOWN"
|
|
||||||
|
|
||||||
var artifactTypeRegExp = regexp.MustCompile(`^application/vnd\.[^.]*\.(.*)\.config\.[^.]*\+json$`)
|
|
||||||
|
|
||||||
// Abstractor abstracts the specific information for different types of artifacts
|
// Abstractor abstracts the specific information for different types of artifacts
|
||||||
type Abstractor interface {
|
type Abstractor interface {
|
||||||
// AbstractMetadata abstracts the metadata for the specific artifact type into the artifact model,
|
// AbstractMetadata abstracts the metadata for the specific artifact type into the artifact model,
|
||||||
@ -60,8 +53,6 @@ type abstractor struct {
|
|||||||
blobFetcher blob.Fetcher
|
blobFetcher blob.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO try CNAB, how to forbid CNAB
|
|
||||||
|
|
||||||
// TODO add white list for supported artifact type
|
// TODO add white list for supported artifact type
|
||||||
func (a *abstractor) AbstractMetadata(ctx context.Context, artifact *artifact.Artifact) error {
|
func (a *abstractor) AbstractMetadata(ctx context.Context, artifact *artifact.Artifact) error {
|
||||||
repository, err := a.repoMgr.Get(ctx, artifact.RepositoryID)
|
repository, err := a.repoMgr.Get(ctx, artifact.RepositoryID)
|
||||||
@ -101,9 +92,8 @@ func (a *abstractor) AbstractMetadata(ctx context.Context, artifact *artifact.Ar
|
|||||||
artifact.Annotations = manifest.Annotations
|
artifact.Annotations = manifest.Annotations
|
||||||
// OCI index/docker manifest list
|
// OCI index/docker manifest list
|
||||||
case v1.MediaTypeImageIndex, manifestlist.MediaTypeManifestList:
|
case v1.MediaTypeImageIndex, manifestlist.MediaTypeManifestList:
|
||||||
// the identity of index is still in progress, only handle image index for now
|
// the identity of index is still in progress, we use the manifest mediaType
|
||||||
// and use the manifestMediaType as the media type of artifact
|
// as the media type of artifact
|
||||||
// If we want to support CNAB, we should get the media type from annotation
|
|
||||||
artifact.MediaType = artifact.ManifestMediaType
|
artifact.MediaType = artifact.ManifestMediaType
|
||||||
|
|
||||||
index := &v1.Index{}
|
index := &v1.Index{}
|
||||||
@ -115,7 +105,15 @@ func (a *abstractor) AbstractMetadata(ctx context.Context, artifact *artifact.Ar
|
|||||||
|
|
||||||
// set annotations
|
// set annotations
|
||||||
artifact.Annotations = index.Annotations
|
artifact.Annotations = index.Annotations
|
||||||
// TODO handle references in resolvers
|
|
||||||
|
// Currently, CNAB put its media type inside the annotations
|
||||||
|
// try to parse the artifact media type from the annotations
|
||||||
|
if artifact.Annotations != nil {
|
||||||
|
mediaType := artifact.Annotations["org.opencontainers.artifactType"]
|
||||||
|
if len(mediaType) > 0 {
|
||||||
|
artifact.MediaType = mediaType
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unsupported manifest media type: %s", artifact.ManifestMediaType)
|
return fmt.Errorf("unsupported manifest media type: %s", artifact.ManifestMediaType)
|
||||||
}
|
}
|
||||||
@ -125,8 +123,6 @@ func (a *abstractor) AbstractMetadata(ctx context.Context, artifact *artifact.Ar
|
|||||||
return resolver.ResolveMetadata(ctx, content, artifact)
|
return resolver.ResolveMetadata(ctx, content, artifact)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if got no resolver, try to parse the artifact type based on the media type
|
|
||||||
artifact.Type = parseArtifactType(artifact.MediaType)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,12 +134,3 @@ func (a *abstractor) AbstractAddition(ctx context.Context, artifact *artifact.Ar
|
|||||||
}
|
}
|
||||||
return resolver.ResolveAddition(ctx, artifact, addition)
|
return resolver.ResolveAddition(ctx, artifact, addition)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseArtifactType(mediaType string) string {
|
|
||||||
strs := artifactTypeRegExp.FindStringSubmatch(mediaType)
|
|
||||||
if len(strs) == 2 {
|
|
||||||
return strings.ToUpper(strs[1])
|
|
||||||
}
|
|
||||||
// can not get the artifact type from the media type, return unknown
|
|
||||||
return ArtifactTypeUnknown
|
|
||||||
}
|
|
||||||
|
@ -284,28 +284,6 @@ func (a *abstractorTestSuite) TestAbstractMetadataOfUnsupported() {
|
|||||||
a.Require().NotNil(err)
|
a.Require().NotNil(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *abstractorTestSuite) TestParseArtifactType() {
|
|
||||||
mediaType := ""
|
|
||||||
typee := parseArtifactType(mediaType)
|
|
||||||
a.Equal(ArtifactTypeUnknown, typee)
|
|
||||||
|
|
||||||
mediaType = "unknown"
|
|
||||||
typee = parseArtifactType(mediaType)
|
|
||||||
a.Equal(ArtifactTypeUnknown, typee)
|
|
||||||
|
|
||||||
mediaType = "application/vnd.oci.image.config.v1+json"
|
|
||||||
typee = parseArtifactType(mediaType)
|
|
||||||
a.Equal("IMAGE", typee)
|
|
||||||
|
|
||||||
mediaType = "application/vnd.cncf.helm.chart.config.v1+json"
|
|
||||||
typee = parseArtifactType(mediaType)
|
|
||||||
a.Equal("HELM.CHART", typee)
|
|
||||||
|
|
||||||
mediaType = "application/vnd.sylabs.sif.config.v1+json"
|
|
||||||
typee = parseArtifactType(mediaType)
|
|
||||||
a.Equal("SIF", typee)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *abstractorTestSuite) TestAbstractAddition() {
|
func (a *abstractorTestSuite) TestAbstractAddition() {
|
||||||
resolver.Register(a.resolver, v1.MediaTypeImageConfig)
|
resolver.Register(a.resolver, v1.MediaTypeImageConfig)
|
||||||
// cannot get the resolver
|
// cannot get the resolver
|
||||||
|
130
src/api/artifact/abstractor/resolver/cnab/cnab.go
Normal file
130
src/api/artifact/abstractor/resolver/cnab/cnab.go
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
// Copyright Project Harbor 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 cnab
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/goharbor/harbor/src/api/artifact/abstractor/blob"
|
||||||
|
resolv "github.com/goharbor/harbor/src/api/artifact/abstractor/resolver"
|
||||||
|
"github.com/goharbor/harbor/src/api/artifact/descriptor"
|
||||||
|
"github.com/goharbor/harbor/src/common/utils/log"
|
||||||
|
ierror "github.com/goharbor/harbor/src/internal/error"
|
||||||
|
"github.com/goharbor/harbor/src/pkg/artifact"
|
||||||
|
"github.com/goharbor/harbor/src/pkg/repository"
|
||||||
|
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// const definitions
|
||||||
|
const (
|
||||||
|
ArtifactTypeCNAB = "CNAB"
|
||||||
|
mediaType = "application/vnd.cnab.manifest.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
resolver := &resolver{
|
||||||
|
repoMgr: repository.Mgr,
|
||||||
|
argMgr: artifact.Mgr,
|
||||||
|
blobFetcher: blob.Fcher,
|
||||||
|
}
|
||||||
|
if err := resolv.Register(resolver, mediaType); err != nil {
|
||||||
|
log.Errorf("failed to register resolver for media type %s: %v", mediaType, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := descriptor.Register(resolver, mediaType); err != nil {
|
||||||
|
log.Errorf("failed to register descriptor for media type %s: %v", mediaType, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type resolver struct {
|
||||||
|
repoMgr repository.Manager
|
||||||
|
argMgr artifact.Manager
|
||||||
|
blobFetcher blob.Fetcher
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolver) ResolveMetadata(ctx context.Context, manifest []byte, art *artifact.Artifact) error {
|
||||||
|
index := &v1.Index{}
|
||||||
|
if err := json.Unmarshal(manifest, index); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cfgManiDgt := ""
|
||||||
|
// populate the referenced artifacts
|
||||||
|
for _, mani := range index.Manifests {
|
||||||
|
digest := mani.Digest.String()
|
||||||
|
// make sure the child artifact exist
|
||||||
|
ar, err := r.argMgr.GetByDigest(ctx, art.RepositoryID, digest)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
art.References = append(art.References, &artifact.Reference{
|
||||||
|
ChildID: ar.ID,
|
||||||
|
Platform: mani.Platform,
|
||||||
|
})
|
||||||
|
// try to get the digest of the manifest that the config layer is referenced by
|
||||||
|
if mani.Annotations != nil &&
|
||||||
|
mani.Annotations["io.cnab.manifest.type"] == "config" {
|
||||||
|
cfgManiDgt = mani.Digest.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(cfgManiDgt) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolve the config of CNAB
|
||||||
|
repository, err := r.repoMgr.Get(ctx, art.RepositoryID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// get the manifest that the config layer is referenced by
|
||||||
|
_, cfgMani, err := r.blobFetcher.FetchManifest(repository.Name, cfgManiDgt)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
m := &v1.Manifest{}
|
||||||
|
if err := json.Unmarshal(cfgMani, m); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cfgDgt := m.Config.Digest.String()
|
||||||
|
// get the config layer
|
||||||
|
cfg, err := r.blobFetcher.FetchLayer(repository.Name, cfgDgt)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
metadata := map[string]interface{}{}
|
||||||
|
if err := json.Unmarshal(cfg, &metadata); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if art.ExtraAttrs == nil {
|
||||||
|
art.ExtraAttrs = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
for k, v := range metadata {
|
||||||
|
art.ExtraAttrs[k] = v
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolver) ResolveAddition(ctx context.Context, artifact *artifact.Artifact, addition string) (*resolv.Addition, error) {
|
||||||
|
return nil, ierror.New(nil).WithCode(ierror.BadRequestCode).
|
||||||
|
WithMessage("addition %s isn't supported for %s", addition, ArtifactTypeCNAB)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolver) GetArtifactType() string {
|
||||||
|
return ArtifactTypeCNAB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolver) ListAdditionTypes() []string {
|
||||||
|
return nil
|
||||||
|
}
|
144
src/api/artifact/abstractor/resolver/cnab/cnab_test.go
Normal file
144
src/api/artifact/abstractor/resolver/cnab/cnab_test.go
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
// Copyright Project Harbor 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 cnab
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goharbor/harbor/src/common/models"
|
||||||
|
ierror "github.com/goharbor/harbor/src/internal/error"
|
||||||
|
"github.com/goharbor/harbor/src/pkg/artifact"
|
||||||
|
"github.com/goharbor/harbor/src/testing/api/artifact/abstractor/blob"
|
||||||
|
testingartifact "github.com/goharbor/harbor/src/testing/pkg/artifact"
|
||||||
|
"github.com/goharbor/harbor/src/testing/pkg/repository"
|
||||||
|
"github.com/stretchr/testify/suite"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type resolverTestSuite struct {
|
||||||
|
suite.Suite
|
||||||
|
resolver *resolver
|
||||||
|
repoMgr *repository.FakeManager
|
||||||
|
artMgr *testingartifact.FakeManager
|
||||||
|
blobFetcher *blob.FakeFetcher
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolverTestSuite) SetupTest() {
|
||||||
|
r.repoMgr = &repository.FakeManager{}
|
||||||
|
r.artMgr = &testingartifact.FakeManager{}
|
||||||
|
r.blobFetcher = &blob.FakeFetcher{}
|
||||||
|
r.resolver = &resolver{
|
||||||
|
repoMgr: r.repoMgr,
|
||||||
|
argMgr: r.artMgr,
|
||||||
|
blobFetcher: r.blobFetcher,
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolverTestSuite) TestResolveMetadata() {
|
||||||
|
index := `{
|
||||||
|
"schemaVersion": 2,
|
||||||
|
"manifests": [
|
||||||
|
{
|
||||||
|
"mediaType": "application/vnd.oci.image.manifest.v1+json",
|
||||||
|
"digest": "sha256:b9616da7500f8c7c9a5e8d915714cd02d11bcc71ff5b4fd190bb77b1355c8549",
|
||||||
|
"size": 193,
|
||||||
|
"annotations": {
|
||||||
|
"io.cnab.manifest.type": "config"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
|
||||||
|
"digest": "sha256:a59a4e74d9cc89e4e75dfb2cc7ea5c108e4236ba6231b53081a9e2506d1197b6",
|
||||||
|
"size": 942,
|
||||||
|
"annotations": {
|
||||||
|
"io.cnab.manifest.type": "invocation"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"annotations": {
|
||||||
|
"io.cnab.keywords": "[\"helloworld\",\"cnab\",\"tutorial\"]",
|
||||||
|
"io.cnab.runtime_version": "v1.0.0",
|
||||||
|
"org.opencontainers.artifactType": "application/vnd.cnab.manifest.v1",
|
||||||
|
"org.opencontainers.image.authors": "[{\"name\":\"Jane Doe\",\"email\":\"jane.doe@example.com\",\"url\":\"https://example.com\"}]",
|
||||||
|
"org.opencontainers.image.description": "A short description of your bundle",
|
||||||
|
"org.opencontainers.image.title": "helloworld",
|
||||||
|
"org.opencontainers.image.version": "0.1.1"
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
manifest := `{
|
||||||
|
"schemaVersion": 2,
|
||||||
|
"config": {
|
||||||
|
"mediaType": "application/vnd.oci.image.config.v1+json",
|
||||||
|
"digest": "sha256:e91b9dfcbbb3b88bac94726f276b89de46e4460b55f6e6d6f876e666b150ec5b",
|
||||||
|
"size": 498
|
||||||
|
},
|
||||||
|
"layers": null
|
||||||
|
}`
|
||||||
|
config := `{
|
||||||
|
"description": "A short description of your bundle",
|
||||||
|
"invocationImages": [
|
||||||
|
{
|
||||||
|
"contentDigest": "sha256:a59a4e74d9cc89e4e75dfb2cc7ea5c108e4236ba6231b53081a9e2506d1197b6",
|
||||||
|
"image": "cnab/helloworld:0.1.1",
|
||||||
|
"imageType": "docker",
|
||||||
|
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
|
||||||
|
"size": 942
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"helloworld",
|
||||||
|
"cnab",
|
||||||
|
"tutorial"
|
||||||
|
],
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"email": "jane.doe@example.com",
|
||||||
|
"name": "Jane Doe",
|
||||||
|
"url": "https://example.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "helloworld",
|
||||||
|
"schemaVersion": "v1.0.0",
|
||||||
|
"version": "0.1.1"
|
||||||
|
}`
|
||||||
|
art := &artifact.Artifact{}
|
||||||
|
r.artMgr.On("GetByDigest").Return(&artifact.Artifact{ID: 1}, nil)
|
||||||
|
r.repoMgr.On("Get").Return(&models.RepoRecord{}, nil)
|
||||||
|
r.blobFetcher.On("FetchManifest").Return("", []byte(manifest), nil)
|
||||||
|
r.blobFetcher.On("FetchLayer").Return([]byte(config), nil)
|
||||||
|
err := r.resolver.ResolveMetadata(nil, []byte(index), art)
|
||||||
|
r.Require().Nil(err)
|
||||||
|
r.Len(art.References, 2)
|
||||||
|
r.Equal("0.1.1", art.ExtraAttrs["version"].(string))
|
||||||
|
r.Equal("helloworld", art.ExtraAttrs["name"].(string))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolverTestSuite) TestResolveAddition() {
|
||||||
|
_, err := r.resolver.ResolveAddition(nil, nil, "")
|
||||||
|
r.Require().NotNil(err)
|
||||||
|
r.True(ierror.IsErr(err, ierror.BadRequestCode))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolverTestSuite) TestGetArtifactType() {
|
||||||
|
r.Assert().Equal(ArtifactTypeCNAB, r.resolver.GetArtifactType())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *resolverTestSuite) TestListAdditionTypes() {
|
||||||
|
r.Nil(r.resolver.ListAdditionTypes())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResolverTestSuite(t *testing.T) {
|
||||||
|
suite.Run(t, &resolverTestSuite{})
|
||||||
|
}
|
@ -17,9 +17,6 @@ package artifact
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/goharbor/harbor/src/api/artifact/abstractor"
|
"github.com/goharbor/harbor/src/api/artifact/abstractor"
|
||||||
"github.com/goharbor/harbor/src/api/artifact/abstractor/resolver"
|
"github.com/goharbor/harbor/src/api/artifact/abstractor/resolver"
|
||||||
"github.com/goharbor/harbor/src/api/artifact/descriptor"
|
"github.com/goharbor/harbor/src/api/artifact/descriptor"
|
||||||
@ -36,11 +33,14 @@ import (
|
|||||||
"github.com/goharbor/harbor/src/pkg/registry"
|
"github.com/goharbor/harbor/src/pkg/registry"
|
||||||
"github.com/goharbor/harbor/src/pkg/signature"
|
"github.com/goharbor/harbor/src/pkg/signature"
|
||||||
"github.com/opencontainers/go-digest"
|
"github.com/opencontainers/go-digest"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
// registry image resolvers
|
// registry image resolvers
|
||||||
_ "github.com/goharbor/harbor/src/api/artifact/abstractor/resolver/image"
|
_ "github.com/goharbor/harbor/src/api/artifact/abstractor/resolver/image"
|
||||||
// register chart resolver
|
// register chart resolver
|
||||||
_ "github.com/goharbor/harbor/src/api/artifact/abstractor/resolver/chart"
|
_ "github.com/goharbor/harbor/src/api/artifact/abstractor/resolver/chart"
|
||||||
|
// register CNAB resolver
|
||||||
|
_ "github.com/goharbor/harbor/src/api/artifact/abstractor/resolver/cnab"
|
||||||
"github.com/goharbor/harbor/src/common/utils/log"
|
"github.com/goharbor/harbor/src/common/utils/log"
|
||||||
ierror "github.com/goharbor/harbor/src/internal/error"
|
ierror "github.com/goharbor/harbor/src/internal/error"
|
||||||
"github.com/goharbor/harbor/src/pkg/artifact"
|
"github.com/goharbor/harbor/src/pkg/artifact"
|
||||||
@ -170,11 +170,7 @@ func (c *controller) ensureArtifact(ctx context.Context, repositoryID int64, dig
|
|||||||
}
|
}
|
||||||
|
|
||||||
// populate the artifact type
|
// populate the artifact type
|
||||||
typee, err := descriptor.GetArtifactType(artifact.MediaType)
|
artifact.Type = descriptor.GetArtifactType(artifact.MediaType)
|
||||||
if err != nil {
|
|
||||||
return false, 0, err
|
|
||||||
}
|
|
||||||
artifact.Type = typee
|
|
||||||
|
|
||||||
// create it
|
// create it
|
||||||
id, err := c.artMgr.Create(ctx, artifact)
|
id, err := c.artMgr.Create(ctx, artifact)
|
||||||
@ -658,12 +654,7 @@ func (c *controller) populateImmutableStatus(ctx context.Context, tag *Tag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *controller) populateAdditionLinks(ctx context.Context, artifact *Artifact) {
|
func (c *controller) populateAdditionLinks(ctx context.Context, artifact *Artifact) {
|
||||||
types, err := descriptor.ListAdditionTypes(artifact.MediaType)
|
types := descriptor.ListAdditionTypes(artifact.MediaType)
|
||||||
if err != nil {
|
|
||||||
log.Error(err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(types) > 0 {
|
if len(types) > 0 {
|
||||||
version := internal.GetAPIVersion(ctx)
|
version := internal.GetAPIVersion(ctx)
|
||||||
for _, t := range types {
|
for _, t := range types {
|
||||||
|
@ -17,10 +17,16 @@ package descriptor
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/goharbor/harbor/src/common/utils/log"
|
"github.com/goharbor/harbor/src/common/utils/log"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ArtifactTypeUnknown defines the type for the unknown artifacts
|
||||||
|
const ArtifactTypeUnknown = "UNKNOWN"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
registry = map[string]Descriptor{}
|
registry = map[string]Descriptor{}
|
||||||
|
artifactTypeRegExp = regexp.MustCompile(`^application/vnd\.[^.]*\.(.*)\.config\.[^.]*\+json$`)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Descriptor describes the static information for one kind of media type
|
// Descriptor describes the static information for one kind of media type
|
||||||
@ -45,28 +51,34 @@ func Register(descriptor Descriptor, mediaTypes ...string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the descriptor according to the media type
|
// Get the descriptor according to the media type
|
||||||
func Get(mediaType string) (Descriptor, error) {
|
func Get(mediaType string) Descriptor {
|
||||||
descriptor := registry[mediaType]
|
return registry[mediaType]
|
||||||
if descriptor == nil {
|
|
||||||
return nil, fmt.Errorf("descriptor for media type %s not found", mediaType)
|
|
||||||
}
|
|
||||||
return descriptor, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetArtifactType gets the artifact type according to the media type
|
// GetArtifactType gets the artifact type according to the media type
|
||||||
func GetArtifactType(mediaType string) (string, error) {
|
func GetArtifactType(mediaType string) string {
|
||||||
descriptor, err := Get(mediaType)
|
descriptor := Get(mediaType)
|
||||||
if err != nil {
|
if descriptor != nil {
|
||||||
return "", err
|
return descriptor.GetArtifactType()
|
||||||
}
|
}
|
||||||
return descriptor.GetArtifactType(), nil
|
// if got no descriptor, try to parse the artifact type based on the media type
|
||||||
|
return parseArtifactType(mediaType)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListAdditionTypes lists the supported addition types according to the media type
|
// ListAdditionTypes lists the supported addition types according to the media type
|
||||||
func ListAdditionTypes(mediaType string) ([]string, error) {
|
func ListAdditionTypes(mediaType string) []string {
|
||||||
descriptor, err := Get(mediaType)
|
descriptor := Get(mediaType)
|
||||||
if err != nil {
|
if descriptor != nil {
|
||||||
return nil, err
|
return descriptor.ListAdditionTypes()
|
||||||
}
|
}
|
||||||
return descriptor.ListAdditionTypes(), nil
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseArtifactType(mediaType string) string {
|
||||||
|
strs := artifactTypeRegExp.FindStringSubmatch(mediaType)
|
||||||
|
if len(strs) == 2 {
|
||||||
|
return strings.ToUpper(strs[1])
|
||||||
|
}
|
||||||
|
// can not get the artifact type from the media type, return unknown
|
||||||
|
return ArtifactTypeUnknown
|
||||||
}
|
}
|
||||||
|
50
src/api/artifact/descriptor/descriptor_test.go
Normal file
50
src/api/artifact/descriptor/descriptor_test.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// Copyright Project Harbor 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 descriptor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/stretchr/testify/suite"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type descriptorTestSuite struct {
|
||||||
|
suite.Suite
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *descriptorTestSuite) TestParseArtifactType() {
|
||||||
|
mediaType := ""
|
||||||
|
typee := parseArtifactType(mediaType)
|
||||||
|
d.Equal(ArtifactTypeUnknown, typee)
|
||||||
|
|
||||||
|
mediaType = "unknown"
|
||||||
|
typee = parseArtifactType(mediaType)
|
||||||
|
d.Equal(ArtifactTypeUnknown, typee)
|
||||||
|
|
||||||
|
mediaType = "application/vnd.oci.image.config.v1+json"
|
||||||
|
typee = parseArtifactType(mediaType)
|
||||||
|
d.Equal("IMAGE", typee)
|
||||||
|
|
||||||
|
mediaType = "application/vnd.cncf.helm.chart.config.v1+json"
|
||||||
|
typee = parseArtifactType(mediaType)
|
||||||
|
d.Equal("HELM.CHART", typee)
|
||||||
|
|
||||||
|
mediaType = "application/vnd.sylabs.sif.config.v1+json"
|
||||||
|
typee = parseArtifactType(mediaType)
|
||||||
|
d.Equal("SIF", typee)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDescriptorTestSuite(t *testing.T) {
|
||||||
|
suite.Run(t, &descriptorTestSuite{})
|
||||||
|
}
|
@ -25,6 +25,8 @@ import (
|
|||||||
_ "github.com/docker/distribution/manifest/schema2"
|
_ "github.com/docker/distribution/manifest/schema2"
|
||||||
// manifestlist
|
// manifestlist
|
||||||
_ "github.com/docker/distribution/manifest/manifestlist"
|
_ "github.com/docker/distribution/manifest/manifestlist"
|
||||||
|
// oci schema
|
||||||
|
_ "github.com/docker/distribution/manifest/ocischema"
|
||||||
ref "github.com/docker/distribution/reference"
|
ref "github.com/docker/distribution/reference"
|
||||||
"github.com/goharbor/harbor/src/common/utils"
|
"github.com/goharbor/harbor/src/common/utils"
|
||||||
)
|
)
|
||||||
|
@ -88,8 +88,9 @@ func (r *Route) Handler(handler http.Handler) {
|
|||||||
middleware.WithMiddlewares(handler, middlewares...).
|
middleware.WithMiddlewares(handler, middlewares...).
|
||||||
ServeHTTP(ctx.ResponseWriter, ctx.Request)
|
ServeHTTP(ctx.ResponseWriter, ctx.Request)
|
||||||
})
|
})
|
||||||
|
|
||||||
if len(methods) == 0 {
|
if len(methods) == 0 {
|
||||||
beego.Any(r.path, filterFunc)
|
beego.Any(path, filterFunc)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, method := range methods {
|
for _, method := range methods {
|
||||||
|
107
src/vendor/github.com/docker/distribution/manifest/ocischema/builder.go
generated
vendored
Normal file
107
src/vendor/github.com/docker/distribution/manifest/ocischema/builder.go
generated
vendored
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
package ocischema
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/docker/distribution"
|
||||||
|
"github.com/docker/distribution/manifest"
|
||||||
|
"github.com/opencontainers/go-digest"
|
||||||
|
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Builder is a type for constructing manifests.
|
||||||
|
type Builder struct {
|
||||||
|
// bs is a BlobService used to publish the configuration blob.
|
||||||
|
bs distribution.BlobService
|
||||||
|
|
||||||
|
// configJSON references
|
||||||
|
configJSON []byte
|
||||||
|
|
||||||
|
// layers is a list of layer descriptors that gets built by successive
|
||||||
|
// calls to AppendReference.
|
||||||
|
layers []distribution.Descriptor
|
||||||
|
|
||||||
|
// Annotations contains arbitrary metadata relating to the targeted content.
|
||||||
|
annotations map[string]string
|
||||||
|
|
||||||
|
// For testing purposes
|
||||||
|
mediaType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewManifestBuilder is used to build new manifests for the current schema
|
||||||
|
// version. It takes a BlobService so it can publish the configuration blob
|
||||||
|
// as part of the Build process, and annotations.
|
||||||
|
func NewManifestBuilder(bs distribution.BlobService, configJSON []byte, annotations map[string]string) distribution.ManifestBuilder {
|
||||||
|
mb := &Builder{
|
||||||
|
bs: bs,
|
||||||
|
configJSON: make([]byte, len(configJSON)),
|
||||||
|
annotations: annotations,
|
||||||
|
mediaType: v1.MediaTypeImageManifest,
|
||||||
|
}
|
||||||
|
copy(mb.configJSON, configJSON)
|
||||||
|
|
||||||
|
return mb
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMediaType assigns the passed mediatype or error if the mediatype is not a
|
||||||
|
// valid media type for oci image manifests currently: "" or "application/vnd.oci.image.manifest.v1+json"
|
||||||
|
func (mb *Builder) SetMediaType(mediaType string) error {
|
||||||
|
if mediaType != "" && mediaType != v1.MediaTypeImageManifest {
|
||||||
|
return errors.New("Invalid media type for OCI image manifest")
|
||||||
|
}
|
||||||
|
|
||||||
|
mb.mediaType = mediaType
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build produces a final manifest from the given references.
|
||||||
|
func (mb *Builder) Build(ctx context.Context) (distribution.Manifest, error) {
|
||||||
|
m := Manifest{
|
||||||
|
Versioned: manifest.Versioned{
|
||||||
|
SchemaVersion: 2,
|
||||||
|
MediaType: mb.mediaType,
|
||||||
|
},
|
||||||
|
Layers: make([]distribution.Descriptor, len(mb.layers)),
|
||||||
|
Annotations: mb.annotations,
|
||||||
|
}
|
||||||
|
copy(m.Layers, mb.layers)
|
||||||
|
|
||||||
|
configDigest := digest.FromBytes(mb.configJSON)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
m.Config, err = mb.bs.Stat(ctx, configDigest)
|
||||||
|
switch err {
|
||||||
|
case nil:
|
||||||
|
// Override MediaType, since Put always replaces the specified media
|
||||||
|
// type with application/octet-stream in the descriptor it returns.
|
||||||
|
m.Config.MediaType = v1.MediaTypeImageConfig
|
||||||
|
return FromStruct(m)
|
||||||
|
case distribution.ErrBlobUnknown:
|
||||||
|
// nop
|
||||||
|
default:
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add config to the blob store
|
||||||
|
m.Config, err = mb.bs.Put(ctx, v1.MediaTypeImageConfig, mb.configJSON)
|
||||||
|
// Override MediaType, since Put always replaces the specified media
|
||||||
|
// type with application/octet-stream in the descriptor it returns.
|
||||||
|
m.Config.MediaType = v1.MediaTypeImageConfig
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return FromStruct(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendReference adds a reference to the current ManifestBuilder.
|
||||||
|
func (mb *Builder) AppendReference(d distribution.Describable) error {
|
||||||
|
mb.layers = append(mb.layers, d.Descriptor())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// References returns the current references added to this builder.
|
||||||
|
func (mb *Builder) References() []distribution.Descriptor {
|
||||||
|
return mb.layers
|
||||||
|
}
|
124
src/vendor/github.com/docker/distribution/manifest/ocischema/manifest.go
generated
vendored
Normal file
124
src/vendor/github.com/docker/distribution/manifest/ocischema/manifest.go
generated
vendored
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
package ocischema
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/docker/distribution"
|
||||||
|
"github.com/docker/distribution/manifest"
|
||||||
|
"github.com/opencontainers/go-digest"
|
||||||
|
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// SchemaVersion provides a pre-initialized version structure for this
|
||||||
|
// packages version of the manifest.
|
||||||
|
SchemaVersion = manifest.Versioned{
|
||||||
|
SchemaVersion: 2, // historical value here.. does not pertain to OCI or docker version
|
||||||
|
MediaType: v1.MediaTypeImageManifest,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
ocischemaFunc := func(b []byte) (distribution.Manifest, distribution.Descriptor, error) {
|
||||||
|
m := new(DeserializedManifest)
|
||||||
|
err := m.UnmarshalJSON(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, distribution.Descriptor{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dgst := digest.FromBytes(b)
|
||||||
|
return m, distribution.Descriptor{Digest: dgst, Size: int64(len(b)), MediaType: v1.MediaTypeImageManifest}, err
|
||||||
|
}
|
||||||
|
err := distribution.RegisterManifestSchema(v1.MediaTypeImageManifest, ocischemaFunc)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("Unable to register manifest: %s", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manifest defines a ocischema manifest.
|
||||||
|
type Manifest struct {
|
||||||
|
manifest.Versioned
|
||||||
|
|
||||||
|
// Config references the image configuration as a blob.
|
||||||
|
Config distribution.Descriptor `json:"config"`
|
||||||
|
|
||||||
|
// Layers lists descriptors for the layers referenced by the
|
||||||
|
// configuration.
|
||||||
|
Layers []distribution.Descriptor `json:"layers"`
|
||||||
|
|
||||||
|
// Annotations contains arbitrary metadata for the image manifest.
|
||||||
|
Annotations map[string]string `json:"annotations,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// References returns the descriptors of this manifests references.
|
||||||
|
func (m Manifest) References() []distribution.Descriptor {
|
||||||
|
references := make([]distribution.Descriptor, 0, 1+len(m.Layers))
|
||||||
|
references = append(references, m.Config)
|
||||||
|
references = append(references, m.Layers...)
|
||||||
|
return references
|
||||||
|
}
|
||||||
|
|
||||||
|
// Target returns the target of this manifest.
|
||||||
|
func (m Manifest) Target() distribution.Descriptor {
|
||||||
|
return m.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeserializedManifest wraps Manifest with a copy of the original JSON.
|
||||||
|
// It satisfies the distribution.Manifest interface.
|
||||||
|
type DeserializedManifest struct {
|
||||||
|
Manifest
|
||||||
|
|
||||||
|
// canonical is the canonical byte representation of the Manifest.
|
||||||
|
canonical []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromStruct takes a Manifest structure, marshals it to JSON, and returns a
|
||||||
|
// DeserializedManifest which contains the manifest and its JSON representation.
|
||||||
|
func FromStruct(m Manifest) (*DeserializedManifest, error) {
|
||||||
|
var deserialized DeserializedManifest
|
||||||
|
deserialized.Manifest = m
|
||||||
|
|
||||||
|
var err error
|
||||||
|
deserialized.canonical, err = json.MarshalIndent(&m, "", " ")
|
||||||
|
return &deserialized, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON populates a new Manifest struct from JSON data.
|
||||||
|
func (m *DeserializedManifest) UnmarshalJSON(b []byte) error {
|
||||||
|
m.canonical = make([]byte, len(b), len(b))
|
||||||
|
// store manifest in canonical
|
||||||
|
copy(m.canonical, b)
|
||||||
|
|
||||||
|
// Unmarshal canonical JSON into Manifest object
|
||||||
|
var manifest Manifest
|
||||||
|
if err := json.Unmarshal(m.canonical, &manifest); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if manifest.MediaType != "" && manifest.MediaType != v1.MediaTypeImageManifest {
|
||||||
|
return fmt.Errorf("if present, mediaType in manifest should be '%s' not '%s'",
|
||||||
|
v1.MediaTypeImageManifest, manifest.MediaType)
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Manifest = manifest
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON returns the contents of canonical. If canonical is empty,
|
||||||
|
// marshals the inner contents.
|
||||||
|
func (m *DeserializedManifest) MarshalJSON() ([]byte, error) {
|
||||||
|
if len(m.canonical) > 0 {
|
||||||
|
return m.canonical, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New("JSON representation not initialized in DeserializedManifest")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Payload returns the raw content of the manifest. The contents can be used to
|
||||||
|
// calculate the content identifier.
|
||||||
|
func (m DeserializedManifest) Payload() (string, []byte, error) {
|
||||||
|
return v1.MediaTypeImageManifest, m.canonical, nil
|
||||||
|
}
|
233
src/vendor/modules.txt
vendored
233
src/vendor/modules.txt
vendored
@ -14,82 +14,82 @@ github.com/Unknwon/goconfig
|
|||||||
github.com/agl/ed25519
|
github.com/agl/ed25519
|
||||||
github.com/agl/ed25519/edwards25519
|
github.com/agl/ed25519/edwards25519
|
||||||
# github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190726115642-cd293c93fd97
|
# github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190726115642-cd293c93fd97
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/services/cr
|
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests
|
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses
|
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider
|
||||||
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors
|
||||||
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests
|
||||||
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils
|
github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/signers
|
github.com/aliyun/alibaba-cloud-sdk-go/services/cr
|
||||||
# github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
|
# github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
|
||||||
github.com/asaskevich/govalidator
|
github.com/asaskevich/govalidator
|
||||||
# github.com/astaxie/beego v1.12.1
|
# github.com/astaxie/beego v1.12.1
|
||||||
|
github.com/astaxie/beego
|
||||||
github.com/astaxie/beego/cache
|
github.com/astaxie/beego/cache
|
||||||
github.com/astaxie/beego/cache/redis
|
github.com/astaxie/beego/cache/redis
|
||||||
github.com/astaxie/beego
|
|
||||||
github.com/astaxie/beego/validation
|
|
||||||
github.com/astaxie/beego/orm
|
|
||||||
github.com/astaxie/beego/session/redis
|
|
||||||
github.com/astaxie/beego/context
|
|
||||||
github.com/astaxie/beego/config
|
github.com/astaxie/beego/config
|
||||||
|
github.com/astaxie/beego/context
|
||||||
github.com/astaxie/beego/context/param
|
github.com/astaxie/beego/context/param
|
||||||
github.com/astaxie/beego/grace
|
github.com/astaxie/beego/grace
|
||||||
github.com/astaxie/beego/logs
|
github.com/astaxie/beego/logs
|
||||||
|
github.com/astaxie/beego/orm
|
||||||
github.com/astaxie/beego/session
|
github.com/astaxie/beego/session
|
||||||
|
github.com/astaxie/beego/session/redis
|
||||||
github.com/astaxie/beego/toolbox
|
github.com/astaxie/beego/toolbox
|
||||||
github.com/astaxie/beego/utils
|
github.com/astaxie/beego/utils
|
||||||
|
github.com/astaxie/beego/validation
|
||||||
# github.com/aws/aws-sdk-go v1.19.47
|
# github.com/aws/aws-sdk-go v1.19.47
|
||||||
github.com/aws/aws-sdk-go/aws
|
github.com/aws/aws-sdk-go/aws
|
||||||
github.com/aws/aws-sdk-go/aws/awserr
|
github.com/aws/aws-sdk-go/aws/awserr
|
||||||
github.com/aws/aws-sdk-go/aws/credentials
|
github.com/aws/aws-sdk-go/aws/awsutil
|
||||||
github.com/aws/aws-sdk-go/aws/session
|
|
||||||
github.com/aws/aws-sdk-go/service/ecr
|
|
||||||
github.com/aws/aws-sdk-go/aws/endpoints
|
|
||||||
github.com/aws/aws-sdk-go/internal/sdkio
|
|
||||||
github.com/aws/aws-sdk-go/internal/ini
|
|
||||||
github.com/aws/aws-sdk-go/internal/shareddefaults
|
|
||||||
github.com/aws/aws-sdk-go/aws/client
|
github.com/aws/aws-sdk-go/aws/client
|
||||||
|
github.com/aws/aws-sdk-go/aws/client/metadata
|
||||||
github.com/aws/aws-sdk-go/aws/corehandlers
|
github.com/aws/aws-sdk-go/aws/corehandlers
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials/endpointcreds
|
||||||
github.com/aws/aws-sdk-go/aws/credentials/processcreds
|
github.com/aws/aws-sdk-go/aws/credentials/processcreds
|
||||||
github.com/aws/aws-sdk-go/aws/credentials/stscreds
|
github.com/aws/aws-sdk-go/aws/credentials/stscreds
|
||||||
github.com/aws/aws-sdk-go/aws/csm
|
github.com/aws/aws-sdk-go/aws/csm
|
||||||
github.com/aws/aws-sdk-go/aws/defaults
|
github.com/aws/aws-sdk-go/aws/defaults
|
||||||
github.com/aws/aws-sdk-go/aws/request
|
|
||||||
github.com/aws/aws-sdk-go/aws/awsutil
|
|
||||||
github.com/aws/aws-sdk-go/aws/client/metadata
|
|
||||||
github.com/aws/aws-sdk-go/aws/signer/v4
|
|
||||||
github.com/aws/aws-sdk-go/private/protocol
|
|
||||||
github.com/aws/aws-sdk-go/private/protocol/jsonrpc
|
|
||||||
github.com/aws/aws-sdk-go/internal/sdkrand
|
|
||||||
github.com/aws/aws-sdk-go/service/sts
|
|
||||||
github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds
|
|
||||||
github.com/aws/aws-sdk-go/aws/credentials/endpointcreds
|
|
||||||
github.com/aws/aws-sdk-go/aws/ec2metadata
|
github.com/aws/aws-sdk-go/aws/ec2metadata
|
||||||
github.com/aws/aws-sdk-go/private/protocol/rest
|
github.com/aws/aws-sdk-go/aws/endpoints
|
||||||
github.com/aws/aws-sdk-go/private/protocol/json/jsonutil
|
github.com/aws/aws-sdk-go/aws/request
|
||||||
github.com/aws/aws-sdk-go/private/protocol/query
|
github.com/aws/aws-sdk-go/aws/session
|
||||||
|
github.com/aws/aws-sdk-go/aws/signer/v4
|
||||||
|
github.com/aws/aws-sdk-go/internal/ini
|
||||||
|
github.com/aws/aws-sdk-go/internal/sdkio
|
||||||
|
github.com/aws/aws-sdk-go/internal/sdkrand
|
||||||
github.com/aws/aws-sdk-go/internal/sdkuri
|
github.com/aws/aws-sdk-go/internal/sdkuri
|
||||||
|
github.com/aws/aws-sdk-go/internal/shareddefaults
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/json/jsonutil
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/jsonrpc
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/query
|
||||||
github.com/aws/aws-sdk-go/private/protocol/query/queryutil
|
github.com/aws/aws-sdk-go/private/protocol/query/queryutil
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/rest
|
||||||
github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil
|
github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil
|
||||||
|
github.com/aws/aws-sdk-go/service/ecr
|
||||||
|
github.com/aws/aws-sdk-go/service/sts
|
||||||
# github.com/beego/i18n v0.0.0-20140604031826-e87155e8f0c0
|
# github.com/beego/i18n v0.0.0-20140604031826-e87155e8f0c0
|
||||||
github.com/beego/i18n
|
github.com/beego/i18n
|
||||||
# github.com/bmatcuk/doublestar v1.1.1
|
# github.com/bmatcuk/doublestar v1.1.1
|
||||||
github.com/bmatcuk/doublestar
|
github.com/bmatcuk/doublestar
|
||||||
# github.com/casbin/casbin v1.7.0
|
# github.com/casbin/casbin v1.7.0
|
||||||
github.com/casbin/casbin
|
github.com/casbin/casbin
|
||||||
github.com/casbin/casbin/model
|
github.com/casbin/casbin/config
|
||||||
github.com/casbin/casbin/persist
|
|
||||||
github.com/casbin/casbin/util
|
|
||||||
github.com/casbin/casbin/effect
|
github.com/casbin/casbin/effect
|
||||||
github.com/casbin/casbin/log
|
github.com/casbin/casbin/log
|
||||||
|
github.com/casbin/casbin/model
|
||||||
|
github.com/casbin/casbin/persist
|
||||||
github.com/casbin/casbin/persist/file-adapter
|
github.com/casbin/casbin/persist/file-adapter
|
||||||
github.com/casbin/casbin/rbac
|
github.com/casbin/casbin/rbac
|
||||||
github.com/casbin/casbin/rbac/default-role-manager
|
github.com/casbin/casbin/rbac/default-role-manager
|
||||||
github.com/casbin/casbin/config
|
github.com/casbin/casbin/util
|
||||||
# github.com/coreos/go-oidc v2.0.0+incompatible
|
# github.com/coreos/go-oidc v2.0.0+incompatible
|
||||||
github.com/coreos/go-oidc
|
github.com/coreos/go-oidc
|
||||||
# github.com/cyphar/filepath-securejoin v0.2.2
|
# github.com/cyphar/filepath-securejoin v0.2.2
|
||||||
@ -101,27 +101,28 @@ github.com/dghubble/sling
|
|||||||
# github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
# github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||||
github.com/dgrijalva/jwt-go
|
github.com/dgrijalva/jwt-go
|
||||||
# github.com/docker/distribution v2.7.1+incompatible
|
# github.com/docker/distribution v2.7.1+incompatible
|
||||||
github.com/docker/distribution/manifest/manifestlist
|
|
||||||
github.com/docker/distribution/manifest/schema1
|
|
||||||
github.com/docker/distribution/manifest/schema2
|
|
||||||
github.com/docker/distribution
|
github.com/docker/distribution
|
||||||
github.com/docker/distribution/registry/auth/token
|
|
||||||
github.com/docker/distribution/reference
|
|
||||||
github.com/docker/distribution/registry/client/auth/challenge
|
|
||||||
github.com/docker/distribution/health
|
|
||||||
github.com/docker/distribution/registry/auth
|
|
||||||
github.com/docker/distribution/manifest
|
|
||||||
github.com/docker/distribution/context
|
github.com/docker/distribution/context
|
||||||
github.com/docker/distribution/digestset
|
github.com/docker/distribution/digestset
|
||||||
|
github.com/docker/distribution/health
|
||||||
|
github.com/docker/distribution/manifest
|
||||||
|
github.com/docker/distribution/manifest/manifestlist
|
||||||
|
github.com/docker/distribution/manifest/ocischema
|
||||||
|
github.com/docker/distribution/manifest/schema1
|
||||||
|
github.com/docker/distribution/manifest/schema2
|
||||||
|
github.com/docker/distribution/reference
|
||||||
github.com/docker/distribution/registry/api/errcode
|
github.com/docker/distribution/registry/api/errcode
|
||||||
|
github.com/docker/distribution/registry/auth
|
||||||
|
github.com/docker/distribution/registry/auth/token
|
||||||
|
github.com/docker/distribution/registry/client/auth/challenge
|
||||||
github.com/docker/distribution/uuid
|
github.com/docker/distribution/uuid
|
||||||
# github.com/docker/go v0.0.0-20160303222718-d30aec9fd63c
|
# github.com/docker/go v0.0.0-20160303222718-d30aec9fd63c
|
||||||
github.com/docker/go/canonical/json
|
github.com/docker/go/canonical/json
|
||||||
# github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
|
# github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
|
||||||
github.com/docker/libtrust
|
github.com/docker/libtrust
|
||||||
# github.com/garyburd/redigo v1.6.0
|
# github.com/garyburd/redigo v1.6.0
|
||||||
github.com/garyburd/redigo/redis
|
|
||||||
github.com/garyburd/redigo/internal
|
github.com/garyburd/redigo/internal
|
||||||
|
github.com/garyburd/redigo/redis
|
||||||
# github.com/ghodss/yaml v1.0.0
|
# github.com/ghodss/yaml v1.0.0
|
||||||
github.com/ghodss/yaml
|
github.com/ghodss/yaml
|
||||||
# github.com/go-openapi/analysis v0.19.5
|
# github.com/go-openapi/analysis v0.19.5
|
||||||
@ -137,8 +138,8 @@ github.com/go-openapi/jsonreference
|
|||||||
github.com/go-openapi/loads
|
github.com/go-openapi/loads
|
||||||
# github.com/go-openapi/runtime v0.19.5
|
# github.com/go-openapi/runtime v0.19.5
|
||||||
github.com/go-openapi/runtime
|
github.com/go-openapi/runtime
|
||||||
github.com/go-openapi/runtime/middleware
|
|
||||||
github.com/go-openapi/runtime/logger
|
github.com/go-openapi/runtime/logger
|
||||||
|
github.com/go-openapi/runtime/middleware
|
||||||
github.com/go-openapi/runtime/middleware/denco
|
github.com/go-openapi/runtime/middleware/denco
|
||||||
github.com/go-openapi/runtime/middleware/header
|
github.com/go-openapi/runtime/middleware/header
|
||||||
github.com/go-openapi/runtime/middleware/untyped
|
github.com/go-openapi/runtime/middleware/untyped
|
||||||
@ -158,11 +159,11 @@ github.com/go-stack/stack
|
|||||||
# github.com/gobwas/glob v0.2.3
|
# github.com/gobwas/glob v0.2.3
|
||||||
github.com/gobwas/glob
|
github.com/gobwas/glob
|
||||||
github.com/gobwas/glob/compiler
|
github.com/gobwas/glob/compiler
|
||||||
github.com/gobwas/glob/syntax
|
|
||||||
github.com/gobwas/glob/match
|
github.com/gobwas/glob/match
|
||||||
|
github.com/gobwas/glob/syntax
|
||||||
github.com/gobwas/glob/syntax/ast
|
github.com/gobwas/glob/syntax/ast
|
||||||
github.com/gobwas/glob/util/runes
|
|
||||||
github.com/gobwas/glob/syntax/lexer
|
github.com/gobwas/glob/syntax/lexer
|
||||||
|
github.com/gobwas/glob/util/runes
|
||||||
github.com/gobwas/glob/util/strings
|
github.com/gobwas/glob/util/strings
|
||||||
# github.com/gocraft/work v0.5.1
|
# github.com/gocraft/work v0.5.1
|
||||||
github.com/gocraft/work
|
github.com/gocraft/work
|
||||||
@ -171,19 +172,19 @@ github.com/gogo/protobuf/proto
|
|||||||
github.com/gogo/protobuf/sortkeys
|
github.com/gogo/protobuf/sortkeys
|
||||||
# github.com/golang-migrate/migrate v3.3.0+incompatible
|
# github.com/golang-migrate/migrate v3.3.0+incompatible
|
||||||
github.com/golang-migrate/migrate
|
github.com/golang-migrate/migrate
|
||||||
github.com/golang-migrate/migrate/database/postgres
|
|
||||||
github.com/golang-migrate/migrate/source/file
|
|
||||||
github.com/golang-migrate/migrate/database
|
github.com/golang-migrate/migrate/database
|
||||||
|
github.com/golang-migrate/migrate/database/postgres
|
||||||
github.com/golang-migrate/migrate/source
|
github.com/golang-migrate/migrate/source
|
||||||
|
github.com/golang-migrate/migrate/source/file
|
||||||
# github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
|
# github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
|
||||||
github.com/golang/glog
|
github.com/golang/glog
|
||||||
# github.com/golang/protobuf v1.3.1
|
# github.com/golang/protobuf v1.3.1
|
||||||
|
github.com/golang/protobuf/proto
|
||||||
github.com/golang/protobuf/ptypes/any
|
github.com/golang/protobuf/ptypes/any
|
||||||
github.com/golang/protobuf/ptypes/timestamp
|
github.com/golang/protobuf/ptypes/timestamp
|
||||||
github.com/golang/protobuf/proto
|
|
||||||
# github.com/gomodule/redigo v2.0.0+incompatible
|
# github.com/gomodule/redigo v2.0.0+incompatible
|
||||||
github.com/gomodule/redigo/redis
|
|
||||||
github.com/gomodule/redigo/internal
|
github.com/gomodule/redigo/internal
|
||||||
|
github.com/gomodule/redigo/redis
|
||||||
# github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135
|
# github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135
|
||||||
github.com/google/go-querystring/query
|
github.com/google/go-querystring/query
|
||||||
# github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf
|
# github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf
|
||||||
@ -211,9 +212,9 @@ github.com/lib/pq
|
|||||||
github.com/lib/pq/oid
|
github.com/lib/pq/oid
|
||||||
github.com/lib/pq/scram
|
github.com/lib/pq/scram
|
||||||
# github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e
|
# github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e
|
||||||
|
github.com/mailru/easyjson/buffer
|
||||||
github.com/mailru/easyjson/jlexer
|
github.com/mailru/easyjson/jlexer
|
||||||
github.com/mailru/easyjson/jwriter
|
github.com/mailru/easyjson/jwriter
|
||||||
github.com/mailru/easyjson/buffer
|
|
||||||
# github.com/mattn/go-runewidth v0.0.4
|
# github.com/mattn/go-runewidth v0.0.4
|
||||||
github.com/mattn/go-runewidth
|
github.com/mattn/go-runewidth
|
||||||
# github.com/miekg/pkcs11 v0.0.0-20170220202408-7283ca79f35e
|
# github.com/miekg/pkcs11 v0.0.0-20170220202408-7283ca79f35e
|
||||||
@ -229,8 +230,8 @@ github.com/olekukonko/tablewriter
|
|||||||
# github.com/opencontainers/go-digest v1.0.0-rc0
|
# github.com/opencontainers/go-digest v1.0.0-rc0
|
||||||
github.com/opencontainers/go-digest
|
github.com/opencontainers/go-digest
|
||||||
# github.com/opencontainers/image-spec v1.0.1
|
# github.com/opencontainers/image-spec v1.0.1
|
||||||
github.com/opencontainers/image-spec/specs-go/v1
|
|
||||||
github.com/opencontainers/image-spec/specs-go
|
github.com/opencontainers/image-spec/specs-go
|
||||||
|
github.com/opencontainers/image-spec/specs-go/v1
|
||||||
# github.com/opentracing/opentracing-go v1.1.0
|
# github.com/opentracing/opentracing-go v1.1.0
|
||||||
github.com/opentracing/opentracing-go
|
github.com/opentracing/opentracing-go
|
||||||
github.com/opentracing/opentracing-go/log
|
github.com/opentracing/opentracing-go/log
|
||||||
@ -252,53 +253,53 @@ github.com/spf13/pflag
|
|||||||
# github.com/stretchr/objx v0.2.0
|
# github.com/stretchr/objx v0.2.0
|
||||||
github.com/stretchr/objx
|
github.com/stretchr/objx
|
||||||
# github.com/stretchr/testify v1.4.0
|
# github.com/stretchr/testify v1.4.0
|
||||||
github.com/stretchr/testify/mock
|
|
||||||
github.com/stretchr/testify/suite
|
|
||||||
github.com/stretchr/testify/assert
|
github.com/stretchr/testify/assert
|
||||||
|
github.com/stretchr/testify/mock
|
||||||
github.com/stretchr/testify/require
|
github.com/stretchr/testify/require
|
||||||
|
github.com/stretchr/testify/suite
|
||||||
# github.com/theupdateframework/notary v0.6.1
|
# github.com/theupdateframework/notary v0.6.1
|
||||||
github.com/theupdateframework/notary/tuf/data
|
|
||||||
github.com/theupdateframework/notary
|
github.com/theupdateframework/notary
|
||||||
github.com/theupdateframework/notary/client
|
github.com/theupdateframework/notary/client
|
||||||
github.com/theupdateframework/notary/trustpinning
|
|
||||||
github.com/theupdateframework/notary/client/changelist
|
github.com/theupdateframework/notary/client/changelist
|
||||||
github.com/theupdateframework/notary/cryptoservice
|
github.com/theupdateframework/notary/cryptoservice
|
||||||
github.com/theupdateframework/notary/storage
|
github.com/theupdateframework/notary/storage
|
||||||
github.com/theupdateframework/notary/trustmanager
|
github.com/theupdateframework/notary/trustmanager
|
||||||
github.com/theupdateframework/notary/trustmanager/yubikey
|
github.com/theupdateframework/notary/trustmanager/yubikey
|
||||||
|
github.com/theupdateframework/notary/trustpinning
|
||||||
github.com/theupdateframework/notary/tuf
|
github.com/theupdateframework/notary/tuf
|
||||||
|
github.com/theupdateframework/notary/tuf/data
|
||||||
github.com/theupdateframework/notary/tuf/signed
|
github.com/theupdateframework/notary/tuf/signed
|
||||||
github.com/theupdateframework/notary/tuf/utils
|
github.com/theupdateframework/notary/tuf/utils
|
||||||
github.com/theupdateframework/notary/tuf/validation
|
github.com/theupdateframework/notary/tuf/validation
|
||||||
# go.mongodb.org/mongo-driver v1.1.1
|
# go.mongodb.org/mongo-driver v1.1.1
|
||||||
go.mongodb.org/mongo-driver/bson
|
go.mongodb.org/mongo-driver/bson
|
||||||
go.mongodb.org/mongo-driver/bson/bsontype
|
|
||||||
go.mongodb.org/mongo-driver/bson/primitive
|
|
||||||
go.mongodb.org/mongo-driver/bson/bsoncodec
|
go.mongodb.org/mongo-driver/bson/bsoncodec
|
||||||
go.mongodb.org/mongo-driver/bson/bsonrw
|
go.mongodb.org/mongo-driver/bson/bsonrw
|
||||||
|
go.mongodb.org/mongo-driver/bson/bsontype
|
||||||
|
go.mongodb.org/mongo-driver/bson/primitive
|
||||||
go.mongodb.org/mongo-driver/x/bsonx/bsoncore
|
go.mongodb.org/mongo-driver/x/bsonx/bsoncore
|
||||||
# golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
|
# golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
|
||||||
golang.org/x/crypto/pbkdf2
|
|
||||||
golang.org/x/crypto/acme/autocert
|
|
||||||
golang.org/x/crypto/openpgp
|
|
||||||
golang.org/x/crypto/openpgp/clearsign
|
|
||||||
golang.org/x/crypto/openpgp/packet
|
|
||||||
golang.org/x/crypto/acme
|
golang.org/x/crypto/acme
|
||||||
golang.org/x/crypto/ed25519
|
golang.org/x/crypto/acme/autocert
|
||||||
golang.org/x/crypto/ssh/terminal
|
|
||||||
golang.org/x/crypto/openpgp/armor
|
|
||||||
golang.org/x/crypto/openpgp/errors
|
|
||||||
golang.org/x/crypto/openpgp/s2k
|
|
||||||
golang.org/x/crypto/cast5
|
golang.org/x/crypto/cast5
|
||||||
golang.org/x/crypto/openpgp/elgamal
|
golang.org/x/crypto/ed25519
|
||||||
golang.org/x/crypto/ed25519/internal/edwards25519
|
golang.org/x/crypto/ed25519/internal/edwards25519
|
||||||
|
golang.org/x/crypto/openpgp
|
||||||
|
golang.org/x/crypto/openpgp/armor
|
||||||
|
golang.org/x/crypto/openpgp/clearsign
|
||||||
|
golang.org/x/crypto/openpgp/elgamal
|
||||||
|
golang.org/x/crypto/openpgp/errors
|
||||||
|
golang.org/x/crypto/openpgp/packet
|
||||||
|
golang.org/x/crypto/openpgp/s2k
|
||||||
|
golang.org/x/crypto/pbkdf2
|
||||||
|
golang.org/x/crypto/ssh/terminal
|
||||||
# golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
|
# golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
|
||||||
golang.org/x/net/http2
|
golang.org/x/net/context
|
||||||
golang.org/x/net/idna
|
|
||||||
golang.org/x/net/context/ctxhttp
|
golang.org/x/net/context/ctxhttp
|
||||||
golang.org/x/net/http/httpguts
|
golang.org/x/net/http/httpguts
|
||||||
|
golang.org/x/net/http2
|
||||||
golang.org/x/net/http2/hpack
|
golang.org/x/net/http2/hpack
|
||||||
golang.org/x/net/context
|
golang.org/x/net/idna
|
||||||
# golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421
|
# golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421
|
||||||
golang.org/x/oauth2
|
golang.org/x/oauth2
|
||||||
golang.org/x/oauth2/clientcredentials
|
golang.org/x/oauth2/clientcredentials
|
||||||
@ -308,21 +309,21 @@ golang.org/x/sys/unix
|
|||||||
golang.org/x/sys/windows
|
golang.org/x/sys/windows
|
||||||
# golang.org/x/text v0.3.2
|
# golang.org/x/text v0.3.2
|
||||||
golang.org/x/text/secure/bidirule
|
golang.org/x/text/secure/bidirule
|
||||||
|
golang.org/x/text/transform
|
||||||
golang.org/x/text/unicode/bidi
|
golang.org/x/text/unicode/bidi
|
||||||
golang.org/x/text/unicode/norm
|
golang.org/x/text/unicode/norm
|
||||||
golang.org/x/text/transform
|
|
||||||
golang.org/x/text/width
|
golang.org/x/text/width
|
||||||
# golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
# golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
||||||
golang.org/x/time/rate
|
golang.org/x/time/rate
|
||||||
# google.golang.org/appengine v1.4.0
|
# google.golang.org/appengine v1.4.0
|
||||||
google.golang.org/appengine/cloudsql
|
google.golang.org/appengine/cloudsql
|
||||||
google.golang.org/appengine/urlfetch
|
|
||||||
google.golang.org/appengine/internal
|
google.golang.org/appengine/internal
|
||||||
google.golang.org/appengine/internal/urlfetch
|
|
||||||
google.golang.org/appengine/internal/base
|
google.golang.org/appengine/internal/base
|
||||||
google.golang.org/appengine/internal/datastore
|
google.golang.org/appengine/internal/datastore
|
||||||
google.golang.org/appengine/internal/log
|
google.golang.org/appengine/internal/log
|
||||||
google.golang.org/appengine/internal/remote_api
|
google.golang.org/appengine/internal/remote_api
|
||||||
|
google.golang.org/appengine/internal/urlfetch
|
||||||
|
google.golang.org/appengine/urlfetch
|
||||||
# gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175
|
# gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175
|
||||||
gopkg.in/asn1-ber.v1
|
gopkg.in/asn1-ber.v1
|
||||||
# gopkg.in/inf.v0 v0.9.1
|
# gopkg.in/inf.v0 v0.9.1
|
||||||
@ -338,13 +339,13 @@ gopkg.in/square/go-jose.v2/json
|
|||||||
# gopkg.in/yaml.v2 v2.2.2
|
# gopkg.in/yaml.v2 v2.2.2
|
||||||
gopkg.in/yaml.v2
|
gopkg.in/yaml.v2
|
||||||
# k8s.io/api v0.0.0-20190222213804-5cb15d344471
|
# k8s.io/api v0.0.0-20190222213804-5cb15d344471
|
||||||
k8s.io/api/authentication/v1beta1
|
|
||||||
k8s.io/api/admissionregistration/v1alpha1
|
k8s.io/api/admissionregistration/v1alpha1
|
||||||
k8s.io/api/admissionregistration/v1beta1
|
k8s.io/api/admissionregistration/v1beta1
|
||||||
k8s.io/api/apps/v1
|
k8s.io/api/apps/v1
|
||||||
k8s.io/api/apps/v1beta1
|
k8s.io/api/apps/v1beta1
|
||||||
k8s.io/api/apps/v1beta2
|
k8s.io/api/apps/v1beta2
|
||||||
k8s.io/api/authentication/v1
|
k8s.io/api/authentication/v1
|
||||||
|
k8s.io/api/authentication/v1beta1
|
||||||
k8s.io/api/authorization/v1
|
k8s.io/api/authorization/v1
|
||||||
k8s.io/api/authorization/v1beta1
|
k8s.io/api/authorization/v1beta1
|
||||||
k8s.io/api/autoscaling/v1
|
k8s.io/api/autoscaling/v1
|
||||||
@ -368,69 +369,69 @@ k8s.io/api/storage/v1
|
|||||||
k8s.io/api/storage/v1alpha1
|
k8s.io/api/storage/v1alpha1
|
||||||
k8s.io/api/storage/v1beta1
|
k8s.io/api/storage/v1beta1
|
||||||
# k8s.io/apimachinery v0.0.0-20180704011316-f534d624797b
|
# k8s.io/apimachinery v0.0.0-20180704011316-f534d624797b
|
||||||
k8s.io/apimachinery/pkg/apis/meta/v1
|
k8s.io/apimachinery/pkg/api/errors
|
||||||
k8s.io/apimachinery/pkg/runtime/schema
|
|
||||||
k8s.io/apimachinery/pkg/runtime/serializer
|
|
||||||
k8s.io/apimachinery/pkg/version
|
|
||||||
k8s.io/apimachinery/pkg/runtime
|
|
||||||
k8s.io/apimachinery/pkg/api/resource
|
k8s.io/apimachinery/pkg/api/resource
|
||||||
|
k8s.io/apimachinery/pkg/apis/meta/v1
|
||||||
|
k8s.io/apimachinery/pkg/apis/meta/v1/unstructured
|
||||||
k8s.io/apimachinery/pkg/conversion
|
k8s.io/apimachinery/pkg/conversion
|
||||||
|
k8s.io/apimachinery/pkg/conversion/queryparams
|
||||||
k8s.io/apimachinery/pkg/fields
|
k8s.io/apimachinery/pkg/fields
|
||||||
k8s.io/apimachinery/pkg/labels
|
k8s.io/apimachinery/pkg/labels
|
||||||
k8s.io/apimachinery/pkg/selection
|
k8s.io/apimachinery/pkg/runtime
|
||||||
k8s.io/apimachinery/pkg/types
|
k8s.io/apimachinery/pkg/runtime/schema
|
||||||
k8s.io/apimachinery/pkg/util/intstr
|
k8s.io/apimachinery/pkg/runtime/serializer
|
||||||
k8s.io/apimachinery/pkg/util/runtime
|
|
||||||
k8s.io/apimachinery/pkg/watch
|
|
||||||
k8s.io/apimachinery/pkg/runtime/serializer/json
|
k8s.io/apimachinery/pkg/runtime/serializer/json
|
||||||
k8s.io/apimachinery/pkg/runtime/serializer/protobuf
|
k8s.io/apimachinery/pkg/runtime/serializer/protobuf
|
||||||
k8s.io/apimachinery/pkg/runtime/serializer/recognizer
|
k8s.io/apimachinery/pkg/runtime/serializer/recognizer
|
||||||
k8s.io/apimachinery/pkg/runtime/serializer/versioning
|
|
||||||
k8s.io/apimachinery/pkg/api/errors
|
|
||||||
k8s.io/apimachinery/pkg/runtime/serializer/streaming
|
k8s.io/apimachinery/pkg/runtime/serializer/streaming
|
||||||
k8s.io/apimachinery/pkg/util/net
|
k8s.io/apimachinery/pkg/runtime/serializer/versioning
|
||||||
k8s.io/apimachinery/pkg/util/sets
|
k8s.io/apimachinery/pkg/selection
|
||||||
k8s.io/apimachinery/pkg/conversion/queryparams
|
k8s.io/apimachinery/pkg/types
|
||||||
k8s.io/apimachinery/pkg/util/errors
|
|
||||||
k8s.io/apimachinery/pkg/util/json
|
|
||||||
k8s.io/apimachinery/third_party/forked/golang/reflect
|
|
||||||
k8s.io/apimachinery/pkg/util/validation
|
|
||||||
k8s.io/apimachinery/pkg/util/wait
|
|
||||||
k8s.io/apimachinery/pkg/util/framer
|
|
||||||
k8s.io/apimachinery/pkg/util/yaml
|
|
||||||
k8s.io/apimachinery/pkg/apis/meta/v1/unstructured
|
|
||||||
k8s.io/apimachinery/pkg/util/validation/field
|
|
||||||
k8s.io/apimachinery/pkg/util/clock
|
k8s.io/apimachinery/pkg/util/clock
|
||||||
|
k8s.io/apimachinery/pkg/util/errors
|
||||||
|
k8s.io/apimachinery/pkg/util/framer
|
||||||
|
k8s.io/apimachinery/pkg/util/intstr
|
||||||
|
k8s.io/apimachinery/pkg/util/json
|
||||||
|
k8s.io/apimachinery/pkg/util/net
|
||||||
|
k8s.io/apimachinery/pkg/util/runtime
|
||||||
|
k8s.io/apimachinery/pkg/util/sets
|
||||||
|
k8s.io/apimachinery/pkg/util/validation
|
||||||
|
k8s.io/apimachinery/pkg/util/validation/field
|
||||||
|
k8s.io/apimachinery/pkg/util/wait
|
||||||
|
k8s.io/apimachinery/pkg/util/yaml
|
||||||
|
k8s.io/apimachinery/pkg/version
|
||||||
|
k8s.io/apimachinery/pkg/watch
|
||||||
|
k8s.io/apimachinery/third_party/forked/golang/reflect
|
||||||
# k8s.io/client-go v8.0.0+incompatible
|
# k8s.io/client-go v8.0.0+incompatible
|
||||||
k8s.io/client-go/kubernetes/scheme
|
k8s.io/client-go/kubernetes/scheme
|
||||||
k8s.io/client-go/rest
|
k8s.io/client-go/pkg/apis/clientauthentication
|
||||||
|
k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1
|
||||||
|
k8s.io/client-go/pkg/apis/clientauthentication/v1beta1
|
||||||
k8s.io/client-go/pkg/version
|
k8s.io/client-go/pkg/version
|
||||||
k8s.io/client-go/plugin/pkg/client/auth/exec
|
k8s.io/client-go/plugin/pkg/client/auth/exec
|
||||||
|
k8s.io/client-go/rest
|
||||||
k8s.io/client-go/rest/watch
|
k8s.io/client-go/rest/watch
|
||||||
k8s.io/client-go/tools/clientcmd/api
|
k8s.io/client-go/tools/clientcmd/api
|
||||||
k8s.io/client-go/tools/metrics
|
k8s.io/client-go/tools/metrics
|
||||||
k8s.io/client-go/transport
|
k8s.io/client-go/transport
|
||||||
k8s.io/client-go/util/cert
|
k8s.io/client-go/util/cert
|
||||||
k8s.io/client-go/util/flowcontrol
|
|
||||||
k8s.io/client-go/pkg/apis/clientauthentication
|
|
||||||
k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1
|
|
||||||
k8s.io/client-go/pkg/apis/clientauthentication/v1beta1
|
|
||||||
k8s.io/client-go/util/connrotation
|
k8s.io/client-go/util/connrotation
|
||||||
k8s.io/client-go/util/integer
|
k8s.io/client-go/util/flowcontrol
|
||||||
k8s.io/client-go/util/homedir
|
k8s.io/client-go/util/homedir
|
||||||
|
k8s.io/client-go/util/integer
|
||||||
# k8s.io/helm v2.16.1+incompatible
|
# k8s.io/helm v2.16.1+incompatible
|
||||||
k8s.io/helm/cmd/helm/search
|
k8s.io/helm/cmd/helm/search
|
||||||
k8s.io/helm/pkg/chartutil
|
k8s.io/helm/pkg/chartutil
|
||||||
k8s.io/helm/pkg/proto/hapi/chart
|
|
||||||
k8s.io/helm/pkg/repo
|
|
||||||
k8s.io/helm/pkg/ignore
|
|
||||||
k8s.io/helm/pkg/proto/hapi/version
|
|
||||||
k8s.io/helm/pkg/sympath
|
|
||||||
k8s.io/helm/pkg/version
|
|
||||||
k8s.io/helm/pkg/getter
|
k8s.io/helm/pkg/getter
|
||||||
k8s.io/helm/pkg/provenance
|
|
||||||
k8s.io/helm/pkg/urlutil
|
|
||||||
k8s.io/helm/pkg/helm/environment
|
k8s.io/helm/pkg/helm/environment
|
||||||
k8s.io/helm/pkg/plugin
|
|
||||||
k8s.io/helm/pkg/tlsutil
|
|
||||||
k8s.io/helm/pkg/helm/helmpath
|
k8s.io/helm/pkg/helm/helmpath
|
||||||
|
k8s.io/helm/pkg/ignore
|
||||||
|
k8s.io/helm/pkg/plugin
|
||||||
|
k8s.io/helm/pkg/proto/hapi/chart
|
||||||
|
k8s.io/helm/pkg/proto/hapi/version
|
||||||
|
k8s.io/helm/pkg/provenance
|
||||||
|
k8s.io/helm/pkg/repo
|
||||||
|
k8s.io/helm/pkg/sympath
|
||||||
|
k8s.io/helm/pkg/tlsutil
|
||||||
|
k8s.io/helm/pkg/urlutil
|
||||||
|
k8s.io/helm/pkg/version
|
||||||
|
Loading…
Reference in New Issue
Block a user