def test_add_build_configuration_to_set_name_notexist(mock_add_config, mock_get_config, mock_get_config_id, mock_get_set_id):
    result = buildconfigurationsets.add_build_configuration_to_set(set_id=1, config_name='testerino')
    mock_get_set_id.assert_called_once_with(1, None)
    mock_get_config_id.assert_called_once_with(None, 'testerino')
    assert not mock_get_config.called
    assert not mock_add_config.called
    assert not result
예제 #2
0
def test_add_build_configuration_to_set_name(mock_add_config, mock_get_config, mock_get_config_id, mock_get_set_id):
    result = buildconfigurationsets.add_build_configuration_to_set(set_name='testerino', config_id=1)
    mock_get_set_id.assert_called_once_with(None, 'testerino')
    mock_get_config_id.assert_called_once_with(1, None)
    mock_get_config.assert_called_once_with(id=1)
    mock_add_config.assert_called_once_with(id=1, body='BuildConfiguration')
    assert result == 'SUCCESS'
예제 #3
0
def test_add_build_configuration_to_set_name(mock_configs_api, mock_sets_api,
                                             mock_add_config, mock_get_entity,
                                             mock_set_id):
    result = buildconfigurationsets.add_build_configuration_to_set(
        set_name='testerino', config_id=1)
    set_id_calls = [
        call(mock_sets_api, None, 'testerino'),
        call(mock_configs_api, 1, None)
    ]
    mock_set_id.assert_has_calls(set_id_calls)
    mock_get_entity.assert_called_once_with(mock_configs_api, 1)
    mock_add_config.assert_called_once_with(id=1, body='BuildConfiguration')
    assert result == 'SUCCESS'
예제 #4
0
def create_build_configuration(environment_id, bc_set, product_version_id, art_params, scm_repo_url, 
                               scm_revision, artifact_name, project, use_external_scm_fields):
    bpm_task_id = 0
    
    if use_external_scm_fields:
        #Create BPM build config using post /bpm/tasks/start-build-configuration-creation 
        #Set these SCM fields: scmExternalRepoURL and scmExternalRevision
        bpm_task_id = bpmbuildconfigurations.create_build_configuration(name=artifact_name,
                                                 project_id=project.id,
                                                 build_environment_id=environment_id,
                                                 scm_external_repo_url=scm_repo_url,
                                                 scm_external_revision=scm_revision,
                                                 build_script=get_maven_options(art_params),
                                                 product_version_id=product_version_id,
                                                 dependency_ids = [],
                                                 build_configuration_set_ids = [],
                                                 generic_parameters=get_generic_parameters(art_params))
    else:
        #Create BPM build config using post /bpm/tasks/start-build-configuration-creation 
        #Set these SCM fields: scmRepoURL and scmRevision
        #Fields scmExternalRepoURL and scmExternalRevision can be optionally filled too
        bpm_task_id = bpmbuildconfigurations.create_build_configuration(name=artifact_name,
                                                 project_id=project.id,
                                                 build_environment_id=environment_id,
                                                 scm_repo_url=scm_repo_url,
                                                 scm_revision=scm_revision,
                                                 build_script=get_maven_options(art_params),
                                                 product_version_id=product_version_id,
                                                 dependency_ids = [],
                                                 build_configuration_set_ids = [],
                                                 generic_parameters=get_generic_parameters(art_params))


    #Using polling every 30s check this endpoint: get /bpm/tasks/{bpm_task_id} 
    #until eventType is:
    # BCC_CONFIG_SET_ADDITION_ERROR BCC_CREATION_ERROR BCC_REPO_CLONE_ERROR BCC_REPO_CREATION_ERROR -> ERROR -> end with error
    # BCC_CREATION_SUCCESS  -> SUCCESS
    error_event_types = ("BCC_CONFIG_SET_ADDITION_ERROR", "BCC_CREATION_ERROR", "BCC_REPO_CLONE_ERROR", "BCC_REPO_CREATION_ERROR")
    time.sleep(2)
    while True:
        bpm_task = bpmbuildconfigurations.get_bpm_task_by_id(bpm_task_id)
        
        if contains_event_type(bpm_task.content.events, ("BCC_CREATION_SUCCESS", )):
            break
        
        if contains_event_type(bpm_task.content.events, error_event_types):
            pprint("Creation of Build Configuration failed")
            pprint(bpm_task.content)
            return None
        
        pprint("Waiting until Build Configuration " + artifact_name + " is created.")
        time.sleep(10)

    
    #Get BC - GET build-configurations?q='$NAME'
    #Not found-> BC creation failed and the task was garbage collected -> fail
    #Success -> add BC to BCSet and return BC
    build_config = get_build_configuration_by_name(artifact_name)
    if build_config == None:
        pprint("Creation of Build Configuration failed. Unfortunately the details were garbage collected on PNC side.")
        return None        
        
    pprint("Build Configuration " + artifact_name + " is created.")
    #Inform user that he should update the config
    if use_external_scm_fields:
        pprint("!! IMPORTANT !! - ACTION REQUIRED !!")
        pprint("External repository " + scm_repo_url
               + " was forked to internal Git server. YOU MUST TO UPDATE YOUR CONFIG FILE WITH THE NEW VALUE.")
        pprint("New repository URL is: " + build_config.scm_repo_url + "#" + build_config.scm_revision)
        
    buildconfigurationsets.add_build_configuration_to_set(set_id=bc_set.id, config_id=build_config.id)
    return build_config
예제 #5
0
            if build_config == None:
                logging.debug('No build config with name ' + artifact_name)
                build_config = create_build_configuration(environment, bc_set, product_version_id, art_params, scm_repo_url,
                                                          scm_revision, artifact_name, project,
                                                          use_external_scm_fields=external)
            else:
                if external:
                    pprint("Updating of an existing Build Configuration is not possible with external repositories (NCL-2963). Build Configuration: " + artifact_name)
                    return 1
                else:
                    build_config = update_build_configuration(environment, product_version_id, art_params, scm_repo_url,
                                                              scm_revision, artifact_name, project)

        # Make sure existing configs are added the group
        if build_config is not None and not external and build_config.id not in bc_set.build_configuration_ids:
            buildconfigurationsets.add_build_configuration_to_set(set_id=bc_set.id, config_id=build_config.id)

        if build_config == None:
            return 10
            
        ids[artifact] = build_config
        logging.debug(build_config.id)
        
    #Construct dependency tree of Build Configs
    logging.debug(ids)
    for package, dependencies in packages.iteritems():
        for artifact in dependencies:
            bc_id = ids[package]
            subid = ids[artifact]
            logging.debug(bc_id.id, subid.id)
            buildconfigurations.add_dependency(id=bc_id.id, dependency_id=subid.id)
예제 #6
0
        build_config = get_build_configuration_by_name(artifact_name)
        if subartifact in look_up_only_list:
            if build_config == None:
                logging.warn("Look up of an existing Build Configuration failed. No build configuration with name " + artifact_name + " found.")
        else:
            if build_config == None:
                logging.debug('No build config with name ' + artifact_name)
                build_config = create_build_configuration(env, bc_set, product_version_id, art_params, scm_repo_url,
                                                          scm_revision, artifact_name, project)
            else:
                build_config = update_build_configuration(env, product_version_id, art_params, scm_repo_url,
                                                          scm_revision, artifact_name, project)

        # Make sure existing configs are added the group
        if build_config is not None and build_config.id not in bc_set.build_configuration_ids:
            buildconfigurationsets.add_build_configuration_to_set(set_id=bc_set.id, config_id=build_config.id)

        if build_config == None:
            return 10

        ids[artifact] = build_config
        logging.debug(build_config.id)

    #Construct dependency tree of Build Configs
    logging.debug(ids)
    for package, dependencies in packages.iteritems():
        for artifact in dependencies:
            bc_id = ids[package]
            subid = ids[artifact]
            logging.debug(bc_id.id, subid.id)
            buildconfigurations.add_dependency(id=bc_id.id, dependency_id=subid.id)
예제 #7
0
def make_mead_impl(config, run_build, environment, suffix, product_name,
                   product_version, look_up_only, clean_group):
    if not validate_input_parameters(config, product_name, product_version):
        return 1

    try:
        config_reader = ConfigReader(config)
    except NoSectionError as e:
        logging.error('Missing config in %s (%r)', config, e)
        return 1
    except Error as err:
        logging.error(err)
        return 1

    ids = dict()
    (subarts, deps_dict) = config_reader.get_dependency_structure()
    packages = config_reader.get_packages_and_dependencies()
    logging.debug(packages)
    logging.debug(subarts)
    logging.debug(deps_dict)

    product_version_id = get_product_version(product_name, product_version)
    if product_version_id is None:
        return 1

    # Get environment
    env = environments.get_environment_raw(environment)
    if not env:
        logging.error('Environment with id %d not found', environment)
        return 1

    #Create a list for look-up-only
    look_up_only_list = look_up_only.split(",")

    #Lookup or create Build Configuration Set
    target_name = product_name + "-" + product_version + "-all" + suffix
    try:
        bc_set = buildconfigurationsets.get_build_configuration_set_raw(
            name=target_name)
        if clean_group:
            for bc_id in bc_set.build_configuration_ids:
                buildconfigurationsets.remove_build_configuration_from_set_raw(
                    set_id=bc_set.id, config_id=bc_id)
    except ValueError:
        bc_set = buildconfigurationsets.create_build_configuration_set_raw(
            name=target_name, product_version_id=product_version_id)
    logging.debug(target_name + ":")
    logging.debug(bc_set.id)

    #Iterate through all sections in configuration file
    for subartifact in subarts:
        art_params = config_reader.get_config(subartifact)
        logging.debug(art_params)
        artifact = art_params['artifact']
        if 'pnc.projectName' in art_params.keys():
            logging.debug("Overriding project name with " +
                          art_params['pnc.projectName'])
            project_name = art_params['pnc.projectName']
        else:
            logging.debug("Using default project name " + artifact)
            project_name = artifact

        logging.debug(art_params)
        package = art_params['package']
        version = art_params['version']
        scm_url = art_params['scmURL']
        (scm_repo_url, scm_revision) = scm_url.split("#", 2)
        artifact_name = package + "-" + re.sub("[\-\.]*redhat\-\d+", "",
                                               version) + suffix

        #WA for subfolder builds (? in SCM url)
        if "?" in scm_repo_url:
            folder = scm_repo_url[scm_repo_url.index('?') + 1:]
            scm_repo_url = scm_repo_url[:scm_repo_url.index('?')]
            if 'maven_options' not in art_params['options'].keys():
                art_params['options']['maven_options'] = []
            art_params['options']['maven_options'].append("-f./" + folder +
                                                          "/pom.xml")
            if 'properties' not in art_params['options'].keys():
                art_params['options']['properties'] = {}
            art_params['options']['properties']['exec_folder'] = folder

        # If scm_repo_url starts with git+https protocol, use https protocol instead
        # recent versions of git don't seem to understand 'git+https' anymore
        scm_repo_url = _git_url_use_https_only(scm_repo_url)

        #Lookup or create a Project
        try:
            project = projects.get_project_raw(name=project_name)
        except ValueError:
            logging.debug('No project ' + project_name +
                          ". Creating a new one")
            project = projects.create_project_raw(name=project_name)
        logging.debug(artifact_name + ":")
        logging.debug(project.id)

        #Lookup or update or create Build Config
        build_config = get_build_configuration_by_name(artifact_name)
        if subartifact in look_up_only_list:
            if build_config == None:
                logging.warn(
                    "Look up of an existing Build Configuration failed. No build configuration with name "
                    + artifact_name + " found.")
        else:
            if build_config == None:
                logging.debug('No build config with name ' + artifact_name)
                build_config = create_build_configuration(
                    env, bc_set, product_version_id, art_params, scm_repo_url,
                    scm_revision, artifact_name, project)
            else:
                build_config = update_build_configuration(
                    env, product_version_id, art_params, scm_repo_url,
                    scm_revision, artifact_name, project)

        # Make sure existing configs are added the group
        if build_config is not None and build_config.id not in bc_set.build_configuration_ids:
            buildconfigurationsets.add_build_configuration_to_set(
                set_id=bc_set.id, config_id=build_config.id)

        if build_config == None:
            return 10

        ids[artifact] = build_config
        logging.debug(build_config.id)

    #Construct dependency tree of Build Configs
    logging.debug(ids)
    for package, dependencies in packages.iteritems():
        for artifact in dependencies:
            bc_id = ids[package]
            subid = ids[artifact]
            logging.debug(bc_id.id, subid.id)
            buildconfigurations.add_dependency(id=bc_id.id,
                                               dependency_id=subid.id)

    #Run build if requested
    if run_build:
        build_record = buildconfigurationsets.build_set_raw(id=bc_set.id)
        logging.info("Build started with id %d", build_record.id)

    return utils.format_json(bc_set)
예제 #8
0
def make_mead_impl(config, run_build, environment, suffix, product_name, product_version, look_up_only, clean_group):
    if not validate_input_parameters(config, product_name, product_version):
        return 1

    try:
        config_reader = ConfigReader(config)
    except NoSectionError as e:
        logging.error('Missing config in %s (%r)', config, e)
        return 1
    except Error as err:
        logging.error(err)
        return 1

    ids = dict()
    (subarts, deps_dict) = config_reader.get_dependency_structure()
    packages = config_reader.get_packages_and_dependencies()
    logging.debug(packages)
    logging.debug(subarts)
    logging.debug(deps_dict)

    product_version_id = get_product_version(product_name, product_version)
    if product_version_id is None:
        return 1

    # Get environment
    env = environments.get_environment_raw(environment)
    if not env:
        logging.error('Environment with id %d not found', environment)
        return 1

    #Create a list for look-up-only
    look_up_only_list = look_up_only.split(",")

    #Lookup or create Build Configuration Set
    target_name = product_name + "-" + product_version + "-all" + suffix
    try:
        bc_set = buildconfigurationsets.get_build_configuration_set_raw(name=target_name)
        if clean_group:
            for bc_id in bc_set.build_configuration_ids:
                buildconfigurationsets.remove_build_configuration_from_set_raw(set_id=bc_set.id, config_id=bc_id)
    except ValueError:
        bc_set = buildconfigurationsets.create_build_configuration_set_raw(name=target_name, product_version_id=product_version_id)
    logging.debug(target_name + ":")
    logging.debug(bc_set.id)

    #Iterate through all sections in configuration file
    for subartifact in subarts:
        art_params = config_reader.get_config(subartifact)
        logging.debug(art_params)
        artifact = art_params['artifact']
        if 'pnc.projectName' in art_params.keys():
            logging.debug("Overriding project name with " + art_params['pnc.projectName'])
            project_name = art_params['pnc.projectName']
        else:
            logging.debug("Using default project name " + artifact)
            project_name = artifact

        logging.debug(art_params)
        package = art_params['package']
        version = art_params['version']
        scm_url = art_params['scmURL']
        (scm_repo_url, scm_revision) = scm_url.split("#", 2)
        artifact_name = package + "-" + re.sub("[\-\.]*redhat\-\d+", "", version) + suffix

        #WA for subfolder builds (? in SCM url)
        if "?" in scm_repo_url:
            folder = scm_repo_url[scm_repo_url.index('?')+1:]
            scm_repo_url = scm_repo_url[:scm_repo_url.index('?')]
            if 'maven_options' not in art_params['options'].keys():
                art_params['options']['maven_options'] = []
            art_params['options']['maven_options'].append("-f./"+folder+"/pom.xml")
            if 'properties' not in art_params['options'].keys():
                art_params['options']['properties'] = {}
            art_params['options']['properties']['exec_folder'] = folder

        # If scm_repo_url starts with git+https protocol, use https protocol instead
        # recent versions of git don't seem to understand 'git+https' anymore
        scm_repo_url = _git_url_use_https_only(scm_repo_url)

        #Lookup or create a Project
        try:
            project = projects.get_project_raw(name=project_name)
        except ValueError:
            logging.debug('No project ' + project_name + ". Creating a new one")
            project = projects.create_project_raw(name=project_name)
        logging.debug(artifact_name + ":")
        logging.debug(project.id)

        #Lookup or update or create Build Config
        build_config = get_build_configuration_by_name(artifact_name)
        if subartifact in look_up_only_list:
            if build_config == None:
                logging.warn("Look up of an existing Build Configuration failed. No build configuration with name " + artifact_name + " found.")
        else:
            if build_config == None:
                logging.debug('No build config with name ' + artifact_name)
                build_config = create_build_configuration(env, bc_set, product_version_id, art_params, scm_repo_url,
                                                          scm_revision, artifact_name, project)
            else:
                build_config = update_build_configuration(env, product_version_id, art_params, scm_repo_url,
                                                          scm_revision, artifact_name, project)

        # Make sure existing configs are added the group
        if build_config is not None and build_config.id not in bc_set.build_configuration_ids:
            buildconfigurationsets.add_build_configuration_to_set(set_id=bc_set.id, config_id=build_config.id)

        if build_config == None:
            return 10

        ids[artifact] = build_config
        logging.debug(build_config.id)

    #Construct dependency tree of Build Configs
    logging.debug(ids)
    for package, dependencies in packages.iteritems():
        for artifact in dependencies:
            bc_id = ids[package]
            subid = ids[artifact]
            logging.debug(bc_id.id, subid.id)
            buildconfigurations.add_dependency(id=bc_id.id, dependency_id=subid.id)

    #Run build if requested
    if run_build:
        build_record = buildconfigurationsets.build_set_raw(id=bc_set.id)
        logging.info("Build started with id %d",build_record.id)

    return utils.format_json(bc_set)