mirror of
https://github.com/genuinetools/reg.git
synced 2024-05-20 03:58:32 -04:00
update api
Signed-off-by: Jess Frazelle <acidburn@microsoft.com>
This commit is contained in:
parent
8e5eba8735
commit
758d45bea2
165
Gopkg.lock
generated
165
Gopkg.lock
generated
|
@ -1,165 +0,0 @@
|
|||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/Azure/go-ansiterm"
|
||||
packages = [".","winterm"]
|
||||
revision = "d6e3b3328b783f23731bc4d058875b0371ff8109"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/Microsoft/go-winio"
|
||||
packages = ["."]
|
||||
revision = "78439966b38d69bf38227fbf57ac8a6fee70f69a"
|
||||
version = "v0.4.5"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/Nvveen/Gotty"
|
||||
packages = ["."]
|
||||
revision = "cd527374f1e5bff4938207604a14f2e38a9cf512"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/containerd/continuity"
|
||||
packages = ["pathdriver"]
|
||||
revision = "0cf103d319cc2d7efe085224094f466d1f8b9640"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/docker/cli"
|
||||
packages = ["cli/config/configfile","cli/config/credentials","opts"]
|
||||
revision = "29d3510d50d58c34e89801303f2a390857d89a44"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/docker/distribution"
|
||||
packages = [".","digestset","manifest","manifest/schema1","manifest/schema2","reference","registry/api/errcode","registry/api/v2","registry/client","registry/client/auth","registry/client/auth/challenge","registry/client/transport","registry/storage/cache","registry/storage/cache/memory"]
|
||||
revision = "f4118485915abb8b163442717326597908eee6aa"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/docker/docker"
|
||||
packages = ["api","api/types","api/types/blkiodev","api/types/container","api/types/events","api/types/filters","api/types/image","api/types/mount","api/types/network","api/types/registry","api/types/strslice","api/types/swarm","api/types/swarm/runtime","api/types/time","api/types/versions","api/types/volume","client","pkg/homedir","pkg/idtools","pkg/ioutils","pkg/jsonmessage","pkg/longpath","pkg/mount","pkg/stringid","pkg/system","pkg/tarsum","pkg/term","pkg/term/windows","registry","registry/resumable"]
|
||||
revision = "549a2b9bbe757c8cd6d295f51fd67074847b7a94"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/docker/docker-ce"
|
||||
packages = ["components/cli/cli/config"]
|
||||
revision = "ee263ca445d83cd7433c46e4cdf22575852179fe"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/docker/docker-credential-helpers"
|
||||
packages = ["client","credentials","pass"]
|
||||
revision = "d68f9aeca33f5fd3f08eeae5e9d175edf4e731d1"
|
||||
version = "v0.6.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/docker/go-connections"
|
||||
packages = ["nat","sockets","tlsconfig"]
|
||||
revision = "3ede32e2033de7505e6500d6c868c2b9ed9f169d"
|
||||
version = "v0.3.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/docker/go-units"
|
||||
packages = ["."]
|
||||
revision = "0dadbb0345b35ec7ef35e228dabb8de89a65bf52"
|
||||
version = "v0.3.2"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/docker/libtrust"
|
||||
packages = ["."]
|
||||
revision = "aabc10ec26b754e797f9028f4589c5b7bd90dc20"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/gogo/protobuf"
|
||||
packages = ["proto"]
|
||||
revision = "342cbe0a04158f6dcb03ca0079991a51a4248c02"
|
||||
version = "v0.5"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/gorilla/context"
|
||||
packages = ["."]
|
||||
revision = "1ea25387ff6f684839d82767c1733ff4d4d15d0a"
|
||||
version = "v1.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/gorilla/mux"
|
||||
packages = ["."]
|
||||
revision = "7f08801859139f86dfafd1c296e2cba9a80d292e"
|
||||
version = "v1.6.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/mitchellh/go-wordwrap"
|
||||
packages = ["."]
|
||||
revision = "ad45545899c7b13c020ea92b2072220eefad42b8"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/opencontainers/go-digest"
|
||||
packages = ["."]
|
||||
revision = "279bed98673dd5bef374d3b6e4b09e2af76183bf"
|
||||
version = "v1.0.0-rc1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/opencontainers/image-spec"
|
||||
packages = ["specs-go","specs-go/v1"]
|
||||
revision = "d60099175f88c47cd379c4738d158884749ed235"
|
||||
version = "v1.0.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/opencontainers/runc"
|
||||
packages = ["libcontainer/user"]
|
||||
revision = "baf6536d6259209c3edfa2b22237af82942d3dfa"
|
||||
version = "v0.1.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/peterhellberg/link"
|
||||
packages = ["."]
|
||||
revision = "d1cebc7ea14a5fc0de7cb4a45acae773161642c6"
|
||||
version = "v1.0.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pkg/errors"
|
||||
packages = ["."]
|
||||
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||
version = "v0.8.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/sirupsen/logrus"
|
||||
packages = ["."]
|
||||
revision = "d682213848ed68c0a260ca37d6dd5ace8423f5ba"
|
||||
version = "v1.0.4"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/urfave/cli"
|
||||
packages = ["."]
|
||||
revision = "119bb6564841921ce6f1401e0f5d75317bdd9f4d"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/crypto"
|
||||
packages = ["ssh/terminal"]
|
||||
revision = "94eea52f7b742c7cbe0b03b22f0c4c8631ece122"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/net"
|
||||
packages = ["context","context/ctxhttp","proxy"]
|
||||
revision = "dc871a5d77e227f5bbf6545176ef3eeebf87e76e"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/sys"
|
||||
packages = ["unix","windows"]
|
||||
revision = "b8f5ef32195cae6470b728e8ca677f0dbed1a004"
|
||||
|
||||
[solve-meta]
|
||||
analyzer-name = "dep"
|
||||
analyzer-version = 1
|
||||
inputs-digest = "2d38c95f4c3b2b862f84456ed99c3fe91733300520513a057eba46aecfb22d9e"
|
||||
solver-name = "gps-cdcl"
|
||||
solver-version = 1
|
6
main.go
6
main.go
|
@ -23,8 +23,6 @@ import (
|
|||
|
||||
const (
|
||||
dockerConfigPath = ".docker/config.json"
|
||||
|
||||
defaultDockerRegistry = "https://registry-1.docker.io"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -101,7 +99,7 @@ func main() {
|
|||
cli.StringFlag{
|
||||
Name: "registry, r",
|
||||
Usage: "URL to the private registry (ex. r.j3ss.co)",
|
||||
Value: defaultDockerRegistry,
|
||||
Value: utils.DefaultDockerRegistry,
|
||||
},
|
||||
}
|
||||
app.Commands = []cli.Command{
|
||||
|
@ -235,7 +233,7 @@ func main() {
|
|||
return err
|
||||
}
|
||||
|
||||
layer, err := r.DownloadLayer(repo, digest.Digest(ref))
|
||||
layer, err := r.DownloadLayer(repo, digest.FromString(ref))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -10,43 +10,24 @@ import (
|
|||
// Delete removes a repository reference from the registry.
|
||||
// https://docs.docker.com/registry/spec/api/#deleting-an-image
|
||||
func (r *Registry) Delete(repository, ref string) error {
|
||||
// get digest first
|
||||
url := r.url("/v2/%s/manifests/%s", repository, ref)
|
||||
r.Logf("registry.manifests.get url=%s repository=%s ref=%s",
|
||||
url, repository, ref)
|
||||
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
// Get the digest first.
|
||||
digest, err := r.Digest(repository, ref)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Accept", schema2.MediaTypeManifest)
|
||||
|
||||
resp, err := r.Client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
digest := resp.Header.Get("Docker-Content-Digest")
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
if resp.StatusCode == http.StatusNotFound {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("Got status code: %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
// delete image
|
||||
url = r.url("/v2/%s/manifests/%s", repository, digest)
|
||||
// Delete the image.
|
||||
url := r.url("/v2/%s/manifests/%s", repository, digest)
|
||||
r.Logf("registry.manifests.delete url=%s repository=%s ref=%s",
|
||||
url, repository, digest)
|
||||
|
||||
req, err = http.NewRequest("DELETE", url, nil)
|
||||
req, err := http.NewRequest("DELETE", url, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
req.Header.Set("Accept", schema2.MediaTypeManifest)
|
||||
resp, err = r.Client.Do(req)
|
||||
resp, err := r.Client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
34
registry/digest.go
Normal file
34
registry/digest.go
Normal file
|
@ -0,0 +1,34 @@
|
|||
package registry
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/docker/distribution/manifest/schema2"
|
||||
)
|
||||
|
||||
// Digest returns the digest for a repository and reference.
|
||||
func (r *Registry) Digest(repository, ref string) (string, error) {
|
||||
url := r.url("/v2/%s/manifests/%s", repository, ref)
|
||||
r.Logf("registry.manifests.get url=%s repository=%s ref=%s",
|
||||
url, repository, ref)
|
||||
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
req.Header.Set("Accept", schema2.MediaTypeManifest)
|
||||
|
||||
resp, err := r.Client.Do(req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return "", fmt.Errorf("Got status code: %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
digest := resp.Header.Get("Docker-Content-Digest")
|
||||
return digest, nil
|
||||
}
|
|
@ -1,32 +1,70 @@
|
|||
package registry
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
|
||||
"github.com/docker/distribution"
|
||||
"github.com/docker/distribution/manifest/manifestlist"
|
||||
"github.com/docker/distribution/manifest/schema1"
|
||||
"github.com/docker/distribution/manifest/schema2"
|
||||
)
|
||||
|
||||
// Manifest returns the manifest for a specific repository:tag.
|
||||
func (r *Registry) Manifest(repository, ref string) (interface{}, error) {
|
||||
func (r *Registry) Manifest(repository, ref string) (distribution.Manifest, error) {
|
||||
uri := r.url("/v2/%s/manifests/%s", repository, ref)
|
||||
r.Logf("registry.manifests uri=%s repository=%s ref=%s", uri, repository, ref)
|
||||
|
||||
req, err := http.NewRequest("GET", uri, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req.Header.Add("Accept", schema2.MediaTypeManifest)
|
||||
req.Header.Add("Accept", manifestlist.MediaTypeManifestList)
|
||||
|
||||
resp, err := r.Client.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
m, _, err := distribution.UnmarshalManifest(resp.Header.Get("Content-Type"), body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// ManifestList gets the registry v2 manifest list.
|
||||
func (r *Registry) ManifestList(repository, ref string) (manifestlist.ManifestList, error) {
|
||||
uri := r.url("/v2/%s/manifests/%s", repository, ref)
|
||||
r.Logf("registry.manifests uri=%s repository=%s ref=%s", uri, repository, ref)
|
||||
|
||||
var m manifestlist.ManifestList
|
||||
if _, err := r.getJSON(uri, &m, true); err != nil {
|
||||
return m, err
|
||||
}
|
||||
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// ManifestV2 gets the registry v2 manifest.
|
||||
func (r *Registry) ManifestV2(repository, ref string) (schema2.Manifest, error) {
|
||||
uri := r.url("/v2/%s/manifests/%s", repository, ref)
|
||||
r.Logf("registry.manifests uri=%s repository=%s ref=%s", uri, repository, ref)
|
||||
|
||||
var m schema2.Manifest
|
||||
h, err := r.getJSON(uri, &m, true)
|
||||
if err != nil {
|
||||
if _, err := r.getJSON(uri, &m, true); err != nil {
|
||||
return m, err
|
||||
}
|
||||
|
||||
if !strings.Contains(ref, ":") {
|
||||
// we got a tag, get the manifest for the ref
|
||||
r.Logf("ref: %s", h.Get("Docker-Content-Digest"))
|
||||
}
|
||||
|
||||
if m.Versioned.SchemaVersion == 1 {
|
||||
return r.ManifestV1(repository, ref)
|
||||
}
|
||||
|
||||
return m, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ import (
|
|||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/docker/distribution/manifest/manifestlist"
|
||||
"github.com/docker/distribution/manifest/schema2"
|
||||
"github.com/docker/docker/api/types"
|
||||
)
|
||||
|
||||
|
@ -113,8 +115,8 @@ func (r *Registry) getJSON(url string, response interface{}, addV2Header bool) (
|
|||
return nil, err
|
||||
}
|
||||
if addV2Header {
|
||||
req.Header.Add("Accept", "application/vnd.docker.distribution.manifest.v2+json")
|
||||
req.Header.Add("Accept", "application/vnd.docker.distribution.manifest.list.v2+json")
|
||||
req.Header.Add("Accept", schema2.MediaTypeManifest)
|
||||
req.Header.Add("Accept", manifestlist.MediaTypeManifestList)
|
||||
}
|
||||
resp, err := r.Client.Do(req)
|
||||
if err != nil {
|
||||
|
|
|
@ -9,6 +9,11 @@ import (
|
|||
"github.com/docker/docker/api/types"
|
||||
)
|
||||
|
||||
const (
|
||||
// DefaultDockerRegistry is the default docker registry address.
|
||||
DefaultDockerRegistry = "https://registry-1.docker.io"
|
||||
)
|
||||
|
||||
// GetAuthConfig returns the docker registry AuthConfig.
|
||||
// Optionally takes in the authentication values, otherwise pulls them from the
|
||||
// docker config file.
|
||||
|
@ -30,9 +35,9 @@ func GetAuthConfig(username, password, registry string) (types.AuthConfig, error
|
|||
if !dcfg.ContainsAuth() {
|
||||
// If we were passed a registry, just use that.
|
||||
if registry != "" {
|
||||
return types.AuthConfig{
|
||||
return setDefaultRegistry(types.AuthConfig{
|
||||
ServerAddress: registry,
|
||||
}, nil
|
||||
}), nil
|
||||
}
|
||||
|
||||
// Otherwise, just use an empty auth config.
|
||||
|
@ -54,9 +59,9 @@ func GetAuthConfig(username, password, registry string) (types.AuthConfig, error
|
|||
}
|
||||
|
||||
// Otherwise just use the registry with no auth.
|
||||
return types.AuthConfig{
|
||||
return setDefaultRegistry(types.AuthConfig{
|
||||
ServerAddress: registry,
|
||||
}, nil
|
||||
}), nil
|
||||
}
|
||||
|
||||
// Just set the auth config as the first registryURL, username and password
|
||||
|
@ -92,3 +97,11 @@ func GetRepoAndRef(arg string) (repo, ref string, err error) {
|
|||
|
||||
return
|
||||
}
|
||||
|
||||
func setDefaultRegistry(auth types.AuthConfig) types.AuthConfig {
|
||||
if auth.ServerAddress == "docker.io" {
|
||||
auth.ServerAddress = DefaultDockerRegistry
|
||||
}
|
||||
|
||||
return auth
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue