Capability to upload a package from a source folder
[osm/osmclient.git] / osmclient / common / utils.py
1 # Copyright 2017 Sandvine
2 #
3 # All Rights Reserved.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
15 # under the License.
16
17 import time
18 from uuid import UUID
19 import hashlib
20 import tarfile
21 import re
22 import yaml
23
24
25 def wait_for_value(func, result=True, wait_time=10, catch_exception=None):
26 maxtime = time.time() + wait_time
27 while time.time() < maxtime:
28 try:
29 if func() == result:
30 return True
31 except catch_exception:
32 pass
33 time.sleep(5)
34 try:
35 return func() == result
36 except catch_exception:
37 return False
38
39
40 def validate_uuid4(uuid_text):
41 try:
42 UUID(uuid_text)
43 return True
44 except (ValueError, TypeError):
45 return False
46
47
48 def md5(fname):
49 hash_md5 = hashlib.md5()
50 with open(fname, "rb") as f:
51 for chunk in iter(lambda: f.read(4096), b""):
52 hash_md5.update(chunk)
53 return hash_md5.hexdigest()
54
55
56 def get_key_val_from_pkg(descriptor_file):
57 # method opens up a package and finds the name of the resulting
58 # descriptor (vnfd or nsd name)
59 tar = tarfile.open(descriptor_file)
60 yamlfile = None
61 for member in tar.getmembers():
62 if (re.match('.*.yaml', member.name) and
63 len(member.name.split('/')) == 2):
64 yamlfile = member.name
65 break
66 if yamlfile is None:
67 return None
68
69 dict = yaml.safe_load(tar.extractfile(yamlfile))
70 result = {}
71 for k1, v1 in list(dict.items()):
72 if not k1.endswith('-catalog'):
73 continue
74 for k2, v2 in v1.items():
75 if not k2.endswith('nsd') and not k2.endswith('vnfd'):
76 continue
77
78 if 'nsd' in k2:
79 result['type'] = 'nsd'
80 else:
81 result['type'] = 'vnfd'
82
83 for entry in v2:
84 for k3, v3 in list(entry.items()):
85 # strip off preceeding chars before :
86 key_name = k3.split(':').pop()
87
88 result[key_name] = v3
89 tar.close()
90 return result