Untitled

 avatar
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