blob: f09a8116d436a1afc40b4c40bebe5379f89a6428 [file] [log] [blame]
Matteo Scandolodf2600b2017-07-05 17:01:29 -07001import unittest
2from mock import patch, MagicMock
3from tosca.parser import TOSCA_Parser
4from grpc_client.resources import RESOURCES
5
6class FakeObj:
7 new = None
8 filter = None
9
10class FakeModel:
11 save = None
Matteo Scandolo78ca3eb2017-07-13 16:58:22 -070012 delete = None
13 is_new = False
Matteo Scandolodf2600b2017-07-05 17:01:29 -070014 id = 1
15
16class FakeGuiExt:
17 objects = FakeObj
18
19class FakeSite:
20 objects = FakeObj
21
22class FakeUser:
23 objects = FakeObj
24
Matteo Scandolo21dde412017-07-11 18:54:12 -070025USERNAME = "username"
26PASSWORD = "pass"
27
28mock_resources = {}
29mock_resources["%s~%s" % (USERNAME, PASSWORD)] = {
Matteo Scandolodf2600b2017-07-05 17:01:29 -070030 'XOSGuiExtension': FakeGuiExt,
31 'Site': FakeSite,
32 'User': FakeUser
33}
34
35class TOSCA_Parser_E2E(unittest.TestCase):
36
37 @patch.dict(RESOURCES, mock_resources, clear=True)
38 @patch.object(FakeGuiExt.objects, 'filter', MagicMock(return_value=[FakeModel]))
39 @patch.object(FakeModel, 'save')
40 def test_basic_creation(self, mock_save):
41 """
42 [TOSCA_Parser] Should save models defined in a TOSCA recipe
43 """
44 recipe = """
45tosca_definitions_version: tosca_simple_yaml_1_0
46
47description: Persist xos-sample-gui-extension
48
49imports:
50 - custom_types/xosguiextension.yaml
51
52topology_template:
53 node_templates:
54
55 # UI Extension
56 test:
57 type: tosca.nodes.XOSGuiExtension
58 properties:
59 name: test
60 files: /spa/extensions/test/vendor.js, /spa/extensions/test/app.js
61"""
62
Matteo Scandolo21dde412017-07-11 18:54:12 -070063 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolodf2600b2017-07-05 17:01:29 -070064
65 parser.execute()
66
67 # checking that the model has been saved
68 mock_save.assert_called()
69
70 self.assertIsNotNone(parser.templates_by_model_name['test'])
71 self.assertEqual(parser.ordered_models_name, ['test'])
72
73 # check that the model was saved with the expected values
74 saved_model = parser.saved_model_by_name['test']
75 self.assertEqual(saved_model.name, 'test')
76 self.assertEqual(saved_model.files, '/spa/extensions/test/vendor.js, /spa/extensions/test/app.js')
77
78 @patch.dict(RESOURCES, mock_resources, clear=True)
Matteo Scandolo78ca3eb2017-07-13 16:58:22 -070079 @patch.object(FakeGuiExt.objects, 'filter', MagicMock(return_value=[FakeModel]))
80 @patch.object(FakeModel, 'delete')
81 def test_basic_deletion(self, mock_delete):
82 """
83 [TOSCA_Parser] Should delete models defined in a TOSCA recipe
84 """
85 recipe = """
86 tosca_definitions_version: tosca_simple_yaml_1_0
87
88 description: Persist xos-sample-gui-extension
89
90 imports:
91 - custom_types/xosguiextension.yaml
92
93 topology_template:
94 node_templates:
95
96 # UI Extension
97 test:
98 type: tosca.nodes.XOSGuiExtension
99 properties:
100 name: test
101 files: /spa/extensions/test/vendor.js, /spa/extensions/test/app.js
102 """
103
104 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD, delete=True)
105
106 parser.execute()
107
108 # checking that the model has been saved
109 mock_delete.assert_called()
110
111 self.assertIsNotNone(parser.templates_by_model_name['test'])
112 self.assertEqual(parser.ordered_models_name, ['test'])
113
114 @patch.dict(RESOURCES, mock_resources, clear=True)
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700115 @patch.object(FakeSite.objects, 'filter', MagicMock(return_value=[FakeModel]))
116 @patch.object(FakeUser.objects, 'filter', MagicMock(return_value=[FakeModel]))
117 @patch.object(FakeModel, 'save')
118 def test_related_models_creation(self, mock_save):
119 """
120 [TOSCA_Parser] Should save related models defined in a TOSCA recipe
121 """
122
123 recipe = """
124tosca_definitions_version: tosca_simple_yaml_1_0
125
126description: Create a new site with one user
127
128imports:
129 - custom_types/user.yaml
130 - custom_types/site.yaml
131
132topology_template:
133 node_templates:
134
135 # Site
136 site_onlab:
137 type: tosca.nodes.Site
138 properties:
139 name: Open Networking Lab
140 site_url: http://onlab.us/
141 hosts_nodes: True
142
143 # User
144 user_test:
145 type: tosca.nodes.User
146 properties:
147 username: test@opencord.org
148 email: test@opencord.org
149 password: mypwd
150 firstname: User
151 lastname: Test
152 is_admin: True
153 requirements:
154 - site:
155 node: site_onlab
156 relationship: tosca.relationships.BelongsToOne
157"""
158
Matteo Scandolo21dde412017-07-11 18:54:12 -0700159 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700160
161 parser.execute()
162
163 self.assertEqual(mock_save.call_count, 2)
164
165 self.assertIsNotNone(parser.templates_by_model_name['site_onlab'])
166 self.assertIsNotNone(parser.templates_by_model_name['user_test'])
167 self.assertEqual(parser.ordered_models_name, ['site_onlab', 'user_test'])
168
169 # check that the model was saved with the expected values
170 saved_site = parser.saved_model_by_name['site_onlab']
171 self.assertEqual(saved_site.name, 'Open Networking Lab')
172
173 saved_user = parser.saved_model_by_name['user_test']
174 self.assertEqual(saved_user.firstname, 'User')
Matteo Scandolod12be212017-07-07 10:44:34 -0700175 self.assertEqual(saved_user.site_id, 1)
176
177 @patch.dict(RESOURCES, mock_resources, clear=True)
178 @patch.object(FakeSite.objects, 'filter', MagicMock(return_value=[]))
179 def test_must_exist_fail(self):
180 """
181 [TOSCA_Parser] Should throw an error if an object with 'must_exist' does not exist
182 """
183 recipe = """
184 tosca_definitions_version: tosca_simple_yaml_1_0
185
186 description: Create a new site with one user
187
188 imports:
189 - custom_types/user.yaml
190 - custom_types/site.yaml
191
192 topology_template:
193 node_templates:
194
195 # Site
196 site_onlab:
197 type: tosca.nodes.Site
198 properties:
199 name: Open Networking Lab
200 must-exist: True
201 """
202
Matteo Scandolo21dde412017-07-11 18:54:12 -0700203 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolod12be212017-07-07 10:44:34 -0700204
205 with self.assertRaises(Exception) as e:
206 parser.execute()
207
208 self.assertEqual(e.exception.message, "[XOS-TOSCA] Model Site:Open Networking Lab has property 'must-exist' but cannot be found")