configstore: update/fix remotesource rename
* Override the provided remotesource id with the current one (it could not be provided or provided with a different id but the remotesource ref is the way to get the current remote source). * When changing remotesource name check that a remote source with the new name does not already exist.
This commit is contained in:
parent
2c042fb4bd
commit
28c44ce1fc
@ -125,13 +125,15 @@ func (h *ActionHandler) UpdateRemoteSource(ctx context.Context, req *UpdateRemot
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var curRemoteSource *types.RemoteSource
|
||||||
var cgt *datamanager.ChangeGroupsUpdateToken
|
var cgt *datamanager.ChangeGroupsUpdateToken
|
||||||
|
|
||||||
// must do all the checks in a single transaction to avoid concurrent changes
|
// must do all the checks in a single transaction to avoid concurrent changes
|
||||||
err := h.readDB.Do(func(tx *db.Tx) error {
|
err := h.readDB.Do(func(tx *db.Tx) error {
|
||||||
var err error
|
var err error
|
||||||
// check duplicate remoteSource name
|
|
||||||
curRemoteSource, err := h.readDB.GetRemoteSourceByName(tx, req.RemoteSourceRef)
|
// check remotesource exists
|
||||||
|
curRemoteSource, err = h.readDB.GetRemoteSourceByName(tx, req.RemoteSourceRef)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -139,6 +141,20 @@ func (h *ActionHandler) UpdateRemoteSource(ctx context.Context, req *UpdateRemot
|
|||||||
return util.NewErrBadRequest(errors.Errorf("remotesource with ref %q doesn't exist", req.RemoteSourceRef))
|
return util.NewErrBadRequest(errors.Errorf("remotesource with ref %q doesn't exist", req.RemoteSourceRef))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if curRemoteSource.Name != req.RemoteSource.Name {
|
||||||
|
// check duplicate remoteSource name
|
||||||
|
u, err := h.readDB.GetRemoteSourceByName(tx, req.RemoteSource.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if u != nil {
|
||||||
|
return util.NewErrBadRequest(errors.Errorf("remotesource %q already exists", u.Name))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set/override ID that must be kept from the current remote source
|
||||||
|
req.RemoteSource.ID = curRemoteSource.ID
|
||||||
|
|
||||||
// changegroup is the remotesource id and also name since we could change the
|
// changegroup is the remotesource id and also name since we could change the
|
||||||
// name so concurrently updating on the new name
|
// name so concurrently updating on the new name
|
||||||
cgNames := []string{util.EncodeSha256Hex("remotesourcename-" + req.RemoteSource.Name), util.EncodeSha256Hex("remotesourceid-" + req.RemoteSource.ID)}
|
cgNames := []string{util.EncodeSha256Hex("remotesourcename-" + req.RemoteSource.Name), util.EncodeSha256Hex("remotesourceid-" + req.RemoteSource.ID)}
|
||||||
|
@ -829,6 +829,73 @@ func TestRemoteSource(t *testing.T) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "test update remote source keeping same name",
|
||||||
|
f: func(ctx context.Context, t *testing.T, cs *Configstore) {
|
||||||
|
rs01 := &types.RemoteSource{
|
||||||
|
Name: "rs01",
|
||||||
|
APIURL: "https://api.example.com",
|
||||||
|
Type: types.RemoteSourceTypeGitea,
|
||||||
|
AuthType: types.RemoteSourceAuthTypeOauth2,
|
||||||
|
Oauth2ClientID: "clientid",
|
||||||
|
Oauth2ClientSecret: "clientsecret",
|
||||||
|
}
|
||||||
|
rs01, err := cs.ah.CreateRemoteSource(ctx, rs01)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rs01.APIURL = "https://api01.example.com"
|
||||||
|
req := &action.UpdateRemoteSourceRequest{
|
||||||
|
RemoteSourceRef: "rs01",
|
||||||
|
RemoteSource: rs01,
|
||||||
|
}
|
||||||
|
_, err = cs.ah.UpdateRemoteSource(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected err: %v", err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "test rename remote source to an already existing name",
|
||||||
|
f: func(ctx context.Context, t *testing.T, cs *Configstore) {
|
||||||
|
rs01 := &types.RemoteSource{
|
||||||
|
Name: "rs01",
|
||||||
|
APIURL: "https://api.example.com",
|
||||||
|
Type: types.RemoteSourceTypeGitea,
|
||||||
|
AuthType: types.RemoteSourceAuthTypeOauth2,
|
||||||
|
Oauth2ClientID: "clientid",
|
||||||
|
Oauth2ClientSecret: "clientsecret",
|
||||||
|
}
|
||||||
|
rs01, err := cs.ah.CreateRemoteSource(ctx, rs01)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rs02 := &types.RemoteSource{
|
||||||
|
Name: "rs02",
|
||||||
|
APIURL: "https://api.example.com",
|
||||||
|
Type: types.RemoteSourceTypeGitea,
|
||||||
|
AuthType: types.RemoteSourceAuthTypeOauth2,
|
||||||
|
Oauth2ClientID: "clientid",
|
||||||
|
Oauth2ClientSecret: "clientsecret",
|
||||||
|
}
|
||||||
|
if _, err = cs.ah.CreateRemoteSource(ctx, rs02); err != nil {
|
||||||
|
t.Fatalf("unexpected err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedError := util.NewErrBadRequest(fmt.Errorf(`remotesource "rs02" already exists`))
|
||||||
|
rs01.Name = "rs02"
|
||||||
|
req := &action.UpdateRemoteSourceRequest{
|
||||||
|
RemoteSourceRef: "rs01",
|
||||||
|
RemoteSource: rs01,
|
||||||
|
}
|
||||||
|
_, err = cs.ah.UpdateRemoteSource(ctx, req)
|
||||||
|
if err.Error() != expectedError.Error() {
|
||||||
|
t.Fatalf("expected err: %v, got err: %v", expectedError.Error(), err.Error())
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user