apiVersion: v1 kind: Namespace metadata: name: konflux-cli --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: konflux-cli-configmaps-read namespace: konflux-cli rules: - apiGroups: - "" resourceNames: - create-tenant - setup-release resources: - configmaps verbs: - get - list --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: konflux-cli-configmaps-read-binding namespace: konflux-cli roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: konflux-cli-configmaps-read subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: system:authenticated --- apiVersion: v1 data: create-tenant.sh: "#!/bin/bash -e\n\n# Script to create a new Konflux tenant namespace with all required resources\n\nusage() {\n cat < -u \n\nCreate a new Konflux tenant namespace with all required resources.\n\nRequired arguments:\n -n, --namespace Name of the tenant namespace to create\n -u, --admin-user Name of the admin user (e.g., user1@konflux.dev)\n\nExample:\n \ $(basename \"$0\") -n my-tenant -u user1@konflux.dev\nEOF\n exit 1\n}\n\n# Parse arguments\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n -n|--namespace)\n \ NAMESPACE=\"$2\"\n shift 2\n ;;\n -u|--admin-user)\n \ ADMIN_USER=\"$2\"\n shift 2\n ;;\n -h|--help)\n \ usage\n ;;\n *)\n echo \"Unknown option: $1\"\n usage\n ;;\n esac\ndone\n\n# Validate required arguments\nif [[ -z \"${NAMESPACE}\" ]]; then\n echo \"Error: Namespace is required\"\n usage\nfi\n\nif [[ -z \"${ADMIN_USER}\" ]]; then\n echo \"Error: Admin user is required\"\n usage\nfi\n\necho \"\U0001F3D7️ Creating Konflux tenant namespace: ${NAMESPACE}\"\n\n# Create the namespace with tenant label\necho \"\U0001F4E6 Creating namespace...\"\nkubectl apply -f - < ClusterRole/konflux-integration-runner\"\necho \" - RoleBinding: ${ADMIN_USER%%@*}-konflux-admin -> ClusterRole/konflux-admin-user-actions\"\n" kind: ConfigMap metadata: name: create-tenant namespace: konflux-cli --- apiVersion: v1 data: setup-release.sh: "#!/bin/bash -e\n\n# Script to set up release resources for a Konflux application.\n# Creates a managed namespace with all required resources (EnterpriseContractPolicy,\n# ImageRepositories, ReleasePlanAdmission) and a ReleasePlan in the tenant namespace.\n# Note: this script needs to be compatible with Bash 3.x to support both macOS and Linux.\n\nset -o pipefail\nset -eu\n\nWAIT_TIMEOUT=120 \ # seconds to wait for ImageRepositories to become ready\nPOLL_INTERVAL=5 # seconds between polls\n\nusage() {\n cat </dev/null || true)\n if [[ \"${state}\" == \"ready\" ]]; then\n return 0\n fi\n sleep \"${POLL_INTERVAL}\"\n elapsed=$((elapsed + POLL_INTERVAL))\n done\n echo \"Error: ImageRepository '${name}' did not become ready within ${WAIT_TIMEOUT}s\"\n echo \" Current state: $(kubectl get imagerepository \"${name}\" -n \"${MANAGED_NS}\" -o jsonpath='{.status.state}' 2>/dev/null || echo 'unknown')\"\n echo \" Message: $(kubectl get imagerepository \"${name}\" -n \"${MANAGED_NS}\" -o jsonpath='{.status.message}' 2>/dev/null || echo 'none')\"\n return 1\n}\n\n# Parse arguments\nTENANT_NS=\"default-tenant\"\nMANAGED_NS=\"default-managed-tenant\"\nAPPLICATION=\"sample-component\"\nPRODUCT_VERSION=\"0.1\"\nCONFORMA_POLICY=\"default\"\nRELEASE_NAME=\"local-release\"\n# renovate: datasource=git-refs depName=https://github.com/konflux-ci/release-service-catalog currentValue=development\nCATALOG_REVISION=\"2e68ba2def542c5ae91d17952003cbebeb5b29ab\"\nIMAGE_NAME_PREFIX=\"\"\nCOMPONENTS=()\n\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n -t|--tenant-namespace)\n TENANT_NS=\"$2\"\n \ shift 2\n ;;\n -m|--managed-namespace)\n MANAGED_NS=\"$2\"\n \ shift 2\n ;;\n -a|--application)\n APPLICATION=\"$2\"\n \ shift 2\n ;;\n -p|--product-name)\n PRODUCT_NAME=\"$2\"\n \ shift 2\n ;;\n -v|--product-version)\n PRODUCT_VERSION=\"$2\"\n \ shift 2\n ;;\n -c|--component)\n COMPONENTS+=(\"$2\")\n \ shift 2\n ;;\n -e|--conforma-policy)\n CONFORMA_POLICY=\"$2\"\n \ shift 2\n ;;\n -r|--release-name)\n RELEASE_NAME=\"$2\"\n \ shift 2\n ;;\n -R|--catalog-revision)\n CATALOG_REVISION=\"$2\"\n \ shift 2\n ;;\n -I|--image-name-prefix)\n IMAGE_NAME_PREFIX=\"$2\"\n \ shift 2\n ;;\n -h|--help)\n usage\n ;;\n \ *)\n echo \"Unknown option: $1\"\n usage\n ;;\n \ esac\ndone\n\n# Parse PRODUCT_NAME default value based on APPLICATION value (after args parsing)\nPRODUCT_NAME=${PRODUCT_NAME:-$APPLICATION}\n\n# Generate a unique image name prefix to avoid credential collisions between\n# concurrent CI runs that share the same Quay organization.\nif [[ -z \"${IMAGE_NAME_PREFIX}\" ]]; then\n RANDOM_SUFFIX=$(od -An -tx1 -N3 /dev/urandom | tr -d ' ')\n IMAGE_NAME_PREFIX=\"${MANAGED_NS}-${RANDOM_SUFFIX}\"\nfi\n\n# OpenShift registers config.openshift.io API resources. Without -o name, kubectl still exits 0\n# when the group is absent (header-only table); -o name yields no lines on vanilla k8s / Kind.\nIS_OPENSHIFT=false\nif [[ -n \"$(kubectl api-resources --api-group=config.openshift.io -o name 2>/dev/null)\" ]]; then\n IS_OPENSHIFT=true\nfi\n# Auto-detect components if none specified\nif [[ ${#COMPONENTS[@]} -eq 0 ]]; then\n \ echo \"\U0001F50D No components specified, auto-detecting from application '${APPLICATION}' in namespace '${TENANT_NS}'...\"\n while IFS= read -r line; do\n COMPONENTS+=(\"$line\")\n done < <(kubectl get components -n \"${TENANT_NS}\" \\\n -o jsonpath=\"{range .items[?(@.spec.application==\\\"${APPLICATION}\\\")]}{.metadata.name}{\\\"\\n\\\"}{end}\" \\\n 2>/dev/null | grep -v '^$')\n\n if [[ ${#COMPONENTS[@]} -eq 0 ]]; then\n echo \"Error: No components found for application '${APPLICATION}' in namespace '${TENANT_NS}'.\"\n echo \"Make sure the application and its components exist, or specify components explicitly with -c.\"\n exit 1\n \ fi\n echo \" Found ${#COMPONENTS[@]} component(s): ${COMPONENTS[*]}\"\nfi\n\necho \"\"\necho \"\U0001F3D7️ Setting up release resources\"\necho \" Tenant namespace: \ ${TENANT_NS}\"\necho \" Managed namespace: ${MANAGED_NS}\"\necho \" Application: \ ${APPLICATION}\"\necho \" Product Name: ${PRODUCT_NAME}\"\necho \" Product Version: ${PRODUCT_VERSION}\"\necho \" EC policy: ${CONFORMA_POLICY}\"\necho \" Release name: ${RELEASE_NAME}\"\necho \" Catalog revision: ${CATALOG_REVISION}\"\necho \" Image name prefix: ${IMAGE_NAME_PREFIX}\"\necho \" Components: ${COMPONENTS[*]}\"\necho \"\"\n\n# Step 1: Create managed namespace\necho \"\U0001F4E6 Creating managed namespace '${MANAGED_NS}'...\"\nkubectl apply -f - < ClusterRole/konflux-viewer-user-actions\"\necho \" - ImageRepository: trusted-artifacts\"\nfor COMPONENT in \"${COMPONENTS[@]}\"; do\n echo \" - ImageRepository: ${COMPONENT}\"\ndone\necho \" - ServiceAccount: release-pipeline (with push secrets)\"\necho \" - RoleBinding: release-pipeline-resource-role-binding -> ClusterRole/release-pipeline-resource-role\"\nif [[ \"${SSO_SECRET_CREATED}\" == \"true\" ]]; then\n echo \" - Secret: release-sso-secret (SSO credentials from 'tpa-realm-clients')\"\nelse\n echo \" - Secret: release-sso-secret (SKIPPED - Secret 'tpa-realm-client' in 'tsf' not found)\"\nfi\necho \" - ReleasePlanAdmission: ${RELEASE_NAME}\"\necho \"\"\necho \"Resources created in tenant namespace '${TENANT_NS}':\"\necho \" - ReleasePlan: ${RELEASE_NAME} -> ${MANAGED_NS}\"\n" kind: ConfigMap metadata: name: setup-release namespace: konflux-cli