blob: 6067b2db640974af09db2c803cf05a79618fb49f [file] [log] [blame]
aticig9bc63ac2022-07-27 09:32:06 +03001# Copyright 2022 Canonical Ltd.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# 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, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14#
15# For those usages not covered by the Apache License, Version 2.0 please
16# contact: alfonso.tiernosepulveda@telefonica.com
17##
18import logging
aticig9bc63ac2022-07-27 09:32:06 +030019from unittest.mock import Mock, patch, MagicMock
20from unittest import TestCase
21
22from osm_common.msgkafka import MsgKafka
23from osm_common import fslocal
24from osm_lcm.data_utils.database.database import Database
25from osm_lcm.data_utils.filesystem.filesystem import Filesystem
26from osm_lcm.lcm_utils import LcmBase, LcmException
27from osm_lcm.tests import test_db_descriptors as descriptors
28import yaml
29from zipfile import BadZipfile
30
31
32class TestLcmBase(TestCase):
33
aticiga37c6ff2022-08-20 20:56:19 +030034 test_nsr_id = "f48163a6-c807-47bc-9682-f72caef5af85"
35 test_nsd_id = "8c2f8b95-bb1b-47ee-8001-36dc090678da"
36 nsd_package_path = "/" + test_nsd_id
aticig9bc63ac2022-07-27 09:32:06 +030037 nsd_package_name = "test_nsd"
38 charm_metadata_file = "/path/charm/metadata.yaml"
39
40 def setUp(self):
41 # DB
42 Database.instance = None
43 self.db = Database({"database": {"driver": "memory"}}).instance.db
44 self.db.create_list("nsds", yaml.safe_load(descriptors.db_nsds_text))
aticiga37c6ff2022-08-20 20:56:19 +030045 self.db.create_list("nsds_revisions", yaml.safe_load(descriptors.db_nsds_text))
aticig9bc63ac2022-07-27 09:32:06 +030046 self.db.create_list("nsrs", yaml.safe_load(descriptors.db_nsrs_text))
47 # Filesystem
48 self.fs = Filesystem({"storage": {"driver": "local", "path": "/"}}).instance.fs
49 # Create LCMBase class
50 self.msg = Mock(MsgKafka())
51 self.logger = Mock(logging)
52 self.my_ns = LcmBase(self.msg, self.logger)
53 self.my_ns.fs = self.fs
54 self.my_ns.db = self.db
55
56 def test_get_charm_name_successfully(self):
57 instance = self.my_ns
58 mock_open = MagicMock(open)
59 mock_yaml = MagicMock(yaml)
60 mock_yaml.safe_load.return_value = {"name": "test_charm"}
61 expected_result = "test_charm"
62
63 with patch("osm_lcm.lcm_utils.open", mock_open), patch(
64 "osm_lcm.lcm_utils.yaml.safe_load", mock_yaml.safe_load
65 ):
66 result = instance.get_charm_name(TestLcmBase.charm_metadata_file)
67 self.assertEqual(result, expected_result, "wrong charm name")
68 self.assertEqual(mock_yaml.safe_load.call_count, 1)
69 self.assertEqual(mock_open.call_count, 1)
70
71 def test_get_charm_name_can_not_open_metadata_file(self):
72 instance = self.my_ns
73 mock_open = MagicMock(open)
74 mock_open.side_effect = IOError
75 mock_yaml = MagicMock(create_autospec=True)
76
77 with patch("osm_lcm.lcm_utils.open", mock_open), patch(
78 "osm_lcm.lcm_utils.yaml.safe_load", mock_yaml.safe_load
79 ):
80 with self.assertRaises(IOError):
81 instance.get_charm_name(TestLcmBase.charm_metadata_file)
82 mock_yaml.safe_load.assert_not_called()
83 self.assertEqual(mock_open.call_count, 1)
84
85 def test_get_charm_name_wrong_metadata_file_format(self):
86 instance = self.my_ns
87 mock_open = MagicMock(open)
88 mock_yaml = MagicMock(create_autospec=True)
89 mock_yaml.safe_load.return_value = {}
90
91 with patch("osm_lcm.lcm_utils.open", mock_open), patch(
92 "osm_lcm.lcm_utils.yaml.safe_load", mock_yaml.safe_load
93 ):
94 with self.assertRaises(KeyError):
95 instance.get_charm_name(TestLcmBase.charm_metadata_file)
96 self.assertEqual(mock_open.call_count, 1)
97 self.assertEqual(mock_yaml.safe_load.call_count, 1)
98
99 def test_get_charm_path_successfully(self):
100 instance = self.my_ns
101 fs = fslocal.FsLocal()
102 fs.path = "/app/storage"
103 instance.fs = fs
104 charm_folder_name = "simple_charm"
aticiga37c6ff2022-08-20 20:56:19 +0300105 expected_result = (
106 "/app/storage/" + TestLcmBase.test_nsd_id + "/test_nsd/charms/simple_charm"
107 )
aticig9bc63ac2022-07-27 09:32:06 +0300108 result = instance._get_charm_path(
aticiga37c6ff2022-08-20 20:56:19 +0300109 TestLcmBase.nsd_package_path,
110 TestLcmBase.nsd_package_name,
111 charm_folder_name,
aticig9bc63ac2022-07-27 09:32:06 +0300112 )
113 self.assertEqual(result, expected_result, "wrong_charm_path")
114
115 def test_get_charm_metadata_file_charm_is_not_zipped(self):
116 instance = self.my_ns
117 fs = fslocal.FsLocal()
118 fs.path = "/app/storage"
119 instance.fs = fs
120 mock_zipfile = MagicMock(create_autospec=True)
121 charm_folder_name = "simple_charm"
aticiga37c6ff2022-08-20 20:56:19 +0300122 charm_path = (
123 "/app/storage/" + TestLcmBase.test_nsd_id + "/test_nsd/charms/simple_charm"
124 )
125 expected_result = (
126 "/app/storage/"
127 + TestLcmBase.test_nsd_id
128 + "/test_nsd/charms/simple_charm/metadata.yaml"
129 )
aticig9bc63ac2022-07-27 09:32:06 +0300130
131 with patch("osm_lcm.lcm_utils.ZipFile", mock_zipfile):
132 result = instance._get_charm_metadata_file(
133 charm_folder_name,
134 TestLcmBase.nsd_package_path,
135 TestLcmBase.nsd_package_name,
136 charm_path=charm_path,
137 )
138 self.assertEqual(result, expected_result, "wrong charm metadata path")
139 mock_zipfile.assert_not_called()
140
141 def test_get_charm_metadata_file_charm_is_zipped(self):
142 instance = self.my_ns
143 fs = fslocal.FsLocal()
144 fs.path = "/app/storage"
145 instance.fs = fs
146 mock_zipfile = MagicMock(create_autospec=True)
147 mock_zipfile.side_effect = None
aticiga37c6ff2022-08-20 20:56:19 +0300148 charm_folder_name = "ubuntu_18.04_simple_charm2.charm"
149 charm_path = (
150 "/app/storage/" + TestLcmBase.test_nsd_id + "/test_nsd/charms/simple_charm"
151 )
152 expected_result = (
153 "/app/storage/"
154 + TestLcmBase.test_nsd_id
155 + "/test_nsd/charms/ubuntu_18.04_simple_charm2/metadata.yaml"
156 )
aticig9bc63ac2022-07-27 09:32:06 +0300157
158 with patch("osm_lcm.lcm_utils.ZipFile", mock_zipfile):
159 result = instance._get_charm_metadata_file(
160 charm_folder_name,
161 TestLcmBase.nsd_package_path,
162 TestLcmBase.nsd_package_name,
163 charm_path=charm_path,
164 )
165 self.assertEqual(result, expected_result, "wrong charm metadata path")
166 self.assertEqual(mock_zipfile.call_count, 1)
167
168 def test_find_charm_name_successfully(self):
169 db_nsr = self.db.get_one("nsrs", {"_id": TestLcmBase.test_nsr_id})
170 instance = self.my_ns
aticig9bc63ac2022-07-27 09:32:06 +0300171 mock_charm_path = MagicMock()
172 mock_metadata_file = MagicMock()
173 mock_metadata_file.return_value = (
aticiga37c6ff2022-08-20 20:56:19 +0300174 "/" + TestLcmBase.test_nsd_id + "/new_test_nsd/charms/simple/metadata.yaml"
aticig9bc63ac2022-07-27 09:32:06 +0300175 )
176 mock_charm_name = MagicMock()
177 mock_charm_name.return_value = "test_charm"
178 expected_result = "test_charm"
179
180 with patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path), patch(
aticiga37c6ff2022-08-20 20:56:19 +0300181 "osm_lcm.lcm_utils.LcmBase._get_charm_metadata_file", mock_metadata_file
182 ), patch("osm_lcm.lcm_utils.LcmBase.get_charm_name", mock_charm_name):
aticig9bc63ac2022-07-27 09:32:06 +0300183
184 result = instance.find_charm_name(db_nsr, "simple")
185 self.assertEqual(result, expected_result, "Wrong charm name")
186 mock_charm_path.assert_called_once()
187 mock_metadata_file.assert_called_once()
188 mock_charm_name.assert_called_once_with(
aticiga37c6ff2022-08-20 20:56:19 +0300189 "/"
190 + TestLcmBase.test_nsd_id
191 + "/new_test_nsd/charms/simple/metadata.yaml"
aticig9bc63ac2022-07-27 09:32:06 +0300192 )
aticig9bc63ac2022-07-27 09:32:06 +0300193
194 def test_find_charm_name_charm_bad_zipfile(self):
195 db_nsr = self.db.get_one("nsrs", {"_id": TestLcmBase.test_nsr_id})
196 instance = self.my_ns
aticig9bc63ac2022-07-27 09:32:06 +0300197 mock_charm_path = MagicMock()
198 mock_metadata_file = MagicMock()
199 mock_metadata_file.side_effect = BadZipfile
200 mock_charm_name = MagicMock()
201
202 with patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path), patch(
aticiga37c6ff2022-08-20 20:56:19 +0300203 "osm_lcm.lcm_utils.LcmBase._get_charm_metadata_file", mock_metadata_file
204 ), patch("osm_lcm.lcm_utils.LcmBase.get_charm_name", mock_charm_name):
aticig9bc63ac2022-07-27 09:32:06 +0300205
206 with self.assertRaises(LcmException):
207
208 instance.find_charm_name(db_nsr, "simple")
aticig9bc63ac2022-07-27 09:32:06 +0300209 self.assertEqual(mock_charm_path.call_count, 1)
210 self.assertEqual(mock_metadata_file.call_count, 1)
211 mock_charm_name.assert_not_called()
212
aticig9bc63ac2022-07-27 09:32:06 +0300213 def test_find_charm_name_missing_input_charm_folder_name(self):
214 db_nsr = self.db.get_one("nsrs", {"_id": TestLcmBase.test_nsr_id})
215 instance = self.my_ns
aticig9bc63ac2022-07-27 09:32:06 +0300216 mock_metadata_file = MagicMock()
217 mock_charm_name = MagicMock()
aticiga37c6ff2022-08-20 20:56:19 +0300218 mock_charm_path = MagicMock()
aticig9bc63ac2022-07-27 09:32:06 +0300219
220 with patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path), patch(
aticiga37c6ff2022-08-20 20:56:19 +0300221 "osm_lcm.lcm_utils.LcmBase._get_charm_metadata_file", mock_metadata_file
222 ), patch("osm_lcm.lcm_utils.LcmBase.get_charm_name", mock_charm_name):
aticig9bc63ac2022-07-27 09:32:06 +0300223
224 with self.assertRaises(LcmException):
225 instance.find_charm_name(db_nsr, "")
226 mock_charm_path.assert_not_called()
227 mock_metadata_file.assert_not_called()
228 mock_charm_name.assert_not_called()
aticig9bc63ac2022-07-27 09:32:06 +0300229
230 def test_find_charm_name_can_not_open_metadata_file(self):
aticiga37c6ff2022-08-20 20:56:19 +0300231 db_nsr = self.db.get_one("nsrs", {"_id": TestLcmBase.test_nsr_id})
aticig9bc63ac2022-07-27 09:32:06 +0300232 instance = self.my_ns
aticiga37c6ff2022-08-20 20:56:19 +0300233
aticig9bc63ac2022-07-27 09:32:06 +0300234 mock_charm_path = MagicMock()
235 mock_metadata_file = MagicMock()
236 mock_charm_name = MagicMock()
237 mock_charm_name.side_effect = yaml.YAMLError
238
239 with patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path), patch(
aticiga37c6ff2022-08-20 20:56:19 +0300240 "osm_lcm.lcm_utils.LcmBase._get_charm_metadata_file", mock_metadata_file
241 ), patch("osm_lcm.lcm_utils.LcmBase.get_charm_name", mock_charm_name):
aticig9bc63ac2022-07-27 09:32:06 +0300242
243 with self.assertRaises(LcmException):
244 instance.find_charm_name(db_nsr, "simple")
245 self.assertEqual(mock_charm_path.call_count, 1)
246 self.assertEqual(mock_metadata_file.call_count, 1)
247 self.assertEqual(mock_charm_name.call_count, 1)