blob: 6a44b6fcb43095e86348df9abbca1a8f82920927 [file] [log] [blame]
Matteo Scandolo920e8fd2017-08-08 13:05:24 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
Matteo Scandolodf2600b2017-07-05 17:01:29 -070017import unittest
18from mock import patch, MagicMock
19from tosca.parser import TOSCA_Parser
20from grpc_client.resources import RESOURCES
21
22class FakeObj:
23 new = None
24 filter = None
25
26class FakeModel:
27 save = None
Matteo Scandolo78ca3eb2017-07-13 16:58:22 -070028 delete = None
29 is_new = False
Matteo Scandolodf2600b2017-07-05 17:01:29 -070030 id = 1
31
32class FakeGuiExt:
33 objects = FakeObj
34
35class FakeSite:
36 objects = FakeObj
37
Matteo Scandoloa9f17262017-12-05 13:00:30 -080038class FakeInstance:
39 objects = FakeObj
40
Matteo Scandolodf2600b2017-07-05 17:01:29 -070041class FakeUser:
42 objects = FakeObj
43
Matteo Scandolo21dde412017-07-11 18:54:12 -070044USERNAME = "username"
45PASSWORD = "pass"
46
47mock_resources = {}
48mock_resources["%s~%s" % (USERNAME, PASSWORD)] = {
Matteo Scandolodf2600b2017-07-05 17:01:29 -070049 'XOSGuiExtension': FakeGuiExt,
50 'Site': FakeSite,
Matteo Scandoloa9f17262017-12-05 13:00:30 -080051 'User': FakeUser,
52 'Instance': FakeInstance
Matteo Scandolodf2600b2017-07-05 17:01:29 -070053}
54
55class TOSCA_Parser_E2E(unittest.TestCase):
56
57 @patch.dict(RESOURCES, mock_resources, clear=True)
58 @patch.object(FakeGuiExt.objects, 'filter', MagicMock(return_value=[FakeModel]))
59 @patch.object(FakeModel, 'save')
Matteo Scandolo24197a12017-12-13 12:21:59 -080060 def test_basic_creation(self, mock_save):
Matteo Scandolodf2600b2017-07-05 17:01:29 -070061 """
62 [TOSCA_Parser] Should save models defined in a TOSCA recipe
63 """
64 recipe = """
65tosca_definitions_version: tosca_simple_yaml_1_0
66
67description: Persist xos-sample-gui-extension
68
69imports:
70 - custom_types/xosguiextension.yaml
71
72topology_template:
73 node_templates:
74
75 # UI Extension
76 test:
77 type: tosca.nodes.XOSGuiExtension
78 properties:
79 name: test
80 files: /spa/extensions/test/vendor.js, /spa/extensions/test/app.js
81"""
82
Matteo Scandolo21dde412017-07-11 18:54:12 -070083 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolodf2600b2017-07-05 17:01:29 -070084
85 parser.execute()
86
87 # checking that the model has been saved
88 mock_save.assert_called()
89
90 self.assertIsNotNone(parser.templates_by_model_name['test'])
91 self.assertEqual(parser.ordered_models_name, ['test'])
92
93 # check that the model was saved with the expected values
94 saved_model = parser.saved_model_by_name['test']
95 self.assertEqual(saved_model.name, 'test')
96 self.assertEqual(saved_model.files, '/spa/extensions/test/vendor.js, /spa/extensions/test/app.js')
97
98 @patch.dict(RESOURCES, mock_resources, clear=True)
Matteo Scandolo78ca3eb2017-07-13 16:58:22 -070099 @patch.object(FakeGuiExt.objects, 'filter', MagicMock(return_value=[FakeModel]))
100 @patch.object(FakeModel, 'delete')
Matteo Scandolo24197a12017-12-13 12:21:59 -0800101 def test_basic_deletion(self, mock_delete):
Matteo Scandolo78ca3eb2017-07-13 16:58:22 -0700102 """
103 [TOSCA_Parser] Should delete models defined in a TOSCA recipe
104 """
105 recipe = """
106 tosca_definitions_version: tosca_simple_yaml_1_0
107
108 description: Persist xos-sample-gui-extension
109
110 imports:
111 - custom_types/xosguiextension.yaml
112
113 topology_template:
114 node_templates:
115
116 # UI Extension
117 test:
118 type: tosca.nodes.XOSGuiExtension
119 properties:
120 name: test
121 files: /spa/extensions/test/vendor.js, /spa/extensions/test/app.js
122 """
123
124 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD, delete=True)
125
126 parser.execute()
127
128 # checking that the model has been saved
129 mock_delete.assert_called()
130
131 self.assertIsNotNone(parser.templates_by_model_name['test'])
132 self.assertEqual(parser.ordered_models_name, ['test'])
133
134 @patch.dict(RESOURCES, mock_resources, clear=True)
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700135 @patch.object(FakeSite.objects, 'filter', MagicMock(return_value=[FakeModel]))
136 @patch.object(FakeUser.objects, 'filter', MagicMock(return_value=[FakeModel]))
137 @patch.object(FakeModel, 'save')
Matteo Scandolo24197a12017-12-13 12:21:59 -0800138 def test_related_models_creation(self, mock_save):
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700139 """
140 [TOSCA_Parser] Should save related models defined in a TOSCA recipe
141 """
142
143 recipe = """
144tosca_definitions_version: tosca_simple_yaml_1_0
145
146description: Create a new site with one user
147
148imports:
149 - custom_types/user.yaml
150 - custom_types/site.yaml
151
152topology_template:
153 node_templates:
154
155 # Site
156 site_onlab:
157 type: tosca.nodes.Site
158 properties:
159 name: Open Networking Lab
160 site_url: http://onlab.us/
161 hosts_nodes: True
162
163 # User
Matteo Scandolo24197a12017-12-13 12:21:59 -0800164 usertest:
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700165 type: tosca.nodes.User
166 properties:
167 username: test@opencord.org
168 email: test@opencord.org
169 password: mypwd
170 firstname: User
171 lastname: Test
172 is_admin: True
173 requirements:
174 - site:
175 node: site_onlab
176 relationship: tosca.relationships.BelongsToOne
177"""
178
Matteo Scandolo21dde412017-07-11 18:54:12 -0700179 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700180
181 parser.execute()
182
183 self.assertEqual(mock_save.call_count, 2)
184
185 self.assertIsNotNone(parser.templates_by_model_name['site_onlab'])
Matteo Scandolo24197a12017-12-13 12:21:59 -0800186 self.assertIsNotNone(parser.templates_by_model_name['usertest'])
187 self.assertEqual(parser.ordered_models_name, ['site_onlab', 'usertest'])
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700188
189 # check that the model was saved with the expected values
190 saved_site = parser.saved_model_by_name['site_onlab']
191 self.assertEqual(saved_site.name, 'Open Networking Lab')
192
Matteo Scandolo24197a12017-12-13 12:21:59 -0800193 saved_user = parser.saved_model_by_name['usertest']
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700194 self.assertEqual(saved_user.firstname, 'User')
Matteo Scandolod12be212017-07-07 10:44:34 -0700195 self.assertEqual(saved_user.site_id, 1)
196
197 @patch.dict(RESOURCES, mock_resources, clear=True)
198 @patch.object(FakeSite.objects, 'filter', MagicMock(return_value=[]))
Matteo Scandolo24197a12017-12-13 12:21:59 -0800199 def test_must_exist_fail(self):
Matteo Scandolod12be212017-07-07 10:44:34 -0700200 """
201 [TOSCA_Parser] Should throw an error if an object with 'must_exist' does not exist
202 """
203 recipe = """
204 tosca_definitions_version: tosca_simple_yaml_1_0
205
206 description: Create a new site with one user
207
208 imports:
Matteo Scandolod12be212017-07-07 10:44:34 -0700209 - custom_types/site.yaml
210
211 topology_template:
212 node_templates:
213
214 # Site
215 site_onlab:
216 type: tosca.nodes.Site
217 properties:
218 name: Open Networking Lab
219 must-exist: True
220 """
221
Matteo Scandolo21dde412017-07-11 18:54:12 -0700222 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolod12be212017-07-07 10:44:34 -0700223
224 with self.assertRaises(Exception) as e:
225 parser.execute()
226
Matteo Scandolo1bd10762017-10-18 09:53:14 +0200227 self.assertEqual(e.exception.message.message, "[XOS-TOSCA] Model of class Site and properties {'name': 'Open Networking Lab'} has property 'must-exist' but cannot be found")
Matteo Scandoloa9f17262017-12-05 13:00:30 -0800228
229 @patch.dict(RESOURCES, mock_resources, clear=True)
230 @patch.object(FakeInstance.objects, 'filter', MagicMock(return_value=[FakeModel]))
231 @patch.object(FakeModel, 'save')
232 def test_number_param(self, mock_save):
233 """
234 [TOSCA_Parser] Should correctly parse number parameters
235 """
236 recipe = """
237 tosca_definitions_version: tosca_simple_yaml_1_0
238
239 description: Create a new site with one user
240
241 imports:
242 - custom_types/instance.yaml
243
244 topology_template:
245 node_templates:
246
247 # Site
248 instance#test_instance:
249 type: tosca.nodes.Instance
250 properties:
251 name: test_instance
252 numberCores: 10
253 """
254 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
255 parser.execute()
256
257 # checking that the model has been saved
258 mock_save.assert_called()
259
260 # check that the model was saved with the expected values
261 saved_model = parser.saved_model_by_name['instance#test_instance']
262 self.assertEqual(saved_model.name, 'test_instance')
263 self.assertEqual(saved_model.numberCores, 10)