mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
fn: cherry pick 4xx errors from docker-pull (#1340)
Docker pull errors are now 502.
This commit is contained in:
@@ -535,6 +535,60 @@ func TestDockerPullHungRepo(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDockerPullUnAuthorizedRepo(t *testing.T) {
|
||||||
|
garbageServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// version check seem to have a sane timeout in docker, let's serve this, then stop
|
||||||
|
if r.URL.String() == "/v2/" {
|
||||||
|
w.WriteHeader(200)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.WriteHeader(401)
|
||||||
|
return
|
||||||
|
}))
|
||||||
|
defer garbageServer.Close()
|
||||||
|
|
||||||
|
dest := strings.TrimPrefix(garbageServer.URL, "http://")
|
||||||
|
|
||||||
|
app := &models.App{ID: "app_id"}
|
||||||
|
fn := &models.Fn{
|
||||||
|
ID: "fn_id",
|
||||||
|
Image: dest + "/fnproject/fn-test-utils",
|
||||||
|
ResourceConfig: models.ResourceConfig{
|
||||||
|
Timeout: 5,
|
||||||
|
IdleTimeout: 10,
|
||||||
|
Memory: 128,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "http://127.0.0.1:8080/invoke/" + fn.ID
|
||||||
|
|
||||||
|
ls := logs.NewMock()
|
||||||
|
cfg, err := NewConfig()
|
||||||
|
cfg.MaxDockerRetries = 1
|
||||||
|
cfg.HotPullTimeout = time.Duration(5) * time.Second
|
||||||
|
a := New(NewDirectCallDataAccess(ls, new(mqs.Mock)), WithConfig(cfg))
|
||||||
|
defer checkClose(t, a)
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", url, &dummyReader{Reader: strings.NewReader(`{}`)})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("unexpected error building request", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var out bytes.Buffer
|
||||||
|
callI, err := a.GetCall(FromHTTPFnRequest(app, fn, req), WithWriter(&out))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = a.Submit(callI)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("submit should error!")
|
||||||
|
}
|
||||||
|
if models.GetAPIErrorCode(err) != http.StatusBadGateway {
|
||||||
|
t.Fatalf("unexpected error %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDockerPullBadRepo(t *testing.T) {
|
func TestDockerPullBadRepo(t *testing.T) {
|
||||||
|
|
||||||
garbageServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
garbageServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|||||||
@@ -306,10 +306,12 @@ func (c *cookie) PullImage(ctx context.Context) error {
|
|||||||
// TODO need to inspect for hub or network errors and pick; for now, assume
|
// TODO need to inspect for hub or network errors and pick; for now, assume
|
||||||
// 500 if not a docker error
|
// 500 if not a docker error
|
||||||
msg := err.Error()
|
msg := err.Error()
|
||||||
code := http.StatusInternalServerError
|
code := http.StatusBadGateway
|
||||||
if dErr, ok := err.(*docker.Error); ok {
|
if dErr, ok := err.(*docker.Error); ok {
|
||||||
msg = dockerMsg(dErr)
|
msg = dockerMsg(dErr)
|
||||||
code = dErr.Status // 401/404
|
if dErr.Status >= 400 && dErr.Status < 500 {
|
||||||
|
code = dErr.Status // decap 4xx errors
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return models.NewAPIError(code, fmt.Errorf("Failed to pull image '%s': %s", c.task.Image(), msg))
|
return models.NewAPIError(code, fmt.Errorf("Failed to pull image '%s': %s", c.task.Image(), msg))
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ func TestFnInvokeRunnerExecution(t *testing.T) {
|
|||||||
{"/invoke/http_stream_fn_id", bigbuf, http.MethodPost, http.StatusRequestEntityTooLarge, nil, "", nil},
|
{"/invoke/http_stream_fn_id", bigbuf, http.MethodPost, http.StatusRequestEntityTooLarge, nil, "", nil},
|
||||||
|
|
||||||
{"/invoke/dne_fn_id", ``, http.MethodPost, http.StatusNotFound, nil, "pull access denied", nil},
|
{"/invoke/dne_fn_id", ``, http.MethodPost, http.StatusNotFound, nil, "pull access denied", nil},
|
||||||
{"/invoke/dnereg_fn_id", ``, http.MethodPost, http.StatusInternalServerError, nil, "connection refused", nil},
|
{"/invoke/dnereg_fn_id", ``, http.MethodPost, http.StatusBadGateway, nil, "connection refused", nil},
|
||||||
|
|
||||||
// XXX(reed): what are these?
|
// XXX(reed): what are these?
|
||||||
{"/invoke/http_stream_fn_id", multiLog, http.MethodPost, http.StatusOK, nil, "", multiLogExpectHot},
|
{"/invoke/http_stream_fn_id", multiLog, http.MethodPost, http.StatusOK, nil, "", multiLogExpectHot},
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ func TestTriggerRunnerExecution(t *testing.T) {
|
|||||||
{"/t/myapp/httpstream", nil, oomer, "POST", http.StatusBadGateway, nil, "error receiving function response", nil},
|
{"/t/myapp/httpstream", nil, oomer, "POST", http.StatusBadGateway, nil, "error receiving function response", nil},
|
||||||
|
|
||||||
{"/t/myapp/mydne", nil, ``, "GET", http.StatusNotFound, nil, "pull access denied", nil},
|
{"/t/myapp/mydne", nil, ``, "GET", http.StatusNotFound, nil, "pull access denied", nil},
|
||||||
{"/t/myapp/mydneregistry", nil, ``, "GET", http.StatusInternalServerError, nil, "connection refused", nil},
|
{"/t/myapp/mydneregistry", nil, ``, "GET", http.StatusBadGateway, nil, "connection refused", nil},
|
||||||
|
|
||||||
// XXX(reed): what are these?
|
// XXX(reed): what are these?
|
||||||
{"/t/myapp/httpstream", nil, multiLog, "GET", http.StatusOK, nil, "", multiLogExpectHot},
|
{"/t/myapp/httpstream", nil, multiLog, "GET", http.StatusOK, nil, "", multiLogExpectHot},
|
||||||
|
|||||||
Reference in New Issue
Block a user