@@ -30,16 +30,11 @@ def __init__(self, chassis_gateway_mapping, gateway):
30
30
None ))
31
31
32
32
33
- class FakeOVNGatewaySchedulerSbOvnIdl (object ):
34
- def __init__ (self , chassis_gateway_mapping ):
35
- self .get_all_chassis = mock .Mock (
36
- return_value = chassis_gateway_mapping ['Chassis' ])
37
-
38
-
39
33
class TestOVNGatewayScheduler (base .BaseTestCase ):
40
34
41
35
def setUp (self ):
42
36
super (TestOVNGatewayScheduler , self ).setUp ()
37
+ self .mock_log = mock .patch .object (l3_ovn_scheduler , 'LOG' ).start ()
43
38
44
39
# Overwritten by derived classes
45
40
self .l3_scheduler = None
@@ -82,12 +77,11 @@ def setUp(self):
82
77
if chassis in details ['Chassis_Bindings' ]:
83
78
details ['Chassis_Bindings' ][chassis ].append ((gw , 0 ))
84
79
85
- def select (self , chassis_gateway_mapping , gateway_name ):
80
+ def select (self , chassis_gateway_mapping , gateway_name , candidates = None ):
86
81
nb_idl = FakeOVNGatewaySchedulerNbOvnIdl (chassis_gateway_mapping ,
87
82
gateway_name )
88
- sb_idl = FakeOVNGatewaySchedulerSbOvnIdl (chassis_gateway_mapping )
89
- return self .l3_scheduler .select (nb_idl , sb_idl ,
90
- gateway_name )
83
+ return self .l3_scheduler .select (nb_idl , gateway_name ,
84
+ candidates = candidates )
91
85
92
86
def filter_existing_chassis (self , * args , ** kwargs ):
93
87
return self .l3_scheduler .filter_existing_chassis (
@@ -108,21 +102,33 @@ def setUp(self):
108
102
def test_no_chassis_available_for_existing_gateway (self ):
109
103
mapping = self .fake_chassis_gateway_mappings ['None' ]
110
104
gateway_name = random .choice (list (mapping ['Gateways' ].keys ()))
111
- chassis = self .select (mapping , gateway_name )
105
+ chassis = self .select (mapping , gateway_name ,
106
+ candidates = mapping ['Chassis' ])
112
107
self .assertEqual ([ovn_const .OVN_GATEWAY_INVALID_CHASSIS ], chassis )
113
108
114
109
def test_no_chassis_available_for_new_gateway (self ):
115
110
mapping = self .fake_chassis_gateway_mappings ['None' ]
116
111
gateway_name = self .new_gateway_name
117
- chassis = self .select (mapping , gateway_name )
112
+ chassis = self .select (mapping , gateway_name ,
113
+ candidates = mapping ['Chassis' ])
118
114
self .assertEqual ([ovn_const .OVN_GATEWAY_INVALID_CHASSIS ], chassis )
119
115
120
116
def test_random_chassis_available_for_new_gateway (self ):
121
117
mapping = self .fake_chassis_gateway_mappings ['Multiple1' ]
122
118
gateway_name = self .new_gateway_name
123
- chassis = self .select (mapping , gateway_name )
119
+ chassis = self .select (mapping , gateway_name ,
120
+ candidates = mapping ['Chassis' ])
124
121
self .assertCountEqual (chassis , mapping .get ('Chassis' ))
125
122
123
+ def test_no_candidates_provided (self ):
124
+ mapping = self .fake_chassis_gateway_mappings ['None' ]
125
+ gateway_name = self .new_gateway_name
126
+ chassis = self .select (mapping , gateway_name )
127
+ self .assertEqual ([ovn_const .OVN_GATEWAY_INVALID_CHASSIS ], chassis )
128
+ self .mock_log .warning .assert_called_once_with (
129
+ 'Gateway %s was not scheduled on any chassis, no candidates are '
130
+ 'available' , gateway_name )
131
+
126
132
def test_filter_existing_chassis (self ):
127
133
# filter_existing_chassis is scheduler independent, but calling
128
134
# it from Base class didnt seem right. Also, there is no need to have
@@ -171,19 +177,22 @@ def setUp(self):
171
177
def test_no_chassis_available_for_existing_gateway (self ):
172
178
mapping = self .fake_chassis_gateway_mappings ['None' ]
173
179
gateway_name = random .choice (list (mapping ['Gateways' ].keys ()))
174
- chassis = self .select (mapping , gateway_name )
180
+ chassis = self .select (mapping , gateway_name ,
181
+ candidates = mapping ['Chassis' ])
175
182
self .assertEqual ([ovn_const .OVN_GATEWAY_INVALID_CHASSIS ], chassis )
176
183
177
184
def test_no_chassis_available_for_new_gateway (self ):
178
185
mapping = self .fake_chassis_gateway_mappings ['None' ]
179
186
gateway_name = self .new_gateway_name
180
- chassis = self .select (mapping , gateway_name )
187
+ chassis = self .select (mapping , gateway_name ,
188
+ candidates = mapping ['Chassis' ])
181
189
self .assertEqual ([ovn_const .OVN_GATEWAY_INVALID_CHASSIS ], chassis )
182
190
183
191
def test_least_loaded_chassis_available_for_new_gateway1 (self ):
184
192
mapping = self .fake_chassis_gateway_mappings ['Multiple1' ]
185
193
gateway_name = self .new_gateway_name
186
- chassis = self .select (mapping , gateway_name )
194
+ chassis = self .select (mapping , gateway_name ,
195
+ candidates = mapping ['Chassis' ])
187
196
self .assertCountEqual (chassis , mapping .get ('Chassis' ))
188
197
# least loaded will be the first one in the list,
189
198
# networking-ovn will assign highest priority to this first element
@@ -192,28 +201,32 @@ def test_least_loaded_chassis_available_for_new_gateway1(self):
192
201
def test_least_loaded_chassis_available_for_new_gateway2 (self ):
193
202
mapping = self .fake_chassis_gateway_mappings ['Multiple2' ]
194
203
gateway_name = self .new_gateway_name
195
- chassis = self .select (mapping , gateway_name )
204
+ chassis = self .select (mapping , gateway_name ,
205
+ candidates = mapping ['Chassis' ])
196
206
# hv1 will have least priority
197
207
self .assertEqual (chassis [2 ], 'hv1' )
198
208
199
209
def test_least_loaded_chassis_available_for_new_gateway3 (self ):
200
210
mapping = self .fake_chassis_gateway_mappings ['Multiple3' ]
201
211
gateway_name = self .new_gateway_name
202
- chassis = self .select (mapping , gateway_name )
212
+ chassis = self .select (mapping , gateway_name ,
213
+ candidates = mapping ['Chassis' ])
203
214
# least loaded chassis will be in the front of the list
204
215
self .assertEqual (['hv1' , 'hv3' , 'hv2' ], chassis )
205
216
206
217
def test_least_loaded_chassis_with_rebalance (self ):
207
218
mapping = self .fake_chassis_gateway_mappings ['Multiple4' ]
208
219
gateway_name = self .new_gateway_name
209
- chassis = self .select (mapping , gateway_name )
220
+ chassis = self .select (mapping , gateway_name ,
221
+ candidates = mapping ['Chassis' ])
210
222
# least loaded chassis will be in the front of the list
211
223
self .assertEqual (['hv2' , 'hv1' ], chassis )
212
224
213
225
def test_existing_chassis_available_for_existing_gateway (self ):
214
226
mapping = self .fake_chassis_gateway_mappings ['Multiple1' ]
215
227
gateway_name = random .choice (list (mapping ['Gateways' ].keys ()))
216
- chassis = self .select (mapping , gateway_name )
228
+ chassis = self .select (mapping , gateway_name ,
229
+ candidates = mapping ['Chassis' ])
217
230
self .assertEqual (ovn_const .MAX_GW_CHASSIS , len (chassis ))
218
231
219
232
def test__get_chassis_load_by_prios_several_ports (self ):
0 commit comments