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
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'
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'
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
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)
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)
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)
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)