update api

Signed-off-by: Jess Frazelle <acidburn@microsoft.com>
This commit is contained in:
Jess Frazelle 2017-12-11 17:33:26 -05:00
parent 8e5eba8735
commit 758d45bea2
No known key found for this signature in database
GPG key ID: 18F3685C0022BFF3
7 changed files with 114 additions and 213 deletions

165
Gopkg.lock generated
View file

@ -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

View file

@ -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
}

View file

@ -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
View 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
}

View file

@ -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
}

View file

@ -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 {

View file

@ -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
}