Check health status when add/update registry

Signed-off-by: cd1989 <chende@caicloud.io>
This commit is contained in:
cd1989 2019-04-10 09:38:14 +08:00
parent 7d4649fc6b
commit a9fa22269c
2 changed files with 70 additions and 53 deletions

View File

@ -129,24 +129,24 @@ func (t *RegistryAPI) Ping() {
func (t *RegistryAPI) Get() { func (t *RegistryAPI) Get() {
id := t.GetIDFromURL() id := t.GetIDFromURL()
registry, err := t.manager.Get(id) r, err := t.manager.Get(id)
if err != nil { if err != nil {
log.Errorf("failed to get registry %d: %v", id, err) log.Errorf("failed to get registry %d: %v", id, err)
t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
return return
} }
if registry == nil { if r == nil {
t.HandleNotFound(fmt.Sprintf("registry %d not found", id)) t.HandleNotFound(fmt.Sprintf("registry %d not found", id))
return return
} }
// Hide access secret // Hide access secret
if registry.Credential != nil && len(registry.Credential.AccessSecret) != 0 { if r.Credential != nil && len(r.Credential.AccessSecret) != 0 {
registry.Credential.AccessSecret = "*****" r.Credential.AccessSecret = "*****"
} }
t.Data["json"] = registry t.Data["json"] = r
t.ServeJSON() t.ServeJSON()
} }
@ -164,9 +164,9 @@ func (t *RegistryAPI) List() {
} }
// Hide passwords // Hide passwords
for _, registry := range registries { for _, r := range registries {
if registry.Credential != nil && len(registry.Credential.AccessSecret) != 0 { if r.Credential != nil && len(r.Credential.AccessSecret) != 0 {
registry.Credential.AccessSecret = "*****" r.Credential.AccessSecret = "*****"
} }
} }
@ -177,24 +177,34 @@ func (t *RegistryAPI) List() {
// Post creates a registry // Post creates a registry
func (t *RegistryAPI) Post() { func (t *RegistryAPI) Post() {
registry := &model.Registry{} r := &model.Registry{}
t.DecodeJSONReqAndValidate(registry) t.DecodeJSONReqAndValidate(r)
reg, err := t.manager.GetByName(registry.Name) reg, err := t.manager.GetByName(r.Name)
if err != nil { if err != nil {
log.Errorf("failed to get registry %s: %v", registry.Name, err) log.Errorf("failed to get registry %s: %v", r.Name, err)
t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
return return
} }
if reg != nil { if reg != nil {
t.HandleConflict(fmt.Sprintf("name '%s' is already used", registry.Name)) t.HandleConflict(fmt.Sprintf("name '%s' is already used", r.Name))
return return
} }
id, err := t.manager.Add(registry) status, err := registry.CheckHealthStatus(r)
if err != nil { if err != nil {
log.Errorf("Add registry '%s' error: %v", registry.URL, err) t.HandleBadRequest(fmt.Sprintf("health check to registry %s failed: %v", r.URL, err))
return
}
if status != model.Healthy {
t.HandleBadRequest(fmt.Sprintf("registry %s is unhealthy: %s", r.URL, status))
return
}
id, err := t.manager.Add(r)
if err != nil {
log.Errorf("Add registry '%s' error: %v", r.URL, err)
t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
return return
} }
@ -206,14 +216,14 @@ func (t *RegistryAPI) Post() {
func (t *RegistryAPI) Put() { func (t *RegistryAPI) Put() {
id := t.GetIDFromURL() id := t.GetIDFromURL()
registry, err := t.manager.Get(id) r, err := t.manager.Get(id)
if err != nil { if err != nil {
log.Errorf("Get registry by id %d error: %v", id, err) log.Errorf("Get registry by id %d error: %v", id, err)
t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
return return
} }
if registry == nil { if r == nil {
t.HandleNotFound(fmt.Sprintf("Registry %d not found", id)) t.HandleNotFound(fmt.Sprintf("Registry %d not found", id))
return return
} }
@ -221,36 +231,36 @@ func (t *RegistryAPI) Put() {
req := models.RegistryUpdateRequest{} req := models.RegistryUpdateRequest{}
t.DecodeJSONReq(&req) t.DecodeJSONReq(&req)
originalName := registry.Name originalName := r.Name
if req.Name != nil { if req.Name != nil {
registry.Name = *req.Name r.Name = *req.Name
} }
if req.Description != nil { if req.Description != nil {
registry.Description = *req.Description r.Description = *req.Description
} }
if req.URL != nil { if req.URL != nil {
registry.URL = *req.URL r.URL = *req.URL
} }
if req.CredentialType != nil { if req.CredentialType != nil {
registry.Credential.Type = (model.CredentialType)(*req.CredentialType) r.Credential.Type = (model.CredentialType)(*req.CredentialType)
} }
if req.AccessKey != nil { if req.AccessKey != nil {
registry.Credential.AccessKey = *req.AccessKey r.Credential.AccessKey = *req.AccessKey
} }
if req.AccessSecret != nil { if req.AccessSecret != nil {
registry.Credential.AccessSecret = *req.AccessSecret r.Credential.AccessSecret = *req.AccessSecret
} }
if req.Insecure != nil { if req.Insecure != nil {
registry.Insecure = *req.Insecure r.Insecure = *req.Insecure
} }
t.Validate(registry) t.Validate(r)
if registry.Name != originalName { if r.Name != originalName {
reg, err := t.manager.GetByName(registry.Name) reg, err := t.manager.GetByName(r.Name)
if err != nil { if err != nil {
log.Errorf("Get registry by name '%s' error: %v", registry.Name, err) log.Errorf("Get registry by name '%s' error: %v", r.Name, err)
t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
return return
} }
@ -261,7 +271,17 @@ func (t *RegistryAPI) Put() {
} }
} }
if err := t.manager.Update(registry); err != nil { status, err := registry.CheckHealthStatus(r)
if err != nil {
t.HandleBadRequest(fmt.Sprintf("health check to registry %s failed: %v", r.URL, err))
return
}
if status != model.Healthy {
t.HandleBadRequest(fmt.Sprintf("registry %s is unhealthy: %s", r.URL, status))
return
}
if err := t.manager.Update(r); err != nil {
log.Errorf("Update registry %d error: %v", id, err) log.Errorf("Update registry %d error: %v", id, err)
t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) t.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
return return

View File

@ -15,24 +15,16 @@ import (
var ( var (
testRegistry = &model.Registry{ testRegistry = &model.Registry{
Name: "test1", Name: "test1",
URL: "https://127.0.0.1", URL: "https://goharbor.io",
Type: "harbor", Type: "harbor",
Credential: &model.Credential{ Credential: nil,
Type: model.CredentialTypeBasic,
AccessKey: "admin",
AccessSecret: "Harbor12345",
},
} }
testRegistry2 = &model.Registry{ testRegistry2 = &model.Registry{
Name: "test2", Name: "test2",
URL: "https://test2.harbor.io", URL: "https://goharbor.io",
Type: "harbor", Type: "harbor",
Credential: &model.Credential{ Credential: nil,
Type: model.CredentialTypeBasic,
AccessKey: "admin",
AccessSecret: "Harbor12345",
},
} }
) )
@ -120,11 +112,16 @@ func (suite *RegistrySuite) TestPost() {
func (suite *RegistrySuite) TestPing() { func (suite *RegistrySuite) TestPing() {
assert := assert.New(suite.T()) assert := assert.New(suite.T())
code, err := suite.testAPI.RegistryPing(*admin, &pingReq{
ID: &suite.defaultRegistry.ID,
})
assert.Nil(err)
assert.Equal(http.StatusOK, code)
var id int64 = -1 var id int64 = -1
code, err := suite.testAPI.RegistryPing(*admin, code, err = suite.testAPI.RegistryPing(*admin, &pingReq{
&pingReq{ ID: &id,
ID: &id, })
})
assert.Nil(err) assert.Nil(err)
assert.Equal(http.StatusNotFound, code) assert.Equal(http.StatusNotFound, code)
@ -143,9 +140,9 @@ func (suite *RegistrySuite) TestRegistryPut() {
assert := assert.New(suite.T()) assert := assert.New(suite.T())
// Update as admin, should succeed // Update as admin, should succeed
newKey := "NewKey" description := "foobar"
updateReq := &models.RegistryUpdateRequest{ updateReq := &models.RegistryUpdateRequest{
AccessKey: &newKey, Description: &description,
} }
code, err := suite.testAPI.RegistryUpdate(*admin, suite.defaultRegistry.ID, updateReq) code, err := suite.testAPI.RegistryUpdate(*admin, suite.defaultRegistry.ID, updateReq)
assert.Nil(err) assert.Nil(err)
@ -153,7 +150,7 @@ func (suite *RegistrySuite) TestRegistryPut() {
updated, code, err := suite.testAPI.RegistryGet(*admin, suite.defaultRegistry.ID) updated, code, err := suite.testAPI.RegistryGet(*admin, suite.defaultRegistry.ID)
assert.Nil(err) assert.Nil(err)
assert.Equal(http.StatusOK, code) assert.Equal(http.StatusOK, code)
assert.Equal("NewKey", updated.Credential.AccessKey) assert.Equal("foobar", updated.Description)
// Update as user, should fail // Update as user, should fail
code, err = suite.testAPI.RegistryUpdate(*testUser, suite.defaultRegistry.ID, updateReq) code, err = suite.testAPI.RegistryUpdate(*testUser, suite.defaultRegistry.ID, updateReq)