blob: b3f5f8d93d677b14f52870dd602474925f3bae14 [file] [log] [blame]
Gary Wu9abb61c2018-09-27 10:38:50 -07001import json
binieke98a7252019-06-03 11:46:23 +02002import re
Gary Wu9abb61c2018-09-27 10:38:50 -07003import docker
pkarasc7abba82018-10-22 12:22:35 +02004import time
Gary Wu9abb61c2018-09-27 10:38:50 -07005
6
7class PrhLibrary(object):
8
9 def __init__(self):
10 pass
11
12 @staticmethod
grabinsk2d51f2b2019-06-10 11:35:48 +020013 def find_one_of_log_entryies(searched_entries):
14 print(type(searched_entries))
Gary Wu9abb61c2018-09-27 10:38:50 -070015 client = docker.from_env()
16 container = client.containers.get('prh')
grabinsk2d51f2b2019-06-10 11:35:48 +020017 print("Check for log searches for pattern: ", searched_entries)
Gary Wu9abb61c2018-09-27 10:38:50 -070018 for line in container.logs(stream=True):
binieke98a7252019-06-03 11:46:23 +020019 print("Check for log analysis line: ", line )
grabinsk2d51f2b2019-06-10 11:35:48 +020020 for searched_entry in searched_entries:
21 if searched_entry in line.strip():
22 return True
Gary Wu9abb61c2018-09-27 10:38:50 -070023 else:
24 return False
25
26 @staticmethod
binieke98a7252019-06-03 11:46:23 +020027 def find_log_json(prefix, json_message):
28 print("Looking for:")
29 print("Prefix: " + str(prefix))
30 print("Json: " + str(json_message))
31 try:
32 decoded_message = json.loads(json_message)
33 except json.JSONDecodeError:
34 print("Could not decode given message")
35 return False
36 pattern = re.compile(prefix + "(.*)$")
37 client = docker.from_env()
38 container = client.containers.get('prh')
39 for line in container.logs(stream=True):
40 print("Check for log analysis line: ", line )
41 if PrhLibrary.__same_json_in_log(decoded_message, line, pattern):
42 return True
43 else:
44 return False
45
46 @staticmethod
Joanna Jeremicz0a391482019-03-14 10:58:32 +010047 def create_invalid_notification(json_file):
binieke98a7252019-06-03 11:46:23 +020048 output = {}
grabinsk8bc68e22019-06-14 13:56:17 +020049 input = json.loads(json_file)
binieke98a7252019-06-03 11:46:23 +020050 output["correlationId"] = PrhLibrary.__extract_correlation_id_value(input)
51 output["oamV4IpAddress"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "oamV4IpAddress")
52 output["oamV6IpAddress"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "oamV6IpAddress")
53 output["serialNumber"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "serialNumber")
54 output["vendorName"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "vendorName")
55 output["modelNumber"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "modelNumber")
56 output["unitType"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "unitType")
57 output['nfNamingCode'] = ''
58 output['softwareVersion'] = ''
Marcin Migdal183c8962019-02-13 15:43:12 +010059
binieke98a7252019-06-03 11:46:23 +020060 output["additionalFields"] = PrhLibrary.__get_additional_fields_as_key_value_pairs(input)
61
62 return json.dumps(output)
Gary Wu9abb61c2018-09-27 10:38:50 -070063
64 @staticmethod
Marcin Migdal183c8962019-02-13 15:43:12 +010065 def create_pnf_ready_notification_as_pnf_ready(json_file):
binieke98a7252019-06-03 11:46:23 +020066 output = {}
67 input = json.loads(json_file)[0]
Joanna Jeremicz469a3ef2019-03-19 09:37:59 +010068
binieke98a7252019-06-03 11:46:23 +020069 output["correlationId"] = PrhLibrary.__extract_correlation_id_value(input)
70 output["serialNumber"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "serialNumber")
71 output["equip-vendor"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "vendorName")
72 output["equip-model"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "modelNumber")
73 output["equip-type"] = PrhLibrary.__extract_value_from_pnfRegistrationFields(input, "unitType")
74 output["nf-role"] = PrhLibrary.__extract_nf_role(input)
75 output["sw-version"] = ""
Marcin Migdal183c8962019-02-13 15:43:12 +010076
binieke98a7252019-06-03 11:46:23 +020077 output["additionalFields"] = PrhLibrary.__get_additional_fields_as_key_value_pairs(input)
Joanna Jeremicz0a391482019-03-14 10:58:32 +010078
binieke98a7252019-06-03 11:46:23 +020079 return json.dumps(output)
Gary Wu9abb61c2018-09-27 10:38:50 -070080
81 @staticmethod
pkarasc7abba82018-10-22 12:22:35 +020082 def ensure_container_is_running(name):
Gary Wu9abb61c2018-09-27 10:38:50 -070083 client = docker.from_env()
pkarasc7abba82018-10-22 12:22:35 +020084
85 if not PrhLibrary.is_in_status(client, name, "running"):
86 print ("starting container", name)
87 container = client.containers.get(name)
88 container.start()
89 PrhLibrary.wait_for_status(client, name, "running")
90
91 PrhLibrary.print_status(client)
92
93 @staticmethod
94 def ensure_container_is_exited(name):
95 client = docker.from_env()
96
97 if not PrhLibrary.is_in_status(client, name, "exited"):
98 print ("stopping container", name)
99 container = client.containers.get(name)
100 container.stop()
101 PrhLibrary.wait_for_status(client, name, "exited")
102
103 PrhLibrary.print_status(client)
104
105 @staticmethod
106 def print_status(client):
107 print("containers status")
108 for c in client.containers.list(all=True):
109 print(c.name, " ", c.status)
110
111 @staticmethod
112 def wait_for_status(client, name, status):
113 while not PrhLibrary.is_in_status(client, name, status):
114 print ("waiting for container: ", name, "to be in status: ", status)
115 time.sleep(3)
116
117 @staticmethod
118 def is_in_status(client, name, status):
binieke98a7252019-06-03 11:46:23 +0200119 return len(client.containers.list(all=True, filters={"name": "^/"+name+"$", "status": status})) == 1
120
121 @staticmethod
122 def create_pnf_name(json_file):
123 json_to_python = json.loads(json_file)
124 correlation_id = json_to_python.get("event").get("commonEventHeader").get("sourceName") + '",' if "sourceName" in json_to_python["event"]["commonEventHeader"] else '",'
125 return correlation_id
126
127 @staticmethod
128 def __get_additional_fields_as_key_value_pairs(content):
129 return content.get("event").get("pnfRegistrationFields").get(
130 "additionalFields") if "additionalFields" in content["event"]["pnfRegistrationFields"] else {}
131
132 @staticmethod
133 def __extract_value_from_pnfRegistrationFields(content, key):
134 return content["event"]["pnfRegistrationFields"][key] if key in content["event"]["pnfRegistrationFields"] else ''
135
136 @staticmethod
137 def __extract_correlation_id_value(content):
138 return content["event"]["commonEventHeader"]["sourceName"] if "sourceName" in content["event"]["commonEventHeader"] else ''
139
140 @staticmethod
141 def __extract_nf_role(content):
142 return content["event"]["commonEventHeader"]["nfNamingCode"] if "nfNamingCode" in content["event"]["commonEventHeader"] else ''
143
144 @staticmethod
145 def __same_json_in_log(decoded_message, line, pattern):
146 extracted_json = PrhLibrary.__extract_json(line, pattern)
147 if extracted_json is not None:
148 print("Found json: " + extracted_json)
149 try:
150 if json.loads(extracted_json) == decoded_message:
151 return True
152 except json.JSONDecodeError:
153 print("Could not decode")
154 return False
155
156 @staticmethod
157 def __extract_json(line, pattern):
158 full_message = PrhLibrary.__extract_full_message_from_line(line)
159 if full_message is not None:
160 match = pattern.match(full_message)
161 if match:
162 return match.group(1).replace("\\n", "\n").replace("\\t", "\t")
163 return None
164
165 @staticmethod
166 def __extract_full_message_from_line(line):
167 split = line.split("|")
168 if len(split) > 3:
169 return split[3]
170 return None