예제 #1
0
def save_project(request, project_id):
    """ Save project properties """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    project_entry = BluesteelProjectEntry.objects.filter(id=project_id).first()
    if project_entry is None:
        return res.get_response(404, 'Bluesteel project not found', {})

    (json_valid, post_info) = val.validate_json_string(request.body)
    if not json_valid:
        return res.get_json_parser_failed({})

    (obj_validated, val_resp_obj) = val.validate_obj_schema(post_info, BluesteelSchemas.SAVE_PROJECT)

    if not obj_validated:
        return res.get_schema_failed(val_resp_obj)

    CommandSetEntry.objects.filter(group=project_entry.command_group).delete()

    local_search_path = filter_folder_path(val_resp_obj['git_project_folder_search_path'])

    project_entry.name = val_resp_obj['name']
    project_entry.git_project_folder_search_path = local_search_path
    project_entry.save()

    CommandController.add_full_command_set(project_entry.command_group, 'CLONE', 0, val_resp_obj['clone'])
    CommandController.add_full_command_set(project_entry.command_group, 'FETCH', 1, val_resp_obj['fetch'])

    return res.get_response(200, 'Project saved', {})
예제 #2
0
def get_project_ids_and_names_from_layout(request, layout_id):
    """ Return project ids, names and selected one from a layout """
    if request.method != 'GET':
        return res.get_only_get_allowed({})

    layout = BluesteelLayoutEntry.objects.filter(id=layout_id).first()

    if layout is None:
        return res.get_response(400, 'Layout not found', {})

    project_entries = BluesteelProjectEntry.objects.filter(
        layout=layout).order_by('order')

    projects = []
    for index, project in enumerate(project_entries):
        obj = {}
        obj['id'] = project.id
        obj['name'] = project.name
        obj['selected'] = index == layout.project_index_path
        projects.append(obj)

    data = {}
    data['projects'] = projects

    return res.get_response(200, 'Layout projects info found', data)
예제 #3
0
def purge_old_feed_reports(request, worker_id, keep_young_count):
    """ Purge old feed reports and keep young ones"""
    if request.method != 'POST':
        return res.get_response(400, 'Only post allowed', {})

    GitFeederController.purge_old_reports(worker_id, keep_young_count)
    return res.get_response(200, 'Feed reports purged', {})
예제 #4
0
def purge_all_feed_reports(request, worker_id):
    """ Purge all feed reports """
    if request.method != 'POST':
        return res.get_response(400, 'Only post allowed', {})

    GitFeederController.purge_all_reports(worker_id)
    return res.get_response(200, 'Feed reports purged', {})
예제 #5
0
def delete_branches(request, project_id):
    """ Delete all the branches associated with a project """
    if request.method != 'POST':
        return res.get_response(400, 'Only post allowed', {})

    project_entry = GitProjectEntry.objects.filter(id=project_id).first()
    if project_entry is None:
        return res.get_response(404, 'project not found', {})

    (json_valid, post_info) = val.validate_json_string(request.body)
    if not json_valid:
        LogEntry.error(
            request.user,
            'Json parser failed.\n{0}'.format(json.dumps(post_info)))
        return res.get_json_parser_failed({})

    (obj_validated, val_resp_obj) = val.validate_obj_schema(
        post_info, GitFeederSchemas.GIT_FEED_DELETE_BRANCHES_SCHEMA)
    if not obj_validated:
        LogEntry.error(
            request.user,
            'Json schema failed.\n{0}'.format(json.dumps(val_resp_obj)))
        return res.get_schema_failed(val_resp_obj)

    for name in val_resp_obj['branch_names']:
        GitFeederController.delete_branch(project_entry, name)

    return res.get_response(200, 'Branches removed correctly', {})
def view_save_benchmark_definition(request, benchmark_definition_id):
    """ Save benchmark definition properties """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    (json_valid_value, post_info) = val.validate_json_string(request.body)
    if not json_valid_value:
        return res.get_json_parser_failed({})

    (obj_validated, val_resp_obj) = val.validate_obj_schema(
        post_info, BenchmarkDefinitionSchemas.SAVE_BENCHMARK_DEFINITION)

    if not obj_validated:
        return res.get_schema_failed(val_resp_obj)

    bench_entry = BenchmarkDefinitionController.save_benchmark_definition(
        benchmark_definition_id=benchmark_definition_id,
        name=val_resp_obj['name'],
        layout_id=val_resp_obj['layout_id'],
        project_id=val_resp_obj['project_id'],
        priority=val_resp_obj['priority'],
        active=val_resp_obj['active'],
        command_list=val_resp_obj['command_list'],
        max_fluctuation_percent=val_resp_obj['max_fluctuation_percent'],
        overrides=val_resp_obj['overrides'],
        max_weeks_old_notify=val_resp_obj['max_weeks_old_notify'],
        work_passes=val_resp_obj['work_passes'],
    )

    if bench_entry is None:
        return res.get_response(404, 'Benchmark Defintion save error', {})

    return res.get_response(200, 'Benchmark Definition saved', {})
예제 #7
0
def save_layout(request, layout_id):
    """ Save layout properties """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    layout_entry = BluesteelLayoutEntry.objects.filter(id=layout_id).first()
    if layout_entry is None:
        return res.get_response(404, 'Bluesteel layout not found', {})

    (json_valid, post_info) = val.validate_json_string(request.body)
    if not json_valid:
        return res.get_json_parser_failed({})

    (obj_validated,
     val_resp_obj) = val.validate_obj_schema(post_info,
                                             BluesteelSchemas.SAVE_LAYOUT)

    if not obj_validated:
        return res.get_schema_failed(val_resp_obj)

    layout_entry.name = val_resp_obj['name']
    layout_entry.active = val_resp_obj['active']
    layout_entry.project_index_path = val_resp_obj['project_index_path']
    # Check if change of path in case we need to purge other services like 'performance tests service'
    layout_entry.clamp_project_index_path()
    layout_entry.check_active_state()
    layout_entry.save()
    return res.get_response(200, 'Layout saved', {})
예제 #8
0
def post_feed_reports(request, project_id):
    """ Insert feed reports to a given git project """
    if request.method != 'POST':
        return res.get_response(400, 'Only post allowed', {})

    project_entry = GitProjectEntry.objects.filter(id=project_id).first()
    if project_entry is None:
        return res.get_response(404, 'project not found', {})

    (json_valid, post_info) = val.validate_json_string(request.body)
    if not json_valid:
        LogEntry.error(
            request.user,
            'Json parser failed.\n{0}'.format(json.dumps(post_info)))
        return res.get_json_parser_failed({})

    (obj_validated, val_resp_obj) = val.validate_obj_schema(
        post_info, GitFeederSchemas.GIT_FEED_REPORTS_SCHEMA)
    if not obj_validated:
        LogEntry.error(
            request.user,
            'Json schema failed.\n{0}'.format(json.dumps(val_resp_obj)))
        return res.get_schema_failed(val_resp_obj)

    GitFeederController.insert_reports(request.user, val_resp_obj['reports'],
                                       project_entry)

    if request.user.is_authenticated() and not request.user.is_anonymous():
        worker_entry = WorkerEntry.objects.filter(user=request.user).first()

        if worker_entry:
            GitFeederController.purge_old_reports(
                worker_entry.id, worker_entry.max_feed_reports)

    return res.get_response(200, 'Reports added correctly', {})
예제 #9
0
def login_worker_info(request):
    """ Makes login with worker credentials """

    if request.method != 'POST':
        return res.get_only_post_allowed({})

    (json_valid, post_info) = val.validate_json_string(request.body)
    if not json_valid:
        return res.get_json_parser_failed({})

    (obj_validated, obj) = val.validate_obj_schema(post_info, BluesteelWorkerSchemas.LOGIN_WORKER_SCHEMA)
    if not obj_validated:
        return res.get_schema_failed(obj)

    user = authenticate(username=obj['username'], password=obj['password'])
    if user is not None:
        # the password verified for the user
        if user.is_active:
            login(request, user)
            return res.get_response(200, 'Access granted!', {})

        return res.get_response(200, 'The password is valid, but the account has been disabled!', {})

    # the authentication system was unable to verify the username and password
    return res.get_response(401, 'Access denied!', {})
예제 #10
0
def get_project_list_from_layout(request, layout_id):
    """ Return project ids, names and get-branch-list url """
    if request.method != 'GET':
        return res.get_only_get_allowed({})

    layout = BluesteelLayoutEntry.objects.filter(id=layout_id).first()
    if layout is None:
        return res.get_response(400, 'Layout not found', {})

    project_entries = BluesteelProjectEntry.objects.filter(layout=layout).order_by('order')

    projects = []
    for project in project_entries:
        obj = {}
        obj['id'] = project.id
        obj['name'] = project.name
        obj['url'] = {}
        obj['url']['project_branch_list'] = ViewUrlGenerator.get_project_branch_list_url(project.git_project.id)
        obj['url']['project_definition_list'] = ViewUrlGenerator.get_project_definition_list_url(project.id)
        projects.append(obj)

    data = {}
    data['projects'] = projects

    return res.get_response(200, 'Projects info found', data)
예제 #11
0
def create_worker_info(request):
    """ Creates a worker given its info """

    if request.method != 'POST':
        return res.get_only_post_allowed({})

    (json_valid, post_info) = val.validate_json_string(request.body)
    if not json_valid:
        return res.get_json_parser_failed(
            {}
        )

    (obj_validated, val_resp_obj) = val.validate_obj_schema(
        post_info,
        BluesteelWorkerSchemas.CREATE_WORKER_INFO_SCHEMA
    )
    if not obj_validated:
        return res.get_schema_failed(val_resp_obj)

    obj = val_resp_obj
    username_trimmed = obj['uuid'][:30]

    worker = WorkerEntry.objects.filter(uuid=username_trimmed).first()
    if worker is not None:
        return res.get_response(405, 'Worker already created', {})

    user = User.objects.filter(username=username_trimmed).first()
    if not user:
        user = User.objects.create_user(
            username=username_trimmed,
            email=None,
            password=obj['uuid']
        )
        user.save()

    worker_count = WorkerEntry.objects.all().count()

    new_worker = WorkerEntry.objects.create(
        uuid=obj['uuid'],
        name=obj['host_name'],
        operative_system=obj['operative_system'],
        user=user,
        git_feeder=(worker_count == 0)
    )
    new_worker.save()

    BenchmarkDefinitionController.populate_worker_passes_all_definitions()

    ret = {}
    ret['worker'] = new_worker.as_object()
    ret['worker']['url'] = get_worker_urls(request.get_host(), ret['worker']['id'], ret['worker']['uuid'])
    ret['worker']['last_update'] = str(ret['worker']['last_update'])

    return res.get_response(200, 'Worker created succesfuly!', ret)
예제 #12
0
def update_worker_activity(request, worker_id):
    """ Updates worker activity from the last update time """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    worker = WorkerEntry.objects.filter(id=worker_id).first()
    if worker:
        worker.save()
        return res.get_response(200, 'Acitivity updated', {})

    return res.get_response(404, 'Worker not found!', {})
예제 #13
0
def get_worker_files_hash(request):
    """ Returns the hash of all the files of the worker source code """
    if request.method != 'GET':
        return res.get_only_get_allowed({})

    worker_files_hash = WorkerFilesHashEntry.objects.all().first()

    if not worker_files_hash:
        return res.get_response(400, 'Worker files hash not found', {})

    obj = {}
    obj['worker_files_hash'] = worker_files_hash.files_hash
    return res.get_response(200, 'Worker files hash', obj)
예제 #14
0
def get_layout(request, layout_id):
    """ Return layout in json """
    if request.method != 'GET':
        return res.get_only_get_allowed({})

    layout = BluesteelLayoutEntry.objects.filter(id=layout_id).first()

    if layout is None:
        return res.get_response(400, 'Layout not found', {})

    layout_obj = layout.as_object()
    layout_obj = add_project_feed_url(request, layout_obj)
    return res.get_response(200, 'Layout found', layout_obj)
예제 #15
0
def modify_fluctuation_waiver(request, waiver_id, value):
    """ Modify the fluctuation waiver to allow or deny notifications. """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    waiver = BenchmarkFluctuationWaiverEntry.objects.filter(
        id=waiver_id).first()

    if waiver is None:
        return res.get_response(404, 'Waiver does not exists!', {})

    waiver.notification_allowed = value
    waiver.save()
    return res.get_response(200, 'Waiver modified succesfully!', {})
예제 #16
0
def delete(request, layout_id):
    """ Layout deletion """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    layout_entry = BluesteelLayoutEntry.objects.filter(id=layout_id).first()
    if layout_entry is None:
        return res.get_response(404, 'Bluesteel layout not found', {})

    BluesteelLayoutController.delete_layout(layout_entry)

    data = {}
    data['redirect'] = ViewUrlGenerator.get_layout_all_url(1)
    return res.get_response(200, 'Layout deleted', data)
예제 #17
0
def delete_worker(request, worker_id):
    """ Deletes worker and all its related info from BlueSteel """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    worker = WorkerEntry.objects.filter(id=worker_id).first()
    if worker is None:
        return res.get_response(400, 'Worker not found', {})
    else:
        worker.delete()

    obj = {}
    obj['redirect'] = ViewUrlGenerator.get_worker_all_url(1)
    return res.get_response(200, 'Worker Deleted!', obj)
def invalidate_benchmark_execution(request, benchmark_execution_id):
    """ Check and save a benchmark execution data into the db """
    if request.method == 'POST':
        bench_exec_entry = BenchmarkExecutionEntry.objects.filter(
            id=benchmark_execution_id).first()
        if bench_exec_entry is None:
            return res.get_response(404, 'Bench Execution Entry not found', {})

        bench_exec_entry.invalidated = True
        bench_exec_entry.save()

        return res.get_response(200, 'Benchmark Execution invalidated', {})
    else:
        return res.get_response(400, 'Only post allowed', {})
def create_new_benchmark_definition(request):
    """ Creates a new benchmark defintion """
    if request.method != 'POST':
        return res.get_response(400, 'Only post allowed', {})

    definition = BenchmarkDefinitionController.create_default_benchmark_definition(
    )
    BenchmarkDefinitionController.populate_worker_passes_for_definition(
        definition)

    data = {}
    data['redirect'] = ViewUrlGenerator.get_benchmark_definitions_url(1)

    return res.get_response(200, 'Benchmark definition created', data)
예제 #20
0
def add_default_project(request, layout_id):
    """ Add default projet to layout """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    layout_entry = BluesteelLayoutEntry.objects.filter(id=layout_id).first()
    if layout_entry is None:
        return res.get_response(404, 'Bluesteel layout not found', {})

    BluesteelLayoutController.add_default_project_to_layout(layout_entry)
    BluesteelLayoutController.sort_layout_projects_by_order(layout_entry)

    obj = {}
    obj['redirect'] = ViewUrlGenerator.get_layout_edit_url(layout_entry.id)
    return res.get_response(200, 'Layout saved!', obj)
예제 #21
0
def get_known_commit_hashes(request, project_id):
    """ Returns a list of known commit hashes for a given project """
    if request.method == 'GET':
        project_entry = GitProjectEntry.objects.filter(id=project_id).first()
        if project_entry is None:
            return res.get_response(404, 'project not found', {})

        obj = {}
        obj['hashes'] = list(
            GitCommitEntry.objects.filter(project=project_entry).values_list(
                'commit_hash', flat=True))

        return res.get_response(200, '', obj)
    else:
        return res.get_only_get_allowed({})
예제 #22
0
def get_bootstrap_urls(request):
    """ Returns the bootstrap entry urls """
    if request.method != 'GET':
        return res.get_only_get_allowed({})

    obj = get_entry_points_urls(request.get_host())
    return res.get_response(200, 'Entry points', obj)
def view_duplicate_benchmark_definition(request, benchmark_definition_id):
    """ Duplicate benchmark definition properties """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    dup_bench_entry = BenchmarkDefinitionController.duplicate_benchmark_definition(
        benchmark_definition_id)

    if dup_bench_entry is None:
        return res.get_response(404, 'Benchmark Defintion save error', {})

    data = {}
    data['redirect'] = ViewUrlGenerator.get_benchmark_definition_url(
        dup_bench_entry.id)

    return res.get_response(200, 'Benchmark Definition saved', data)
def view_delete_benchmark_definition(request, benchmark_definition_id):
    """ Delete benchmark definition properties """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    ret = BenchmarkDefinitionController.delete_benchmark_definition(
        benchmark_definition_id=benchmark_definition_id)

    data = {}
    data['redirect'] = ViewUrlGenerator.get_benchmark_definitions_url(1)
    data['benchmark_definition_id'] = benchmark_definition_id

    if ret:
        return res.get_response(200, 'Benchmark Defintion deleted', data)

    return res.get_response(404, 'Benchmark Definition not found', data)
예제 #25
0
def acquire_benchmark_execution(request):
    """ Acquire the next available benchmark execution posible """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    BenchmarkExecutionController.try_populate_executions(
        POPULATE_EXECUTIONS_INC_COUNT)
    next_execution = BenchmarkExecutionController.get_earliest_available_execution(
        request.user)

    if next_execution is None:
        return res.get_response(404, 'Next Execution not found', {})

    execution = ViewPrepareObjects.prepare_benchmark_execution_for_html(
        next_execution.as_object(), request.get_host())
    return res.get_response(200, 'Next Execution', execution)
예제 #26
0
def wipe(request, layout_id):
    """ Layout wipe data """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    layout_entry = BluesteelLayoutEntry.objects.filter(id=layout_id).first()
    if layout_entry is None:
        return res.get_response(404, 'Bluesteel layout not found', {})

    project_entries = BluesteelProjectEntry.objects.filter(layout=layout_entry)

    for project in project_entries:
        project.wipe_data()

    data = {}
    data['redirect'] = ViewUrlGenerator.get_layout_all_url(1)
    return res.get_response(200, 'Layout wiped', data)
예제 #27
0
def send_notifications(request):
    """ Sends all the stacked emails to notify users """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    MailingController.MailingController.send_stacked_emails()

    return res.get_response(200, 'Stacked emails sent', {})
예제 #28
0
def get_worker_info(request, worker_uuid):
    """ Returns worker info based on uuid """
    if request.method != 'GET':
        return res.get_only_get_allowed({})

    worker = WorkerEntry.objects.filter(uuid=worker_uuid).first()

    obj = {}
    obj['csrf_token'] = csrf.get_token(request)

    if worker is None:
        return res.get_response(400, 'Worker not found', obj)

    ret_worker = worker.as_object()
    ret_worker['last_update'] = str(ret_worker['last_update'])
    ret_worker['url'] = get_worker_urls(request.get_host(), ret_worker['id'], ret_worker['uuid'])
    obj['worker'] = ret_worker
    return res.get_response(200, 'Worker found', obj)
예제 #29
0
def update_branch_order_value(request, branch_id, project_id, order_value):
    """ Change branch order value """
    if request.method == 'POST':
        project_entry = GitProjectEntry.objects.filter(id=project_id).first()
        if project_entry is None:
            return res.get_response(404, 'project not found', {})

        branch_entry = GitBranchEntry.objects.filter(project=project_entry,
                                                     id=branch_id).first()
        if branch_entry is None:
            return res.get_response(404, 'branch not found', {})

        GitController.sort_branch_with_branches(project_entry, branch_entry,
                                                order_value)

        return res.get_response(200, 'Branch order saved', {})
    else:
        return res.get_only_post_allowed({})
예제 #30
0
def delete_project(request, project_id):
    """ Delete project on a layout """
    if request.method != 'POST':
        return res.get_only_post_allowed({})

    project_entry = BluesteelProjectEntry.objects.filter(id=project_id).first()
    if project_entry is None:
        return res.get_response(404, 'Bluesteel project not found', {})

    layout_id = project_entry.layout.id
    project_entry.layout.active = False
    project_entry.layout.save()

    BluesteelProjectController.delete_project(project_entry)
    BluesteelLayoutController.sort_layout_projects_by_order(project_entry.layout)

    obj = {}
    obj['redirect'] = ViewUrlGenerator.get_layout_edit_url(layout_id)
    return res.get_response(200, 'Project deleted', obj)