mirror of
https://github.com/openfaas/faas.git
synced 2025-06-22 14:53:25 +00:00
Vendoring with Glide and delete function handler
This commit is contained in:
148
gateway/vendor/github.com/docker/distribution/testutil/handler.go
generated
vendored
Normal file
148
gateway/vendor/github.com/docker/distribution/testutil/handler.go
generated
vendored
Normal file
@ -0,0 +1,148 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// RequestResponseMap is an ordered mapping from Requests to Responses
|
||||
type RequestResponseMap []RequestResponseMapping
|
||||
|
||||
// RequestResponseMapping defines a Response to be sent in response to a given
|
||||
// Request
|
||||
type RequestResponseMapping struct {
|
||||
Request Request
|
||||
Response Response
|
||||
}
|
||||
|
||||
// Request is a simplified http.Request object
|
||||
type Request struct {
|
||||
// Method is the http method of the request, for example GET
|
||||
Method string
|
||||
|
||||
// Route is the http route of this request
|
||||
Route string
|
||||
|
||||
// QueryParams are the query parameters of this request
|
||||
QueryParams map[string][]string
|
||||
|
||||
// Body is the byte contents of the http request
|
||||
Body []byte
|
||||
|
||||
// Headers are the header for this request
|
||||
Headers http.Header
|
||||
}
|
||||
|
||||
func (r Request) String() string {
|
||||
queryString := ""
|
||||
if len(r.QueryParams) > 0 {
|
||||
keys := make([]string, 0, len(r.QueryParams))
|
||||
queryParts := make([]string, 0, len(r.QueryParams))
|
||||
for k := range r.QueryParams {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
for _, k := range keys {
|
||||
for _, val := range r.QueryParams[k] {
|
||||
queryParts = append(queryParts, fmt.Sprintf("%s=%s", k, url.QueryEscape(val)))
|
||||
}
|
||||
}
|
||||
queryString = "?" + strings.Join(queryParts, "&")
|
||||
}
|
||||
var headers []string
|
||||
if len(r.Headers) > 0 {
|
||||
var headerKeys []string
|
||||
for k := range r.Headers {
|
||||
headerKeys = append(headerKeys, k)
|
||||
}
|
||||
sort.Strings(headerKeys)
|
||||
|
||||
for _, k := range headerKeys {
|
||||
for _, val := range r.Headers[k] {
|
||||
headers = append(headers, fmt.Sprintf("%s:%s", k, val))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return fmt.Sprintf("%s %s%s\n%s\n%s", r.Method, r.Route, queryString, headers, r.Body)
|
||||
}
|
||||
|
||||
// Response is a simplified http.Response object
|
||||
type Response struct {
|
||||
// Statuscode is the http status code of the Response
|
||||
StatusCode int
|
||||
|
||||
// Headers are the http headers of this Response
|
||||
Headers http.Header
|
||||
|
||||
// Body is the response body
|
||||
Body []byte
|
||||
}
|
||||
|
||||
// testHandler is an http.Handler with a defined mapping from Request to an
|
||||
// ordered list of Response objects
|
||||
type testHandler struct {
|
||||
responseMap map[string][]Response
|
||||
}
|
||||
|
||||
// NewHandler returns a new test handler that responds to defined requests
|
||||
// with specified responses
|
||||
// Each time a Request is received, the next Response is returned in the
|
||||
// mapping, until no Responses are defined, at which point a 404 is sent back
|
||||
func NewHandler(requestResponseMap RequestResponseMap) http.Handler {
|
||||
responseMap := make(map[string][]Response)
|
||||
for _, mapping := range requestResponseMap {
|
||||
responses, ok := responseMap[mapping.Request.String()]
|
||||
if ok {
|
||||
responseMap[mapping.Request.String()] = append(responses, mapping.Response)
|
||||
} else {
|
||||
responseMap[mapping.Request.String()] = []Response{mapping.Response}
|
||||
}
|
||||
}
|
||||
return &testHandler{responseMap: responseMap}
|
||||
}
|
||||
|
||||
func (app *testHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
defer r.Body.Close()
|
||||
|
||||
requestBody, _ := ioutil.ReadAll(r.Body)
|
||||
request := Request{
|
||||
Method: r.Method,
|
||||
Route: r.URL.Path,
|
||||
QueryParams: r.URL.Query(),
|
||||
Body: requestBody,
|
||||
Headers: make(map[string][]string),
|
||||
}
|
||||
|
||||
// Add headers of interest here
|
||||
for k, v := range r.Header {
|
||||
if k == "If-None-Match" {
|
||||
request.Headers[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
responses, ok := app.responseMap[request.String()]
|
||||
|
||||
if !ok || len(responses) == 0 {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
response := responses[0]
|
||||
app.responseMap[request.String()] = responses[1:]
|
||||
|
||||
responseHeader := w.Header()
|
||||
for k, v := range response.Headers {
|
||||
responseHeader[k] = v
|
||||
}
|
||||
|
||||
w.WriteHeader(response.StatusCode)
|
||||
|
||||
io.Copy(w, bytes.NewReader(response.Body))
|
||||
}
|
87
gateway/vendor/github.com/docker/distribution/testutil/manifests.go
generated
vendored
Normal file
87
gateway/vendor/github.com/docker/distribution/testutil/manifests.go
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/docker/distribution"
|
||||
"github.com/docker/distribution/context"
|
||||
"github.com/docker/distribution/manifest"
|
||||
"github.com/docker/distribution/manifest/manifestlist"
|
||||
"github.com/docker/distribution/manifest/schema1"
|
||||
"github.com/docker/distribution/manifest/schema2"
|
||||
"github.com/docker/libtrust"
|
||||
"github.com/opencontainers/go-digest"
|
||||
)
|
||||
|
||||
// MakeManifestList constructs a manifest list out of a list of manifest digests
|
||||
func MakeManifestList(blobstatter distribution.BlobStatter, manifestDigests []digest.Digest) (*manifestlist.DeserializedManifestList, error) {
|
||||
ctx := context.Background()
|
||||
|
||||
var manifestDescriptors []manifestlist.ManifestDescriptor
|
||||
for _, manifestDigest := range manifestDigests {
|
||||
descriptor, err := blobstatter.Stat(ctx, manifestDigest)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
platformSpec := manifestlist.PlatformSpec{
|
||||
Architecture: "atari2600",
|
||||
OS: "CP/M",
|
||||
Variant: "ternary",
|
||||
Features: []string{"VLIW", "superscalaroutoforderdevnull"},
|
||||
}
|
||||
manifestDescriptor := manifestlist.ManifestDescriptor{
|
||||
Descriptor: descriptor,
|
||||
Platform: platformSpec,
|
||||
}
|
||||
manifestDescriptors = append(manifestDescriptors, manifestDescriptor)
|
||||
}
|
||||
|
||||
return manifestlist.FromDescriptors(manifestDescriptors)
|
||||
}
|
||||
|
||||
// MakeSchema1Manifest constructs a schema 1 manifest from a given list of digests and returns
|
||||
// the digest of the manifest
|
||||
func MakeSchema1Manifest(digests []digest.Digest) (distribution.Manifest, error) {
|
||||
manifest := schema1.Manifest{
|
||||
Versioned: manifest.Versioned{
|
||||
SchemaVersion: 1,
|
||||
},
|
||||
Name: "who",
|
||||
Tag: "cares",
|
||||
}
|
||||
|
||||
for _, digest := range digests {
|
||||
manifest.FSLayers = append(manifest.FSLayers, schema1.FSLayer{BlobSum: digest})
|
||||
manifest.History = append(manifest.History, schema1.History{V1Compatibility: ""})
|
||||
}
|
||||
|
||||
pk, err := libtrust.GenerateECP256PrivateKey()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unexpected error generating private key: %v", err)
|
||||
}
|
||||
|
||||
signedManifest, err := schema1.Sign(&manifest, pk)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error signing manifest: %v", err)
|
||||
}
|
||||
|
||||
return signedManifest, nil
|
||||
}
|
||||
|
||||
// MakeSchema2Manifest constructs a schema 2 manifest from a given list of digests and returns
|
||||
// the digest of the manifest
|
||||
func MakeSchema2Manifest(repository distribution.Repository, digests []digest.Digest) (distribution.Manifest, error) {
|
||||
ctx := context.Background()
|
||||
blobStore := repository.Blobs(ctx)
|
||||
builder := schema2.NewManifestBuilder(blobStore, schema2.MediaTypeImageConfig, []byte{})
|
||||
for _, digest := range digests {
|
||||
builder.AppendReference(distribution.Descriptor{Digest: digest})
|
||||
}
|
||||
|
||||
manifest, err := builder.Build(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unexpected error generating manifest: %v", err)
|
||||
}
|
||||
|
||||
return manifest, nil
|
||||
}
|
115
gateway/vendor/github.com/docker/distribution/testutil/tarfile.go
generated
vendored
Normal file
115
gateway/vendor/github.com/docker/distribution/testutil/tarfile.go
generated
vendored
Normal file
@ -0,0 +1,115 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
mrand "math/rand"
|
||||
"time"
|
||||
|
||||
"github.com/docker/distribution"
|
||||
"github.com/docker/distribution/context"
|
||||
"github.com/opencontainers/go-digest"
|
||||
)
|
||||
|
||||
// CreateRandomTarFile creates a random tarfile, returning it as an
|
||||
// io.ReadSeeker along with its digest. An error is returned if there is a
|
||||
// problem generating valid content.
|
||||
func CreateRandomTarFile() (rs io.ReadSeeker, dgst digest.Digest, err error) {
|
||||
nFiles := mrand.Intn(10) + 10
|
||||
target := &bytes.Buffer{}
|
||||
wr := tar.NewWriter(target)
|
||||
|
||||
// Perturb this on each iteration of the loop below.
|
||||
header := &tar.Header{
|
||||
Mode: 0644,
|
||||
ModTime: time.Now(),
|
||||
Typeflag: tar.TypeReg,
|
||||
Uname: "randocalrissian",
|
||||
Gname: "cloudcity",
|
||||
AccessTime: time.Now(),
|
||||
ChangeTime: time.Now(),
|
||||
}
|
||||
|
||||
for fileNumber := 0; fileNumber < nFiles; fileNumber++ {
|
||||
fileSize := mrand.Int63n(1<<20) + 1<<20
|
||||
|
||||
header.Name = fmt.Sprint(fileNumber)
|
||||
header.Size = fileSize
|
||||
|
||||
if err := wr.WriteHeader(header); err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
randomData := make([]byte, fileSize)
|
||||
|
||||
// Fill up the buffer with some random data.
|
||||
n, err := mrand.Read(randomData)
|
||||
|
||||
if n != len(randomData) {
|
||||
return nil, "", fmt.Errorf("short read creating random reader: %v bytes != %v bytes", n, len(randomData))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
nn, err := io.Copy(wr, bytes.NewReader(randomData))
|
||||
if nn != fileSize {
|
||||
return nil, "", fmt.Errorf("short copy writing random file to tar")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
if err := wr.Flush(); err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
}
|
||||
|
||||
if err := wr.Close(); err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
dgst = digest.FromBytes(target.Bytes())
|
||||
|
||||
return bytes.NewReader(target.Bytes()), dgst, nil
|
||||
}
|
||||
|
||||
// CreateRandomLayers returns a map of n digests. We don't particularly care
|
||||
// about the order of said digests (since they're all random anyway).
|
||||
func CreateRandomLayers(n int) (map[digest.Digest]io.ReadSeeker, error) {
|
||||
digestMap := map[digest.Digest]io.ReadSeeker{}
|
||||
for i := 0; i < n; i++ {
|
||||
rs, ds, err := CreateRandomTarFile()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unexpected error generating test layer file: %v", err)
|
||||
}
|
||||
|
||||
dgst := digest.Digest(ds)
|
||||
digestMap[dgst] = rs
|
||||
}
|
||||
return digestMap, nil
|
||||
}
|
||||
|
||||
// UploadBlobs lets you upload blobs to a repository
|
||||
func UploadBlobs(repository distribution.Repository, layers map[digest.Digest]io.ReadSeeker) error {
|
||||
ctx := context.Background()
|
||||
for digest, rs := range layers {
|
||||
wr, err := repository.Blobs(ctx).Create(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unexpected error creating upload: %v", err)
|
||||
}
|
||||
|
||||
if _, err := io.Copy(wr, rs); err != nil {
|
||||
return fmt.Errorf("unexpected error copying to upload: %v", err)
|
||||
}
|
||||
|
||||
if _, err := wr.Commit(ctx, distribution.Descriptor{Digest: digest}); err != nil {
|
||||
return fmt.Errorf("unexpected error committinng upload: %v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user