Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test clean for resubmission pipeline #1292

Draft
wants to merge 26 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
def run(params) {
timestamps {
//Capybara configuration
def api_program = "./susemanager-ci/jenkins_pipelines/scripts/api_program/main.py"

env.resultdir = "${WORKSPACE}/results"
env.resultdirbuild = "${resultdir}/${BUILD_NUMBER}"
// The junit plugin doesn't affect full paths
junit_resultdir = "results/${BUILD_NUMBER}/results_junit"
env.exports = "export BUILD_NUMBER=${BUILD_NUMBER}; export BUILD_VALIDATION=true; "
def tf_file = "/home/jenkins/workspace/${params.targeted_project}/results/sumaform/main.tf"

// Variables to store none critical stage run status

env.common_params = "--outputdir ${resultdir} --tf ${tf_file} --gitfolder ${resultdir}/sumaform"

if (params.terraform_parallelism) {
env.common_params = "${env.common_params} --parallelism ${params.terraform_parallelism}"
}
try {
stage('Clone terracumber, susemanager-ci and sumaform') {
// Create a directory for to place the directory with the build results (if it does not exist)
sh "mkdir -p ${resultdir}"
git url: params.terracumber_gitrepo, branch: params.terracumber_ref
dir("susemanager-ci") {
checkout scm
}
// Clone sumaform
sh "set +x; source /home/jenkins/.credentials set -x; ./terracumber-cli ${common_params} --gitrepo ${params.sumaform_gitrepo} --gitref ${params.sumaform_ref} --runstep gitsync"

// Restore Terraform states from artifacts
if (params.use_previous_terraform_state) {
copyArtifacts projectName: currentBuild.projectName, selector: specific("${currentBuild.previousBuild.number}")
}
}

stage('Delete the systems') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_systems")
}
stage('Delete config projects') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_config_projects")
}
stage('Delete software channels') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_software_channels")
}
stage('Delete activation keys') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_activation_keys")
}
stage('Delete minion users') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_users")
}
stage('Delete channel repositories') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_repositories")
}
stage('Delete salt keys') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_salt_keys")
}
stage('Delete ssh know hosts') {
sh(script: "${api_program} --url ${params.manager_hostname} --mode delete_known_hosts")
}

stage('Delete client VMs') {
// Copy tfstate from project
sh "cp /home/jenkins/workspace/${params.targeted_project}/results/sumaform/terraform.tfstate ${env.resultdir}/sumaform/terraform.tfstate"
sh "cp -r /home/jenkins/workspace/${params.targeted_project}/results/sumaform/.terraform ${env.resultdir}/sumaform/"
// Run Terracumber to deploy the environment without clients
sh "set +x; source /home/jenkins/.credentials set -x; export TF_VAR_CUCUMBER_GITREPO=${params.cucumber_gitrepo}; export TF_VAR_CUCUMBER_BRANCH=${params.cucumber_ref}; export TERRAFORM=${params.terraform_bin}; export TERRAFORM_PLUGINS=${params.terraform_bin_plugins}; ./terracumber-cli ${common_params} --logfile ${resultdirbuild}/sumaform.log --init --sumaform-backend ${params.sumaform_backend} --use-tf-resource-cleaner --tf-resources-to-delete proxy retail monitoring-server --runstep provision"
}

stage('Redeploy the environment with new client VMs and update custom repositories into cucumber') {
// Generate custom_repositories.json file in the workspace from the value passed by parameter
if (params.custom_repositories?.trim()) {
writeFile file: 'custom_repositories.json', text: params.custom_repositories, encoding: "UTF-8"
}
// Generate custom_repositories.json file in the workspace using a Python script - MI Identifiers passed by parameter
if (params.mi_ids?.trim()) {
node('manager-jenkins-node') {
checkout scm
res_python_script_ = sh(script: "python3 jenkins_pipelines/scripts/json_generator/maintenance_json_generator.py --mi_ids ${params.mi_ids}", returnStatus: true)
echo "Build Validation JSON script return code:\n ${json_content}"
if (res_python_script != 0) {
error("MI IDs (${params.mi_ids}) passed by parameter are wrong (or already released)")
}
}
}
// Run Terracumber to deploy the environment
sh "set +x; source /home/jenkins/.credentials set -x; export TF_VAR_CUCUMBER_GITREPO=${params.cucumber_gitrepo}; export TF_VAR_CUCUMBER_BRANCH=${params.cucumber_ref}; export TERRAFORM=${params.terraform_bin}; export TERRAFORM_PLUGINS=${params.terraform_bin_plugins}; ./terracumber-cli ${common_params} --logfile ${resultdirbuild}/sumaform.log --init --sumaform-backend ${params.sumaform_backend} --runstep provision"
}

stage('Sanity check') {
sh "./terracumber-cli ${common_params} --logfile ${resultdirbuild}/testsuite.log --runstep cucumber --cucumber-cmd 'cd /root/spacewalk/testsuite; ${env.exports} rake cucumber:build_validation_sanity_check'"
}

}
finally {
stage('Copy back tfstate') {
// Copy back the tftstate to targeted project
sh "cp ${env.resultdir}/sumaform/terraform.tfstate /home/jenkins/workspace/${params.targeted_project}/results/sumaform/terraform.tfstate"
}
stage('Save TF state') {
archiveArtifacts artifacts: "results/sumaform/terraform.tfstate, results/sumaform/.terraform/**/*"
}

}
}
}

return this
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env groovy

node('sumaform-cucumber') {
def minionList = 'sle12sp5_client, sle12sp5_minion, sle12sp5_ssh_minion, ' +
'sle15sp1_client, sle15sp1_minion, sle15sp1_ssh_minion, ' +
'sle15sp2_client, sle15sp2_minion, sle15sp2_ssh_minion, ' +
'sle15sp3_client, sle15sp3_minion, sle15sp3_ssh_minion, ' +
'sle15sp4_client, sle15sp4_minion, sle15sp4_ssh_minion, ' +
'sle15sp5_client, sle15sp5_minion, sle15sp5_ssh_minion, ' +
'sle15sp6_client, sle15sp6_minion, sle15sp6_ssh_minion, ' +
'salt_migration_minion, ' +
'alma8_minion, alma8_ssh_minion, alma9_minion, alma9_ssh_minion, ' +
'centos7_client, centos7_minion, centos7_ssh_minion, ' +
'liberty9_minion, liberty9_ssh_minion, ' +
'oracle9_minion, oracle9_ssh_minion, ' +
'rocky8_minion, rocky8_ssh_minion, rocky9_minion, rocky9_ssh_minion, ' +
'ubuntu2004_minion, ubuntu2004_ssh_minion, ubuntu2204_minion, ubuntu2204_ssh_minion, ' +
'debian11_minion, debian11_ssh_minion, debian12_minion, debian12_ssh_minion, ' +
'opensuse154arm_minion, opensuse154arm_ssh_minion, ' +
'opensuse155arm_minion, opensuse155arm_ssh_minion, ' +
'opensuse156arm_minion, opensuse156arm_ssh_minion, ' +
'sle15sp5s390_minion, sle15sp5s390_ssh_minion, ' +
'slemicro51_minion, slemicro52_minion, slemicro53_minion, slemicro54_minion, slemicro55_minion, slmicro60_minion'
properties([
buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '3')),
disableConcurrentBuilds(),
parameters([
string(name: 'cucumber_gitrepo', defaultValue: 'https://github.com/SUSE/spacewalk.git', description: 'Testsuite Git Repository'),
string(name: 'cucumber_ref', defaultValue: 'Manager-4.3', description: 'Branch prepared for the MU tested'),
string(name: 'targeted_project', defaultValue: 'manager-4.3-qe-build-validation-NUE', description: 'Path to the tf file to be used'),
string(name: 'sumaform_gitrepo', defaultValue: 'https://github.com/uyuni-project/sumaform.git', description: 'Sumaform Git Repository'),
string(name: 'sumaform_ref', defaultValue: 'master', description: 'Sumaform Git reference (branch, tag...)'),
choice(name: 'sumaform_backend', choices: ['libvirt'], description: 'Sumaform backend to be used (see https://github.com/uyuni-project/sumaform#backend-choice)'),
choice(name: 'terraform_bin', choices: ['/usr/bin/terraform'], description: 'Terraform binary path'),
choice(name: 'terraform_bin_plugins', choices: ['/usr/bin'], description: 'Terraform plugins path'),
string(name: 'terraform_parallelism', defaultValue: '', description: 'Advanced: Define the number of parallel resource operations for terraform'),
// Temporary: should move to uyuni-project
string(name: 'terracumber_gitrepo', defaultValue: 'https://github.com/uyuni-project/terracumber.git', description: 'Terracumber Git Repository'),
string(name: 'terracumber_ref', defaultValue: 'master', description: 'Terracumber Git ref (branch, tag...)'),
string(name: 'manager_hostname', defaultValue: 'suma-bv-43-srv.mgr.suse.de', description: 'Manager hostname'),
extendedChoice(name: 'minions_to_run', multiSelectDelimiter: ', ', quoteValue: false, saveJSONParameterToFile: false, type: 'PT_CHECKBOX', visibleItemCount: 15,
value: minionList,
defaultValue: minionList,
description: 'Node list to run during BV'),
text(name: 'mi_ids', defaultValue: '', description: 'MI Identifiers separated by comma or whitespaces (Option A)'),
text(name: 'custom_repositories', defaultValue: '{}', description: 'MU Repositories in json format (Option B)')
])
])

stage('Checkout pipeline') {
checkout scm
}
def pipeline = load "jenkins_pipelines/environments/common/pipeline-build-validation-cleanup.groovy"
pipeline.run(params)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env groovy

node('sumaform-cucumber-provo') {
def minionList = 'sle12sp5_client, sle12sp5_minion, sle12sp5_ssh_minion, ' +
'sle15sp1_client, sle15sp1_minion, sle15sp1_ssh_minion, ' +
'sle15sp2_client, sle15sp2_minion, sle15sp2_ssh_minion, ' +
'sle15sp3_client, sle15sp3_minion, sle15sp3_ssh_minion, ' +
'sle15sp4_client, sle15sp4_minion, sle15sp4_ssh_minion, ' +
'sle15sp5_client, sle15sp5_minion, sle15sp5_ssh_minion, ' +
'sle15sp6_client, sle15sp6_minion, sle15sp6_ssh_minion, ' +
'salt_migration_minion, ' +
'alma8_minion, alma8_ssh_minion, alma9_minion, alma9_ssh_minion, ' +
'centos7_client, centos7_minion, centos7_ssh_minion, ' +
'liberty9_minion, liberty9_ssh_minion, ' +
'oracle9_minion, oracle9_ssh_minion, ' +
'rocky8_minion, rocky8_ssh_minion, rocky9_minion, rocky9_ssh_minion, ' +
'ubuntu2004_minion, ubuntu2004_ssh_minion, ubuntu2204_minion, ubuntu2204_ssh_minion, ' +
'debian11_minion, debian11_ssh_minion, debian12_minion, debian12_ssh_minion, ' +
'opensuse154arm_minion, opensuse154arm_ssh_minion, ' +
'opensuse155arm_minion, opensuse155arm_ssh_minion, ' +
'opensuse156arm_minion, opensuse156arm_ssh_minion, ' +
'sle15sp5s390_minion, sle15sp5s390_ssh_minion, ' +
'slemicro51_minion, slemicro52_minion, slemicro53_minion, slemicro54_minion, slemicro55_minion, slmicro60_minion'
properties([
buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '3')),
disableConcurrentBuilds(),
parameters([
string(name: 'cucumber_gitrepo', defaultValue: 'https://github.com/SUSE/spacewalk.git', description: 'Testsuite Git Repository'),
string(name: 'cucumber_ref', defaultValue: 'Manager-4.3', description: 'Branch prepared for the MU tested'),
string(name: 'targeted_project', defaultValue: 'manager-4.3-qe-build-validation-PRV', description: 'Path to the tf file to be used'),
string(name: 'sumaform_gitrepo', defaultValue: 'https://github.com/uyuni-project/sumaform.git', description: 'Sumaform Git Repository'),
string(name: 'sumaform_ref', defaultValue: 'master', description: 'Sumaform Git reference (branch, tag...)'),
choice(name: 'sumaform_backend', choices: ['libvirt'], description: 'Sumaform backend to be used (see https://github.com/uyuni-project/sumaform#backend-choice)'),
choice(name: 'terraform_bin', choices: ['/usr/bin/terraform'], description: 'Terraform binary path'),
choice(name: 'terraform_bin_plugins', choices: ['/usr/bin'], description: 'Terraform plugins path'),
string(name: 'terraform_parallelism', defaultValue: '', description: 'Advanced: Define the number of parallel resource operations for terraform'),
// Temporary: should move to uyuni-project
string(name: 'terracumber_gitrepo', defaultValue: 'https://github.com/uyuni-project/terracumber.git', description: 'Terracumber Git Repository'),
string(name: 'terracumber_ref', defaultValue: 'master', description: 'Terracumber Git ref (branch, tag...)'),
string(name: 'manager_hostname', defaultValue: 'suma-bv-43-srv.mgr.prv.suse.net', description: 'Manager hostname'),
extendedChoice(name: 'minions_to_run', multiSelectDelimiter: ', ', quoteValue: false, saveJSONParameterToFile: false, type: 'PT_CHECKBOX', visibleItemCount: 15,
value: minionList,
defaultValue: minionList,
description: 'Node list to run during BV'),
text(name: 'mi_ids', defaultValue: '', description: 'MI Identifiers separated by comma or whitespaces (Option A)'),
text(name: 'custom_repositories', defaultValue: '{}', description: 'MU Repositories in json format (Option B)')
])
])

stage('Checkout pipeline') {
checkout scm
}
def pipeline = load "jenkins_pipelines/environments/common/pipeline-build-validation-cleanup.groovy"
pipeline.run(params)
}
57 changes: 57 additions & 0 deletions jenkins_pipelines/scripts/api_program/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/python3
import argparse
from suse_manager_api import get_session_key, logout_session, delete_users, delete_activation_keys, delete_config_projects, delete_software_channels, delete_systems, delete_channel_repos, delete_salt_keys
from suse_manager_ssh import run_ssh_command
import logging

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Manage SUSE Manager API actions.")
parser.add_argument("--url", help="The URL of the SUSE Manager XML-RPC API.")
parser.add_argument("--mode", choices=["delete_users", "delete_activation_keys", "delete_config_projects", "delete_software_channels", "delete_systems", "delete_repositories","full_cleanup", "delete_salt_keys", "delete_known_hosts"], help="The mode of operation.")
parser.add_argument('--tf-resources-to-delete', type=str, nargs='*', choices=['proxy', 'monitoring-server', 'retail'], default=[],
help='List of default modules to force deletion')

args = parser.parse_args()

manager_url = args.url

session_key, client = get_session_key(manager_url)

try:
if args.mode == "delete_users":
delete_users(client, session_key)
elif args.mode == "delete_activation_keys":
delete_activation_keys(client, session_key)
elif args.mode == "delete_config_channels":
delete_config_channels(client, session_key)
elif args.mode == "delete_software_channels":
delete_software_channels(client, session_key)
elif args.mode == "delete_systems":
delete_systems(client, session_key)
elif args.mode == "delete_repositories":
delete_channel_repos(client, session_key)
elif args.mode == "delete_salt_keys":
delete_salt_keys(client, session_key)
elif args.mode == "delete_known_hosts":
run_ssh_command(manager_url, "rm /var/lib/salt/.ssh/known_hosts")
elif args.mode == "update_custom_repositories":
copy_file_over_ssh(manager_url, "","/root/spacewalk/testsuite/features/upload_files/custom_repositories.json")
elif args.mode == "delete_config_projects":
delete_config_projects(client, session_key)
elif args.mode == "full_cleanup":
delete_systems(client, session_key)
delete_config_projects(client, session_key)
delete_software_channels(client, session_key)
delete_activation_keys(client, session_key)
delete_users(client, session_key)
delete_channel_repos(client, session_key)
delete_salt_keys(client,session_key)
run_ssh_command(manager_url, "rm /var/lib/salt/.ssh/known_hosts")
logger.info("Delete known_hosts file on server")
finally:
logout_session(client, session_key)
Loading