forked from TrueCloudLab/frostfs-sdk-go
[#306] netmap: Allow to select empty set of nodes
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
0352b5b191
commit
f7da6ba99c
7 changed files with 43 additions and 15 deletions
|
@ -114,7 +114,7 @@ func (c *context) getSelection(s netmap.Selector) ([]nodes, error) {
|
|||
}
|
||||
|
||||
if len(res) < bucketCount {
|
||||
if len(res) == 0 {
|
||||
if c.strict && len(res) == 0 {
|
||||
return nil, errNotEnoughNodes
|
||||
}
|
||||
bucketCount = len(res)
|
||||
|
|
|
@ -254,6 +254,39 @@ func TestPlacementPolicy_ProcessSelectors(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestPlacementPolicy_PartiallyMissingContainer(t *testing.T) {
|
||||
s := `REP 2 IN D1OBJ
|
||||
REP 2 IN D2OBJ
|
||||
CBF 2
|
||||
SELECT 2 FROM PRIMARY AS D1OBJ
|
||||
SELECT 2 FROM SECONDARY AS D2OBJ
|
||||
FILTER ClusterName EQ D1OBJ AS PRIMARY
|
||||
FILTER ClusterName EQ D2OBJ AS SECONDARY`
|
||||
|
||||
var p PlacementPolicy
|
||||
require.NoError(t, p.DecodeString(s))
|
||||
|
||||
nodes := []NodeInfo{
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "1"),
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "2"),
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "3"),
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "4"),
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "5"),
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "6"),
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "7"),
|
||||
nodeInfoFromAttributes("ClusterName", "D1OBJ", "ID", "8"),
|
||||
}
|
||||
|
||||
var nm NetMap
|
||||
nm.SetNodes(nodes)
|
||||
|
||||
res, err := nm.ContainerNodes(p, nil)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, res, 2)
|
||||
require.Len(t, res[0], 4)
|
||||
require.Len(t, res[1], 0)
|
||||
}
|
||||
|
||||
func TestPlacementPolicy_Like(t *testing.T) {
|
||||
nodes := []NodeInfo{
|
||||
nodeInfoFromAttributes("Country", "Russia"),
|
||||
|
|
|
@ -84,8 +84,15 @@ func TestPlacementPolicy_Interopability(t *testing.T) {
|
|||
t.Run(name, func(t *testing.T) {
|
||||
v, err := nm.ContainerNodes(tt.Policy, tt.Pivot)
|
||||
if tt.Result == nil {
|
||||
if tt.Error != "" {
|
||||
require.Error(t, err)
|
||||
require.Contains(t, err.Error(), tt.Error)
|
||||
} else {
|
||||
require.Len(t, v, tt.Policy.NumberOfReplicas())
|
||||
for i := range v {
|
||||
require.Len(t, v[i], 0)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, srcNodes, tc.Nodes)
|
||||
|
|
|
@ -107,7 +107,6 @@ tests:
|
|||
op: EQ
|
||||
value: Value2
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
bad rating:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -157,7 +156,6 @@ tests:
|
|||
op: EQ
|
||||
value: Value2
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
bad param:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -207,4 +205,3 @@ tests:
|
|||
op: EQ
|
||||
value: Value2
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
|
|
|
@ -24,7 +24,6 @@ tests:
|
|||
op: LE
|
||||
value: '8'
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
non-empty string is not casted to a number:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -42,4 +41,3 @@ tests:
|
|||
op: GE
|
||||
value: '0'
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
|
|
|
@ -42,7 +42,6 @@ tests:
|
|||
op: GE
|
||||
value: '5'
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
GT true:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -79,7 +78,6 @@ tests:
|
|||
op: GT
|
||||
value: '4'
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
LE true:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -116,7 +114,6 @@ tests:
|
|||
op: LE
|
||||
value: '3'
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
LT true:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -153,7 +150,6 @@ tests:
|
|||
op: LT
|
||||
value: '4'
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
EQ true:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -190,7 +186,6 @@ tests:
|
|||
op: EQ
|
||||
value: China
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
NE true:
|
||||
policy:
|
||||
replicas:
|
||||
|
@ -227,4 +222,3 @@ tests:
|
|||
op: NE
|
||||
value: Germany
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
|
|
|
@ -45,4 +45,3 @@ tests:
|
|||
op: EQ
|
||||
value: Moon
|
||||
filters: []
|
||||
error: not enough nodes
|
||||
|
|
Loading…
Reference in a new issue