d2e2b5b2c4e1bd3ae9aaa1e3592b559d003b9722
[modeling/etsicatalog.git] / catalog / packages / tests / test_vnf_pkg_subscription.py
1 # Copyright (C) 2019 Verizon. All Rights Reserved
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 import json
16 import os
17 import uuid
18
19 import mock
20 from django.test import TestCase
21 from rest_framework import status
22 from rest_framework.test import APIClient
23
24 import catalog.pub.utils.timeutil
25 from catalog.packages import const
26 from catalog.packages.biz.notificationsutil import PkgNotifications
27 from catalog.packages.biz.vnf_pkg_subscription import QuerySubscription, TerminateSubscription
28 from catalog.pub.config import config as pub_config
29 from catalog.pub.config.config import CATALOG_ROOT_PATH
30 from catalog.pub.database.models import VnfPkgSubscriptionModel, VnfPackageModel
31 from catalog.pub.exceptions import SubscriptionDoesNotExistsException
32 from catalog.pub.utils import toscaparser
33 from .const import vnf_subscription_data, vnfd_data
34
35
36 class TestNfPackageSubscription(TestCase):
37     def setUp(self):
38         self.client = APIClient()
39         VnfPkgSubscriptionModel.objects.filter().delete()
40         self.vnf_subscription_data = vnf_subscription_data
41
42     def tearDown(self):
43         pass
44
45     @mock.patch("requests.get")
46     @mock.patch.object(uuid, 'uuid4')
47     def test_create_vnf_subscription(self, mock_uuid4, mock_requests):
48         temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13"
49         mock_requests.return_value.status_code = 204
50         mock_requests.get.status_code = 204
51         mock_uuid4.return_value = temp_uuid
52         response = self.client.post(
53             "/api/vnfpkgm/v1/subscriptions",
54             data=self.vnf_subscription_data,
55             format='json'
56         )
57         self.assertEqual(201, response.status_code)
58         self.assertEqual(
59             self.vnf_subscription_data["callbackUri"],
60             response.data["callbackUri"]
61         )
62         self.assertEqual(temp_uuid, response.data["id"])
63
64     @mock.patch("requests.get")
65     @mock.patch.object(uuid, 'uuid4')
66     def test_duplicate_subscriptions(self, mock_uuid4, mock_requests):
67         temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13"
68         temp1_uuid = "00342b18-a5c7-11e8-998c-bf1755941f12"
69         mock_requests.return_value.status_code = 204
70         mock_requests.get.status_code = 204
71         mock_uuid4.side_effect = [temp_uuid, temp1_uuid]
72         response = self.client.post(
73             "/api/vnfpkgm/v1/subscriptions",
74             data=self.vnf_subscription_data,
75             format='json'
76         )
77         self.assertEqual(201, response.status_code)
78         self.assertEqual(
79             self.vnf_subscription_data["callbackUri"],
80             response.data["callbackUri"]
81         )
82         self.assertEqual(temp_uuid, response.data["id"])
83         temp_uuid = "00442b18-a5c7-11e8-998c-bf1755941f12"
84         mock_requests.return_value.status_code = 204
85         mock_requests.get.status_code = 204
86         mock_uuid4.return_value = temp_uuid
87         response = self.client.post(
88             "/api/vnfpkgm/v1/subscriptions",
89             data=self.vnf_subscription_data,
90             format='json'
91         )
92         self.assertEqual(303, response.status_code)
93
94     @mock.patch("requests.get")
95     @mock.patch.object(uuid, 'uuid4')
96     def test_get_subscriptions(self, mock_uuid4, mock_requests):
97         temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13"
98         mock_requests.return_value.status_code = 204
99         mock_requests.get.status_code = 204
100         mock_uuid4.return_value = temp_uuid
101         self.client.post(
102             "/api/vnfpkgm/v1/subscriptions",
103             data=self.vnf_subscription_data,
104             format='json'
105         )
106         response = self.client.get(
107             "/api/vnfpkgm/v1/subscriptions?usageState=IN_USE",
108             format='json'
109         )
110         self.assertEqual(200, response.status_code)
111         self.assertEqual(1, len(response.data))
112
113     @mock.patch("requests.get")
114     @mock.patch.object(uuid, 'uuid4')
115     def test_get_subscriptions_with_invalid_params(self, mock_uuid4, mock_requests):
116         temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13"
117         mock_requests.return_value.status_code = 204
118         mock_requests.get.status_code = 204
119         mock_uuid4.return_value = temp_uuid
120         self.client.post(
121             "/api/vnfpkgm/v1/subscriptions",
122             data=self.vnf_subscription_data,
123             format='json'
124         )
125         response = self.client.get(
126             "/api/vnfpkgm/v1/subscriptions?dummy=dummy",
127             format='json'
128         )
129         self.assertEqual(400, response.status_code)
130
131     @mock.patch("requests.get")
132     @mock.patch.object(uuid, 'uuid4')
133     def test_get_subscription_with_id(self, mock_uuid4, mock_requests):
134         temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13"
135         mock_requests.return_value.status_code = 204
136         mock_requests.get.status_code = 204
137         mock_uuid4.return_value = temp_uuid
138         self.client.post(
139             "/api/vnfpkgm/v1/subscriptions",
140             data=self.vnf_subscription_data,
141             format='json'
142         )
143         response = self.client.get(
144             "/api/vnfpkgm/v1/subscriptions/%s" % temp_uuid,
145             format='json'
146         )
147         self.assertEqual(200, response.status_code)
148         self.assertEqual(temp_uuid, response.data["id"])
149
150     @mock.patch("requests.get")
151     @mock.patch.object(uuid, 'uuid4')
152     def test_get_subscription_with_id_not_exists(self, mock_uuid4, mock_requests):
153         temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13"
154         dummy_uuid = str(uuid.uuid4())
155         mock_requests.return_value.status_code = 204
156         mock_requests.get.status_code = 204
157         mock_uuid4.return_value = temp_uuid
158         self.client.post(
159             "/api/vnfpkgm/v1/subscriptions",
160             data=self.vnf_subscription_data,
161             format='json'
162         )
163         response = self.client.get(
164             "/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid,
165             format='json'
166         )
167         self.assertEqual(404, response.status_code)
168
169     @mock.patch("requests.get")
170     @mock.patch.object(uuid, 'uuid4')
171     def test_delete_subscription_with_id(self, mock_uuid4, mock_requests):
172         temp_uuid = "99442b18-a5c7-11e8-998c-bf1755941f13"
173         dummy_uuid = str(uuid.uuid4())
174         mock_requests.return_value.status_code = 204
175         mock_requests.get.status_code = 204
176         mock_uuid4.return_value = temp_uuid
177         self.client.post(
178             "/api/vnfpkgm/v1/subscriptions",
179             data=self.vnf_subscription_data,
180             format='json'
181         )
182         self.client.get(
183             "/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid,
184             format='json'
185         )
186         response = self.client.delete("/api/vnfpkgm/v1/subscriptions/%s" % temp_uuid)
187         self.assertEqual(204, response.status_code)
188
189     @mock.patch("requests.get")
190     @mock.patch.object(uuid, 'uuid4')
191     def test_delete_subscription_with_id_not_exists(self, mock_uuid4, mock_requests):
192         dummy_uuid = str(uuid.uuid4())
193         response = self.client.delete("/api/vnfpkgm/v1/subscriptions/%s" % dummy_uuid)
194         self.assertEqual(404, response.status_code)
195
196     @mock.patch("requests.get")
197     @mock.patch.object(toscaparser, 'parse_vnfd')
198     @mock.patch("requests.post")
199     @mock.patch("uuid.uuid4")
200     @mock.patch.object(catalog.pub.utils.timeutil, "now_time")
201     def test_vnfpkg_subscript_notify(self, mock_nowtime, mock_uuid, mock_requests_post, mock_parse_vnfd,
202                                      mock_requests_get):
203         mock_nowtime.return_value = "2019-02-16 14:41:16"
204         uuid_subscriptid = "99442b18-a5c7-11e8-998c-bf1755941f13"
205         uuid_vnfPackageId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
206         uuid_vnfdid = "00342b18-a5c7-11e8-998c-bf1755941f12"
207         mock_uuid.side_effect = [uuid_subscriptid, "1111"]
208         mock_requests_get.return_value.status_code = 204
209         mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data)
210
211         response = self.client.post(
212             "/api/vnfpkgm/v1/subscriptions",
213             data=vnf_subscription_data,
214             format='json')
215         self.assertEqual(201, response.status_code)
216
217         data = {'file': open(os.path.join(CATALOG_ROOT_PATH, "empty.txt"), "rt")}
218         VnfPackageModel.objects.create(
219             vnfPackageId=uuid_vnfPackageId,
220             onboardingState="CREATED"
221         )
222
223         response = self.client.put("/api/vnfpkgm/v1/vnf_packages/%s/package_content" % uuid_vnfPackageId, data=data)
224         vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId=uuid_vnfPackageId)
225         self.assertEqual(uuid_vnfdid, vnf_pkg[0].vnfdId)
226         self.assertEqual(const.PKG_STATUS.ONBOARDED, vnf_pkg[0].onboardingState)
227         self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
228
229         expect_notification = {
230             'id': "1111",
231             'notificationType': const.PKG_NOTIFICATION_TYPE.ONBOARDING,
232             'timeStamp': "2019-02-16 14:41:16",
233             'vnfPkgId': uuid_vnfPackageId,
234             'vnfdId': uuid_vnfdid,
235             "subscriptionId": uuid_subscriptid,
236             '_links': {
237                 'subscription': {
238                     'href': 'http://%s:%s/%s%s' % (pub_config.MSB_SERVICE_IP,
239                                                    pub_config.MSB_SERVICE_PORT,
240                                                    const.VNFPKG_SUBSCRIPTION_ROOT_URI,
241                                                    uuid_subscriptid)},
242                 'vnfPackage': {
243                     'href': 'http://%s:%s/%s/vnf_packages/%s' % (pub_config.MSB_SERVICE_IP,
244                                                                  pub_config.MSB_SERVICE_PORT,
245                                                                  const.PKG_URL_PREFIX,
246                                                                  uuid_vnfPackageId)
247                 }
248             }
249         }
250         mock_requests_post.assert_called_with(vnf_subscription_data["callbackUri"], data=expect_notification,
251                                               headers={'Connection': 'close'})
252
253     def test_service_query_single_subscription_not_found(self):
254         try:
255             subscription_id = "test_not_found"
256             QuerySubscription().query_single_subscription(subscription_id)
257         except SubscriptionDoesNotExistsException as e:
258             self.assertEqual("Subscription with ID: %s does not exist" % subscription_id, e.args[0])
259
260     def test_service_delete_single_subscription_not_found(self):
261         try:
262             subscription_id = "test_not_found"
263             TerminateSubscription().terminate(subscription_id)
264         except SubscriptionDoesNotExistsException as e:
265             self.assertEqual("Subscription with ID: %s does not exist" % subscription_id, e.args[0])
266
267
268 class NotificationTest(TestCase):
269     def setUp(self):
270         VnfPackageModel.objects.all().delete()
271         VnfPkgSubscriptionModel.objects.all().delete()
272
273     def tearDown(self):
274         VnfPackageModel.objects.all().delete()
275         VnfPkgSubscriptionModel.objects.all().delete()
276
277     @mock.patch("requests.post")
278     @mock.patch("uuid.uuid4")
279     @mock.patch.object(catalog.pub.utils.timeutil, "now_time")
280     def test_vnfpkg_manual_notify(self, mock_nowtime, mock_uuid, mock_requests_post):
281         VnfPackageModel(vnfPackageId="vnfpkgid1",
282                         vnfdId="vnfdid1"
283                         ).save()
284
285         VnfPkgSubscriptionModel(subscription_id="1",
286                                 callback_uri="http://127.0.0.1/self",
287                                 notification_types=const.NOTIFICATION_TYPES,
288                                 vnfd_id="vnfdid1",
289                                 vnf_pkg_id="vnfpkgid1"
290                                 ).save()
291         mock_nowtime.return_value = "2019-12-16 14:41:16"
292         mock_uuid.return_value = "1111"
293         notify = PkgNotifications(const.PKG_NOTIFICATION_TYPE.CHANGE, "vnfpkgid1",
294                                   const.PKG_CHANGE_TYPE.OP_STATE_CHANGE, operational_state=None)
295
296         notify.send_notification()
297         expect_callbackuri = "http://127.0.0.1/self"
298         expect_notification = {
299             'id': "1111",
300             'notificationType': const.PKG_NOTIFICATION_TYPE.CHANGE,
301             'timeStamp': "2019-12-16 14:41:16",
302             'vnfPkgId': "vnfpkgid1",
303             'vnfdId': "vnfdid1",
304             'changeType': const.PKG_CHANGE_TYPE.OP_STATE_CHANGE,
305             'operationalState': None,
306             "subscriptionId": "1",
307             '_links': {
308                 'subscription': {
309                     'href': 'http://%s:%s/%s%s' % (pub_config.MSB_SERVICE_IP,
310                                                    pub_config.MSB_SERVICE_PORT,
311                                                    const.VNFPKG_SUBSCRIPTION_ROOT_URI,
312                                                    "1")},
313                 'vnfPackage': {
314                     'href': 'http://%s:%s/%s/vnf_packages/%s' % (pub_config.MSB_SERVICE_IP,
315                                                                  pub_config.MSB_SERVICE_PORT,
316                                                                  const.PKG_URL_PREFIX,
317                                                                  "vnfpkgid1")
318                 }
319             }
320         }
321         mock_requests_post.assert_called_with(expect_callbackuri, data=expect_notification,
322                                               headers={'Connection': 'close'})