blob: 3405c6afbe57b5a9488f85ddc6ed94e2ce98f513 [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 Scandoloc6230b42018-02-26 15:27:57 -080063
64 def tearDown(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -070065 sys.path = self.sys_path_save
Matteo Scandoloc6230b42018-02-26 15:27:57 -080066
Matteo Scandoloc322df52018-06-22 14:43:59 -070067 def test_update_pre_provisione(self):
68 si = self.si
69 si.status = "pre-provisioned"
70 self.policy.handle_create(si)
71
72 with patch.object(VOLTServiceInstance, "save", autospec=True) as save_volt, \
Scott Bakerb1671512019-04-01 19:16:54 -070073 patch.object(ServiceInstanceLink, "save", autospec=True) as save_link:
Matteo Scandoloc322df52018-06-22 14:43:59 -070074
75 self.policy.handle_create(si)
76 self.assertEqual(save_link.call_count, 0)
77 self.assertEqual(save_volt.call_count, 0)
78
Matteo Scandoloc6230b42018-02-26 15:27:57 -080079 def test_update_and_do_nothing(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -070080 si = self.si
Matteo Scandoloc6230b42018-02-26 15:27:57 -080081 si.is_new = False
Matteo Scandolocc94e902018-05-22 15:25:25 -070082 si.subscribed_links.all.return_value = ["already", "have", "a", "chain"]
Scott Bakerb1671512019-04-01 19:16:54 -070083
Matteo Scandoloc322df52018-06-22 14:43:59 -070084 with patch.object(VOLTServiceInstance, "save", autospec=True) as save_volt, \
Scott Bakerb1671512019-04-01 19:16:54 -070085 patch.object(ServiceInstanceLink, "save", autospec=True) as save_link:
Matteo Scandoloc322df52018-06-22 14:43:59 -070086
87 self.policy.handle_create(si)
88 self.assertEqual(save_link.call_count, 0)
89 self.assertEqual(save_volt.call_count, 0)
Matteo Scandoloc6230b42018-02-26 15:27:57 -080090
Matteo Scandoloace9dd72018-08-16 16:12:43 -070091 def test_create_chain(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -070092 volt = Mock()
93 volt.get_service_instance_class_name.return_value = "VOLTServiceInstance"
Matteo Scandoloc6230b42018-02-26 15:27:57 -080094
Matteo Scandolocc94e902018-05-22 15:25:25 -070095 service_dependency = Mock()
96 service_dependency.provider_service = volt
Matteo Scandoloc6230b42018-02-26 15:27:57 -080097
Matteo Scandolocc94e902018-05-22 15:25:25 -070098 si = self.si
99 si.is_new = True
Matteo Scandolofab45ef2018-08-17 16:33:29 -0700100 si.status = "enabled"
Matteo Scandolocc94e902018-05-22 15:25:25 -0700101 si.subscribed_links.all.return_value = []
102 si.owner.subscribed_dependencies.all.return_value = [service_dependency]
103
104 with patch.object(VOLTServiceInstance, "save", autospec=True) as save_volt, \
Scott Bakerb1671512019-04-01 19:16:54 -0700105 patch.object(ServiceInstanceLink, "save", autospec=True) as save_link:
Matteo Scandolocc94e902018-05-22 15:25:25 -0700106
Matteo Scandoloc6230b42018-02-26 15:27:57 -0800107 self.policy.handle_create(si)
108 self.assertEqual(save_link.call_count, 1)
109 self.assertEqual(save_volt.call_count, 1)
110
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700111 def test_remove_chain(self):
112 volt = VOLTServiceInstance()
113 volt.name = "volt"
114
115 link = ServiceInstanceLink()
Scott Bakerb1671512019-04-01 19:16:54 -0700116 link.subscriber_service_instance = self.si
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700117 link.provider_service_instance = volt
118 link.provider_service_instance.leaf_model = volt
119
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700120 si = self.si
121 si.is_new = False
122 si.status = "awaiting-auth"
123 si.subscribed_links.all.return_value = [link]
124
125 with patch.object(VOLTServiceInstance, "delete", autospec=True) as delete_volt, \
Scott Bakerb1671512019-04-01 19:16:54 -0700126 patch.object(ServiceInstanceLink, "delete", autospec=True) as delete_link:
Matteo Scandoloace9dd72018-08-16 16:12:43 -0700127
128 self.policy.handle_create(si)
129 self.assertEqual(delete_link.call_count, 1)
130 self.assertEqual(delete_volt.call_count, 1)
131
Matteo Scandoloc6230b42018-02-26 15:27:57 -0800132
133if __name__ == '__main__':
Scott Baker9d9ddf62018-03-20 20:44:27 -0700134 unittest.main()