1 # Copyright 2022 Canonical Ltd.
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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
15 # For those usages not covered by the Apache License, Version 2.0 please
16 # contact: alfonso.tiernosepulveda@telefonica.com
19 from unittest
.mock
import Mock
, patch
, MagicMock
20 from unittest
import TestCase
22 from osm_common
.msgkafka
import MsgKafka
23 from osm_common
import fslocal
24 from osm_lcm
.data_utils
.database
.database
import Database
25 from osm_lcm
.data_utils
.filesystem
.filesystem
import Filesystem
26 from osm_lcm
.lcm_utils
import LcmBase
, LcmException
27 from osm_lcm
.tests
import test_db_descriptors
as descriptors
29 from zipfile
import BadZipfile
32 class TestLcmBase(TestCase
):
34 test_nsr_id
= "f48163a6-c807-47bc-9682-f72caef5af85"
35 test_nsd_id
= "8c2f8b95-bb1b-47ee-8001-36dc090678da"
36 nsd_package_path
= "/" + test_nsd_id
37 nsd_package_name
= "test_nsd"
38 charm_metadata_file
= "/path/charm/metadata.yaml"
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
))
45 self
.db
.create_list("nsds_revisions", yaml
.safe_load(descriptors
.db_nsds_text
))
46 self
.db
.create_list("nsrs", yaml
.safe_load(descriptors
.db_nsrs_text
))
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
56 def test_get_charm_name_successfully(self
):
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"
63 with
patch("osm_lcm.lcm_utils.open", mock_open
), patch(
64 "osm_lcm.lcm_utils.yaml.safe_load", mock_yaml
.safe_load
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)
71 def test_get_charm_name_can_not_open_metadata_file(self
):
73 mock_open
= MagicMock(open)
74 mock_open
.side_effect
= IOError
75 mock_yaml
= MagicMock(create_autospec
=True)
77 with
patch("osm_lcm.lcm_utils.open", mock_open
), patch(
78 "osm_lcm.lcm_utils.yaml.safe_load", mock_yaml
.safe_load
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)
85 def test_get_charm_name_wrong_metadata_file_format(self
):
87 mock_open
= MagicMock(open)
88 mock_yaml
= MagicMock(create_autospec
=True)
89 mock_yaml
.safe_load
.return_value
= {}
91 with
patch("osm_lcm.lcm_utils.open", mock_open
), patch(
92 "osm_lcm.lcm_utils.yaml.safe_load", mock_yaml
.safe_load
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)
99 def test_get_charm_path_successfully(self
):
100 instance
= self
.my_ns
101 fs
= fslocal
.FsLocal()
102 fs
.path
= "/app/storage"
104 charm_folder_name
= "simple_charm"
106 "/app/storage/" + TestLcmBase
.test_nsd_id
+ "/test_nsd/charms/simple_charm"
108 result
= instance
._get
_charm
_path
(
109 TestLcmBase
.nsd_package_path
,
110 TestLcmBase
.nsd_package_name
,
113 self
.assertEqual(result
, expected_result
, "wrong_charm_path")
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"
120 mock_zipfile
= MagicMock(create_autospec
=True)
121 charm_folder_name
= "simple_charm"
123 "/app/storage/" + TestLcmBase
.test_nsd_id
+ "/test_nsd/charms/simple_charm"
127 + TestLcmBase
.test_nsd_id
128 + "/test_nsd/charms/simple_charm/metadata.yaml"
131 with
patch("osm_lcm.lcm_utils.ZipFile", mock_zipfile
):
132 result
= instance
._get
_charm
_metadata
_file
(
134 TestLcmBase
.nsd_package_path
,
135 TestLcmBase
.nsd_package_name
,
136 charm_path
=charm_path
,
138 self
.assertEqual(result
, expected_result
, "wrong charm metadata path")
139 mock_zipfile
.assert_not_called()
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"
146 mock_zipfile
= MagicMock(create_autospec
=True)
147 mock_zipfile
.side_effect
= None
148 charm_folder_name
= "ubuntu_18.04_simple_charm2.charm"
150 "/app/storage/" + TestLcmBase
.test_nsd_id
+ "/test_nsd/charms/simple_charm"
154 + TestLcmBase
.test_nsd_id
155 + "/test_nsd/charms/ubuntu_18.04_simple_charm2/metadata.yaml"
158 with
patch("osm_lcm.lcm_utils.ZipFile", mock_zipfile
):
159 result
= instance
._get
_charm
_metadata
_file
(
161 TestLcmBase
.nsd_package_path
,
162 TestLcmBase
.nsd_package_name
,
163 charm_path
=charm_path
,
165 self
.assertEqual(result
, expected_result
, "wrong charm metadata path")
166 self
.assertEqual(mock_zipfile
.call_count
, 1)
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
171 mock_charm_path
= MagicMock()
172 mock_metadata_file
= MagicMock()
173 mock_metadata_file
.return_value
= (
174 "/" + TestLcmBase
.test_nsd_id
+ "/new_test_nsd/charms/simple/metadata.yaml"
176 mock_charm_name
= MagicMock()
177 mock_charm_name
.return_value
= "test_charm"
178 expected_result
= "test_charm"
180 with
patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path
), patch(
181 "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
):
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(
190 + TestLcmBase
.test_nsd_id
191 + "/new_test_nsd/charms/simple/metadata.yaml"
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
197 mock_charm_path
= MagicMock()
198 mock_metadata_file
= MagicMock()
199 mock_metadata_file
.side_effect
= BadZipfile
200 mock_charm_name
= MagicMock()
202 with
patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path
), patch(
203 "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
):
206 with self
.assertRaises(LcmException
):
208 instance
.find_charm_name(db_nsr
, "simple")
209 self
.assertEqual(mock_charm_path
.call_count
, 1)
210 self
.assertEqual(mock_metadata_file
.call_count
, 1)
211 mock_charm_name
.assert_not_called()
213 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
216 mock_metadata_file
= MagicMock()
217 mock_charm_name
= MagicMock()
218 mock_charm_path
= MagicMock()
220 with
patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path
), patch(
221 "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
):
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()
230 def test_find_charm_name_can_not_open_metadata_file(self
):
231 db_nsr
= self
.db
.get_one("nsrs", {"_id": TestLcmBase
.test_nsr_id
})
232 instance
= self
.my_ns
234 mock_charm_path
= MagicMock()
235 mock_metadata_file
= MagicMock()
236 mock_charm_name
= MagicMock()
237 mock_charm_name
.side_effect
= yaml
.YAMLError
239 with
patch("osm_lcm.lcm_utils.LcmBase._get_charm_path", mock_charm_path
), patch(
240 "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
):
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)