blob: 374e9be9ca0832e529eb0b708dd5e7ce286307d3 [file] [log] [blame]
Matteo Scandoloc6230b42018-02-26 15:27:57 -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
15
16import unittest
Matteo Scandolocc94e902018-05-22 15:25:25 -070017from mock import patch, Mock
18
Matteo Scandoloc6230b42018-02-26 15:27:57 -080019
Scott Bakerb1671512019-04-01 19:16:54 -070020import os
21import sys
Matteo Scandoloc6230b42018-02-26 15:27:57 -080022
Scott Bakerb1671512019-04-01 19:16:54 -070023test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
24
Matteo Scandoloc6230b42018-02-26 15:27:57 -080025
26class TestModelPolicyRCORDSubscriber(unittest.TestCase):
27 def setUp(self):
Scott Baker9d9ddf62018-03-20 20:44:27 -070028
Matteo Scandolocc94e902018-05-22 15:25:25 -070029 self.sys_path_save = sys.path
Matteo Scandoloc6230b42018-02-26 15:27:57 -080030
Matteo Scandolocc94e902018-05-22 15:25:25 -070031 config = os.path.join(test_path, "../test_config.yaml")
32 from xosconfig import Config
33 Config.clear()
34 Config.init(config, 'synchronizer-config-schema.yaml')
35
Scott Baker8b1a8852019-02-04 09:39:17 -080036 from xossynchronizer.mock_modelaccessor_build import mock_modelaccessor_config
37 mock_modelaccessor_config(test_path, [
Matteo Scandoloc9527a82019-02-14 17:02:53 -080038 ("rcord", "rcord.xproto"),
Scott Baker8b1a8852019-02-04 09:39:17 -080039 ("olt-service", "volt.xproto")])
Scott Baker9d9ddf62018-03-20 20:44:27 -070040
Scott Baker8b1a8852019-02-04 09:39:17 -080041 import xossynchronizer.modelaccessor
42 import mock_modelaccessor
Scott Bakerb1671512019-04-01 19:16:54 -070043 reload(mock_modelaccessor) # in case nose2 loaded it in a previous test
Scott Baker8b1a8852019-02-04 09:39:17 -080044 reload(xossynchronizer.modelaccessor) # in case nose2 loaded it in a previous test
45
46 from xossynchronizer.modelaccessor import model_accessor
47 self.model_accessor = model_accessor
48
49 from model_policy_rcordsubscriber import RCORDSubscriberPolicy
Matteo Scandolocc94e902018-05-22 15:25:25 -070050
51 from mock_modelaccessor import MockObjectList
Matteo Scandoloc6230b42018-02-26 15:27:57 -080052
53 # import all class names to globals
54 for (k, v) in model_accessor.all_model_classes.items():
55 globals()[k] = v
56
Matteo Scandolocc94e902018-05-22 15:25:25 -070057 # Some of the functions we call have side-effects. For example, creating a VSGServiceInstance may lead to creation of
58 # tags. Ideally, this wouldn't happen, but it does. So make sure we reset the world.
59 model_accessor.reset_all_object_stores()
Matteo Scandoloc6230b42018-02-26 15:27:57 -080060
Scott Baker8b1a8852019-02-04 09:39:17 -080061 self.policy = RCORDSubscriberPolicy(model_accessor=self.model_accessor)
Matteo Scandolocc94e902018-05-22 15:25:25 -070062 self.si = Mock(name="myTestSubscriber")
Matteo Scandoloc7756902019-05-31 16:04:05 -070063 self.si.subscribed_links.all.return_value = []
Matteo Scandoloc6230b42018-02-26 15:27:57 -080064
65 def tearDown(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -070066 sys.path = self.sys_path_save
Matteo Scandoloc6230b42018-02-26 15:27:57 -080067
Matteo Scandoloc7756902019-05-31 16:04:05 -070068 def test_update_pre_provisioned(self):
Matteo Scandoloc322df52018-06-22 14:43:59 -070069 si = self.si
70 si.status = "pre-provisioned"
Matteo Scandoloc7756902019-05-31 16:04:05 -070071
Matteo Scandoloc322df52018-06-22 14:43:59 -070072 self.policy.handle_create(si)
73
74 with patch.object(VOLTServiceInstance, "save", autospec=True) as save_volt, \
Scott Bakerb1671512019-04-01 19:16:54 -070075 patch.object(ServiceInstanceLink, "save", autospec=True) as save_link:
Matteo Scandoloc322df52018-06-22 14:43:59 -070076
77 self.policy.handle_create(si)
78 self.assertEqual(save_link.call_count, 0)
79 self.assertEqual(save_volt.call_count, 0)
80
Matteo Scandoloc6230b42018-02-26 15:27:57 -080081 def test_update_and_do_nothing(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -070082 si = self.si
Matteo Scandoloc6230b42018-02-26 15:27:57 -080083 si.is_new = False
Matteo Scandoloc7756902019-05-31 16:04:05 -070084 si.status = "enabled"
Scott Bakerb1671512019-04-01 19:16:54 -070085
Matteo Scandoloc7756902019-05-31 16:04:05 -070086 next_si = Mock()
Matteo Scandoloc322df52018-06-22 14:43:59 -070087
Matteo Scandoloc7756902019-05-31 16:04:05 -070088 link = Mock()
89 link.provider_service.validate_links = Mock(return_value=next_si)
90 link.provider_service.acquire_service_instance = Mock()
91 link.provider_service.leaf_model = link.provider_service
92
93 si.owner.subscribed_dependencies.all.return_value = [link]
94
95 self.policy.handle_create(si)
96
97 link.provider_service.validate_links.assert_called_with(si)
98 link.provider_service.acquire_service_instance.assert_not_called()
Matteo Scandoloc6230b42018-02-26 15:27:57 -080099
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700100 def test_create_chain(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -0700101 si = self.si
102 si.is_new = True
Matteo Scandolofab45ef2018-08-17 16:33:29 -0700103 si.status = "enabled"
Matteo Scandolocc94e902018-05-22 15:25:25 -0700104
Matteo Scandoloc7756902019-05-31 16:04:05 -0700105 next_si = Mock()
Matteo Scandolocc94e902018-05-22 15:25:25 -0700106
Matteo Scandoloc7756902019-05-31 16:04:05 -0700107 link = Mock()
108 link.provider_service.validate_links = Mock(return_value=None)
109 link.provider_service.acquire_service_instance = Mock()
110 link.provider_service.leaf_model = link.provider_service
111 link.provider_service.get_service_instance_class_name.return_value = "TestClass"
112
113 si.owner.subscribed_dependencies.all.return_value = [link]
114
115 self.policy.handle_create(si)
116
117 link.provider_service.validate_links.assert_called_with(si)
118 link.provider_service.acquire_service_instance.assert_called_with(si)
Matteo Scandoloc6230b42018-02-26 15:27:57 -0800119
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700120 def test_remove_chain(self):
121 volt = VOLTServiceInstance()
122 volt.name = "volt"
123
124 link = ServiceInstanceLink()
Scott Bakerb1671512019-04-01 19:16:54 -0700125 link.subscriber_service_instance = self.si
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700126 link.provider_service_instance = volt
127 link.provider_service_instance.leaf_model = volt
128
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700129 si = self.si
130 si.is_new = False
131 si.status = "awaiting-auth"
132 si.subscribed_links.all.return_value = [link]
133
134 with patch.object(VOLTServiceInstance, "delete", autospec=True) as delete_volt, \
Scott Bakerb1671512019-04-01 19:16:54 -0700135 patch.object(ServiceInstanceLink, "delete", autospec=True) as delete_link:
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700136
137 self.policy.handle_create(si)
138 self.assertEqual(delete_link.call_count, 1)
139 self.assertEqual(delete_volt.call_count, 1)
140
Matteo Scandoloc6230b42018-02-26 15:27:57 -0800141
142if __name__ == '__main__':
Scott Baker9d9ddf62018-03-20 20:44:27 -0700143 unittest.main()