You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.5 KiB
153 lines
4.5 KiB
#!/usr/bin/env python3 |
|
# Copyright (c) 2021 Intel Corporation |
|
# |
|
# SPDX-License-Identifier: Apache-2.0 |
|
|
|
from anytree.importer import DictImporter |
|
from anytree import PreOrderIter |
|
from anytree.search import find |
|
importer = DictImporter() |
|
from datetime import datetime |
|
from dateutil.relativedelta import relativedelta |
|
import os |
|
import json |
|
from git import Repo |
|
from git.exc import BadName |
|
|
|
from influxdb import InfluxDBClient |
|
import glob |
|
import argparse |
|
from tabulate import tabulate |
|
|
|
TODAY = datetime.utcnow() |
|
two_mon_rel = relativedelta(months=4) |
|
|
|
influx_dsn = 'influxdb://localhost:8086/footprint_tracking' |
|
|
|
def create_event(data, board, feature, commit, current_time, typ, application): |
|
footprint_data = [] |
|
client = InfluxDBClient.from_dsn(influx_dsn) |
|
client.create_database('footprint_tracking') |
|
for d in data.keys(): |
|
footprint_data.append({ |
|
"measurement": d, |
|
"tags": { |
|
"board": board, |
|
"commit": commit, |
|
"application": application, |
|
"type": typ, |
|
"feature": feature |
|
}, |
|
"time": current_time, |
|
"fields": { |
|
"value": data[d] |
|
} |
|
}) |
|
|
|
client.write_points(footprint_data, time_precision='s', database='footprint_tracking') |
|
|
|
|
|
def parse_args(): |
|
global args |
|
parser = argparse.ArgumentParser( |
|
description=__doc__, |
|
formatter_class=argparse.RawDescriptionHelpFormatter, allow_abbrev=False) |
|
|
|
parser.add_argument("-d", "--data", help="Data Directory") |
|
parser.add_argument("-y", "--dryrun", action="store_true", help="Dry run, do not upload to database") |
|
parser.add_argument("-z", "--zephyr-base", help="Zephyr tree") |
|
parser.add_argument("-f", "--file", help="JSON file with footprint data") |
|
args = parser.parse_args() |
|
|
|
|
|
def parse_file(json_file): |
|
|
|
with open(json_file, "r") as fp: |
|
contents = json.load(fp) |
|
root = importer.import_(contents['symbols']) |
|
|
|
zr = find(root, lambda node: node.name == 'ZEPHYR_BASE') |
|
ws = find(root, lambda node: node.name == 'WORKSPACE') |
|
|
|
data = {} |
|
if zr and ws: |
|
trees = [zr, ws] |
|
else: |
|
trees = [root] |
|
|
|
for node in PreOrderIter(root, maxlevel=2): |
|
if node.name not in ['WORKSPACE', 'ZEPHYR_BASE']: |
|
if node.name in ['Root', 'Symbols']: |
|
data['all'] = node.size |
|
else: |
|
data[node.name] = node.size |
|
|
|
for t in trees: |
|
root = t.name |
|
for node in PreOrderIter(t, maxlevel=2): |
|
if node.name == root: |
|
continue |
|
comp = node.name |
|
if comp in ['Root', 'Symbols']: |
|
data['all'] = node.size |
|
else: |
|
data[comp] = node.size |
|
|
|
return data |
|
|
|
def process_files(data_dir, zephyr_base, dry_run): |
|
repo = Repo(zephyr_base) |
|
|
|
for hash in os.listdir(f'{data_dir}'): |
|
if not dry_run: |
|
client = InfluxDBClient.from_dsn(influx_dsn) |
|
result = client.query(f"select * from kernel where commit = '{hash}';") |
|
if result: |
|
print(f"Skipping {hash}...") |
|
continue |
|
print(f"Importing {hash}...") |
|
for file in glob.glob(f"{args.data}/{hash}/**/*json", recursive=True): |
|
file_data = file.split("/") |
|
json_file = os.path.basename(file) |
|
if 'ram' in json_file: |
|
typ = 'ram' |
|
else: |
|
typ = 'rom' |
|
commit = file_data[1] |
|
app = file_data[2] |
|
feature = file_data[3] |
|
board = file_data[4] |
|
|
|
data = parse_file(file) |
|
|
|
try: |
|
gitcommit = repo.commit(f'{commit}') |
|
current_time = gitcommit.committed_datetime |
|
except BadName: |
|
cidx = commit.find('-g') + 2 |
|
gitcommit = repo.commit(f'{commit[cidx:]}') |
|
current_time = gitcommit.committed_datetime |
|
|
|
print(current_time) |
|
|
|
if not dry_run: |
|
create_event(data, board, feature, commit, current_time, typ, app) |
|
|
|
def main(): |
|
parse_args() |
|
|
|
if args.data and args.zephyr_base: |
|
process_files(args.data, args.zephyr_base, args.dryrun) |
|
|
|
if args.file: |
|
data = parse_file(args.file) |
|
items = [] |
|
for component,value in data.items(): |
|
items.append([component,value]) |
|
|
|
table = tabulate(items, headers=['Component', 'Size'], tablefmt='orgtbl') |
|
print(table) |
|
|
|
|
|
if __name__ == "__main__": |
|
main()
|
|
|