import json import docker import time from docker.utils.json_stream import json_stream from collections import OrderedDict class BbsLibrary(object): def __init__(self): pass @staticmethod def check_for_log(search_for): client = docker.from_env() container = client.containers.get('bbs') alog = container.logs(stream=False, tail=1000) try: alog = alog.decode() except AttributeError: pass found = alog.find(search_for) if found != -1: return True else: return False @staticmethod def create_pnf_name_from_auth(json_file): json_to_python = json.loads(json_file) correlation_id = json_to_python.get("event").get("commonEventHeader").get("sourceName") return correlation_id @staticmethod def get_invalid_auth_elements(json_file): """ Get the correlationId, oldState, newState, stateInterface, macAddress, swVersion elements from the invalid message and place the elements into a JSON object (string) as fields for comparision """ eventString = json.loads(json_file)[0] json_to_python = json.loads(eventString.replace("\\", "")) correlation_id = json_to_python.get("event").get("commonEventHeader").get("sourceName") oldState = json_to_python.get("event").get("stateChangeFields").get("oldState") newState = json_to_python.get("event").get("stateChangeFields").get("newState") stateInterface = json_to_python.get("event").get("stateChangeFields").get("stateInterface") macAddress = json_to_python.get("event").get("stateChangeFields").get("additionalFields").get("macAddress") swVersion = json_to_python.get("event").get("stateChangeFields").get("additionalFields").get("swVersion") if swVersion is None: swVersion = "" inv_fields = OrderedDict() #inv_fields = dict() inv_fields['correlationId'] = correlation_id inv_fields['oldState'] = oldState inv_fields['newState'] = newState inv_fields['stateInterface'] = stateInterface inv_fields['macAddress'] = macAddress inv_fields['swVersion'] = swVersion # Transform the dictionary to JSON string json_str = json.dumps(inv_fields) # Need to remove spaces between elements json_str = json_str.replace(', ', ',') return json_str @staticmethod def get_invalid_update_elements(json_file): """ Get the correlationId, attachment-point, remote-id, cvlan, svlan, elements from the invalid message and place the elements into a JSON object (string) as fields for comparision """ eventString = json.loads(json_file)[0] json_to_python = json.loads(eventString.replace("\\", "")) correlation_id = json_to_python.get("correlationId") attachmentPoint = json_to_python.get("additionalFields").get("attachment-point") remoteId = json_to_python.get("additionalFields").get("remote-id") cvlan = json_to_python.get("additionalFields").get("cvlan") svlan = json_to_python.get("additionalFields").get("svlan") inv_fields = OrderedDict() #inv_fields = dict() inv_fields['correlationId'] = correlation_id inv_fields['attachment-point'] = attachmentPoint inv_fields['remote-id'] = remoteId inv_fields['cvlan'] = cvlan inv_fields['svlan'] = svlan # Transform the dictionary to JSON string json_str = json.dumps(inv_fields) # Need to remove spaces between elements json_str = json_str.replace(', ', ',') return json_str @staticmethod def compare_policy(dmaap_policy, json_policy): resp = False try: python_policy = json.loads(json_policy).pop() except: python_policy = "" try: python_dmaap_policy = json.loads(dmaap_policy) except: python_dmaap_policy = "" try: d_policy = python_dmaap_policy[0].get("policyName") except: d_policy = "" try: j_policy = python_policy.get("policyName") except: return "False" resp = "False" if (d_policy == j_policy): resp = "True" return resp @staticmethod def create_pnf_name_from_update(json_file): json_to_python = json.loads(json_file) correlation_id = json_to_python.get("correlationId") return correlation_id @staticmethod def ensure_container_is_running(name): client = docker.from_env() if not BbsLibrary.is_in_status(client, name, "running"): print ("starting container", name) container = client.containers.get(name) container.start() BbsLibrary.wait_for_status(client, name, "running") BbsLibrary.print_status(client) @staticmethod def ensure_container_is_exited(name): client = docker.from_env() if not BbsLibrary.is_in_status(client, name, "exited"): print ("stopping container", name) container = client.containers.get(name) container.stop() BbsLibrary.wait_for_status(client, name, "exited") BbsLibrary.print_status(client) @staticmethod def print_status(client): print("containers status") for c in client.containers.list(all=True): print(c.name, " ", c.status) @staticmethod def wait_for_status(client, name, status): while not BbsLibrary.is_in_status(client, name, status): print ("waiting for container: ", name, "to be in status: ", status) time.sleep(3) @staticmethod def is_in_status(client, name, status): return len(client.containers.list(all=True, filters={"name": "^/"+name+"$", "status": status})) == 1