blob: e358feaa30d95735a5eda3ce9927e6ab5c421600 [file] [log] [blame]
Scott Bakerbba67b62019-01-28 17:38:21 -08001# Copyright 2017-present Open Networking Foundation
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
15import unittest
16from mock import patch
17import mock
18import pdb
19import networkx as nx
20
21import os
22import sys
23
24#test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
25#xos_dir = os.path.join(test_path, "..", "..", "..")
26
27
28class TestControllerDependencies(unittest.TestCase):
29
30 __test__ = False
31
32 def setUp(self):
33 global mock_enumerator, event_loop
34
35 self.sys_path_save = sys.path
36 self.cwd_save = os.getcwd()
37
38 config = os.path.join(test_path, "test_config.yaml")
39 from xosconfig import Config
40
41 Config.clear()
42 Config.init(config, "synchronizer-config-schema.yaml")
43
44 from xossynchronizer.mock_modelaccessor_build import (
45 build_mock_modelaccessor,
46 )
47
48 build_mock_modelaccessor(xos_dir, services_dir=None, service_xprotos=[])
49
50 os.chdir(os.path.join(test_path, "..")) # config references tests/model-deps
51
52 import event_loop
53
54 reload(event_loop)
55 import backend
56
57 reload(backend)
58 from mock_modelaccessor import mock_enumerator
59 from modelaccessor import model_accessor
60
61 # import all class names to globals
62 for (k, v) in model_accessor.all_model_classes.items():
63 globals()[k] = v
64
65 b = backend.Backend()
66 steps_dir = Config.get("steps_dir")
67 self.steps = b.load_sync_step_modules(steps_dir)
68 self.synchronizer = event_loop.XOSObserver(self.steps)
69
70 def tearDown(self):
71 sys.path = self.sys_path_save
72 os.chdir(self.cwd_save)
73
74 def test_multi_controller_path(self):
75 csl = ControllerSlice()
76 csi = ControllerSite()
77 site = Site()
78 slice = Slice()
79 slice.site = site
80 csl.slice = slice
81 csi.site = site
82 slice.controllerslices = mock_enumerator([csl])
83 site.controllersite = mock_enumerator([csi])
84
85 verdict, edge_type = self.synchronizer.concrete_path_exists(csl, csi)
86 self.assertTrue(verdict)
87 self.assertEqual(edge_type, event_loop.PROXY_EDGE)
88
89 def test_controller_path_simple(self):
90 p = Instance()
91 s = Slice()
92 t = Site()
93 ct = ControllerSite()
94 p.slice = s
95 s.site = t
96 ct.site = t
97 t.controllersite = mock_enumerator([ct])
98 cohorts = self.synchronizer.compute_dependent_cohorts([p, ct], False)
99 self.assertEqual([ct, p], cohorts[0])
100 cohorts = self.synchronizer.compute_dependent_cohorts([ct, p], False)
101 self.assertEqual([ct, p], cohorts[0])
102
103 def test_controller_deletion_path(self):
104 p = Instance()
105 s = Slice()
106 t = Site()
107 ct = ControllerSite()
108 ct.site = t
109 p.slice = s
110 s.site = t
111
112 t.controllersite = mock_enumerator([ct])
113
114 cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], False)
115 self.assertEqual([t, ct, s, p], cohorts[0])
116 cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], True)
117 self.assertEqual([p, s, ct, t], cohorts[0])
118
119 def test_multi_controller_schedule(self):
120 csl = ControllerSlice()
121 csi = ControllerSite()
122 site = Site()
123 slice = Slice()
124 slice.site = site
125 csl.slice = slice
126 csi.site = site
127 slice.controllerslices = mock_enumerator([csl])
128 site.controllersite = mock_enumerator([csi])
129 i = Instance()
130 i.slice = slice
131
132 cohorts = self.synchronizer.compute_dependent_cohorts(
133 [i, slice, site, csl, csi], False
134 )
135 self.assertEqual([site, csi, slice, csl, i], cohorts[0])
136
137 def test_multi_controller_path_negative(self):
138 csl = ControllerSlice()
139 csi = ControllerSite()
140 site = Site()
141 slice = Slice()
142 slice.site = site
143 csl.slice = slice
144 csi.site = site
145 slice.controllerslices = mock_enumerator([])
146 site.controllersite = mock_enumerator([])
147
148 verdict, edge_type = self.synchronizer.concrete_path_exists(csl, csi)
149 self.assertFalse(verdict)
150 self.assertEqual(edge_type, None)
151
152 def test_controller_path_simple_negative(self):
153 p = Instance()
154 s = Slice()
155 t = Site()
156 ct = ControllerSite()
157 p.slice = s
158 s.site = t
159 ct.site = t
160 t.controllersite = mock_enumerator([])
161 cohorts = self.synchronizer.compute_dependent_cohorts([p, ct], False)
162 self.assertIn([ct], cohorts)
163 self.assertIn([p], cohorts)
164
165 def test_controller_deletion_path_negative(self):
166 p = Instance()
167 s = Slice()
168 t = Site()
169 ct = ControllerSite()
170 s.site = t
171
172 t.controllersite = mock_enumerator([])
173
174 cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], False)
175 self.assertIn([t, s], cohorts)
176 self.assertIn([p], cohorts)
177 self.assertIn([ct], cohorts)
178 cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], True)
179 self.assertIn([s, t], cohorts)
180 self.assertIn([p], cohorts)
181 self.assertIn([ct], cohorts)
182
183 def test_multi_controller_deletion_schedule(self):
184 csl = ControllerSlice()
185 cn = ControllerNetwork()
186 site = Site()
187 slice = Slice()
188 slice.site = site
189 slice.controllerslices = mock_enumerator([])
190 site.controllersite = mock_enumerator([])
191 i = Instance()
192 i.slice = slice
193
194 cohorts = self.synchronizer.compute_dependent_cohorts(
195 [i, slice, site, csl, csi], False
196 )
197 self.assertIn([site, slice, i], cohorts)
198 self.assertIn([csl], cohorts)
199 self.assertIn([csi], cohorts)
200
201 def test_multi_controller_schedule_negative(self):
202 csl = ControllerSlice()
203 csi = ControllerSite()
204 site = Site()
205 slice = Slice()
206 slice.site = site
207 slice.controllerslices = mock_enumerator([])
208 site.controllersite = mock_enumerator([])
209 i = Instance()
210 i.slice = slice
211
212 cohorts = self.synchronizer.compute_dependent_cohorts(
213 [i, slice, site, csl, csi], False
214 )
215 self.assertIn([site, slice, i], cohorts)
216 self.assertIn([csl], cohorts)
217 self.assertIn([csi], cohorts)
218
219
220if __name__ == "__main__":
221 unittest.main()