Example #1
0
def run(compile, test, fuzz, replay):
    # instantiate RAFT CLI
    cli = RaftCLI()
    # Create compilation job configuration
    compile_job_config = RaftJobConfig(file_path=compile)
    print('Compile')
    # submit a new job with the Compile config and get new job ID
    compile_job = cli.new_job(compile_job_config)
    # wait for a job with ID from compile_job to finish the run
    cli.poll(compile_job['jobId'])

    subs = {}
    # use compile job as input for fuzz job
    subs['{compile.jobId}'] = compile_job['jobId']

    test_job_config = RaftJobConfig(file_path=test, substitutions=subs)
    print('Test')
    # create new fuzz job configuration
    test_job = cli.new_job(test_job_config)
    # wait for job ID from fuzz_job to finish the run
    cli.poll(test_job['jobId'])

    subs['{outputFolder}'] = 'fuzz'
    # create a new job config with Fuzz configuration JSON
    fuzz_job_config = RaftJobConfig(file_path=fuzz, substitutions=subs)
    print('Fuzz')
    # create new fuzz job configuration
    fuzz_job = cli.new_job(fuzz_job_config)

    # wait for job ID from fuzz_job to finish the run
    cli.poll(fuzz_job['jobId'])

    status = cli.job_status(fuzz_job['jobId'])
    experiment = None
    for s in status:
        if (s['agentName'] != s['jobId']):
            if (int(s['details']['numberOfBugsFound']) > 0):
                experiment = s['details']['experiment']
            else:
                print("Did not find any bugs")

    subs['{experiment}'] = experiment
    subs['{jobId}'] = fuzz_job['jobId']

    replay_job_config = RaftJobConfig(file_path=replay, substitutions=subs)
    replay_job = cli.new_job(replay_job_config)
    cli.poll(replay_job['jobId'])
Example #2
0
def run(args):
    def validate(defaults):
        s = defaults.get('subscription')
        d = defaults.get('deploymentName')
        r = defaults.get('region')
        return (s and d and r)

    defaults_path = args['defaults_context_path']
    defaults_json = args['defaults_context_json']

    if defaults_json:
        print(f"Loading defaults from command line: {defaults_json}")
        defaults = json.loads(defaults_json)
        if not validate(defaults):
            print(defaults_help)
            return
    # check if defaults.json is set in the context and it exists
    elif os.path.isfile(defaults_path):
        with open(defaults_path, 'r') as d:
            defaults = json.load(d)
            if not validate(defaults):
                print(defaults_help)
                return
    else:
        with open(defaults_path, 'w') as d:
            d.write(fresh_defaults)
        print(defaults_help)
        return

    defaults['secret'] = args.get('secret')
    if 'metricsOptIn' not in defaults:
        defaults['metricsOptIn'] = True

    if defaults.get('useAppInsights') is None:
        defaults['useAppInsights'] = True

    cli_action = args.get('logout')
    service_action = args.get('service-action')
    job_action = args.get('job-action')
    webhook_action = args.get('webhook-action')

    if cli_action == 'logout':
        raft_sdk.raft_common.delete_token_cache()
    elif service_action:
        service_cli = RaftServiceCLI(defaults, defaults_path,
                                     args.get('secret'))
        if service_action == 'restart':
            service_cli.restart()
        elif service_action == 'info':
            info = service_cli.service_info()
            print(info)
        elif service_action == 'deploy':
            skip_sp_deployment = args.get('skip_sp_deployment')
            service_cli.deploy(
                args['sku'], skip_sp_deployment and skip_sp_deployment is True)
        elif service_action == 'upload-tools':
            utils_file_share = f'{uuid.uuid4()}'
            service_cli.upload_utils(utils_file_share,
                                     args.get('custom_tools_path'))
            service_cli.restart()
        else:
            raise Exception(f'Unhandled service argument: {service_action}')

    elif job_action:
        cli = RaftCLI()
        if job_action == 'create':
            json_config_path = args.get('file')
            if json_config_path is None:
                ArgumentRequired('--file')

            substitutionDictionary = {}
            substitutionParameter = args.get('substitute')
            if substitutionParameter:
                substitutionDictionary = json.loads(substitutionParameter)

            job_config = RaftJobConfig(file_path=json_config_path,
                                       substitutions=substitutionDictionary)

            print(job_config.config)
            duration = args.get('duration')
            if duration:
                job_config.config['duration'] = duration

            metadata = args.get('metadata')
            if metadata:
                job_config.config['metadata'] = json.loads(metadata)

            newJob = cli.new_job(job_config, args.get('region'))
            poll_interval = args.get('poll')
            if poll_interval:
                print(newJob)
                cli.poll(newJob['jobId'], poll_interval)
            else:
                print(newJob)

        elif job_action == 'status':
            job_id = args.get('job_id')
            if job_id is None:
                ArgumentRequired('--job-id')
            job_status = cli.job_status(job_id)
            poll_interval = args.get('poll')
            cli.print_status(job_status)
            if poll_interval:
                cli.poll(job_id, poll_interval)

        elif job_action == 'list':
            jobs_list = cli.list_jobs(args['look_back_hours'])
            sorted = {}
            for job in jobs_list:
                if sorted.get(job['jobId']):
                    sorted[job['jobId']].append(job)
                else:
                    sorted[job['jobId']] = [job]

            for s in sorted:
                cli.print_status(sorted[s])
                print()

            print(f"Total number of jobs: {len(sorted)}")

        elif job_action == 'update':
            json_config_path = args.get('file')
            if json_config_path is None:
                ArgumentRequired('--file')

            substitutionDictionary = {}
            substitutionParameter = args.get('substitute')
            if substitutionParameter:
                substitutionDictionary = json.loads(substitutionParameter)

            job_update = cli.update_job(
                args.get('job_id'),
                RaftJobConfig(file_path=json_config_path,
                              substitutions=substitutionDictionary))
            print(job_update)

        elif job_action == 'results':
            job_id = args.get('job_id')
            if job_id is None:
                ArgumentRequired('--job-id')
            url = cli.result_url(job_id)
            print(url)

        elif job_action == 'delete':
            job_id = args.get('job_id')
            if job_id is None:
                ArgumentRequired('--job-id')
            job_delete = cli.delete_job(job_id)
            print(job_delete)

    elif webhook_action:
        cli = RaftCLI()
        if webhook_action == 'events':
            webhook_events = cli.list_available_webhooks_events()
            print(webhook_events)

        elif webhook_action == 'create':
            name_parameter = args.get('name')
            if name_parameter is None:
                ArgumentRequired('--name')

            event_parameter = args.get('event')
            if event_parameter is None:
                ArgumentRequired('--event')

            uri_parameter = args.get('url')
            if uri_parameter is None:
                ArgumentRequired('--url')

            webhook_create_or_update = cli.set_webhooks_subscription(
                name_parameter, event_parameter, uri_parameter)
            print(webhook_create_or_update)

        elif webhook_action == 'test':
            name_parameter = args.get('name')
            if name_parameter is None:
                ArgumentRequired('--name')

            event_parameter = args.get('event')
            if event_parameter is None:
                ArgumentRequired('--event')

            webhook_test = cli.test_webhook(name_parameter, event_parameter)
            print(webhook_test)

        elif webhook_action == 'delete':
            name_parameter = args.get('name')
            if name_parameter is None:
                ArgumentRequired('--name')

            event_parameter = args.get('event')
            if event_parameter is None:
                ArgumentRequired('--event')

            webhook_delete = cli.delete_webhook(name_parameter,
                                                event_parameter)
            print(webhook_delete)

        elif webhook_action == 'list':
            name_parameter = args.get('name')
            if name_parameter is None:
                ArgumentRequired('--name')

            # the event name is not required.
            # If not supplied all events will be listed.
            event_parameter = args.get('event')

            webhooks_list = cli.list_webhooks(name_parameter, event_parameter)
            print(webhooks_list)

        else:
            raise Exception('Expected arguments could not be found in args')