diff --git a/.github/actions/build-and-sign-image/action.yml b/.github/actions/build-and-sign-image/action.yml new file mode 100644 index 000000000..1c1d69d2d --- /dev/null +++ b/.github/actions/build-and-sign-image/action.yml @@ -0,0 +1,58 @@ +name: 'Build and Sign Container Image' +description: 'Build Docker image, push to registry, and sign with Cosign' + +inputs: + image-name: + description: 'Full image name with tag (registry/repo:tag)' + required: true + dockerfile: + description: 'Path to Dockerfile' + required: false + default: './Dockerfile' + context: + description: 'Build context path' + required: false + default: '.' + sign-image: + description: 'Sign image with cosign' + required: false + default: 'true' + cosign-private-key: + description: 'Cosign private key' + required: false + cosign-password: + description: 'Cosign password' + required: false + build-args: + description: 'Additional build arguments' + required: false + default: '' + +runs: + using: 'composite' + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and Push Image + shell: bash + run: | + make docker-buildx IMG=${{ inputs.image-name }} ${{ inputs.build-args }} + + - name: Set up Cosign + if: inputs.sign-image == 'true' + uses: sigstore/cosign-installer@main + + - name: Sign Image with Cosign + if: inputs.sign-image == 'true' + shell: bash + run: | + cosign sign --yes --key env://COSIGN_PRIVATE_KEY ${{ inputs.image-name }} + env: + COSIGN_PRIVATE_KEY: ${{ inputs.cosign-private-key }} + COSIGN_PASSWORD: ${{ inputs.cosign-password }} + +outputs: + image-digest: + description: 'Image digest SHA' + value: ${{ steps.build.outputs.digest }} diff --git a/.github/actions/collect-test-artifacts/action.yml b/.github/actions/collect-test-artifacts/action.yml new file mode 100644 index 000000000..a51873696 --- /dev/null +++ b/.github/actions/collect-test-artifacts/action.yml @@ -0,0 +1,40 @@ +name: 'Collect Test Artifacts' +description: 'Collect and upload pod logs and test artifacts' + +inputs: + artifact-name: + description: 'Name for the artifact' + required: true + log-path: + description: 'Path to collect logs from' + required: false + default: './test' + additional-paths: + description: 'Additional paths to collect (newline separated)' + required: false + default: '' + +runs: + using: 'composite' + steps: + - name: Collect Test Logs + if: always() + shell: bash + run: | + mkdir -p /tmp/pod_logs + find ${{ inputs.log-path }} -name "*.log" -exec cp {} /tmp/pod_logs \; 2>/dev/null || true + + # Collect additional paths if specified + if [ -n "${{ inputs.additional-paths }}" ]; then + while IFS= read -r path; do + [ -n "$path" ] && cp -r "$path" /tmp/pod_logs/ 2>/dev/null || true + done <<< "${{ inputs.additional-paths }}" + fi + + - name: Archive Artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.artifact-name }} + path: /tmp/pod_logs/** + retention-days: 7 diff --git a/.github/actions/configure-cloud-auth/action.yml b/.github/actions/configure-cloud-auth/action.yml new file mode 100644 index 000000000..988a21517 --- /dev/null +++ b/.github/actions/configure-cloud-auth/action.yml @@ -0,0 +1,53 @@ +name: 'Configure Cloud Provider Authentication' +description: 'Setup authentication for AWS, Azure, or GCP' + +inputs: + cloud-provider: + description: 'Cloud provider: aws, azure, or gcp' + required: true + aws-access-key-id: + description: 'AWS Access Key ID' + required: false + aws-secret-access-key: + description: 'AWS Secret Access Key' + required: false + aws-region: + description: 'AWS Region' + required: false + azure-credentials: + description: 'Azure credentials JSON' + required: false + gcp-service-account-key: + description: 'GCP service account key JSON' + required: false + +runs: + using: 'composite' + steps: + - name: Configure AWS credentials + if: inputs.cloud-provider == 'aws' + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ inputs.aws-access-key-id }} + aws-secret-access-key: ${{ inputs.aws-secret-access-key }} + aws-region: ${{ inputs.aws-region }} + + - name: Login to Amazon ECR + if: inputs.cloud-provider == 'aws' + uses: aws-actions/amazon-ecr-login@v2 + + - name: Azure Login + if: inputs.cloud-provider == 'azure' + uses: azure/login@v2 + with: + creds: ${{ inputs.azure-credentials }} + + - name: GCP Authentication + if: inputs.cloud-provider == 'gcp' + uses: google-github-actions/auth@v2 + with: + credentials_json: ${{ inputs.gcp-service-account-key }} + + - name: Setup gcloud + if: inputs.cloud-provider == 'gcp' + uses: google-github-actions/setup-gcloud@v2 diff --git a/.github/actions/setup-k8s-tools/action.yml b/.github/actions/setup-k8s-tools/action.yml new file mode 100644 index 000000000..d6ae5ecb6 --- /dev/null +++ b/.github/actions/setup-k8s-tools/action.yml @@ -0,0 +1,62 @@ +name: 'Setup Kubernetes Tools' +description: 'Install kubectl, helm, eksctl, and other Kubernetes tools' + +inputs: + kubectl-version: + description: 'Kubectl version' + required: true + helm-version: + description: 'Helm version' + required: false + default: 'v3.8.2' + eksctl-version: + description: 'eksctl version' + required: false + install-metrics-server: + description: 'Install metrics server' + required: false + default: 'false' + +runs: + using: 'composite' + steps: + - name: Install Kubectl + uses: Azure/setup-kubectl@v4 + with: + version: ${{ inputs.kubectl-version }} + + - name: Install Helm + shell: bash + run: | + curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 + chmod 700 get_helm.sh + DESIRED_VERSION=${{ inputs.helm-version }} bash get_helm.sh + helm version + + - name: Install EKS CLI + if: inputs.eksctl-version != '' + shell: bash + run: | + curl --silent --insecure --location "https://github.com/weaveworks/eksctl/releases/download/${{ inputs.eksctl-version }}/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp + sudo mv /tmp/eksctl /usr/local/bin + eksctl version + + - name: Install Metrics Server + if: inputs.install-metrics-server == 'true' + shell: bash + run: | + curl -LO https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml + kubectl replace --force -f components.yaml || kubectl apply -f components.yaml + + - name: Install Kubernetes Dashboard + if: inputs.install-metrics-server == 'true' + shell: bash + run: | + kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml + + - name: Setup Kustomize + shell: bash + run: | + sudo snap install kustomize + mkdir -p ./bin + cp /snap/bin/kustomize ./bin/kustomize diff --git a/.github/actions/setup-operator-tools/action.yml b/.github/actions/setup-operator-tools/action.yml new file mode 100644 index 000000000..068b2de7e --- /dev/null +++ b/.github/actions/setup-operator-tools/action.yml @@ -0,0 +1,36 @@ +name: 'Setup Operator Development Tools' +description: 'Install Operator SDK, Ginkgo, and other operator development tools' + +inputs: + operator-sdk-version: + description: 'Operator SDK version to install' + required: true + go-version: + description: 'Go version for setup' + required: true + +runs: + using: 'composite' + steps: + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: ${{ inputs.go-version }} + cache: false + + - name: Install Operator SDK + shell: bash + run: | + export ARCH=$(case $(uname -m) in x86_64) echo -n amd64 ;; aarch64) echo -n arm64 ;; *) echo -n $(uname -m) ;; esac) + export OS=$(uname | awk '{print tolower($0)}') + export OPERATOR_SDK_DL_URL=https://github.com/operator-framework/operator-sdk/releases/download/${{ inputs.operator-sdk-version }} + sudo curl -LO ${OPERATOR_SDK_DL_URL}/operator-sdk_${OS}_${ARCH} + sudo chmod +x operator-sdk_${OS}_${ARCH} + sudo mv operator-sdk_${OS}_${ARCH} /usr/local/bin/operator-sdk + operator-sdk version + + - name: Install Ginkgo + shell: bash + run: | + make setup/ginkgo + go mod tidy diff --git a/.github/workflows/modernized-build-test-push.yml b/.github/workflows/modernized-build-test-push.yml new file mode 100644 index 000000000..2a6f2b7dc --- /dev/null +++ b/.github/workflows/modernized-build-test-push.yml @@ -0,0 +1,152 @@ +name: 'Build and Test (Modernized)' + +# This is a modernized version of build-test-push-workflow.yml +# Uses composite actions and reusable workflows to reduce duplication + +on: + pull_request: {} + push: + branches: + - main + - develop + - workflow-fix # Added for testing + workflow_dispatch: {} # Allow manual trigger + +jobs: + check-formatting: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Load environment variables + id: dotenv + uses: falti/dotenv-action@d4d12eaa0e1dd06d5bdc3d7af3bf4c8c93cb5359 + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: ${{ steps.dotenv.outputs.GO_VERSION }} + cache: false + + - name: Check Source Formatting + run: make fmt && if [[ $? -ne 0 ]]; then false; fi + + - name: Lint Source Code + run: make vet && if [[ $? -ne 0 ]]; then false; fi + + unit-tests: + runs-on: ubuntu-latest + needs: check-formatting + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Load environment variables + id: dotenv + uses: falti/dotenv-action@d4d12eaa0e1dd06d5bdc3d7af3bf4c8c93cb5359 + + - name: Setup Operator Tools + uses: ./.github/actions/setup-operator-tools + with: + operator-sdk-version: ${{ steps.dotenv.outputs.OPERATOR_SDK_VERSION }} + go-version: ${{ steps.dotenv.outputs.GO_VERSION }} + + - name: Run Unit Tests + run: make test + + - name: Install Goveralls + run: go install github.com/mattn/goveralls@latest + + - name: Run Code Coverage + run: goveralls -coverprofile=coverage.out -service=circle-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} + + - name: Upload Coverage Artifacts + uses: actions/upload-artifact@v4 + with: + name: coverage.out + path: coverage.out + + build-operator-image: + needs: unit-tests + permissions: + actions: read + contents: read + security-events: write + uses: ./.github/workflows/reusable-build-operator.yml + with: + sign-image: true + run-vulnerability-scan: true + secrets: + ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} + COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }} + COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }} + COSIGN_PUBLIC_KEY: ${{ secrets.COSIGN_PUBLIC_KEY }} + + load-env: + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + splunk-enterprise-release-image: ${{ steps.dotenv.outputs.SPLUNK_ENTERPRISE_RELEASE_IMAGE }} + is-main-branch: ${{ steps.check-branch.outputs.is-main }} + steps: + - uses: actions/checkout@v4 + - name: Load environment variables + id: dotenv + uses: falti/dotenv-action@d4d12eaa0e1dd06d5bdc3d7af3bf4c8c93cb5359 + - name: Check if main branch + id: check-branch + run: | + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + echo "is-main=true" >> $GITHUB_OUTPUT + else + echo "is-main=false" >> $GITHUB_OUTPUT + fi + + smoke-tests: + needs: [build-operator-image, load-env] + permissions: + contents: read + strategy: + fail-fast: false + matrix: + test: + - basic + - appframeworksS1 + - managerappframeworkc3 + - managerappframeworkm4 + - managersecret + - managermc + uses: ./.github/workflows/reusable-integration-test.yml + with: + cluster-platform: eks + test-focus: ${{ matrix.test }} + cluster-name: eks-smoke-test-${{ matrix.test }}-${{ github.run_id }} + cluster-workers: ${{ contains(matrix.test, 'appframework') && 5 || 3 }} + cluster-nodes: ${{ contains(matrix.test, 'appframework') && 2 || 1 }} + # Images will be constructed in reusable workflow from secrets + splunk-operator-image: '' + splunk-enterprise-image: '' + # Pass release image info for main branch + use-release-enterprise-image: ${{ needs.load-env.outputs.is-main-branch == 'true' }} + release-enterprise-image: ${{ needs.load-env.outputs.splunk-enterprise-release-image }} + cluster-wide: true + secrets: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} + ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} + SPLUNK_ENTERPRISE_IMAGE: ${{ secrets.SPLUNK_ENTERPRISE_IMAGE }} + TEST_BUCKET: ${{ secrets.TEST_BUCKET }} + TEST_INDEXES_S3_BUCKET: ${{ secrets.TEST_INDEXES_S3_BUCKET }} + EKS_VPC_PRIVATE_SUBNET_STRING: ${{ secrets.EKS_VPC_PRIVATE_SUBNET_STRING }} + EKS_VPC_PUBLIC_SUBNET_STRING: ${{ secrets.EKS_VPC_PUBLIC_SUBNET_STRING }} + EKS_SSH_PUBLIC_KEY: ${{ secrets.EKS_SSH_PUBLIC_KEY }} diff --git a/.github/workflows/reusable-build-operator.yml b/.github/workflows/reusable-build-operator.yml new file mode 100644 index 000000000..39ad9e746 --- /dev/null +++ b/.github/workflows/reusable-build-operator.yml @@ -0,0 +1,156 @@ +name: 'Reusable Build Operator Image' + +on: + workflow_call: + inputs: + image-tag: + description: 'Image tag (default: github.sha)' + required: false + type: string + default: '' + dockerfile: + description: 'Dockerfile path' + required: false + type: string + default: './Dockerfile' + base-image: + description: 'Base image for build' + required: false + type: string + default: '' + sign-image: + description: 'Sign image with cosign' + required: false + type: boolean + default: true + run-vulnerability-scan: + description: 'Run Trivy vulnerability scan' + required: false + type: boolean + default: true + secrets: + ECR_REPOSITORY: + required: true + AWS_ACCESS_KEY_ID: + required: true + AWS_SECRET_ACCESS_KEY: + required: true + AWS_DEFAULT_REGION: + required: true + COSIGN_PRIVATE_KEY: + required: false + COSIGN_PASSWORD: + required: false + COSIGN_PUBLIC_KEY: + required: false + outputs: + image-name: + description: 'Full image name with tag' + value: ${{ jobs.build.outputs.image-name }} + image-digest: + description: 'Image digest' + value: ${{ jobs.build.outputs.image-digest }} + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + image-name: ${{ steps.set-image.outputs.image-name }} + image-digest: ${{ steps.build.outputs.digest }} + env: + SPLUNK_OPERATOR_IMAGE_NAME: splunk/splunk-operator + ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Load environment variables + id: dotenv + uses: falti/dotenv-action@d4d12eaa0e1dd06d5bdc3d7af3bf4c8c93cb5359 + + - name: Setup Operator Tools + uses: ./.github/actions/setup-operator-tools + with: + operator-sdk-version: ${{ steps.dotenv.outputs.OPERATOR_SDK_VERSION }} + go-version: ${{ steps.dotenv.outputs.GO_VERSION }} + + - name: Setup Cloud Authentication + uses: ./.github/actions/configure-cloud-auth + with: + cloud-provider: aws + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_DEFAULT_REGION }} + + - name: Set Image Name + id: set-image + run: | + TAG="${{ inputs.image-tag }}" + if [ -z "$TAG" ]; then + TAG="${{ github.sha }}" + fi + IMAGE_NAME="${{ secrets.ECR_REPOSITORY }}/${{ env.SPLUNK_OPERATOR_IMAGE_NAME }}:${TAG}" + echo "image-name=${IMAGE_NAME}" >> $GITHUB_OUTPUT + echo "Building image: ${IMAGE_NAME}" + + - name: Build and Sign Image + id: build + uses: ./.github/actions/build-and-sign-image + with: + image-name: ${{ steps.set-image.outputs.image-name }} + dockerfile: ${{ inputs.dockerfile }} + sign-image: ${{ inputs.sign-image }} + cosign-private-key: ${{ secrets.COSIGN_PRIVATE_KEY }} + cosign-password: ${{ secrets.COSIGN_PASSWORD }} + build-args: ${{ inputs.base-image != '' && format('BASE_IMAGE={0}', inputs.base-image) || '' }} + + vulnerability-scan: + if: inputs.run-vulnerability-scan + needs: build + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + env: + SPLUNK_OPERATOR_IMAGE_NAME: splunk/splunk-operator + IMAGE_TAG: ${{ inputs.image-tag || github.sha }} + FULL_IMAGE_NAME: ${{ secrets.ECR_REPOSITORY }}/splunk/splunk-operator:${{ inputs.image-tag || github.sha }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Cloud Authentication + uses: ./.github/actions/configure-cloud-auth + with: + cloud-provider: aws + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_DEFAULT_REGION }} + + - name: Login to Amazon ECR + run: | + aws ecr get-login-password --region ${{ secrets.AWS_DEFAULT_REGION }} | docker login --username AWS --password-stdin ${{ secrets.ECR_REPOSITORY }} + + - name: Pull Image + run: | + echo "Pulling image: ${{ env.FULL_IMAGE_NAME }}" + docker pull ${{ env.FULL_IMAGE_NAME }} + + - name: Run Trivy Vulnerability Scanner + uses: aquasecurity/trivy-action@master + with: + image-ref: ${{ env.FULL_IMAGE_NAME }} + format: sarif + severity: 'CRITICAL,HIGH' + ignore-unfixed: true + output: trivy-results.sarif + + - name: Upload Trivy Results to GitHub Security + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: trivy-results.sarif diff --git a/.github/workflows/reusable-integration-test.yml b/.github/workflows/reusable-integration-test.yml new file mode 100644 index 000000000..2d34ee2cf --- /dev/null +++ b/.github/workflows/reusable-integration-test.yml @@ -0,0 +1,206 @@ +name: 'Reusable Integration Test' + +on: + workflow_call: + inputs: + cluster-platform: + description: 'Cloud platform: eks, azure, or gcp' + required: true + type: string + test-focus: + description: 'Test focus pattern' + required: true + type: string + cluster-name: + description: 'Cluster name' + required: true + type: string + cluster-workers: + description: 'Number of worker nodes' + required: false + type: number + default: 3 + cluster-nodes: + description: 'Number of control plane nodes' + required: false + type: number + default: 1 + splunk-operator-image: + description: 'Splunk operator image to test (if empty, will be constructed from ECR_REPOSITORY)' + required: false + type: string + default: '' + splunk-enterprise-image: + description: 'Splunk enterprise image to test (if empty, will use secret)' + required: false + type: string + default: '' + use-release-enterprise-image: + description: 'Use release enterprise image from env file' + required: false + type: boolean + default: false + release-enterprise-image: + description: 'Release enterprise image name from env file' + required: false + type: string + default: '' + cluster-wide: + description: 'Deploy operator cluster-wide' + required: false + type: boolean + default: true + deployment-type: + description: 'Deployment type (empty, helm, etc.)' + required: false + type: string + default: '' + secrets: + AWS_ACCESS_KEY_ID: + required: false + AWS_SECRET_ACCESS_KEY: + required: false + AWS_DEFAULT_REGION: + required: false + AZURE_CREDENTIALS: + required: false + GCP_SERVICE_ACCOUNT_KEY: + required: false + ECR_REPOSITORY: + required: false + SPLUNK_ENTERPRISE_IMAGE: + required: false + TEST_BUCKET: + required: false + TEST_INDEXES_S3_BUCKET: + required: false + EKS_VPC_PRIVATE_SUBNET_STRING: + required: false + EKS_VPC_PUBLIC_SUBNET_STRING: + required: false + EKS_SSH_PUBLIC_KEY: + required: false + +jobs: + integration-test: + runs-on: ubuntu-latest + permissions: + contents: read + env: + CLUSTER_NODES: ${{ inputs.cluster-nodes }} + CLUSTER_WORKERS: ${{ inputs.cluster-workers }} + TEST_FOCUS: ${{ inputs.test-focus }} + TEST_CLUSTER_PLATFORM: ${{ inputs.cluster-platform }} + TEST_CLUSTER_NAME: ${{ inputs.cluster-name }} + ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} + ECR_REGISTRY: ${{ secrets.ECR_REPOSITORY }} + TEST_BUCKET: ${{ secrets.TEST_BUCKET }} + TEST_INDEXES_S3_BUCKET: ${{ secrets.TEST_INDEXES_S3_BUCKET }} + CLUSTER_WIDE: ${{ inputs.cluster-wide }} + DEPLOYMENT_TYPE: ${{ inputs.deployment-type }} + # SPLUNK_ENTERPRISE_IMAGE and SPLUNK_OPERATOR_IMAGE are set dynamically in "Set Image Names" step + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set Image Names + id: set-images + run: | + echo "=== Setting Image Names ===" + + # Set operator image (construct if empty) + if [ -z "${{ inputs.splunk-operator-image }}" ]; then + OPERATOR_IMAGE="${{ secrets.ECR_REPOSITORY }}/splunk/splunk-operator:${{ github.sha }}" + echo "SPLUNK_OPERATOR_IMAGE=${OPERATOR_IMAGE}" >> $GITHUB_ENV + echo "✓ Constructed operator image: ${OPERATOR_IMAGE}" + else + echo "SPLUNK_OPERATOR_IMAGE=${{ inputs.splunk-operator-image }}" >> $GITHUB_ENV + echo "✓ Using provided operator image: ${{ inputs.splunk-operator-image }}" + fi + + # Set enterprise image (use release or secret based on input) + if [ -z "${{ inputs.splunk-enterprise-image }}" ]; then + if [ "${{ inputs.use-release-enterprise-image }}" == "true" ]; then + ENTERPRISE_IMAGE="${{ inputs.release-enterprise-image }}" + echo "✓ Using release enterprise image: ${ENTERPRISE_IMAGE}" + else + ENTERPRISE_IMAGE="${{ secrets.SPLUNK_ENTERPRISE_IMAGE }}" + echo "✓ Using secret enterprise image (from SPLUNK_ENTERPRISE_IMAGE secret)" + fi + + if [ -z "${ENTERPRISE_IMAGE}" ]; then + echo "❌ ERROR: Enterprise image is empty!" + echo " - use-release-enterprise-image: ${{ inputs.use-release-enterprise-image }}" + echo " - release-enterprise-image: ${{ inputs.release-enterprise-image }}" + echo " - SPLUNK_ENTERPRISE_IMAGE secret is not set or empty" + exit 1 + fi + + echo "SPLUNK_ENTERPRISE_IMAGE=${ENTERPRISE_IMAGE}" >> $GITHUB_ENV + else + echo "SPLUNK_ENTERPRISE_IMAGE=${{ inputs.splunk-enterprise-image }}" >> $GITHUB_ENV + echo "✓ Using provided enterprise image: ${{ inputs.splunk-enterprise-image }}" + fi + + echo "=== Image Names Set Successfully ===" + + - name: Load environment variables + id: dotenv + uses: falti/dotenv-action@d4d12eaa0e1dd06d5bdc3d7af3bf4c8c93cb5359 + + - name: Setup Operator Tools + uses: ./.github/actions/setup-operator-tools + with: + operator-sdk-version: ${{ steps.dotenv.outputs.OPERATOR_SDK_VERSION }} + go-version: ${{ steps.dotenv.outputs.GO_VERSION }} + + - name: Setup Kubernetes Tools + uses: ./.github/actions/setup-k8s-tools + with: + kubectl-version: ${{ steps.dotenv.outputs.KUBECTL_VERSION }} + helm-version: v3.8.2 + eksctl-version: ${{ steps.dotenv.outputs.EKSCTL_VERSION }} + + - name: Setup Cloud Authentication + uses: ./.github/actions/configure-cloud-auth + with: + cloud-provider: ${{ inputs.cluster-platform == 'eks' && 'aws' || inputs.cluster-platform == 'azure' && 'azure' || 'gcp' }} + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_DEFAULT_REGION }} + azure-credentials: ${{ secrets.AZURE_CREDENTIALS }} + gcp-service-account-key: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }} + + - name: Create Cluster + run: | + export EKS_CLUSTER_K8_VERSION=${{ steps.dotenv.outputs.EKS_CLUSTER_K8_VERSION }} + make cluster-up + + - name: Install Kubernetes Add-ons + uses: ./.github/actions/setup-k8s-tools + with: + kubectl-version: ${{ steps.dotenv.outputs.KUBECTL_VERSION }} + install-metrics-server: 'true' + + - name: Run Integration Tests + id: test + run: | + make int-test + + - name: Collect Test Artifacts + if: always() + uses: ./.github/actions/collect-test-artifacts + with: + artifact-name: test-logs-${{ inputs.cluster-platform }}-${{ inputs.test-focus }} + + - name: Cleanup Test Artifacts + if: always() + run: | + make cleanup + make clean + + - name: Cleanup Cluster + if: always() + run: | + make cluster-down diff --git a/.github/workflows/reusable-verify-image.yml b/.github/workflows/reusable-verify-image.yml new file mode 100644 index 000000000..b8835bea8 --- /dev/null +++ b/.github/workflows/reusable-verify-image.yml @@ -0,0 +1,105 @@ +name: 'Reusable Image Verification' + +# This workflow verifies container image signatures using cosign +# Use this before deploying images to production or when consuming images from external sources + +on: + workflow_call: + inputs: + image-name: + description: 'Full image name with tag to verify (registry/repo:tag)' + required: true + type: string + cloud-provider: + description: 'Cloud provider for authentication (aws, azure, gcp)' + required: false + type: string + default: 'aws' + secrets: + # AWS Secrets + AWS_ACCESS_KEY_ID: + required: false + AWS_SECRET_ACCESS_KEY: + required: false + AWS_DEFAULT_REGION: + required: false + ECR_REPOSITORY: + required: false + # Azure Secrets + AZURE_CREDENTIALS: + required: false + # GCP Secrets + GCP_SERVICE_ACCOUNT_KEY: + required: false + # Cosign Public Key + COSIGN_PUBLIC_KEY: + required: true + outputs: + verified: + description: 'Whether the image signature was verified successfully' + value: ${{ jobs.verify.outputs.verified }} + +jobs: + verify: + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + verified: ${{ steps.verify.outputs.verified }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Cloud Authentication + uses: ./.github/actions/configure-cloud-auth + with: + cloud-provider: ${{ inputs.cloud-provider }} + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_DEFAULT_REGION }} + azure-credentials: ${{ secrets.AZURE_CREDENTIALS }} + gcp-service-account-key: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }} + + - name: Login to Container Registry + run: | + case "${{ inputs.cloud-provider }}" in + aws) + aws ecr get-login-password --region ${{ secrets.AWS_DEFAULT_REGION }} | docker login --username AWS --password-stdin ${{ secrets.ECR_REPOSITORY }} + ;; + azure) + # Azure login handled by configure-cloud-auth + echo "Azure registry login handled by authentication step" + ;; + gcp) + # GCP login handled by configure-cloud-auth + echo "GCP registry login handled by authentication step" + ;; + esac + + - name: Set up Cosign + uses: sigstore/cosign-installer@main + + - name: Verify Image Signature + id: verify + run: | + echo "Verifying signature for image: ${{ inputs.image-name }}" + + if cosign verify --key env://COSIGN_PUBLIC_KEY ${{ inputs.image-name }}; then + echo "✅ Image signature verified successfully!" + echo "verified=true" >> $GITHUB_OUTPUT + else + echo "❌ Image signature verification failed!" + echo "verified=false" >> $GITHUB_OUTPUT + exit 1 + fi + env: + COSIGN_PUBLIC_KEY: ${{ secrets.COSIGN_PUBLIC_KEY }} + + - name: Display Verification Result + run: | + echo "## Image Signature Verification" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Image**: \`${{ inputs.image-name }}\`" >> $GITHUB_STEP_SUMMARY + echo "**Status**: ✅ Verified" >> $GITHUB_STEP_SUMMARY + echo "**Timestamp**: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/test-composite-actions.yml b/.github/workflows/test-composite-actions.yml new file mode 100644 index 000000000..200788122 --- /dev/null +++ b/.github/workflows/test-composite-actions.yml @@ -0,0 +1,109 @@ +name: 'Test Composite Actions' + +# This workflow tests the new composite actions on the workflow-fix branch +on: + push: + branches: + - workflow-fix + workflow_dispatch: {} + +permissions: + contents: read + +jobs: + test-setup-operator-tools: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Load environment variables + id: dotenv + uses: falti/dotenv-action@d4d12eaa0e1dd06d5bdc3d7af3bf4c8c93cb5359 + + - name: Test setup-operator-tools + uses: ./.github/actions/setup-operator-tools + with: + operator-sdk-version: ${{ steps.dotenv.outputs.OPERATOR_SDK_VERSION }} + go-version: ${{ steps.dotenv.outputs.GO_VERSION }} + + - name: Verify installations + run: | + echo "=== Go Version ===" + go version + echo "" + echo "=== Operator SDK Version ===" + operator-sdk version + echo "" + echo "✅ setup-operator-tools composite action works!" + + test-setup-k8s-tools: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Load environment variables + id: dotenv + uses: falti/dotenv-action@d4d12eaa0e1dd06d5bdc3d7af3bf4c8c93cb5359 + + - name: Test setup-k8s-tools + uses: ./.github/actions/setup-k8s-tools + with: + kubectl-version: ${{ steps.dotenv.outputs.KUBECTL_VERSION }} + helm-version: v3.8.2 + eksctl-version: ${{ steps.dotenv.outputs.EKSCTL_VERSION }} + + - name: Verify installations + run: | + echo "=== Kubectl Version ===" + kubectl version --client + echo "" + echo "=== Helm Version ===" + helm version + echo "" + echo "=== eksctl Version ===" + eksctl version + echo "" + echo "✅ setup-k8s-tools composite action works!" + + test-cloud-auth: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Test AWS authentication + uses: ./.github/actions/configure-cloud-auth + with: + cloud-provider: aws + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_DEFAULT_REGION }} + + - name: Verify AWS authentication + run: | + echo "=== AWS Identity ===" + aws sts get-caller-identity + echo "" + echo "✅ configure-cloud-auth composite action works for AWS!" + + summary: + needs: [test-setup-operator-tools, test-setup-k8s-tools, test-cloud-auth] + runs-on: ubuntu-latest + steps: + - name: Test Summary + run: | + echo "==========================================" + echo "✅ All composite actions tested successfully!" + echo "==========================================" + echo "" + echo "Tested actions:" + echo " ✅ setup-operator-tools" + echo " ✅ setup-k8s-tools" + echo " ✅ configure-cloud-auth" + echo "" + echo "Next steps:" + echo " 1. Review the workflow logs above" + echo " 2. Verify all tools were installed correctly" + echo " 3. Proceed with migrating existing workflows" diff --git a/cmd/main.go b/cmd/main.go index 6a152ce16..f8aba0ae1 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -107,11 +107,11 @@ func main() { // as certificates issued by a trusted Certificate Authority (CA). The primary risk is potentially allowing // unauthorized access to sensitive metrics data. Consider replacing with CertDir, CertName, and KeyName // to provide certificates, ensuring the server communicates using trusted and secure certificates. - TLSOpts: tlsOpts, + TLSOpts: tlsOpts, FilterProvider: filters.WithAuthenticationAndAuthorization, } - // TODO: enable https for /metrics endpoint by default + // TODO: enable https for /metrics endpoint by default // if secureMetrics { // // FilterProvider is used to protect the metrics endpoint with authn/authz. // // These configurations ensure that only authorized users and service accounts diff --git a/go.mod b/go.mod index 8f24791da..be7f49103 100644 --- a/go.mod +++ b/go.mod @@ -12,13 +12,13 @@ require ( github.com/aws/aws-sdk-go-v2/credentials v1.17.71 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.85 github.com/aws/aws-sdk-go-v2/service/s3 v1.84.1 - github.com/go-logr/logr v1.4.2 + github.com/go-logr/logr v1.4.3 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 github.com/minio/minio-go/v7 v7.0.16 - github.com/onsi/ginkgo/v2 v2.23.4 - github.com/onsi/gomega v1.38.0 + github.com/onsi/ginkgo/v2 v2.27.2 + github.com/onsi/gomega v1.38.2 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.19.1 github.com/stretchr/testify v1.9.0 @@ -39,6 +39,7 @@ require ( cloud.google.com/go/iam v1.1.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect @@ -124,18 +125,19 @@ require ( go.opentelemetry.io/otel/sdk v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect - go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.39.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.41.0 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect - golang.org/x/net v0.41.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.26.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.33.0 // indirect + golang.org/x/tools v0.36.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect @@ -143,7 +145,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + google.golang.org/protobuf v1.36.7 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.66.4 // indirect diff --git a/go.sum b/go.sum index 107db504c..eaedcc1fc 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1/go.mod h1:ap1dmS6vQK github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= @@ -115,9 +117,15 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -131,6 +139,8 @@ github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogB github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= @@ -201,6 +211,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -224,6 +236,10 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/minio-go/v7 v7.0.16 h1:GspaSBS8lOuEUCAqMe0W3UxSoyOA4b4F8PTspRVI+k4= @@ -245,10 +261,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= -github.com/onsi/gomega v1.38.0 h1:c/WX+w8SLAinvuKKQFh77WEucCnPk4j2OTUr7lt7BeY= -github.com/onsi/gomega v1.38.0/go.mod h1:OcXcwId0b9QsE7Y49u+BTrL4IdKOBOKnD6VQNTJEB6o= +github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= +github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -256,8 +272,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -268,8 +282,8 @@ github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65 github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -299,6 +313,14 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/wk8/go-ordered-map/v2 v2.1.7 h1:aUZ1xBMdbvY8wnNt77qqo4nyT3y0pX4Usat48Vm+hik= github.com/wk8/go-ordered-map/v2 v2.1.7/go.mod h1:9Xvgm2mV2kSq2SAm0Y608tBmu8akTzI7c2bz7/G7ZN4= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -325,22 +347,22 @@ go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVf go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= @@ -350,6 +372,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -366,12 +390,10 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -381,8 +403,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -397,21 +419,21 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -424,8 +446,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -471,8 +493,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/test/secret/manager_secret_m4_test.go b/test/secret/manager_secret_m4_test.go index 526af6d31..fdf2d2a31 100644 --- a/test/secret/manager_secret_m4_test.go +++ b/test/secret/manager_secret_m4_test.go @@ -17,8 +17,8 @@ import ( "context" "fmt" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" enterpriseApi "github.com/splunk/splunk-operator/api/v4" diff --git a/test/secret/manager_secret_s1_test.go b/test/secret/manager_secret_s1_test.go index d51e004fd..123538317 100644 --- a/test/secret/manager_secret_s1_test.go +++ b/test/secret/manager_secret_s1_test.go @@ -19,8 +19,8 @@ import ( enterpriseApi "github.com/splunk/splunk-operator/api/v4" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" diff --git a/test/secret/secret_c3_test.go b/test/secret/secret_c3_test.go index 90bb9fe9c..698c84786 100644 --- a/test/secret/secret_c3_test.go +++ b/test/secret/secret_c3_test.go @@ -19,8 +19,8 @@ import ( enterpriseApi "github.com/splunk/splunk-operator/api/v4" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" "github.com/splunk/splunk-operator/test/testenv" diff --git a/test/secret/secret_m4_test.go b/test/secret/secret_m4_test.go index f257e70ce..e40d94cfd 100644 --- a/test/secret/secret_m4_test.go +++ b/test/secret/secret_m4_test.go @@ -19,8 +19,8 @@ import ( enterpriseApi "github.com/splunk/splunk-operator/api/v4" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" "github.com/splunk/splunk-operator/test/testenv" diff --git a/test/secret/secret_s1_test.go b/test/secret/secret_s1_test.go index 11c621815..fc7a0e47d 100644 --- a/test/secret/secret_s1_test.go +++ b/test/secret/secret_s1_test.go @@ -19,8 +19,8 @@ import ( enterpriseApi "github.com/splunk/splunk-operator/api/v4" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" diff --git a/test/smartstore/manager_smartstore_test.go b/test/smartstore/manager_smartstore_test.go index 45db78875..b90a68337 100644 --- a/test/smartstore/manager_smartstore_test.go +++ b/test/smartstore/manager_smartstore_test.go @@ -7,8 +7,8 @@ import ( enterpriseApi "github.com/splunk/splunk-operator/api/v4" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" "github.com/splunk/splunk-operator/test/testenv" diff --git a/test/smartstore/smartstore_test.go b/test/smartstore/smartstore_test.go index f1c330a66..c2d550411 100644 --- a/test/smartstore/smartstore_test.go +++ b/test/smartstore/smartstore_test.go @@ -5,8 +5,8 @@ import ( "fmt" "time" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" enterpriseApiV3 "github.com/splunk/splunk-operator/api/v3" diff --git a/test/smoke/smoke_test.go b/test/smoke/smoke_test.go index 9c0a609e6..de4d26e88 100644 --- a/test/smoke/smoke_test.go +++ b/test/smoke/smoke_test.go @@ -17,8 +17,8 @@ import ( "context" "fmt" - "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" "github.com/splunk/splunk-operator/test/testenv"