diff --git a/common/version.go b/common/version.go index ef2b872..772ab81 100644 --- a/common/version.go +++ b/common/version.go @@ -44,3 +44,8 @@ func AppendVersion(data any) []interface{} { } return append(data.([]any), Version) } + +// GetVersion returns version as int by major, minor, patch. +func GetVersion(major, minor, patch int) int { + return major*1_000_000 + minor*1_000 + patch +} diff --git a/frostfsid/frostfsid_contract.go b/frostfsid/frostfsid_contract.go index 80991fb..f177522 100644 --- a/frostfsid/frostfsid_contract.go +++ b/frostfsid/frostfsid_contract.go @@ -134,6 +134,22 @@ func _deploy(data any, isUpdate bool) { storage.Put(ctx, address, true) } } + + if args.version < common.GetVersion(0, 21, 2) { + maxGroupID := 0 + it := storage.Find(ctx, groupKeysPrefix, storage.ValuesOnly) + for iterator.Next(it) { + groupRaw := iterator.Value(it) + group := std.Deserialize(groupRaw.([]byte)).(Group) + if group.ID > maxGroupID { + maxGroupID = group.ID + } + } + + storage.Put(ctx, groupCounterKey, maxGroupID) + } + + return } storage.Put(ctx, groupCounterKey, 0) diff --git a/tests/frostfsid_test.go b/tests/frostfsid_test.go index 72be569..9706093 100644 --- a/tests/frostfsid_test.go +++ b/tests/frostfsid_test.go @@ -1,7 +1,9 @@ package tests import ( + "encoding/json" "errors" + "fmt" "path" "testing" @@ -656,6 +658,53 @@ func TestAdditionalKeyFromPrimarySubject(t *testing.T) { invoker.Invoke(t, stackitem.Null{}, createSubjectMethod, defaultNamespace, subjFPrimaryKey.PublicKey().Bytes()) } +func TestFrostFSIS_GroupsAfterUpdate(t *testing.T) { + countNamesepce := 2 + f := newFrostFSIDInvoker(t) + invoker := f.OwnerInvoker() + + groupid := int64(1) + + for i := range countNamesepce { + namespace := fmt.Sprintf("nm_%d", i) + invoker.Invoke(t, stackitem.Null{}, createNamespaceMethod, namespace) + } + + for i := range 5 { + namespace := fmt.Sprintf("nm_%d", i%2) + groupName := fmt.Sprintf("group_%d", groupid) + + invoker.Invoke(t, stackitem.Make(groupid), createGroupMethod, namespace, groupName) + s, err := invoker.TestInvoke(t, getGroupIDByNameMethod, namespace, groupName) + checkGroupIDResult(t, s, err, groupid) + groupid++ + } + + args := make([]any, 2) + args[0] = f.owner.ScriptHash() + args[1] = 21 * 1_000 + + c := neotest.CompileFile(t, f.e.CommitteeHash, frostfsidPath, path.Join(frostfsidPath, "config.yml")) + + nef, err := c.NEF.Bytes() + require.NoError(t, err) + + manifest, err := json.Marshal(c.Manifest) + require.NoError(t, err) + + f.CommitteeInvoker().Invoke(t, stackitem.Null{}, "update", nef, manifest, args) + + for i := range 5 { + namespace := fmt.Sprintf("nm_%d", i%2) + groupName := fmt.Sprintf("group_%d", groupid) + + invoker.Invoke(t, stackitem.Make(groupid), createGroupMethod, namespace, groupName) + s, err := invoker.TestInvoke(t, getGroupIDByNameMethod, namespace, groupName) + checkGroupIDResult(t, s, err, groupid) + groupid++ + } +} + func checkPublicKeyResult(t *testing.T, s *vm.Stack, err error, key *keys.PrivateKey) { if key == nil { require.ErrorContains(t, err, "not found")