Open Kilda Java Documentation
test_isl.py
Go to the documentation of this file.
1 # Copyright 2017 Telstra Open Source
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 #
15 
16 import unittest
17 
18 from topologylistener import exc
19 from topologylistener import isl_utils
20 from topologylistener import messageclasses
21 from topologylistener import model
22 from topologylistener.tests import share
23 
24 ISL_STATUS_ACTIVE = 'active'
25 ISL_STATUS_INACTIVE = 'inactive'
26 ISL_STATUS_MOVED = 'moved'
27 
28 ISL_STATUS_PROPS_DOWN = {
29  'actual': ISL_STATUS_INACTIVE, 'status': ISL_STATUS_INACTIVE}
30 ISL_STATUS_PROPS_HALF_UP = {
31  'actual': ISL_STATUS_ACTIVE, 'status': ISL_STATUS_INACTIVE}
32 ISL_STATUS_PROPS_UP = {'actual': ISL_STATUS_ACTIVE, 'status': ISL_STATUS_ACTIVE}
33 ISL_STATUS_PROPS_MOVED = {
34  'actual': ISL_STATUS_MOVED, 'status': ISL_STATUS_MOVED}
35 
36 neo4j_connect = share.env.neo4j_connect
37 
38 
39 def inject_db_link_props(tx, source, dest, payload):
40  match = {
41  'src_switch': source.dpid,
42  'src_port': source.port,
43  'dst_switch': dest.dpid,
44  'dst_port': dest.port,
45  }
46  p = match.copy()
47  p['link_props'] = match.copy()
48  p['link_props'].update(payload)
49 
50  q = (
51  'MERGE (subject:link_props {\n'
52  ' src_switch: $src_switch,'
53  ' src_port: $src_port,'
54  ' dst_switch: $dst_switch,'
55  ' dst_port: $dst_port})\n'
56  'SET subject = $link_props')
57  tx.run(q, p)
58 
59 
60 def make_switch_add(dpid):
61  payload = {
62  'clazz': messageclasses.MT_SWITCH,
63  'state': 'ADDED',
64  'switch_id': dpid,
65  'address': '172.16.0.64',
66  'hostname': 'test-sw-{}'.format(dpid.replace(':', '')),
67  'description': 'test switch',
68  'controller': '172.16.0.1'}
69  command = share.command(payload)
70  return messageclasses.MessageItem(command).handle()
71 
72 
74  payload = {
75  'clazz': messageclasses.MT_SWITCH,
76  'state': 'REMOVED',
77  'switch_id': dpid,
78  'address': '172.16.0.64',
79  'hostname': 'test-sw-{}'.format(dpid.replace(':', '')),
80  'description': 'test switch',
81  'controller': '172.16.0.1'}
82  command = share.command(payload)
83  return messageclasses.MessageItem(command).handle()
84 
85 
86 def make_port_down(endpoint):
87  payload = {
88  'clazz': messageclasses.MT_PORT,
89  'state': 'DOWN',
90  'switch_id': endpoint.dpid,
91  'port_no': endpoint.port}
92  command = share.command(payload)
93 
94  return messageclasses.MessageItem(command).handle()
95 
96 
97 def make_isl_pair(source, dest):
98  forward = model.InterSwitchLink(source, dest, None)
99  share.feed_isl_discovery(forward)
100  share.feed_isl_discovery(forward.reversed())
101 
102 
103 def make_isl_failed(source):
104  command = share.command({
105  'clazz': messageclasses.MT_ISL,
106  'state': 'FAILED',
107  'latency_ns': 20,
108  'speed': 1000,
109  'available_bandwidth': 1000,
110  'path': [
111  {
112  'switch_id': source.dpid,
113  'port_no': source.port}]})
114  return messageclasses.MessageItem(command).handle()
115 
116 
117 def make_isl_moved(isl):
118  command = share.command({
119  'clazz': messageclasses.MT_ISL,
120  'state': 'MOVED',
121  'latency_ns': 20,
122  'speed': 1000,
123  'available_bandwidth': 1000,
124  'path': [
125  {
126  'switch_id': isl.source.dpid,
127  'port_no': isl.source.port
128  },
129  {
130  'switch_id': isl.dest.dpid,
131  'port_no': isl.dest.port
132  }
133  ]
134  })
135  return messageclasses.MessageItem(command).handle()
136 
137 
139  src_endpoint = model.IslPathNode(share.make_datapath_id(1), 2)
140  dst_endpoint = model.IslPathNode(share.make_datapath_id(2), 4)
141 
142  def test_isl_status(self):
143  src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint
144  forward = model.InterSwitchLink(src_endpoint, dst_endpoint, None)
145  reverse = forward.reversed()
146 
147  make_switch_add(src_endpoint.dpid)
148  make_switch_add(dst_endpoint.dpid)
149 
150  status_down = {'actual': ISL_STATUS_INACTIVE, 'status': ISL_STATUS_INACTIVE}
151  status_half_up = {'actual': ISL_STATUS_ACTIVE, 'status': ISL_STATUS_INACTIVE}
152  status_up = {'actual': ISL_STATUS_ACTIVE, 'status': ISL_STATUS_ACTIVE}
153 
154  # 0 0
155  self.assertTrue(share.feed_isl_discovery(forward))
156 
157  # 1 0
158  self.ensure_isl_props(neo4j_connect, forward, status_half_up)
159  self.ensure_isl_props(neo4j_connect, reverse, status_down)
160  self.assertTrue(share.feed_isl_discovery(reverse))
161 
162  # 1 1
163  self.ensure_isl_props(neo4j_connect, forward, status_up)
164  self.ensure_isl_props(neo4j_connect, reverse, status_up)
165  self.assertTrue(make_isl_failed(src_endpoint))
166 
167  # 0 1
168  self.ensure_isl_props(neo4j_connect, forward, status_down)
169  self.ensure_isl_props(neo4j_connect, reverse, status_half_up)
170  self.assertTrue(share.feed_isl_discovery(forward))
171 
172  # 1 1
173  self.ensure_isl_props(neo4j_connect, forward, status_up)
174  self.ensure_isl_props(neo4j_connect, reverse, status_up)
175  self.assertTrue(make_isl_failed(dst_endpoint))
176 
177  # 1 0
178  self.ensure_isl_props(neo4j_connect, forward, status_half_up)
179  self.ensure_isl_props(neo4j_connect, reverse, status_down)
180  self.assertTrue(share.feed_isl_discovery(reverse))
181 
182  # 1 1
183  self.ensure_isl_props(neo4j_connect, forward, status_up)
184  self.ensure_isl_props(neo4j_connect, reverse, status_up)
185  self.assertTrue(make_isl_failed(src_endpoint))
186 
187  # 0 1
188  self.ensure_isl_props(neo4j_connect, forward, status_down)
189  self.ensure_isl_props(neo4j_connect, reverse, status_half_up)
190  self.assertTrue(make_isl_failed(dst_endpoint))
191 
192  # 0 0
193  self.ensure_isl_props(neo4j_connect, forward, status_down)
194  self.ensure_isl_props(neo4j_connect, reverse, status_down)
195 
196  @unittest.skip('ISL conflict resolution was disabled, because event topology is responsible for them now')
197  def test_isl_replug(self):
198  sw_alpha = share.make_datapath_id(1)
199  sw_beta = share.make_datapath_id(2)
200  sw_gamma = share.make_datapath_id(3)
201  sw_delta = share.make_datapath_id(4)
202 
203  isl_alpha_beta = model.InterSwitchLink(
204  model.IslPathNode(sw_alpha, 2),
205  model.IslPathNode(sw_beta, 2), None)
206  isl_beta_alpha = isl_alpha_beta.reversed()
207  isl_beta_gamma = model.InterSwitchLink(
208  model.IslPathNode(sw_beta, 2),
209  model.IslPathNode(sw_gamma, 3), None)
210  isl_gamma_beta = isl_beta_gamma.reversed()
211  isl_gamma_delta = model.InterSwitchLink(
212  model.IslPathNode(sw_gamma, 3),
213  model.IslPathNode(sw_delta, 3), None)
214  isl_delta_gamma = isl_gamma_delta.reversed()
215 
216  for dpid in sw_alpha, sw_beta, sw_gamma, sw_delta:
217  self.assertTrue(make_switch_add(dpid))
218 
219  self.assertTrue(share.feed_isl_discovery(isl_alpha_beta))
220  self.assertTrue(share.feed_isl_discovery(isl_beta_alpha))
221  self.assertTrue(share.feed_isl_discovery(isl_gamma_delta))
222  self.assertTrue(share.feed_isl_discovery(isl_delta_gamma))
223 
224  self.ensure_isl_props(
225  neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_UP)
226  self.ensure_isl_props(
227  neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_UP)
228  self.ensure_isl_props(
229  neo4j_connect, isl_gamma_delta, ISL_STATUS_PROPS_UP)
230  self.ensure_isl_props(
231  neo4j_connect, isl_delta_gamma, ISL_STATUS_PROPS_UP)
232 
233  self.assertRaises(
234  exc.DBRecordNotFound, isl_utils.fetch,
235  neo4j_connect, isl_beta_gamma)
236  self.assertRaises(
237  exc.DBRecordNotFound, isl_utils.fetch,
238  neo4j_connect, isl_gamma_beta)
239 
240  # replug
241  self.assertTrue(
242  share.feed_isl_discovery(isl_beta_gamma))
243  # alpha <-> beta is down
244  self.ensure_isl_props(
245  neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_HALF_UP)
246  self.ensure_isl_props(
247  neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_DOWN)
248  # gamma -> delta is down
249  self.ensure_isl_props(
250  neo4j_connect, isl_gamma_delta, ISL_STATUS_PROPS_DOWN)
251  self.ensure_isl_props(
252  neo4j_connect, isl_delta_gamma, ISL_STATUS_PROPS_HALF_UP)
253  # beta <-> gamma is half up
254  self.ensure_isl_props(
255  neo4j_connect, isl_beta_gamma, ISL_STATUS_PROPS_HALF_UP)
256  self.ensure_isl_props(
257  neo4j_connect, isl_gamma_beta, ISL_STATUS_PROPS_DOWN)
258 
259  self.assertTrue(
260  share.feed_isl_discovery(isl_gamma_beta))
261  # alpha <-> beta is down
262  self.ensure_isl_props(
263  neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_HALF_UP)
264  self.ensure_isl_props(
265  neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_DOWN)
266  # gamma -> delta is down
267  self.ensure_isl_props(
268  neo4j_connect, isl_gamma_delta, ISL_STATUS_PROPS_DOWN)
269  self.ensure_isl_props(
270  neo4j_connect, isl_delta_gamma, ISL_STATUS_PROPS_HALF_UP)
271  # beta <-> gamma is up
272  self.ensure_isl_props(
273  neo4j_connect, isl_beta_gamma, ISL_STATUS_PROPS_UP)
274  self.ensure_isl_props(
275  neo4j_connect, isl_gamma_beta, ISL_STATUS_PROPS_UP)
276 
278  src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint
279  forward = model.InterSwitchLink(src_endpoint, dst_endpoint, None)
280  reverse = forward.reversed()
281 
282  self.assertTrue(make_switch_add(src_endpoint.dpid))
283  self.assertTrue(make_switch_add(dst_endpoint.dpid))
284  self.assertTrue(share.feed_isl_discovery(forward))
285  self.assertTrue(share.feed_isl_discovery(reverse))
286 
287  self.ensure_isl_props(neo4j_connect, forward, ISL_STATUS_PROPS_UP)
288  self.ensure_isl_props(neo4j_connect, reverse, ISL_STATUS_PROPS_UP)
289 
290  self.assertTrue(make_switch_remove(src_endpoint.dpid))
291 
292  self.ensure_isl_props(neo4j_connect, forward, ISL_STATUS_PROPS_DOWN)
293  self.ensure_isl_props(neo4j_connect, reverse, ISL_STATUS_PROPS_HALF_UP)
294 
296  sw_alpha = share.make_datapath_id(1)
297  sw_beta = share.make_datapath_id(2)
298  isl_alpha_beta = model.InterSwitchLink(
299  model.IslPathNode(sw_alpha, 2),
300  model.IslPathNode(sw_beta, 2), None)
301  isl_beta_alpha = isl_alpha_beta.reversed()
302 
303  self.assertTrue(make_switch_add(sw_alpha))
304  self.assertTrue(make_isl_failed(isl_alpha_beta.source))
305 
306  self.assertRaises(
307  exc.DBRecordNotFound, isl_utils.fetch,
308  neo4j_connect, isl_alpha_beta)
309  self.assertRaises(
310  exc.DBRecordNotFound, isl_utils.fetch,
311  neo4j_connect, isl_beta_alpha)
312 
314  sw_alpha = share.make_datapath_id(1)
315  sw_beta = share.make_datapath_id(2)
316  isl_alpha_beta = model.InterSwitchLink(
317  model.IslPathNode(sw_alpha, 2),
318  model.IslPathNode(sw_beta, 2), None)
319  isl_beta_alpha = isl_alpha_beta.reversed()
320 
321  self.assertTrue(make_switch_add(sw_alpha))
322  self.assertTrue(make_port_down(isl_alpha_beta.source))
323 
324  self.assertRaises(
325  exc.DBRecordNotFound, isl_utils.fetch,
326  neo4j_connect, isl_alpha_beta)
327  self.assertRaises(
328  exc.DBRecordNotFound, isl_utils.fetch,
329  neo4j_connect, isl_beta_alpha)
330 
332  sw_alpha = share.make_datapath_id(1)
333  sw_beta = share.make_datapath_id(2)
334  isl_alpha_beta = model.InterSwitchLink(
335  model.NetworkEndpoint(sw_alpha, 2),
336  model.NetworkEndpoint(sw_beta, 2), None)
337  self.assertTrue(share.feed_isl_discovery(isl_alpha_beta))
338 
339  with neo4j_connect.begin() as tx:
340  isl_utils.set_props(tx, isl_alpha_beta, {"cost": "10"})
341 
342  self.assertTrue(make_port_down(isl_alpha_beta.source))
343 
345  sw_alpha = share.make_datapath_id(1)
346  sw_beta = share.make_datapath_id(2)
347  sw_gamma = share.make_datapath_id(3)
348 
349  isl_alpha_beta = model.InterSwitchLink(
350  model.IslPathNode(sw_alpha, 2),
351  model.IslPathNode(sw_beta, 2), None)
352  isl_beta_alpha = isl_alpha_beta.reversed()
353  isl_beta_gamma = model.InterSwitchLink(
354  model.IslPathNode(sw_beta, 2),
355  model.IslPathNode(sw_gamma, 3), None)
356  isl_gamma_beta = isl_beta_gamma.reversed()
357 
358  for dpid in sw_alpha, sw_beta, sw_gamma:
359  self.assertTrue(make_switch_add(dpid))
360 
361  self.assertTrue(share.feed_isl_discovery(isl_alpha_beta))
362  self.assertTrue(share.feed_isl_discovery(isl_beta_alpha))
363  self.assertTrue(share.feed_isl_discovery(isl_beta_gamma))
364  self.assertTrue(share.feed_isl_discovery(isl_gamma_beta))
365 
366  self.assertTrue(make_port_down(isl_alpha_beta.dest))
367  self.ensure_isl_props(
368  neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_HALF_UP)
369  self.ensure_isl_props(
370  neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_DOWN)
371  self.ensure_isl_props(
372  neo4j_connect, isl_beta_gamma, ISL_STATUS_PROPS_DOWN)
373  self.ensure_isl_props(
374  neo4j_connect, isl_gamma_beta, ISL_STATUS_PROPS_HALF_UP)
375 
377  self.setup_initial_data()
378  self._cost_raise_on_port_down(10, 10010, 10010)
379  self._cost_raise_on_port_down(10010, 10010, 10010)
380 
381  self._set_isl_cost('20')
382 
383  self._cost_raise_on_port_down(20, 10020, 10020)
384  self._cost_raise_on_port_down(10020, 10020, 10020)
385 
386  self._set_isl_cost(0)
387 
388  self._cost_raise_on_port_down(0, 10000, 10000)
389  self._cost_raise_on_port_down(10000, 10000, 10000)
390 
392  self.setup_initial_data(make_link_props=False)
393  self._cost_raise_on_port_down(None, 10000, 10000)
394 
395  def _cost_raise_on_port_down(self, initial, down, recover):
396  src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint
397  isl = model.InterSwitchLink(src_endpoint, dst_endpoint, None)
398 
399  self.ensure_isl_costs(
400  (src_endpoint, initial),
401  (dst_endpoint, initial))
402 
403  self.assertTrue(
404  make_port_down(src_endpoint), 'Port DOWN command have failed')
405 
406  self.ensure_isl_costs(
407  (src_endpoint, down),
408  (dst_endpoint, down))
409 
410  self.assertTrue(
411  share.feed_isl_discovery(isl),
412  'ISL discovery command have failed')
413 
414  self.ensure_isl_costs(
415  (src_endpoint, recover),
416  (dst_endpoint, recover))
417 
418  def _set_isl_cost(self, value):
419  with neo4j_connect.begin() as tx:
420  isl = model.InterSwitchLink(
421  self.src_endpoint, self.dst_endpoint, None)
422  isl_utils.set_cost(tx, isl, value)
423  isl_utils.set_cost(tx, isl.reversed(), value)
424 
425  with neo4j_connect.begin() as tx:
426  props = {'cost': model.convert_integer(value)}
427  self.ensure_isl_props(tx, isl, props)
428  self.ensure_isl_props(tx, isl.reversed(), props)
429 
431  self.setup_initial_data()
432 
433  src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint
434  isl = model.InterSwitchLink(src_endpoint, dst_endpoint, None)
435 
436  self.ensure_isl_costs(
437  (src_endpoint, 10),
438  (dst_endpoint, 10))
439 
440  self.assertTrue(
441  make_isl_failed(src_endpoint), 'Port DOWN command have failed')
442 
443  self.ensure_isl_costs(
444  (src_endpoint, 10),
445  (dst_endpoint, 10))
446 
447  self.assertTrue(
448  share.feed_isl_discovery(isl), 'ISL discovery command have failed')
449 
450  self.ensure_isl_costs(
451  (src_endpoint, 10),
452  (dst_endpoint, 10))
453 
455  self.setup_initial_data()
456  src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint
457  forward = model.InterSwitchLink(src_endpoint, dst_endpoint, None)
458 
459  make_isl_moved(forward)
460  self.ensure_isl_props(neo4j_connect, forward, ISL_STATUS_PROPS_MOVED)
461 
463  sw_alpha = share.make_datapath_id(1)
464  sw_beta = share.make_datapath_id(2)
465  isl_alpha_beta = model.InterSwitchLink(
466  model.IslPathNode(sw_alpha, 2),
467  model.IslPathNode(sw_beta, 2), None)
468 
469  self.assertTrue(make_switch_add(sw_alpha))
470  self.assertTrue(make_switch_add(sw_beta))
471 
472  self.assertTrue(share.feed_isl_discovery(isl_alpha_beta))
473 
474  with neo4j_connect.begin() as tx:
475  neo4j_connect.pull(isl_utils.fetch(tx, isl_alpha_beta))
476  isl_utils.set_props(
477  tx, isl_alpha_beta,
478  {'time_create': None, 'time_modify': None})
479 
480  self.assertTrue(share.feed_isl_discovery(isl_alpha_beta))
481 
483  sw_alpha = share.make_datapath_id(1)
484  sw_beta = share.make_datapath_id(2)
485  isl_alpha_beta = model.InterSwitchLink(
486  model.IslPathNode(sw_alpha, 2),
487  model.IslPathNode(sw_beta, 2), None)
488 
489  self.assertTrue(make_switch_add(sw_alpha))
490  self.assertTrue(make_switch_add(sw_beta))
491 
492  update_point_a = model.TimeProperty.now(milliseconds_precission=True)
493 
494  message = share.command(share.isl_info_payload(isl_alpha_beta))
495  message['timestamp'] = update_point_a.as_java_timestamp()
496  self.feed_service(message)
497 
498  recovered = model.TimeProperty.new_from_java_timestamp(message['timestamp'])
499  self.assertEquals(update_point_a.value, recovered.value)
500 
501  with neo4j_connect.begin() as tx:
502  isl = isl_utils.fetch(tx, isl_alpha_beta)
503  neo4j_connect.pull(isl)
504 
505  db_ctime = model.TimeProperty.new_from_db(isl['time_create'])
506  self.assertEqual(update_point_a.value, db_ctime.value)
507 
508  db_mtime = model.TimeProperty.new_from_db(isl['time_modify'])
509  self.assertEqual(update_point_a.value, db_mtime.value)
510 
511  # one more update
512  update_point_b = model.TimeProperty.now(milliseconds_precission=True)
513  self.assertNotEqual(update_point_a.value, update_point_b.value)
514 
515  message['timestamp'] = update_point_b.as_java_timestamp()
516  self.feed_service(message)
517  with neo4j_connect.begin() as tx:
518  isl = isl_utils.fetch(tx, isl_alpha_beta)
519  neo4j_connect.pull(isl)
520 
521  db_ctime = model.TimeProperty.new_from_db(isl['time_create'])
522  self.assertEqual(update_point_a.value, db_ctime.value)
523 
524  db_mtime = model.TimeProperty.new_from_db(isl['time_modify'])
525  self.assertEqual(update_point_b.value, db_mtime.value)
526 
527  def ensure_isl_props(self, tx, isl, props):
528  isl_record = isl_utils.fetch(tx, isl)
529  neo4j_connect.pull(isl_record)
530  for name in props:
531  self.assertEqual(
532  props[name], isl_record[name],
533  "Invalid ISL's {!r} value ({!r})".format(name, isl_record))
534 
535  def ensure_isl_costs(self, *endpoint_cost_pairs):
536  endpoints = []
537  costs = []
538  for pair in endpoint_cost_pairs:
539  endpoints.append(pair[0])
540  costs.append(pair[1])
541 
542  for isl, expect in zip(self.enumerate_isl(*endpoints), costs):
543  self.assertEqual(
544  expect, isl['cost'],
545  'Bad "cost" value {!r} (expect {!r}) in isl {!r}'.format(
546  isl['cost'], expect, isl))
547 
548  def enumerate_isl(self, *endpoints):
549  with neo4j_connect.begin() as tx:
550  for node in endpoints:
551  q = (
552  'MATCH (a:switch)-[self:isl]->(:switch)\n'
553  'WHERE a.name=$dpid\n'
554  'RETURN self')
555 
556  for data_set in tx.run(q, dpid=node.dpid):
557  node = data_set['self']
558  neo4j_connect.pull(node)
559  yield node
560 
561  def setup_initial_data(self, make_link_props=True):
562  src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint
563 
564  make_switch_add(src_endpoint.dpid)
565  make_switch_add(dst_endpoint.dpid)
566 
567  if make_link_props:
568  with neo4j_connect.begin() as tx:
569  payload = {'cost': 10}
570  inject_db_link_props(tx, src_endpoint, dst_endpoint, payload)
571  inject_db_link_props(tx, dst_endpoint, src_endpoint, payload)
572 
573  make_isl_pair(src_endpoint, dst_endpoint)
def ensure_isl_costs(self, endpoint_cost_pairs)
Definition: test_isl.py:535
def make_isl_pair(source, dest)
Definition: test_isl.py:97
def _cost_raise_on_port_down(self, initial, down, recover)
Definition: test_isl.py:395
def feed_service(self, message, can_fail=False)
Definition: share.py:267
def enumerate_isl(self, endpoints)
Definition: test_isl.py:548
def setup_initial_data(self, make_link_props=True)
Definition: test_isl.py:561
def ensure_isl_props(self, tx, isl, props)
Definition: test_isl.py:527
def make_port_down(endpoint)
Definition: test_isl.py:86
def inject_db_link_props(tx, source, dest, payload)
Definition: test_isl.py:39
def test_cost_raise_on_port_down_without_link_props(self)
Definition: test_isl.py:391