Untitled
unknown
plain_text
9 months ago
10 kB
12
Indexable
from burninator_ops.commands.ots_client import OTSClient
import click
import json
import os
import csv
import sys
import re
@click.group()
@click.pass_context
def ots(ctx):
"""OTS related operations, --help for more details"""
ctx.obj = OTSClient()
@ots.command(name="close")
@click.option('--ticket-keys', '-t', type=str, required=True,
help="""list of OTS ticket keys to close, comma seperated list
Examples:
python burninatorOps.py ots close -t RMCPREP-01-7870068
python burninatorOps.py ots close -t RMCPREP-01-7870068,RMCPREP-01-7866311
python burninatorOps.py ots query -q 'title ~ "202508151901" and state=OPEN' -k |\
grep RMC | xargs python burninatorOps.py ots close -t
""")
@click.pass_context
def close_ots_ticket(ctx, ticket_keys):
"""Close an OTS ticket by its key"""
client = ctx.obj
ticket_list = [t.strip() for t in ticket_keys.split(',')]
if not ticket_list:
click.echo("No ticket key provided, please provide ticket key")
return
for ticket_key in ticket_list:
ok = client.close_ticket(ticket_key)
if ok:
click.echo(f"Ticket {ticket_key} closed successfully")
else:
click.echo(f"Failed to close ticket {ticket_key}")
@ots.command(name="lookup")
@click.option('--ticket-keys', '-t', type=str, required=True,
help="""OTS ticket key to lookup, comma seperated list
Examples:
python burninatorOps.py ots lookup -t RMCPREP-01-7866311
python burninatorOps.py ots lookup -t RMCPREP-01-7866311,RMCPREP-01-7866309
""")
@click.pass_context
def lookup_ots_ticket(ctx, ticket_keys):
"""Lookup an OTS ticket by its key"""
client = ctx.obj
ticket_list = [t.strip() for t in ticket_keys.split(',')]
if not ticket_list:
click.echo("No ticket key provided, please provide ticket key")
return
for ticket_key in ticket_list:
ticket = client.get_ticket(ticket_key)
if ticket:
click.echo(f"Ticket Key: {ticket['key']}")
click.echo(f"Title: {ticket['title']}")
click.echo(f"Description: {ticket['description']}")
click.echo(f"State: {ticket['status']}")
else:
click.echo(f"Ticket {ticket_key} not found")
@ots.command(name="query")
@click.option('--query', '-q', type=str, required=True,
help="""OTS query to execute
Examples:
python burninatorOps.py ots query -q 'title ~ "202508151901"'
python burninatorOps.py ots query -q 'title ~ "202508151901" and state = open'
python burninatorOps.py ots query --query 'reporter="[email protected]"'
python burninatorOps.py ots query -q 'title ~ "202508151901"' -k
""")
@click.option('--fields', '-f', type=str, default='title,state,key',
help="""Comma-separated list of fields to output. Default: title,state,key
Examples:
python burninatorOps.py ots query -q 'title ~ "202508151901"' -f title,key,description
""")
@click.option('--output', '-o', type=str, default=None,
help="""Output file. If not specified, output to stdout.
Examples:
python burninatorOps.py ots query -q 'title ~ "202508151901"' -f title,key,description -o output.csv
""")
@click.option('--format', '-F', type=click.Choice(['csv', 'json'], case_sensitive=False), default='csv',
help="""Output format. Default: csv
Examples:
python burninatorOps.py ots query -q 'title ~ "202508151901"' -F json
python burninatorOps.py ots query -q 'title ~ "202508151901"' -F csv
""")
@click.option('--keys-only', '-k', is_flag=True, default=False,
help="""Print comma-separated list of ticket keys. Default: False
Examples:
python burninatorOps.py ots query -q 'title ~ "202508151901"' -k
python burninatorOps.py ots query -q 'title ~ "202508151901" and state=OPEN' -k \
| grep RMC | xargs python burninatorOps.py ots close -t
""")
@click.pass_context
def query_ots_tickets(ctx, query, fields, output, format, keys_only):
"""Query OTS tickets using a given query"""
client = ctx.obj
tickets = client.query_tickets(query)
if tickets and 'items' in tickets:
if keys_only:
ticket_keys = [ticket['key'] for ticket in tickets['items']]
click.echo(','.join(ticket_keys))
else:
field_list = [f.strip().lower() for f in fields.split(',')]
data = []
for ticket in tickets['items']:
ticket_data = {}
for field in field_list:
if field == 'rack_position' or field == 'rack_location':
if 'additionalFields' in ticket:
additional_fields = ticket.get('additionalFields', [])
rack_location_field = next((f for f in additional_fields if f['name'] == 'Rack Location'),
None)
ticket_data[field] = rack_location_field['values'] if rack_location_field else ''
elif 'description' in ticket:
match = re.search(r'\*\*Rack Position\*\*: (\d+)', ticket['description'])
if match:
ticket_data[field] = match.group(1)
else:
ticket_data[field] = ''
elif field == 'repair_order_id':
if 'description' in ticket:
match = re.search(r'p100_change_order_id=([\w-]+)', ticket['description'])
if match:
ticket_data[field] = match.group(1)
elif 'additionalFields' in ticket:
additional_fields = ticket.get('additionalFields', [])
repair_order_field = next((f for f in additional_fields if f['name'] == 'Repair Order'),
None)
if repair_order_field:
import urllib.parse
parsed_url = urllib.parse.urlparse(repair_order_field['values'])
query_params = urllib.parse.parse_qs(parsed_url.query)
ticket_data[field] = query_params.get('p100_change_order_id', [''])[0]
else:
ticket_data[field] = ''
elif field == 'component':
additional_fields = ticket.get('additionalFields', [])
component_field = next((f for f in additional_fields if f['name'] == 'component'), None)
ticket_data[field] = component_field['values'] if component_field else ''
elif field == 'searchable_data':
additional_fields = ticket.get('additionalFields', [])
searchable_data_field = next((f for f in additional_fields if f['name'] == 'Searchable Data'),
None)
if searchable_data_field:
values = searchable_data_field['values']
if isinstance(values, str):
ticket_data[field] = values.strip()
else:
ticket_data[field] = str(values)
ticket_data[field] = ticket_data[field].replace('\n', '\\n')
else:
ticket_data[field] = ''
elif field == 'labels':
labels = ticket.get('labels', [])
label_names = [label['name'] for label in labels]
ticket_data[field] = '|'.join(label_names)
else:
ticket_data[field] = ticket.get(field, '')
data.append({k: v for k, v in
zip(fields.split(','), [ticket_data[f.strip().lower()] for f in fields.split(',')])})
if output:
if output.lower().endswith('.json') or format.lower() == 'json':
with open(output, 'w') as jsonfile:
json.dump(data, jsonfile, indent=4)
else:
with open(output, 'w', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fields.split(','))
writer.writeheader()
writer.writerows(data)
else:
if format.lower() == 'json':
json.dump(data, sys.stdout, indent=4)
else:
writer = csv.DictWriter(sys.stdout, fieldnames=fields.split(','))
writer.writeheader()
writer.writerows(data)
else:
click.echo("No tickets found")
@ots.command(name="create")
@click.option('--ticket-data-json-file', '-j', type=str, required=True,
help="""JSON file containing ticket data
Examples:
python burninatorOps.py ots create -j e2e-tests/data/ticket_example.json
""")
@click.pass_context
def create_ots_ticket(ctx, ticket_data_json_file):
"""Create an OTS ticket using data from a JSON file"""
client = ctx.obj
if not os.path.exists(ticket_data_json_file):
click.echo(f"Error: File {ticket_data_json_file} does not exist")
return
click.echo(f"Creating ticket {ticket_data_json_file}")
try:
with open(ticket_data_json_file, 'r') as f:
ticket_data = json.load(f)
click.echo(f"creating ticket {ticket_data['title']}")
ticket_key = client.create_ticket(ticket_data)
click.echo(f"Ticket created with key: {ticket_key}")
except json.JSONDecodeError as e:
click.echo(f"Failed to parse JSON: {e}")
except Exception as e:
click.echo(f"Failed to create ticket: {e}")
Editor is loading...
Leave a Comment