def retrieve_repository_project_id(
blackduck_api,
heimdall_db: HeimdallDatabase,
repository_id: str,
blackduck_project_name: str = None,
):
bd_project_name = blackduck_project_name or (
retrieve_repository_name(heimdall_db, repository_id) if repository_id else None
)
bd_project_id = blackduck_api.get_project_id(bd_project_name)
update_repository_bd_project_id(heimdall_db, bd_project_name, bd_project_id)
return bd_project_id
def total_count_for_blackduck_versions(
service_params: dict,
heimdall_db: HeimdallDatabase
):
repository_id = py_.get(service_params, "repository-id")
if not repository_id:
raise Heimdall400Error(
"Bad Request, repository-id was unspecified. Cancelling request due to missing request data."
)
blackduck_api = BlackduckApi()
project_id = retrieve_repository_project_id(
blackduck_api, heimdall_db, repository_id
)
if not project_id:
raise Exception(f"Failed to retreve projectID for repo {repository_id}")
project_versions = blackduck_api.get_project_versions(project_id)
total_count = py_.get(project_versions, "totalCount", 0)
return total_count, project_versions
def check_scm_type(
heimdall_db: HeimdallDatabase,
repository_id,
project_versions
):
repo_scm_type = retrieve_repository_field(heimdall_db, repository_id, "scm_type")
if repo_scm_type == "GITHUB":
delete_list = []
open_branches_repository = retrieve_open_repository_blackduck_versions(heimdall_db, repository_id)
active_versions = pluck(open_branches_repository, "blackduck_version_name")
project_version_items = project_versions["items"]
for item in project_version_items:
item_version_name = item["versionName"]
if item_version_name not in active_versions:
delete_list.append(item)
return delete_list
# TOTAL COUNT CHECK
def total_count_check(
total_count,
project_version_items,
delete_list
):
if total_count >= 19 and len(delete_list) < 6:
project_version_items.sort(key=operator.itemgetter('createdAt'))
for item in project_version_items:
if item not in delete_list:
delete_list.append(item)
if len(delete_list) >= 1:
break
delete_count = len(delete_list)
return delete_count
def delete_blackduck_version(
delete_list,
delete_count,
total_count,
blackduck_api: BlackduckApi,
project_id
):
for item in delete_list:
project_version_url = py_.get(item, "_meta.href")
version_id = py_.get(project_version_url.split("/"), '7')
version_deleted = blackduck_api.delete_project_version(project_id, version_id)
if version_deleted:
logging.info(f"Project version {version_id} has been deleted sucessfully")
return wrapped_response(200, f"You have deleted {delete_count} versions and you have {total_count- delete_count} remain" )
# TODO PROVIDE ACCESS TO SAC USER
# def execute_blackduck_maintenance():
# # total_count_for_blackduck_version
# # check_scm_type
# # total_count_check
# # delete blackduck version
Я смущен тем, как некоторые функции могут ссылаться на другие функциональные переменные — если переменные ограничены определенной областью.
Например, project_versions создается в total_count_for_blackduck_versions и используется в другой функции с именем check_scm_type?
Любая помощь здесь будет оценена