[#105] policy: Add ListChainNames method
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
0befe361fe
commit
cee957e85a
4 changed files with 43 additions and 0 deletions
|
@ -7,5 +7,6 @@ safemethods:
|
|||
- "getChain"
|
||||
- "listChainsByPrefix"
|
||||
- "listTargets"
|
||||
- "listChainNames"
|
||||
- "iteratorChainsByPrefix"
|
||||
- "version"
|
|
@ -256,3 +256,11 @@ func ListTargets(entity Kind) iterator.Iterator {
|
|||
mKey := mapKey(entity, []byte{})
|
||||
return storage.Find(ctx, mKey, storage.KeysOnly|storage.RemovePrefix)
|
||||
}
|
||||
|
||||
// ListChainNames iterates over chain names for specific target.
|
||||
func ListChainNames(entity Kind, entityName string) iterator.Iterator {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
id, _ := mapToNumeric(ctx, entity, []byte(entityName))
|
||||
keyPrefix := storageKey(entity, id, []byte{})
|
||||
return storage.Find(ctx, keyPrefix, storage.KeysOnly|storage.RemovePrefix)
|
||||
}
|
||||
|
|
|
@ -80,6 +80,20 @@ func (c *ContractReader) IteratorChainsByPrefixExpanded(entity *big.Int, entityN
|
|||
return unwrap.Array(c.invoker.CallAndExpandIterator(c.hash, "iteratorChainsByPrefix", _numOfIteratorItems, entity, entityName, prefix))
|
||||
}
|
||||
|
||||
// ListChainNames invokes `listChainNames` method of contract.
|
||||
func (c *ContractReader) ListChainNames(entity *big.Int, entityName string) (uuid.UUID, result.Iterator, error) {
|
||||
return unwrap.SessionIterator(c.invoker.Call(c.hash, "listChainNames", entity, entityName))
|
||||
}
|
||||
|
||||
// ListChainNamesExpanded is similar to ListChainNames (uses the same contract
|
||||
// method), but can be useful if the server used doesn't support sessions and
|
||||
// doesn't expand iterators. It creates a script that will get the specified
|
||||
// number of result items from the iterator right in the VM and return them to
|
||||
// you. It's only limited by VM stack and GAS available for RPC invocations.
|
||||
func (c *ContractReader) ListChainNamesExpanded(entity *big.Int, entityName string, _numOfIteratorItems int) ([]stackitem.Item, error) {
|
||||
return unwrap.Array(c.invoker.CallAndExpandIterator(c.hash, "listChainNames", _numOfIteratorItems, entity, entityName))
|
||||
}
|
||||
|
||||
// ListChains invokes `listChains` method of contract.
|
||||
func (c *ContractReader) ListChains(namespace string, container string, name []byte) ([]stackitem.Item, error) {
|
||||
return unwrap.Array(c.invoker.Call(c.hash, "listChains", namespace, container, name))
|
||||
|
|
|
@ -66,6 +66,7 @@ func TestPolicy(t *testing.T) {
|
|||
checkChains(t, e, "mynamespace", "cnr1", "ingress", [][]byte{p1, p2, p33}) // Override chain.
|
||||
checkChainsByPrefix(t, e, policy.Container, "cnr1", "", [][]byte{p2, p33})
|
||||
checkChainsByPrefix(t, e, policy.IAM, "", "", nil)
|
||||
checkChainKeys(t, e, policy.Container, "cnr1", []string{"ingress:myrule2", "ingress:myrule3"})
|
||||
|
||||
checkChainsIteratorByPrefix(t, e, policy.Container, "cnr1", "ingress:myrule3", [][]byte{p33})
|
||||
checkChainsIteratorByPrefix(t, e, policy.Container, "cnr1", "ingress", [][]byte{p2, p33})
|
||||
|
@ -151,6 +152,25 @@ func checkChainsIteratorByPrefix(t *testing.T, e *neotest.ContractInvoker, kind
|
|||
}
|
||||
}
|
||||
|
||||
func checkChainKeys(t *testing.T, e *neotest.ContractInvoker, kind byte, entityName string, expected []string) {
|
||||
s, err := e.TestInvoke(t, "listChainNames", kind, entityName)
|
||||
require.NoError(t, err)
|
||||
|
||||
if s.Len() == 0 {
|
||||
t.Fatal("Stack is empty")
|
||||
}
|
||||
|
||||
iteratorItem := s.Pop().Value().(*storage.Iterator)
|
||||
policys := iteratorToArray(iteratorItem)
|
||||
require.Equal(t, len(expected), len(policys))
|
||||
|
||||
for i := range expected {
|
||||
bytesPolicy, err := policys[i].TryBytes()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expected[i], string(bytesPolicy))
|
||||
}
|
||||
}
|
||||
|
||||
func checksChainsOnStack(t *testing.T, s *vm.Stack, expected [][]byte) {
|
||||
require.Equal(t, 1, s.Len())
|
||||
|
||||
|
|
Loading…
Reference in a new issue