8ef325fbf570f7f663ba9bc93092193ea70d57a0
[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 def wait_for_value(func, result=True, wait_time=10, catch_exception=None):
25 maxtime = time.time() + wait_time
26 while time.time() < maxtime:
27 try:
28 if func() == result:
29 return True
30 except catch_exception:
31 pass
32 time.sleep(1)
33 try:
34 return func() == result
35 except catch_exception:
36 return False
37
38
39 def validate_uuid4(uuid_text):
40 try:
41 UUID(uuid_text)
42 return True
43 except (ValueError, TypeError):
44 return False
45
46
47 def md5(fname):
48 hash_md5 = hashlib.md5()
49 with open(fname, "rb") as f:
50 for chunk in iter(lambda: f.read(4096), b""):
51 hash_md5.update(chunk)
52 return hash_md5.hexdigest()
53
54
55 def get_key_val_from_pkg(descriptor_file):
56 # method opens up a package and finds the name of the resulting
57 # descriptor (vnfd or nsd name)
58 tar = tarfile.open(descriptor_file)
59 yamlfile = None
60 for member in tar.getmembers():
61 if (re.match('.*.yaml', member.name) and
62 len(member.name.split('/')) == 2):
63 yamlfile = member.name
64 break
65 if yamlfile is None:
66 return None
67
68 dict = yaml.load(tar.extractfile(yamlfile))
69 result = {}
70 for k1, v1 in list(dict.items()):
71 if not k1.endswith('-catalog'):
72 continue
73 for k2, v2 in list(v1.items()):
74 if not k2.endswith('nsd') and not k2.endswith('vnfd'):
75 continue
76
77 if 'nsd' in k2:
78 result['type'] = 'nsd'
79 else:
80 result['type'] = 'vnfd'
81
82 for entry in v2:
83 for k3, v3 in list(entry.items()):
84 # strip off preceeding chars before :
85 key_name = k3.split(':').pop()
86
87 result[key_name] = v3
88 tar.close()
89 return result
90