Fix function delete with uid (#142)
If no uid is provided, all versions of function files and function metadata will be deleted. If a uid is provided, only that specific version is deleted, and the "latest" version of the function moves back to the previous one. Fixes #152
This commit is contained in:
@@ -126,6 +126,61 @@ func TestFunctionApi(t *testing.T) {
|
|||||||
panicIf(err)
|
panicIf(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFunctionVersionApi(t *testing.T) {
|
||||||
|
testFunc := &fission.Function{
|
||||||
|
Metadata: fission.Metadata{
|
||||||
|
Name: "foo",
|
||||||
|
Uid: "",
|
||||||
|
},
|
||||||
|
Environment: fission.Metadata{
|
||||||
|
Name: "nodejs",
|
||||||
|
Uid: "xxx",
|
||||||
|
},
|
||||||
|
Code: "code1",
|
||||||
|
}
|
||||||
|
|
||||||
|
testFunc.Code = "code1"
|
||||||
|
m, err := g.client.FunctionCreate(testFunc)
|
||||||
|
panicIf(err)
|
||||||
|
uid1 := m.Uid
|
||||||
|
|
||||||
|
testFunc.Code = "code2"
|
||||||
|
m, err = g.client.FunctionUpdate(testFunc)
|
||||||
|
panicIf(err)
|
||||||
|
uid2 := m.Uid
|
||||||
|
|
||||||
|
err = g.client.FunctionDelete(&fission.Metadata{Name: "foo", Uid: uid1})
|
||||||
|
panicIf(err)
|
||||||
|
|
||||||
|
f, err := g.client.FunctionGet(&fission.Metadata{Name: "foo"})
|
||||||
|
panicIf(err)
|
||||||
|
assert(f.Metadata.Uid == uid2, "deleted version1, but version2 does not exist")
|
||||||
|
|
||||||
|
testFunc.Code = "code3"
|
||||||
|
m, err = g.client.FunctionUpdate(testFunc)
|
||||||
|
panicIf(err)
|
||||||
|
uid3 := m.Uid
|
||||||
|
|
||||||
|
err = g.client.FunctionDelete(&fission.Metadata{Name: "foo", Uid: uid3})
|
||||||
|
panicIf(err)
|
||||||
|
|
||||||
|
f, err = g.client.FunctionGet(&fission.Metadata{Name: "foo"})
|
||||||
|
panicIf(err)
|
||||||
|
assert(f.Metadata.Uid == uid2, "deleted version3, but version2 does not exist")
|
||||||
|
|
||||||
|
testFunc.Code = "code4"
|
||||||
|
m, err = g.client.FunctionUpdate(testFunc)
|
||||||
|
panicIf(err)
|
||||||
|
|
||||||
|
err = g.client.FunctionDelete(&fission.Metadata{Name: "foo"})
|
||||||
|
panicIf(err)
|
||||||
|
|
||||||
|
funcs, err := g.client.FunctionList()
|
||||||
|
panicIf(err)
|
||||||
|
assert(len(funcs) == 0,
|
||||||
|
"created one function with two versions(2 and 4), delete without uid but cannot delete them all")
|
||||||
|
}
|
||||||
|
|
||||||
func TestHTTPTriggerApi(t *testing.T) {
|
func TestHTTPTriggerApi(t *testing.T) {
|
||||||
testTrigger := &fission.HTTPTrigger{
|
testTrigger := &fission.HTTPTrigger{
|
||||||
Metadata: fission.Metadata{
|
Metadata: fission.Metadata{
|
||||||
|
|||||||
@@ -108,7 +108,26 @@ func (fs *FunctionStore) Delete(m fission.Metadata) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return fs.ResourceStore.delete(typeName, m.Name)
|
|
||||||
|
bufs, err := fs.ResourceStore.getAll("file/" + m.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(bufs) == 0 {
|
||||||
|
return fs.ResourceStore.delete(typeName, m.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
fnew, err := fs.Get(&fission.Metadata{Name: m.Name})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
latestUid := bufs[len(bufs)-1] // function always tracks the latest version of code
|
||||||
|
if latestUid == fnew.Uid {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fnew.Uid = latestUid
|
||||||
|
return fs.ResourceStore.update(fnew)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fs *FunctionStore) List() ([]fission.Function, error) {
|
func (fs *FunctionStore) List() ([]fission.Function, error) {
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ func (rs *ResourceStore) delete(typename, rkey string) error {
|
|||||||
// getAll finds all entries under key. If none or found or key
|
// getAll finds all entries under key. If none or found or key
|
||||||
// doesn't exist, returns an empty slice.
|
// doesn't exist, returns an empty slice.
|
||||||
func (rs *ResourceStore) getAll(key string) ([]string, error) {
|
func (rs *ResourceStore) getAll(key string) ([]string, error) {
|
||||||
resp, err := rs.KeysAPI.Get(context.Background(), key, &client.GetOptions{Recursive: true})
|
resp, err := rs.KeysAPI.Get(context.Background(), key, &client.GetOptions{Recursive: true, Sort: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if client.IsKeyNotFound(err) {
|
if client.IsKeyNotFound(err) {
|
||||||
return []string{}, nil
|
return []string{}, nil
|
||||||
|
|||||||
Reference in New Issue
Block a user