forked from TrueCloudLab/frostfs-node
[#27] Support JSON format for placement policy
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
778dd54244
commit
84b4ff0755
3 changed files with 306 additions and 0 deletions
84
pkg/policy/json_test.go
Normal file
84
pkg/policy/json_test.go
Normal file
|
@ -0,0 +1,84 @@
|
|||
package policy
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/nspcc-dev/neofs-api-go/v2/netmap"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestToJSON(t *testing.T) {
|
||||
check := func(t *testing.T, p *netmap.PlacementPolicy, json string) {
|
||||
data, err := ToJSON(p)
|
||||
require.NoError(t, err)
|
||||
require.JSONEq(t, json, string(data))
|
||||
|
||||
np, err := FromJSON(data)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, p, np)
|
||||
}
|
||||
t.Run("SimpleREP", func(t *testing.T) {
|
||||
p := new(netmap.PlacementPolicy)
|
||||
p.SetReplicas([]*netmap.Replica{newReplica("", 3)})
|
||||
check(t, p, `{"replicas":[{"count":3}]}`)
|
||||
})
|
||||
t.Run("REPWithCBF", func(t *testing.T) {
|
||||
p := new(netmap.PlacementPolicy)
|
||||
p.SetReplicas([]*netmap.Replica{newReplica("", 3)})
|
||||
p.SetContainerBackupFactor(3)
|
||||
check(t, p, `{"replicas":[{"count":3}],"container_backup_factor":3}`)
|
||||
})
|
||||
t.Run("REPFromSelector", func(t *testing.T) {
|
||||
p := new(netmap.PlacementPolicy)
|
||||
p.SetReplicas([]*netmap.Replica{newReplica("Nodes", 3)})
|
||||
p.SetContainerBackupFactor(3)
|
||||
p.SetSelectors([]*netmap.Selector{
|
||||
newSelector(1, netmap.Distinct, "City", "", "Nodes"),
|
||||
})
|
||||
check(t, p, `{
|
||||
"replicas":[{"count":3,"selector":"Nodes"}],
|
||||
"container_backup_factor":3,
|
||||
"selectors": [{
|
||||
"name":"Nodes",
|
||||
"attribute":"City",
|
||||
"clause":"distinct",
|
||||
"count":1
|
||||
}]}`)
|
||||
})
|
||||
t.Run("FilterOps", func(t *testing.T) {
|
||||
p := new(netmap.PlacementPolicy)
|
||||
p.SetReplicas([]*netmap.Replica{newReplica("Nodes", 3)})
|
||||
p.SetContainerBackupFactor(3)
|
||||
p.SetSelectors([]*netmap.Selector{
|
||||
newSelector(1, netmap.Same, "City", "Good", "Nodes"),
|
||||
})
|
||||
p.SetFilters([]*netmap.Filter{
|
||||
newFilter("GoodRating", "Rating", "5", netmap.GE),
|
||||
newFilter("Good", "", "", netmap.OR,
|
||||
newFilter("GoodRating", "", "", netmap.UnspecifiedOperation),
|
||||
newFilter("", "Attr1", "Val1", netmap.EQ),
|
||||
newFilter("", "Attr2", "Val2", netmap.NE),
|
||||
newFilter("", "", "", netmap.AND,
|
||||
newFilter("", "Attr4", "2", netmap.LT),
|
||||
newFilter("", "Attr5", "3", netmap.LE)),
|
||||
newFilter("", "Attr3", "1", netmap.GT)),
|
||||
})
|
||||
check(t, p, `{
|
||||
"replicas":[{"count":3,"selector":"Nodes"}],
|
||||
"container_backup_factor":3,
|
||||
"selectors": [{"name":"Nodes","attribute":"City","clause":"same","count":1,"filter":"Good"}],
|
||||
"filters": [
|
||||
{"name":"GoodRating","key":"Rating","op":"GE","value":"5"},
|
||||
{"name":"Good","op":"OR","filters":[
|
||||
{"name":"GoodRating"},
|
||||
{"key":"Attr1","op":"EQ","value":"Val1"},
|
||||
{"key":"Attr2","op":"NE","value":"Val2"},
|
||||
{"op":"AND","filters":[
|
||||
{"key":"Attr4","op":"LT","value":"2"},
|
||||
{"key":"Attr5","op":"LE","value":"3"}
|
||||
]},
|
||||
{"key":"Attr3","op":"GT","value":"1"}
|
||||
]}
|
||||
]}`)
|
||||
})
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue