blob: 7c1bd93c107c5f4933be23daaca3dd27cd5e3c47 [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
28 id = 1
29
30class FakeGuiExt:
31 objects = FakeObj
32
33class FakeSite:
34 objects = FakeObj
35
36class FakeUser:
37 objects = FakeObj
38
Matteo Scandolo21dde412017-07-11 18:54:12 -070039USERNAME = "username"
40PASSWORD = "pass"
41
42mock_resources = {}
43mock_resources["%s~%s" % (USERNAME, PASSWORD)] = {
Matteo Scandolodf2600b2017-07-05 17:01:29 -070044 'XOSGuiExtension': FakeGuiExt,
45 'Site': FakeSite,
46 'User': FakeUser
47}
48
49class TOSCA_Parser_E2E(unittest.TestCase):
50
51 @patch.dict(RESOURCES, mock_resources, clear=True)
52 @patch.object(FakeGuiExt.objects, 'filter', MagicMock(return_value=[FakeModel]))
53 @patch.object(FakeModel, 'save')
54 def test_basic_creation(self, mock_save):
55 """
56 [TOSCA_Parser] Should save models defined in a TOSCA recipe
57 """
58 recipe = """
59tosca_definitions_version: tosca_simple_yaml_1_0
60
61description: Persist xos-sample-gui-extension
62
63imports:
64 - custom_types/xosguiextension.yaml
65
66topology_template:
67 node_templates:
68
69 # UI Extension
70 test:
71 type: tosca.nodes.XOSGuiExtension
72 properties:
73 name: test
74 files: /spa/extensions/test/vendor.js, /spa/extensions/test/app.js
75"""
76
Matteo Scandolo21dde412017-07-11 18:54:12 -070077 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolodf2600b2017-07-05 17:01:29 -070078
79 parser.execute()
80
81 # checking that the model has been saved
82 mock_save.assert_called()
83
84 self.assertIsNotNone(parser.templates_by_model_name['test'])
85 self.assertEqual(parser.ordered_models_name, ['test'])
86
87 # check that the model was saved with the expected values
88 saved_model = parser.saved_model_by_name['test']
89 self.assertEqual(saved_model.name, 'test')
90 self.assertEqual(saved_model.files, '/spa/extensions/test/vendor.js, /spa/extensions/test/app.js')
91
92 @patch.dict(RESOURCES, mock_resources, clear=True)
93 @patch.object(FakeSite.objects, 'filter', MagicMock(return_value=[FakeModel]))
94 @patch.object(FakeUser.objects, 'filter', MagicMock(return_value=[FakeModel]))
95 @patch.object(FakeModel, 'save')
96 def test_related_models_creation(self, mock_save):
97 """
98 [TOSCA_Parser] Should save related models defined in a TOSCA recipe
99 """
100
101 recipe = """
102tosca_definitions_version: tosca_simple_yaml_1_0
103
104description: Create a new site with one user
105
106imports:
107 - custom_types/user.yaml
108 - custom_types/site.yaml
109
110topology_template:
111 node_templates:
112
113 # Site
114 site_onlab:
115 type: tosca.nodes.Site
116 properties:
117 name: Open Networking Lab
118 site_url: http://onlab.us/
119 hosts_nodes: True
120
121 # User
122 user_test:
123 type: tosca.nodes.User
124 properties:
125 username: test@opencord.org
126 email: test@opencord.org
127 password: mypwd
128 firstname: User
129 lastname: Test
130 is_admin: True
131 requirements:
132 - site:
133 node: site_onlab
134 relationship: tosca.relationships.BelongsToOne
135"""
136
Matteo Scandolo21dde412017-07-11 18:54:12 -0700137 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolodf2600b2017-07-05 17:01:29 -0700138
139 parser.execute()
140
141 self.assertEqual(mock_save.call_count, 2)
142
143 self.assertIsNotNone(parser.templates_by_model_name['site_onlab'])
144 self.assertIsNotNone(parser.templates_by_model_name['user_test'])
145 self.assertEqual(parser.ordered_models_name, ['site_onlab', 'user_test'])
146
147 # check that the model was saved with the expected values
148 saved_site = parser.saved_model_by_name['site_onlab']
149 self.assertEqual(saved_site.name, 'Open Networking Lab')
150
151 saved_user = parser.saved_model_by_name['user_test']
152 self.assertEqual(saved_user.firstname, 'User')
Matteo Scandolod12be212017-07-07 10:44:34 -0700153 self.assertEqual(saved_user.site_id, 1)
154
155 @patch.dict(RESOURCES, mock_resources, clear=True)
156 @patch.object(FakeSite.objects, 'filter', MagicMock(return_value=[]))
157 def test_must_exist_fail(self):
158 """
159 [TOSCA_Parser] Should throw an error if an object with 'must_exist' does not exist
160 """
161 recipe = """
162 tosca_definitions_version: tosca_simple_yaml_1_0
163
164 description: Create a new site with one user
165
166 imports:
167 - custom_types/user.yaml
168 - custom_types/site.yaml
169
170 topology_template:
171 node_templates:
172
173 # Site
174 site_onlab:
175 type: tosca.nodes.Site
176 properties:
177 name: Open Networking Lab
178 must-exist: True
179 """
180
Matteo Scandolo21dde412017-07-11 18:54:12 -0700181 parser = TOSCA_Parser(recipe, USERNAME, PASSWORD)
Matteo Scandolod12be212017-07-07 10:44:34 -0700182
183 with self.assertRaises(Exception) as e:
184 parser.execute()
185
186 self.assertEqual(e.exception.message, "[XOS-TOSCA] Model Site:Open Networking Lab has property 'must-exist' but cannot be found")