// newRepository returns a new repository middleware. func newRepository(ctx context.Context, repo distribution.Repository, options map[string]interface{}) (distribution.Repository, error) { registryAddr := os.Getenv("DOCKER_REGISTRY_URL") if len(registryAddr) == 0 { return nil, errors.New("DOCKER_REGISTRY_URL is required") } registryClient, err := NewRegistryOpenShiftClient() if err != nil { return nil, err } nameParts := strings.SplitN(repo.Name(), "/", 2) if len(nameParts) != 2 { return nil, fmt.Errorf("invalid repository name %q: it must be of the format <project>/<name>", repo.Name()) } return &repository{ Repository: repo, ctx: ctx, registryClient: registryClient, registryAddr: registryAddr, namespace: nameParts[0], name: nameParts[1], }, nil }
func (b *bridge) createManifestEvent(action string, repo distribution.Repository, sm *manifest.SignedManifest) (*Event, error) { event := b.createEvent(action) event.Target.MediaType = manifest.ManifestMediaType event.Target.Repository = repo.Name() p, err := sm.Payload() if err != nil { return nil, err } event.Target.Length = int64(len(p)) event.Target.Digest, err = digest.FromBytes(p) if err != nil { return nil, err } // TODO(stevvooe): Currently, the is the "tag" url: once the digest url is // implemented, this should be replaced. event.Target.URL, err = b.ub.BuildManifestURL(sm.Name, sm.Tag) if err != nil { return nil, err } return event, nil }
// newRepositoryWithClient returns a new repository middleware. func newRepositoryWithClient(registryClient client.Interface, quotaClient kclient.ResourceQuotasNamespacer, ctx context.Context, repo distribution.Repository, options map[string]interface{}) (distribution.Repository, error) { registryAddr := os.Getenv("DOCKER_REGISTRY_URL") if len(registryAddr) == 0 { return nil, errors.New("DOCKER_REGISTRY_URL is required") } pullthrough := false if value, ok := options["pullthrough"]; ok { if b, ok := value.(bool); ok { pullthrough = b } } nameParts := strings.SplitN(repo.Name(), "/", 2) if len(nameParts) != 2 { return nil, fmt.Errorf("invalid repository name %q: it must be of the format <project>/<name>", repo.Name()) } return &repository{ Repository: repo, ctx: ctx, quotaClient: quotaClient, registryClient: registryClient, registryAddr: registryAddr, namespace: nameParts[0], name: nameParts[1], pullthrough: pullthrough, cachedLayers: cachedLayers, }, nil }
func (b *bridge) createLayerEvent(action string, repo distribution.Repository, layer distribution.Layer) (*Event, error) { event := b.createEvent(action) event.Target.MediaType = layerMediaType event.Target.Repository = repo.Name() event.Target.Length = layer.Length() dgst := layer.Digest() event.Target.Digest = dgst var err error event.Target.URL, err = b.ub.BuildBlobURL(repo.Name(), dgst) if err != nil { return nil, err } return event, nil }
// checkExerciseRegistry takes the registry through all of its operations, // carrying out generic checks. func checkExerciseRepository(t *testing.T, repository distribution.Repository) { // TODO(stevvooe): This would be a nice testutil function. Basically, it // takes the registry through a common set of operations. This could be // used to make cross-cutting updates by changing internals that affect // update counts. Basically, it would make writing tests a lot easier. ctx := context.Background() tag := "thetag" m := manifest.Manifest{ Versioned: manifest.Versioned{ SchemaVersion: 1, }, Name: repository.Name(), Tag: tag, } blobs := repository.Blobs(ctx) for i := 0; i < 2; i++ { rs, ds, err := testutil.CreateRandomTarFile() if err != nil { t.Fatalf("error creating test layer: %v", err) } dgst := digest.Digest(ds) wr, err := blobs.Create(ctx) if err != nil { t.Fatalf("error creating layer upload: %v", err) } // Use the resumes, as well! wr, err = blobs.Resume(ctx, wr.ID()) if err != nil { t.Fatalf("error resuming layer upload: %v", err) } io.Copy(wr, rs) if _, err := wr.Commit(ctx, distribution.Descriptor{Digest: dgst}); err != nil { t.Fatalf("unexpected error finishing upload: %v", err) } m.FSLayers = append(m.FSLayers, manifest.FSLayer{ BlobSum: dgst, }) // Then fetch the blobs if rc, err := blobs.Open(ctx, dgst); err != nil { t.Fatalf("error fetching layer: %v", err) } else { defer rc.Close() } } pk, err := libtrust.GenerateECP256PrivateKey() if err != nil { t.Fatalf("unexpected error generating key: %v", err) } sm, err := manifest.Sign(&m, pk) if err != nil { t.Fatalf("unexpected error signing manifest: %v", err) } manifests, err := repository.Manifests(ctx) if err != nil { t.Fatal(err.Error()) } if err = manifests.Put(sm); err != nil { t.Fatalf("unexpected error putting the manifest: %v", err) } p, err := sm.Payload() if err != nil { t.Fatalf("unexpected error getting manifest payload: %v", err) } dgst, err := digest.FromBytes(p) if err != nil { t.Fatalf("unexpected error digesting manifest payload: %v", err) } fetchedByManifest, err := manifests.Get(dgst) if err != nil { t.Fatalf("unexpected error fetching manifest: %v", err) } if fetchedByManifest.Tag != sm.Tag { t.Fatalf("retrieved unexpected manifest: %v", err) } fetched, err := manifests.GetByTag(tag) if err != nil { t.Fatalf("unexpected error fetching manifest: %v", err) } if fetched.Tag != fetchedByManifest.Tag { t.Fatalf("retrieved unexpected manifest: %v", err) } }