diff --git a/py-json/lfdata.py b/py-json/lfdata.py new file mode 100644 index 00000000..cf643ed1 --- /dev/null +++ b/py-json/lfdata.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +import re +import time +import pprint +from pprint import pprint +import os +import datetime +import base64 +import xlsxwriter +import pandas as pd +import requests +import ast +import csv + + +# LFData class actions: +# - Methods to collect data/store data (use from monitor instance) - used by Profile class. + # - file open/save + # - save row (rolling) - to CSV (standard) + # - headers + # - file to data-storage-type conversion and vice versa (e.g. dataframe (or datatable) to file type and vice versa) + # - other common util methods related to immediate data storage + # - include compression method + # - monitoring truncates every 5 mins and sends to report? --- need clarification. truncate file and rewrite to same file? + # - large data collection use NFS share to NAS. +# Websocket class actions: + #reading data from websockets + +class LFDataCollection: + def __init__(self, local_realm, debug=False): + self.parent_realm = local_realm + self.halt_on_error = False + self.exit_on_error = False + self.debug = debug or local_realm.debug + + def json_get(self, _req_url, debug_=False): + return self.parent_realm.json_get(_req_url, debug_=False) + + def check_json_validity(self, keyword=None, json_response=None): + if json_response is None: + raise ValueError("Cannot find columns requested to be searched in port manager. Exiting script, please retry.") + if keyword is not None and keyword not in json_response: + raise ValueError("Cannot find proper information from json. Please check your json request. Exiting script, please retry.") + + + def get_milliseconds(self, + timestamp): + return (timestamp - datetime.datetime(1970,1,1)).total_seconds()*1000 + def get_seconds(self, + timestamp): + return (timestamp - datetime.datetime(1970,1,1)).total_seconds() + + + #only for ipv4_variable_time at the moment + def monitor_interval(self, header_row_= None, + start_time_= None, sta_list_= None, + created_cx_= None, layer3_fields_= None, + port_mgr_fields_= None): + + #time calculations for while loop and writing to csv + t = datetime.datetime.now() + timestamp= t.strftime("%m/%d/%Y %I:%M:%S") + t_to_millisec_epoch= int(self.get_milliseconds(t)) + time_elapsed=int(self.get_seconds(t))-int(self.get_seconds(start_time_)) + + #get responses from json + layer_3_response = self.json_get("/endp/%s?fields=%s" % (created_cx_, layer3_fields_),debug_=self.debug) + if port_mgr_fields_ is not None: + port_mgr_response=self.json_get("/port/1/1/%s?fields=%s" % (sta_list_, port_mgr_fields_), debug_=self.debug) + + #check json response validity + self.check_json_validity(keyword="endpoint",json_response=layer_3_response) + self.check_json_validity(keyword="interfaces",json_response=port_mgr_response) + + #dict manipulation + temp_list=[] + for endpoint in layer_3_response["endpoint"]: + if self.debug: + print("Current endpoint values list... ") + print(list(endpoint.values())[0]) + temp_endp_values=list(endpoint.values())[0] #dict + temp_list.extend([timestamp,t_to_millisec_epoch,time_elapsed]) + current_sta = temp_endp_values['name'] + merge={} + if port_mgr_fields_ is not None: + for sta_name in sta_list_: + if sta_name in current_sta: + for interface in port_mgr_response["interfaces"]: + if sta_name in list(interface.keys())[0]: + merge=temp_endp_values.copy() + + port_mgr_values_dict =list(interface.values())[0] + renamed_port_cols={} + for key in port_mgr_values_dict.keys(): + renamed_port_cols['port mgr - ' +key]=port_mgr_values_dict[key] + merge.update(renamed_port_cols) + for name in header_row_[3:-3]: + temp_list.append(merge[name]) + return temp_list + + +#class WebSocket(): + \ No newline at end of file