mirror of
https://github.com/goharbor/harbor.git
synced 2024-10-04 00:07:47 +02:00
Check health status when add/update registry
Signed-off-by: cd1989 <chende@caicloud.io>
This commit is contained in:
parent
7d4649fc6b
commit
a9fa22269c
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user