diff --git a/awx/main/management/commands/graph_jobs.py b/awx/main/management/commands/graph_jobs.py deleted file mode 100644 index 2af9389036..0000000000 --- a/awx/main/management/commands/graph_jobs.py +++ /dev/null @@ -1,108 +0,0 @@ -# Python -import asciichartpy as chart -import collections -import time -import sys - -# Django -from django.db.models import Count -from django.core.management.base import BaseCommand - -# AWX -from awx.main.models import Job, Instance - - -DEFAULT_WIDTH = 100 -DEFAULT_HEIGHT = 30 - - -def chart_color_lookup(color_str): - return getattr(chart, color_str) - - -def clear_screen(): - print(chr(27) + "[2J") - - -class JobStatus: - def __init__(self, status, color, width): - self.status = status - self.color = color - self.color_code = chart_color_lookup(color) - self.x = collections.deque(maxlen=width) - self.y = collections.deque(maxlen=width) - - def tick(self, x, y): - self.x.append(x) - self.y.append(y) - - -class JobStatusController: - RESET = chart_color_lookup('reset') - - def __init__(self, width): - self.plots = [JobStatus('pending', 'red', width), JobStatus('waiting', 'blue', width), JobStatus('running', 'green', width)] - self.ts_start = int(time.time()) - - def tick(self): - ts = int(time.time()) - self.ts_start - q = Job.objects.filter(status__in=['pending', 'waiting', 'running']).values_list('status').order_by().annotate(Count('status')) - status_count = dict(pending=0, waiting=0, running=0) - for status, count in q: - status_count[status] = count - - for p in self.plots: - p.tick(ts, status_count[p.status]) - - def series(self): - return [list(p.y) for p in self.plots] - - def generate_status(self): - line = "" - lines = [] - for p in self.plots: - lines.append(f'{p.color_code}{p.status} {p.y[-1]}{self.RESET}') - - line += ", ".join(lines) + '\n' - - width = 5 - time_running = int(time.time()) - self.ts_start - instances = Instance.objects.all().order_by('hostname') - line += "Capacity: " + ", ".join([f"{instance.capacity:{width}}" for instance in instances]) + '\n' - line += "Remaining: " + ", ".join([f"{instance.remaining_capacity:{width}}" for instance in instances]) + '\n' - line += f"Seconds running: {time_running}" + '\n' - - return line - - -class Command(BaseCommand): - help = "Plot pending, waiting, running jobs over time on the terminal" - - def add_arguments(self, parser): - parser.add_argument( - '--refresh', dest='refresh', type=float, default=1.0, help='Time between refreshes of the graph and data in seconds (defaults to 1.0)' - ) - parser.add_argument('--width', dest='width', type=int, default=DEFAULT_WIDTH, help=f'Width of the graph (defaults to {DEFAULT_WIDTH})') - parser.add_argument('--height', dest='height', type=int, default=DEFAULT_HEIGHT, help=f'Height of the graph (defaults to {DEFAULT_HEIGHT})') - - def handle(self, *args, **options): - refresh_seconds = options['refresh'] - width = options['width'] - height = options['height'] - - jctl = JobStatusController(width) - - conf = { - 'colors': [chart_color_lookup(p.color) for p in jctl.plots], - 'height': height, - } - - while True: - jctl.tick() - - draw = chart.plot(jctl.series(), conf) - status_line = jctl.generate_status() - clear_screen() - print(draw) - sys.stdout.write(status_line) - time.sleep(refresh_seconds) diff --git a/licenses/asciichartpy.txt b/licenses/asciichartpy.txt deleted file mode 100644 index 808639aa5b..0000000000 --- a/licenses/asciichartpy.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright © 2016 Igor Kroitor - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/requirements/requirements.in b/requirements/requirements.in index 6b5330fbfb..f9405893b3 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -1,7 +1,6 @@ aiohttp>=3.12.14 # CVE-2024-30251 ansi2html # Used to format the stdout from jobs into html for display jq # used for indirect host counting feature -asciichartpy asn1 azure-identity azure-keyvault diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 388a41f80a..ee704d21f9 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -20,8 +20,6 @@ ansi2html==1.9.2 # via -r /awx_devel/requirements/requirements.in # git+https://github.com/ansible/ansible-runner.git@devel # git requirements installed separately # via -r /awx_devel/requirements/requirements_git.txt -asciichartpy==1.5.25 - # via -r /awx_devel/requirements/requirements.in asgiref==3.11.0 # via # channels @@ -561,7 +559,6 @@ pip==25.3 setuptools==80.9.0 # via # -r /awx_devel/requirements/requirements.in - # asciichartpy # autobahn # incremental # pbr