[
  {
    "path": ".atlassian/OWNER",
    "content": "abrokes"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "*       @nanux @yzha645 @bianchi2 @kush982 @amierzwicki @pbhardwaj6 @jainanshul43 @jwitowski-atl\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/FEATURE.yml",
    "content": "name: Feature request\ndescription: Do you have an idea or suggestion for a Helm charts improvement?\ntitle: \"[Suggestion] - \"\nlabels: [suggestion, triage]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        ## 💡 Feature requests only 💡\n        \n        Thanks for taking the time to suggest a new feature! If you are experiencing issues in Helm chart installation, please read [Supported Boundaries document](https://atlassian.github.io/data-center-helm-charts/troubleshooting/SUPPORT_BOUNDARIES/) and contact [Atlassian Support directly](https://support.atlassian.com/contact/).\n  - type: textarea\n    id: suggestion-description\n    attributes:\n      label: Suggestion\n      description: Describe your idea in detail, including the use case when it will be useful\n    validations:\n      required: true\n  - type: dropdown\n    id: version\n    attributes:\n      label: Product\n      description: You can select multiple products\n      options:\n        - Jira\n        - Confluence\n        - Bitbucket\n        - Other\n      multiple: true\n    validations:\n      required: false\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Code of Conduct\n      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/atlassian/data-center-helm-charts/blob/main/CODE_OF_CONDUCT.md)\n      options:\n        - label: I agree to follow this project's Code of Conduct\n          required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: ⚠️ Support boundaries ⚠️\n    url: https://atlassian.github.io/data-center-helm-charts/troubleshooting/SUPPORT_BOUNDARIES/\n    about: Please read the scope of support before raising an issue\n  - name: Helm installation issues\n    url: https://support.atlassian.com/contact/\n    about: Contact Atlassian Support with issues relating to Helm installation\n  - name: Q & A Community forum\n    url: https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes\n    about: For anyone who’s interested in learning more about K8s, and how they can deploy their Data Center products using the Helm Charts\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Pull request description\n\n_Provide description for the PR_\n\n## Checklist\n- [ ] I have added unit tests\n- [ ] I have applied the change to all applicable products\n- [ ] The E2E test has passed (use `e2e` label)\n"
  },
  {
    "path": ".github/workflows/crc.yaml",
    "content": "# This workflow is for testing Helm charts in MicroShift\n\nname: DC Tests in MicroShift\n\non:\n  schedule:\n    - cron: '0 3 */2 * *' # schedule the test to run every second day at 3:00am\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths:\n      - 'src/main/charts/bamboo/**'\n      - 'src/main/charts/bamboo-agent/**'\n      - 'src/main/charts/bitbucket/**'\n      - 'src/main/charts/confluence/**'\n      - 'src/main/charts/jira/**'\n      - 'src/main/charts/crowd/**'\n  pull_request_target:\n    types: [ labeled ]\n\njobs:\n  jira:\n    uses: ./.github/workflows/openshift.yaml\n    with:\n      dc_app: jira\n    secrets:\n      JIRA_LICENSE: \"${{ secrets.JIRA_LICENSE }}\"\n      OPENSHIFT_PULL_SECRET: \"${{ secrets.OPENSHIFT_PULL_SECRET }}\"\n\n  confluence:\n    uses: ./.github/workflows/openshift.yaml\n    with:\n      dc_app: confluence\n    secrets:\n      CONFLUENCE_LICENSE: \"${{ secrets.TF_VAR_CONFLUENCE_LICENSE }}\"\n      OPENSHIFT_PULL_SECRET: \"${{ secrets.OPENSHIFT_PULL_SECRET }}\"\n\n  bitbucket:\n    uses: ./.github/workflows/openshift.yaml\n    with:\n      dc_app: bitbucket\n    secrets:\n      BITBUCKET_LICENSE: \"${{ secrets.TF_VAR_BITBUCKET_LICENSE }}\"\n      OPENSHIFT_PULL_SECRET: \"${{ secrets.OPENSHIFT_PULL_SECRET }}\"\n\n  bamboo:\n    uses: ./.github/workflows/openshift.yaml\n    with:\n      dc_app: bamboo\n    secrets:\n      BAMBOO_LICENSE: \"${{ secrets.TF_VAR_BAMBOO_LICENSE }}\"\n      OPENSHIFT_PULL_SECRET: \"${{ secrets.OPENSHIFT_PULL_SECRET }}\"\n\n  crowd:\n    uses: ./.github/workflows/openshift.yaml\n    with:\n      dc_app: crowd\n    secrets:\n      OPENSHIFT_PULL_SECRET: \"${{ secrets.OPENSHIFT_PULL_SECRET }}\"\n"
  },
  {
    "path": ".github/workflows/dc-tests.yml",
    "content": "# This workflow is for testing Helm charts in KinD clusters\n\nname: DC apps tests in KinD\n\non:\n  schedule:\n    - cron: '0 3 */2 * *' # schedule the test to run every second day at 3:00am\n  push:\n    branches:\n      - main\n    paths:\n      - 'src/main/charts/bamboo/**'\n      - 'src/main/charts/bamboo-agent/**'\n      - 'src/main/charts/bitbucket/**'\n      - 'src/main/charts/confluence/**'\n      - 'src/main/charts/jira/**'\n      - 'src/main/charts/crowd/**'\n  workflow_dispatch:\n  pull_request_target:\n    types: [ labeled ]\n\njobs:\n  jira:\n    uses: ./.github/workflows/kind.yaml\n    with:\n      dc_app: jira\n    secrets:\n      JIRA_LICENSE: \"${{ secrets.JIRA_LICENSE }}\"\n\n  confluence:\n    uses: ./.github/workflows/kind.yaml\n    with:\n      dc_app: confluence\n    secrets:\n      CONFLUENCE_LICENSE: \"${{ secrets.TF_VAR_CONFLUENCE_LICENSE }}\"\n\n  bitbucket:\n    uses: ./.github/workflows/kind.yaml\n    with:\n      dc_app: bitbucket\n    secrets:\n      BITBUCKET_LICENSE: \"${{ secrets.TF_VAR_BITBUCKET_LICENSE }}\"\n\n  bamboo:\n    uses: ./.github/workflows/kind.yaml\n    with:\n      dc_app: bamboo\n    secrets:\n      BAMBOO_LICENSE: \"${{ secrets.TF_VAR_BAMBOO_LICENSE }}\"\n\n  crowd:\n    uses: ./.github/workflows/kind.yaml\n    with:\n      dc_app: crowd\n"
  },
  {
    "path": ".github/workflows/documentation-build.yaml",
    "content": "name: Documentation - Build\non:\n  pull_request:\njobs:\n  deploy:\n    runs-on: ubuntu-24.04\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.x\n      - name: Install mkdocs requirements\n        run: pip install -r requirements.txt\n        working-directory: docs\n      - name: Publish documentation to gp-pages branch\n        run: mkdocs build\n        working-directory: docs\n"
  },
  {
    "path": ".github/workflows/documentation-deploy.yaml",
    "content": "name: Documentation - Deploy\non:\n  push:\n    branches:\n      - main\njobs:\n  deploy:\n    runs-on: ubuntu-24.04\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.x\n      - name: Install mkdocs requirements\n        run: pip install -r requirements.txt\n        working-directory: docs\n      - name: Publish documentation to gp-pages branch\n        run: mkdocs gh-deploy --force\n        working-directory: docs\n"
  },
  {
    "path": ".github/workflows/e2e-tf-deployment.yaml",
    "content": "name: Helm Charts E2E Testing\non:\n  schedule:\n    - cron: '0 3 */2 * *' # schedule the test to run every second day at 3:00am\n  push:\n    branches:\n      - main\n    paths:\n      - 'src/main/charts/bamboo/**'\n      - 'src/main/charts/bamboo-agent/**'\n      - 'src/main/charts/bitbucket/**'\n      - 'src/main/charts/confluence/**'\n      - 'src/main/charts/jira/**'\n      - 'src/main/charts/crowd/**'\n  pull_request_target:\n    types: [ labeled ]\n  workflow_dispatch:\n    inputs:\n      use_gateway_api:\n        description: 'Use Gateway API (Envoy Gateway) instead of NGINX Ingress'\n        required: false\n        type: boolean\n        default: false\n      terraform_branch:\n        description: 'Terraform repo branch to use (leave empty for latest LTS tag)'\n        required: false\n        type: string\n        default: ''\n\njobs:\n  test:\n    if: ${{ github.event.label.name == 'e2e' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }}\n    name: Deploy Infrastructure and Run E2E Tests\n    runs-on: ubuntu-24.04\n    permissions:\n      id-token: write\n      contents: read\n    env:\n      AWS_DEFAULT_REGION: us-east-1\n      TF_VAR_bamboo_license: ${{ secrets.TF_VAR_BAMBOO_LICENSE }}\n      TF_VAR_confluence_license: ${{ secrets.TF_VAR_CONFLUENCE_LICENSE }}\n      TF_VAR_bitbucket_license: ${{ secrets.TF_VAR_BITBUCKET_LICENSE }}\n      TF_VAR_crowd_license: ${{ secrets.TF_VAR_CROWD_LICENSE }}\n      TF_VAR_bamboo_admin_password: ${{ secrets.TF_VAR_BAMBOO_ADMIN_PASSWORD }}\n      TF_VAR_crowd_admin_password: ${{ secrets.TF_VAR_CROWD_ADMIN_PASSWORD }}\n      TF_VAR_bitbucket_admin_password: ${{ secrets.TF_VAR_BITBUCKET_ADMIN_PASSWORD }}\n      TF_VAR_kinesis_log_producers_role_arns: ${{ secrets.TF_VAR_KINESIS_LOG_PRODUCERS_ROLE_ARNS }}\n      TF_VAR_osquery_fleet_enrollment_secret_name: ${{ secrets.TF_VAR_OSQUERY_FLEET_ENROLLMENT_SECRET_NAME }}\n      TF_VAR_osquery_fleet_entrollment_host: ${{ secrets.TF_VAR_OSQUERY_FLEET_ENROLLMENT_HOST }}\n      TF_VAR_crowdstrike_secret_name: ${{ secrets.TF_VAR_CROWDSTRIKE_SECRET_NAME }}\n      TF_VAR_crowdstrike_kms_key_name: ${{ secrets.TF_VAR_CROWDSTRIKE_KMS_KEY_NAME }}\n      TF_VAR_crowdstrike_aws_account_id: ${{ secrets.TF_VAR_CROWDSTRIKE_AWS_ACCOUNT_ID }}\n      USE_DOMAIN: \"true\"\n      USE_GATEWAY_API: ${{ github.event.inputs.use_gateway_api || 'false' }}\n\n    steps:\n      - name: Checkout Helm charts\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          ref: ${{ github.event.pull_request.head.sha }}\n\n      - name: Install the latest Terraform\n        run: |\n          # check existing version\n          terraform -version || true\n          # download the latest\n          URL=$(curl -fsSL https://api.releases.hashicorp.com/v1/releases/terraform/latest | jq -r '.builds[] | select((.arch==\"amd64\") and (.os==\"linux\")).url')\n          curl -s -o /tmp/terraform.zip ${URL}\n          echo A | unzip /tmp/terraform.zip -d /usr/local/bin/\n          rm /tmp/terraform.zip          \n          # check the latest version\n          terraform -version\n\n      - name: Pin Kubectl version\n        uses: azure/setup-kubectl@v3.0\n        with:\n          version: 'v1.30.0'\n\n      - name: Install Helm\n        uses: azure/setup-helm@v1\n        with:\n          version: v3.15.3\n\n      - name: Execute helm dependency update for Helm charts\n        run: |\n          helm dependency update src/main/charts/bamboo\n          helm dependency update src/main/charts/bamboo-agent\n          helm dependency update src/main/charts/bitbucket\n          helm dependency update src/main/charts/confluence\n          helm dependency update src/main/charts/jira\n          helm dependency update src/main/charts/crowd\n\n      - name: Checkout Deployment Automation\n        run: |\n          DEPLOYMENT_REPO='https://github.com/atlassian-labs/data-center-terraform.git'\n          CUSTOM_BRANCH=\"${{ github.event.inputs.terraform_branch }}\"\n          if [ -n \"$CUSTOM_BRANCH\" ]; then\n            echo \"Using custom branch '${CUSTOM_BRANCH}' of Deployment Automation.\"\n            git clone -b $CUSTOM_BRANCH $DEPLOYMENT_REPO tf\n          else\n            LTS=$(git ls-remote --tags --exit-code --refs \"$DEPLOYMENT_REPO\" \\\n              | sed -E 's/^[[:xdigit:]]+[[:space:]]+refs\\/tags\\/(.+)/\\1/g' \\\n              | grep '^[0-9]*.[0-9]*.[0-9]*$' | sort -V | tail -1)\n            echo \"Using LTS version('${LTS}') of Deployment Automation to provision the infrastructure for Atlassian DC Products.\"\n            git clone -b $LTS $DEPLOYMENT_REPO tf\n          fi\n\n      - name: Setup test environment\n        uses: actions/setup-go@v3\n        with:\n          go-version: '1.18'\n\n      - name: Setup Python environment\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.9.14'\n      - run: |\n          python -m pip install --upgrade pip\n          pip install boto3\n\n      - name: Install test dependencies\n        id: setup-dependencies\n        working-directory: tf/test/\n        run: |\n          go version\n          go get -v -t -d ./... && go mod tidy\n          echo ::set-output name=exit_code::$?\n\n      - name: Add private SSH key for Bitbucket tests\n        uses: shimataro/ssh-key-action@v2\n        with:\n          key: ${{ secrets.BITBUCKET_E2E_TEST_PRIV_SSH_KEY }}\n          name: bitbucket-e2e # optional\n          known_hosts: dummy-entry\n          if_key_exists: fail # replace / ignore / fail; optional (defaults to fail)\n\n      - name: Add public SSH key for Bitbucket tests\n        run: |\n          echo ${{ secrets.BITBUCKET_E2E_TEST_PUB_SSH_KEY }} > /home/runner/.ssh/bitbucket-e2e.pub\n\n      - name: Configure AWS Credentials\n        uses: aws-actions/configure-aws-credentials@master\n        with:\n          aws-region: us-east-1\n          role-to-assume: ${{ secrets.AWS_IAM_ROLE }}\n          role-session-name: DCTerraformHelmSession\n          role-duration-seconds: 7200\n\n      - name: Deploy the infrastructure, install helm charts, run E2E tests, and cleanup\n        id: e2e-test\n        working-directory: tf/test/\n        run: |\n          set -o pipefail\n          # Create test output directory\n          mkdir e2etest/artifacts\n\n          # Add root of helm chart repo to the config template\n          cat << EOF >> ./e2etest/test-config.tfvars.tmpl\n          # install local helm charts\n          local_helm_charts_path=\"$(dirname $(dirname $(pwd)))/src/main/charts\"\n          confluence_install_local_chart = true\n          jira_install_local_chart = true\n          bitbucket_install_local_chart = true\n          bamboo_install_local_chart = true\n          crowd_install_local_chart = true\n          EOF\n\n          # Append Gateway API toggle if enabled\n          if [ \"$USE_GATEWAY_API\" = \"true\" ]; then\n            echo 'use_gateway_api = true' >> ./e2etest/test-config.tfvars.tmpl\n            echo \"Gateway API mode enabled (Envoy Gateway will replace NGINX Ingress)\"\n          else\n            echo \"NGINX Ingress mode (default)\"\n          fi\n\n          # Deploy infrastructure, install helm charts, run e2e tests, and cleanup all\n          # boto3 ignores AWS creds env vars for some reason\n          mkdir -p ~/.aws\n          echo -e \"[default]\\naws_access_key_id = ${AWS_ACCESS_KEY_ID}\\naws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}\\naws_session_token = ${AWS_SESSION_TOKEN}\" > ~/.aws/credentials\n          go test ./e2etest -v -timeout 85m -run Installer | tee ./e2etest/artifacts/e2etest.log\n\n      - name: Upload test log files\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: e2e-test-artifacts\n          path: tf/test/e2etest/artifacts/\n"
  },
  {
    "path": ".github/workflows/kind.yaml",
    "content": "name: Test DC App in a KinD Cluster\n\non:\n  workflow_call:\n    inputs:\n      dc_app:\n        required: true\n        type: string\n    secrets:\n      BITBUCKET_LICENSE:\n        description: 'Bitbucket license'\n      CONFLUENCE_LICENSE:\n        description: 'Confluence license'\n      JIRA_LICENSE:\n        description: 'Jira license'\n      BAMBOO_LICENSE:\n        description: 'Bamboo license'\n\njobs:\n  kind-testing:\n    if: ${{ github.event.label.name == 'e2e' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }}\n    runs-on: ubuntu-24.04\n    env:\n      # See: https://github.com/kubernetes-sigs/kind/tags\n      KIND_VERSION: \"v0.27.0\"\n      # See: https://hub.docker.com/r/kindest/node/tags\n      K8S_VERSION: \"v1.32.2\"\n      DC_APP: ${{inputs.dc_app}}\n      LICENSE: ${{ secrets[format('{0}_LICENSE', inputs.dc_app)] }}\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          ref: ${{ github.event.pull_request.head.sha }}\n\n      - name: Pin Kubectl version\n        uses: azure/setup-kubectl@v4\n        with:\n          version: 'v1.32.2'\n\n      - name: Pin Helm version\n        uses: azure/setup-helm@v3\n        with:\n          version: v3.17.2\n\n      - name: Create KinD cluster\n        run: |\n          src/test/scripts/kind/create_kind.sh\n\n      - name: Install KinD tooling\n        run: |\n          src/test/scripts/kind/configure_kind.sh\n\n      - name: Deploy postgres database\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          deploy_postgres\n\n      - name: Create db, admin and license secrets\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          create_secrets\n\n      - name: Deploy ${{inputs.dc_app}}\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          deploy_app\n\n      - name: Verify ${{inputs.dc_app}} status\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_gateway_ingress\n\n      - name: Verify ${{inputs.dc_app}} grafana dashboards\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_dashboards\n\n      - name: Test scaling ${{inputs.dc_app}}\n        run: |\n          echo \"[INFO]: Scaling ${DC_APP} to 2 replicas\"\n          kubectl scale sts/${DC_APP} --replicas=2 -n atlassian\n          sleep 10\n          kubectl wait --for=condition=ready pod/${DC_APP}-1 -n atlassian --timeout=360s\n\n      - name: Verify ${{inputs.dc_app}} OpenSearch integration\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_opensearch\n\n      - name: Verify ${{inputs.dc_app}} metrics availability\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_metrics\n\n      - name: Verify Gateway API integration\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_gateway\n\n      - name: Get debug info\n        if: always()\n        run: |\n          curl -s https://raw.githubusercontent.com/atlassian-labs/data-center-terraform/main/scripts/collect_k8s_logs.sh | bash -s -- dummy dummy logs/${{inputs.dc_app}}\n\n      - name: Upload test log files\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: kind-artifacts-${{inputs.dc_app}}\n          path: logs/\n"
  },
  {
    "path": ".github/workflows/maven.yml",
    "content": "# This workflow will build a Java project with Maven\n# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven\n\nname: Maven unit tests\n\non:\n  push:\n    branches:\n      - main\n      - /.*-stable/\n  pull_request:\n\njobs:\n  build:\n\n    runs-on: ubuntu-24.04\n\n    steps:\n      - uses: actions/checkout@v4\n      - name: Set up JDK 11\n        uses: actions/setup-java@v1\n        with:\n          java-version: 11\n\n      - name: Install Helm\n        uses: azure/setup-helm@v3\n        with:\n          version: v3.15.3\n\n      - name: Execute helm dependency update for bamboo chart\n        run: helm dependency update src/main/charts/bamboo\n      - name: Execute helm dependency update for bamboo-agent chart\n        run: helm dependency update src/main/charts/bamboo-agent\n      - name: Execute helm dependency update for bitbucket chart\n        run: helm dependency update src/main/charts/bitbucket\n      - name: Execute helm dependency update for confluence chart\n        run: helm dependency update src/main/charts/confluence\n      - name: Execute helm dependency update for crowd chart\n        run: helm dependency update src/main/charts/crowd\n      - name: Execute helm dependency update for jira chart\n        run: helm dependency update src/main/charts/jira\n\n      - name: Run tests with Maven\n        run: mvn -B test\n"
  },
  {
    "path": ".github/workflows/openshift.yaml",
    "content": "name: MicroShift Tests\n\non:\n  workflow_call:\n    inputs:\n      dc_app:\n        required: true\n        type: string\n    secrets:\n      BITBUCKET_LICENSE:\n        description: 'Bitbucket license'\n      CONFLUENCE_LICENSE:\n        description: 'Confluence license'\n      JIRA_LICENSE:\n        description: 'Jira license'\n      BAMBOO_LICENSE:\n        description: 'Bamboo license'\n      OPENSHIFT_PULL_SECRET:\n        description: 'OpenShift Pull Secret'\n\njobs:\n  microshift:\n    if: ${{ github.event.label.name == 'e2e' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }}\n    runs-on: ubuntu-24.04\n    env:\n      DC_APP: ${{inputs.dc_app}}\n      LICENSE: ${{ secrets[format('{0}_LICENSE', inputs.dc_app)] }}\n      OPENSHIFT_PULL_SECRET: ${{ secrets.OPENSHIFT_PULL_SECRET }}\n      KUBECONFIG: /home/runner/.crc/machines/crc/kubeconfig\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Write pull secret file\n        run: |\n          echo \"${OPENSHIFT_PULL_SECRET}\" | base64 -d > pull-secret.txt\n\n      - name: Fetch crc binary\n        run: |\n          CRC_VERSION=\"2.49.0\"\n          wget -q https://developers.redhat.com/content-gateway/file/pub/openshift-v4/clients/crc/${CRC_VERSION}/crc-linux-amd64.tar.xz\n          tar -xvf crc-linux-amd64.tar.xz\n          sudo cp crc-linux-${CRC_VERSION}-amd64/crc /usr/bin/crc\n          sudo chmod a+x /usr/bin/crc\n\n      - name: Fetch oc binary\n        run: |\n          wget -q https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.18/openshift-client-linux.tar.gz\n          tar -xvf openshift-client-linux.tar.gz\n          sudo cp oc /usr/bin/oc\n          sudo chmod a+x /usr/bin/oc\n\n      - name: Install required virtualization software\n        run: |\n          sudo apt-get update\n          sudo apt install qemu-kvm libvirt-daemon libvirt-daemon-system virtiofsd\n          sudo usermod -a -G libvirt $USER\n\n      - name: Free up disk\n        run: |\n          sudo rm -rf /usr/share/dotnet\n          sudo rm -rf /usr/local/lib/android\n          sudo rm -rf /opt/ghc\n          sudo rm -rf \"/usr/local/share/boost\"\n          sudo rm -rf /opt/hostedtoolcache/CodeQL\n          sudo docker image prune --all --force\n          sudo swapoff -a\n          sudo rm -f /mnt/swapfile\n\n      - name: Set crc config and microshift profile\n        run: |\n          crc config set consent-telemetry no\n          crc config set network-mode user\n          crc config set preset microshift\n\n      - name: Setup the crc\n        run: sudo -su $USER crc setup\n\n      - name: Start MicroShift\n        run: sudo -su $USER crc start -p pull-secret.txt --log-level debug\n\n      - name: Create atlassian namespace\n        run: |\n          oc create namespace atlassian\n\n      - name: Grant anyuid SCC for the default service account\n        run: |\n          SCC=(\"anyuid\")\n          for i in ${SCC[@]} ; do\n            oc adm policy add-scc-to-user ${i} system:serviceaccount:atlassian:default\n          done\n\n      - name: Create shared home pvc\n        run: |\n           oc apply -f src/test/config/openshift/shared-home-pvc.yaml\n\n      - name: Install Gateway API + Envoy Gateway\n        run: |\n          # Gateway API CRDs\n          oc apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml\n          oc apply --server-side=true -f https://raw.githubusercontent.com/envoyproxy/gateway/v1.2.5/charts/gateway-helm/crds/generated/gateway.envoyproxy.io_envoyproxies.yaml\n          \n          oc wait --for condition=established --timeout=60s crd/gateways.gateway.networking.k8s.io\n          oc wait --for condition=established --timeout=60s crd/httproutes.gateway.networking.k8s.io\n          oc wait --for condition=established --timeout=60s crd/gatewayclasses.gateway.networking.k8s.io\n          oc wait --for condition=established --timeout=60s crd/envoyproxies.gateway.envoyproxy.io\n\n          # Envoy Gateway (installs into envoy-gateway-system)\n          # OpenShift admission can reject fixed runAsUser/seccomp settings unless the\n          # service accounts are allowed to use a more permissive SCC.\n          oc create namespace envoy-gateway-system --dry-run=client -o yaml | oc apply -f -\n          # Pre-grant SCCs to all service accounts in the namespace so Helm hooks can run\n          # even before the chart-created ServiceAccounts exist.\n          oc adm policy add-scc-to-group anyuid system:serviceaccounts:envoy-gateway-system || true\n          oc adm policy add-scc-to-group privileged system:serviceaccounts:envoy-gateway-system || true\n\n          helm install eg oci://docker.io/envoyproxy/gateway-helm \\\n            --version v1.2.5 \\\n            --namespace envoy-gateway-system \\\n            --set deployment.envoyGateway.resources.requests.cpu=50m \\\n            --set deployment.envoyGateway.resources.requests.memory=100Mi \\\n            --skip-crds \\\n            --timeout=600s \\\n            --wait || { \\\n              oc get all -n envoy-gateway-system || true; \\\n              oc get events -n envoy-gateway-system --sort-by='.lastTimestamp' | tail -n 200 || true; \\\n              exit 1; \\\n            }\n\n          oc wait --for=condition=available deployment/envoy-gateway \\\n            --namespace envoy-gateway-system \\\n            --timeout=300s\n\n          # EnvoyProxy CR configures the proxy Service as ClusterIP (default for OpenShift; an OpenShift Route will handle external access).\n          oc apply -f src/test/config/openshift/envoy-proxy.yaml\n          \n          # GatewayClass references the EnvoyProxy CR via parametersRef\n          cat << EOF | oc apply -f -\n          apiVersion: gateway.networking.k8s.io/v1\n          kind: GatewayClass\n          metadata:\n            name: eg\n          spec:\n            controllerName: gateway.envoyproxy.io/gatewayclass-controller\n            parametersRef:\n              group: gateway.envoyproxy.io\n              kind: EnvoyProxy\n              name: openshift-proxy-config\n              namespace: envoy-gateway-system\n          EOF\n          oc wait --for=condition=Accepted gatewayclass/eg --timeout=180s || { oc get gatewayclass/eg -o yaml; oc get pods -n envoy-gateway-system -o wide || true; exit 1; }\n\n          # Create test Gateway\n          oc apply -f src/test/config/openshift/gateway.yaml\n          oc wait --for=condition=Accepted gateway/atlassian-gateway -n atlassian --timeout=300s || { oc describe gateway/atlassian-gateway -n atlassian; oc get events -n atlassian --sort-by='.lastTimestamp' | tail -n 200 || true; exit 1; }\n\n          # Wait for data-plane\n          oc wait --for=condition=Available deployment \\\n            -n envoy-gateway-system \\\n            -l gateway.envoyproxy.io/owning-gateway-name=atlassian-gateway \\\n            --timeout=300s || { \\\n              oc get deployments -n envoy-gateway-system -o wide; \\\n              oc get pods -n envoy-gateway-system -o wide; \\\n              oc describe deployment -n envoy-gateway-system -l gateway.envoyproxy.io/owning-gateway-name=atlassian-gateway || true; \\\n              oc get events -n envoy-gateway-system --sort-by='.lastTimestamp' | tail -n 200 || true; \\\n              exit 1; \\\n            }\n\n          # Create an OpenShift Route so atlassian.apps.crc.testing reaches the\n          # Envoy proxy Service without port-forward or Host headers.\n          ENVOY_SVC=$(oc get svc -n envoy-gateway-system \\\n            -l gateway.envoyproxy.io/owning-gateway-name=atlassian-gateway \\\n            -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || true)\n\n          if [ -z \"${ENVOY_SVC}\" ]; then\n            echo \"[ERROR]: Envoy Gateway proxy service not found\"\n            oc get svc -n envoy-gateway-system -o wide || true\n            exit 1\n          fi\n\n          oc -n envoy-gateway-system expose svc/${ENVOY_SVC} \\\n            --name atlassian-gateway-proxy \\\n            --hostname atlassian.apps.crc.testing || true\n\n          # Log the Route and Endpoint details for debugging\n          oc -n envoy-gateway-system get route atlassian-gateway-proxy -o yaml || true\n          oc -n envoy-gateway-system get endpoints ${ENVOY_SVC} -o yaml || true\n\n      - name: Deploy postgres database\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          deploy_postgres\n\n      - name: Create db, admin and license secrets\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          create_secrets\n\n      - name: Deploy ${{inputs.dc_app}}\n        run: |\n          export OPENSHIFT_VALUES=\"-f ./src/test/config/openshift/openshift.yaml --set ${DC_APP}.resources.container.requests.cpu=20m --set ${DC_APP}.resources.container.requests.memory=5Mi --set synchrony.resources.container.requests.cpu=20m --set synchrony.resources.container.requests.memory=5Mi\"\n          source src/test/scripts/kind/deploy_app.sh\n          deploy_app\n\n      - name: Verify ${{inputs.dc_app}} status\n        run: |\n          export OPENSHIFT_VALUES=\"1\"\n          source src/test/scripts/kind/deploy_app.sh\n          verify_gateway_ingress\n\n      - name: Verify ${{inputs.dc_app}} metrics availability\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_metrics\n\n      - name: Verify ${{inputs.dc_app}} analytics value\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_openshift_analytics\n\n      - name: Verify Gateway API integration\n        run: |\n          source src/test/scripts/kind/deploy_app.sh\n          verify_gateway\n\n      - name: Get debug info\n        if: always()\n        run: |\n          curl -s https://raw.githubusercontent.com/atlassian-labs/data-center-terraform/main/scripts/collect_k8s_logs.sh | bash -s -- dummy dummy logs/${{inputs.dc_app}}\n\n      - name: Upload test log files\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: kind-artifacts-${{inputs.dc_app}}\n          path: logs/\n"
  },
  {
    "path": ".github/workflows/prepare-release.yaml",
    "content": "name: Prepare Release\n\non:\n  push:\n    branches:\n      - release/*\n\njobs:\n  prepare-release:\n    env:\n      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n    runs-on: ubuntu-24.04\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          ref: refs/heads/main\n\n      - name: Set up JDK 11\n        uses: actions/setup-java@v1\n        with:\n          java-version: 11\n\n      - name: Install Helm\n        uses: azure/setup-helm@v3\n        with:\n          version: v3.15.3\n\n      - name: Setup Python environment\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.9.14'\n\n      - name: Install Python dependencies\n        run: |\n          python -m pip install --upgrade pip gitpython ruamel_yaml\n\n      - name: Install Helm Docs\n        uses: envoy/install-helm-docs@v1.0.0\n        with:\n          version: 1.12.0\n\n      - name: Generate changelog and Chart annotations\n        run: |\n          echo \"[INFO]: Preparing release ${GITHUB_REF_NAME##*/}\"\n          python src/main/scripts/prepare_release.py ${GITHUB_REF_NAME##*/}\n\n      - name: Update README files with helm-docs\n        run: |\n          cd src/main/charts\n          helm-docs\n\n      - name: Configure Git\n        run: |\n          git config --global user.name \"$GITHUB_ACTOR\"\n          git config --global user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n\n      - name: Lint yamls with ah cli\n        run: |\n          docker run --workdir=\"/charts\" -u root -v ${GITHUB_WORKSPACE}/src/main/charts:/charts artifacthub/ah ah lint\n\n      - name: Commit changes and raise a PR\n        run: |\n          git checkout ${GITHUB_REF_NAME}\n          git add -A\n          git commit -m \"Prepare release ${GITHUB_REF_NAME##*/}\"\n          git push origin ${GITHUB_REF_NAME}\n          gh pr create --title \"Release/${GITHUB_REF_NAME##*/}\" --body \"Prepare to release ${GITHUB_REF_NAME##*/}\" --base main --head ${GITHUB_REF_NAME}\n"
  },
  {
    "path": ".github/workflows/process-dashboard-test.yaml",
    "content": "name: Process Dashboard Script Testing\n\non:\n  push:\n    paths:\n      - 'src/main/scripts/process_dash*'\n  workflow_dispatch:\n\njobs:\n  run-process-dashboard-tests:\n    runs-on: ubuntu-24.04\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Setup Python environment\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.9.14'\n\n      - name: Run tests\n        run: |\n          python src/main/scripts/process_dashboard_test.py\n"
  },
  {
    "path": ".github/workflows/release-charts.yaml",
    "content": "name: Release Helm Charts\n\non:\n  workflow_dispatch:\n\njobs:\n  release:\n    runs-on: ubuntu-24.04\n    permissions:\n      id-token: write\n      contents: write\n      pull-requests: write\n    env:\n      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      HELM_SIGNING_KEY_ID: ${{ secrets.HELM_SIGNING_KEY_ID }}\n      GITHUB_REPOSITORY: ${GITHUB_REPOSITORY}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Configure Git\n        run: |\n          git config user.name \"$GITHUB_ACTOR\"\n          git config user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n\n      - name: Install Helm\n        uses: azure/setup-helm@v3\n        with:\n          version: v3.15.3\n\n      - name: Setup Python environment\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.9.14'\n\n      - name: Install Python dependencies\n        run: |\n          python -m pip install --upgrade pip gitpython ruamel_yaml\n\n      - name: Generate Release Notes for GitHub Releases\n        run: |\n          cd src/main/scripts\n          products=(bamboo bamboo-agent bitbucket confluence crowd jira)\n          export REPO_PATH=\"${GITHUB_WORKSPACE}\"\n          export CHARTS_LOCATION=\"src/main/charts\"\n          for product in \"${products[@]}\"; do\n            echo \"[INFO]: Generating ${REPO_PATH}/${CHARTS_LOCATION}/${product}/RELEASE_NOTES.md\"\n            REL_NOTES_LIST=$(python3 -W ignore -c \"import prepare_release; print (prepare_release.gen_changelog(\\\"${product}\\\", \\\"${REPO_PATH}\\\"))\")\n            python -c \"list=${REL_NOTES_LIST}; print('\\n'.join(list))\" > \"${REPO_PATH}\"/\"${CHARTS_LOCATION}\"/\"${product}\"/RELEASE_NOTES.md\n          done\n\n      - name: Execute helm dependency update for bamboo chart\n        run: helm dependency update src/main/charts/bamboo\n      - name: Execute helm dependency update for bamboo-agent chart\n        run: helm dependency update src/main/charts/bamboo-agent\n      - name: Execute helm dependency update for bitbucket chart\n        run: helm dependency update src/main/charts/bitbucket\n      - name: Execute helm dependency update for confluence chart\n        run: helm dependency update src/main/charts/confluence\n      - name: Execute helm dependency update for crowd chart\n        run: helm dependency update src/main/charts/crowd\n      - name: Execute helm dependency update for jira chart\n        run: helm dependency update src/main/charts/jira\n\n\n      - name: Configure AWS Credentials\n        uses: aws-actions/configure-aws-credentials@master\n        with:\n          aws-region: ${{ secrets.HELM_SIGNING_KEY_AWS_REGION }}\n          role-to-assume: ${{ secrets.HELM_SIGNING_KEY_AWS_IAM_ROLE }}\n          role-session-name: HelmSignSession\n\n      - name: Get Helm Signing Key\n        run: |\n          aws secretsmanager get-secret-value --secret-id ${{ secrets.HELM_SIGNING_KEY_AWS_SECRET_ID }} --query 'SecretBinary' --output text --region ${{ secrets.HELM_SIGNING_KEY_AWS_REGION }} | base64 --decode > helm_key\n          gpg --import helm_key\n          gpg --export > ~/.gnupg/pubring.gpg\n          gpg --export-secret-keys > ~/.gnupg/secring.gpg\n          gpg --output src/main/scripts/helm_key.pub --export ${{ secrets.HELM_SIGNING_KEY_EMAIL }}\n\n      - name: Release Helm Charts\n        run: |\n          src/main/scripts/generate_chart_repo.sh ${GH_TOKEN}\n\n      - name: Commit and push index.yaml\n        run: |\n          git checkout -b update-index-yaml-${GITHUB_RUN_ID}\n          git commit -m \"Update index.yaml post release\"\n          git push origin update-index-yaml-${GITHUB_RUN_ID}\n          gh pr create --title \"Update index.yaml\" --body \"Update index.yaml after release\" --base main --head update-index-yaml-${GITHUB_RUN_ID}\n\n      - name: Upload Public Key To Release Assets\n        run: |\n          cd src/main/scripts\n          export RELEASE_VERSION=$(python3 -W ignore -c \"import prepare_release; print (prepare_release.get_chart_versions(\\\"${GITHUB_WORKSPACE}/src/main/charts\\\"))\" | sed \"s/'/\\\"/g\" | python -c 'import sys, json; print (json.load(sys.stdin)[\"bamboo\"][\"version\"])')\n          ./github_asset_uploader.sh ${RELEASE_VERSION}\n\n      - name: Cleanup\n        if: always()\n        run: |\n          rm -rf ~/.gnupg || true\n          rm -rf helm_key\n"
  },
  {
    "path": ".github/workflows/release-unit-tests.yaml",
    "content": "name: Release Script Unit Testing\n\non:\n  push:\n    paths:\n      - 'src/main/scripts/prepare_*'\n  workflow_dispatch:\n\njobs:\n  run-release-unit-tests:\n    runs-on: ubuntu-24.04\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Setup Python environment\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.9.14'\n\n      - name: Install Python dependencies\n        run: |\n          python -m pip install --upgrade pip gitpython ruamel_yaml\n\n      - name: Run release unit tests\n        run: |\n          python src/main/scripts/prepare_release_test.py\n"
  },
  {
    "path": ".github/workflows/sync-grafana-dashboards.yaml",
    "content": "name: Update Grafana Dashboards\n\non:\n  schedule:\n    - cron: '0 1 * * SUN' # At 1AM on every Sunday\n  workflow_dispatch:\n\njobs:\n  sync_dashboards:\n    runs-on: ubuntu-24.04\n    env:\n      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Setup Python environment\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.9.14'\n\n      - name: Configure Git\n        run: |\n          git config user.name \"$GITHUB_ACTOR\"\n          git config user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n\n      - name: Process Grafana Dashboards\n        run: |\n          src/main/scripts/update_grafana_dashboards.sh\n          \n      - name: Commit changes and raise a PR\n        run: |\n          CHANGES=$(git status --porcelain=v1 2>/dev/null | wc -l)\n          if [ ${CHANGES} -ne 0 ]; then\n            OPEN_PRS=$(gh pr list --state open | grep \"Update Grafana Dashboards for DC apps\" || true)\n            if [[ ${OPEN_PRS} ]]; then\n              echo \"Not raising PR because there are open PRs to update dashboards. Merge or close them to let the workflow raise new PRs\"\n            else\n              git checkout -b update-grafana-dashboards-${GITHUB_RUN_ID}\n              git add -A\n              git commit -m \"Update Grafana dashboards for DC apps\"\n              git push origin update-grafana-dashboards-${GITHUB_RUN_ID}\n              gh pr create --title \"Update Grafana Dashboards for DC apps\" --body \"Update Grafana dashboards for DC apps\" --base main --head update-grafana-dashboards-${GITHUB_RUN_ID}\n            fi\n          else\n            echo \"All Helm charts have up to date Grafana dashboards\"\n          fi\n"
  },
  {
    "path": ".github/workflows/update-lts-tags.yaml",
    "content": "name: Update LTS Tags\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 * * SUN' # At 00:00 on every Sunday\n\njobs:\n  lts_check:\n    runs-on: ubuntu-24.04\n    env:\n      ARTIFACTORY_BOT_USERNAME: \"${{ secrets.ARTIFACTORY_BOT_USERNAME }}\"\n      ARTIFACTORY_BOT_PASSWORD: \"${{ secrets.ARTIFACTORY_BOT_PASSWORD }}\"\n      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Setup Python environment\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.9.14'\n\n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install pyyaml requests\n\n      - name: Install Helm Docs\n        uses: envoy/install-helm-docs@v1.0.0\n        with:\n          version: 1.12.0\n\n      - name: Configure Git\n        run: |\n          git config user.name \"$GITHUB_ACTOR\"\n          git config user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n\n      - name: Update LTS tags in Helm charts\n        run: |\n          cd src/test/scripts\n          python update_versions.py\n\n      - name: Update README files with helm-docs\n        run: |\n          cd src/main/charts\n          helm-docs\n\n      - name: Commit changes and raise a PR\n        run: |\n          CHANGES=$(git status --porcelain=v1 2>/dev/null | wc -l)\n          if [ ${CHANGES} -ne 0 ]; then\n            OPEN_PRS=$(gh pr list --state open | grep \"Update appVersions for DC apps\" || true)\n            if [[ ${OPEN_PRS} ]]; then\n              echo \"Not raising PR because there are open PRs to upgrade versions. Merge or close them to let the workflow raise new PRs\"\n            else\n              git checkout -b lts-tag-update-${GITHUB_RUN_ID}\n              git add -A\n              git commit -m \"Update appVersions for DC apps\"\n              git push origin lts-tag-update-${GITHUB_RUN_ID}\n              gh pr create --label \"e2e\" --title \"Update appVersions for DC apps\" --body \"Update appVersions for DC apps\" --base main --head lts-tag-update-${GITHUB_RUN_ID}\n            fi\n          else\n            echo \"All Helm charts have the latest LTS appVersion\"\n          fi\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea\n.vscode\n\ntarget\n__pycache__\n*.iml\n\\#*\\#\ndocs/site\ntmp\n.settings\n.project\n.classpath\n\n# ignore installed common library chart\nsrc/main/charts/*/charts/*.tgz\n\n# Stale tmpfile from failed release process\nsrc/main/charts/*/tmp*\n"
  },
  {
    "path": ".java-version",
    "content": "11.0\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n  - repo: https://github.com/norwoodj/helm-docs\n    rev: v1.12.0\n    hooks:\n      - id: helm-docs\n        args:\n          - --chart-search-root=src/main/charts\n\n          # Repeating the flag adds this to the list, now [./_templates.gotmpl, README.md.gotmpl]\n          # A base filename makes it relative to each chart directory found\n          - --template-files=./README.md.gotmpl"
  },
  {
    "path": "BREAKING_CHANGES.md",
    "content": "# Breaking Changes\n\n## Version 2.0.0\n\n### Required values\n\n* `.Values.bitbucket.clustering.group` is required for Bitbucket\n* `.Values.bitbucket.mirror` is required for Bitbucket\n* `.Values.bitbucket.podManagementStrategy` is required for Bitbucket\n* `.Values.ingress.className` is required for all products\n\n### `securityContext` format change\n`.Values.<product>.securityContext` is now fully configurable with standard [Kubernetes values](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/).    \nIn order to make this happen, we removed `gid` and `enabled` fields from `securityContext` stanza in `values.yaml` file. \nInstead, the standard `fsGroup` value is now the default parameter to make ensure the correct filesystem permissions. This setting is not necessary in OpenShift (or some other specific use cases).\n\n#### Action required\n\n- If `.Values.<product>.securityContext.enabled` was set to `true` (the default value), set the existing `.Values.<product>.securityContext.gid` value to `.Values.<product>.securityContext.fsGroup`.\n- If `.Values.<product>.securityContext.enabled` was set to `false`, comment out all keys under `.Values.<product>.securityContext.securityContext` stanza. This means the `.Values.<product>.securityContext` should be empty.\n\n#### Troubleshooting\n\nIf you encounter this error:\n\n```\nError: unable to build kubernetes objects from release manifest: error validating \"\": error validating data: [ValidationError(StatefulSet.spec.template.spec.securityContext): unknown field \"enabled\" in io.k8s.api.core.v1.PodSecurityContext, ValidationError(StatefulSet.spec.template.spec.securityContext): unknown field \"gid\" in io.k8s.api.core.v1.PodSecurityContext]\n```\n\nIt means your `values.yaml` file contains the unsupported `enabled` or `gid` values for the `securityContext`. Please follow the steps from `securityContext` change above.\n\n### OpenSearch Credentials in Confluence Helm Chart\n\nOpenSearch credentials are now passed as environment variables instead of JVM arguments in the ConfigMap. This is a breaking change for existing Confluence Helm charts that use bundled OpenSearch (`opensearch.enabled` is set to true).\n\nIn **2.0.0** `-Dopensearch.password` has been removed from config-jvm ConfigMap. OpenSearch credentials and other relevant settings are now passed as environment variables and written to `confluence.cfg.xml` in the image entrypoint (See: [Add Opensearch properties](https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/pull-requests/192/overview)).\n\nWhen upgrading Confluence Helm chart to version 2.0.0, you **must** set `confluence.forceConfigUpdate` to true in Helm values file, which will force the image entrypoint to recreate the `confluence.cfg.xml` file with the new Opensearch properties.\nThis is a one-time operation. After the upgrade, you can set `confluence.forceConfigUpdate` to false.\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Code of Conduct\n\nAs contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.\n\nWe are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery\n* Personal attacks\n* Trolling or insulting/derogatory comments\n* Public or private harassment\n* Publishing other's private information, such as physical or electronic addresses, without explicit permission\n* Submitting contributions or comments that you know to violate the intellectual property or privacy rights of others\n* Other unethical or unprofessional conduct\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\nBy adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a project maintainer. Complaints will result in a response and be reviewed and investigated in a way that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident.\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at [http://contributor-covenant.org/version/1/3/0/][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/3/0/"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Data Center Helm Charts\n\nThank you for considering a contribution to Data Center Helm Charts. Pull requests, issues and comments are welcome. For pull requests, please:\n\n* Add tests for new features and bug fixes\n* Follow the existing style\n* Separate unrelated changes into multiple pull requests\n\nFollow the [development setup](DEVELOPMENT.md).\n\nSee the existing issues for things to start contributing.\n\nFor bigger changes, please make sure you start a discussion first by creating an issue and explaining the intended change.\n\nAtlassian requires contributors to sign a Contributor License Agreement, known as a CLA. This serves as a record stating that the contributor is entitled to contribute the code/documentation/translation to the project and is willing to have it used in distributions and derivative works (or is willing to transfer ownership).\n\nPrior to accepting your contributions we ask that you please follow the appropriate link below to digitally sign the CLA. The Corporate CLA is for those who are contributing as a member of an organization and the individual CLA is for those contributing as an individual.\n\n* [CLA for corporate contributors](https://opensource.atlassian.com/corporate)\n* [CLA for individuals](https://opensource.atlassian.com/individual)\n\n## Code Owners' Responsibilities\n\nFor any pull requests, code owners should review the changes thoroughly and make sure all the requirements are met. Code owners should also run the internal Bamboo CI tests and E2E tests against the changes when are applicable.\n\nFor external contributions, any Github action workflow related changes are not acceptable.\n\n## Windows Users\n\nThis repository uses **symlinks** to share common Helm templates across product charts\n(see `src/main/common_templates/`). Git on Windows doesn't enable symlinks by default — without them,\nHelm template rendering will fail.\n\nTo enable symlinks on Windows:\n\n1. Enable **Developer Mode** in Windows Settings (Settings → Update & Security → For Developers), or run Git as Administrator\n2. Configure Git to create real symlinks:\n   ```\n   git config --global core.symlinks true\n   ```\n3. Re-clone the repository after changing this setting (existing clones won't retroactively fix symlinks)\n\n\n### How to run E2E tests\n\nThe Data Center Helm Charts uses the latest release of [Deployment Automation for Atlassian DC on K8s](https://github.com/atlassian-labs/data-center-terraform#deployment-automation-for-atlassian-dc-on-k8s) for end-to-end testing. Internal reviewers can run the tests by adding `e2e` label on a pull request (for external contributions, be mindful of the changes as it will run on internal cloud environment)."
  },
  {
    "path": "DEVELOPMENT.md",
    "content": "# Development\n\n## Chart dependencies\n\nProduct charts are using a common library chart (`common`). To download the dependency, you are required to run:\n\n```bash\nfor d in ./src/main/charts/*/ ; do (cd $d && helm dependency update); done\n```\n\n## Pre-commit hooks\n\nRepository contains repository hook definition to auto-generate chart documentation in case there is a change to `values.yaml` file.\n\n### Installation\n\n1. Install `pre-commit` following [official instructions](https://pre-commit.com/#install).\n2. In the repository root run `pre-commit install`, which will install the hooks.\n\n### Usage\n\nWhen you have the pre-commit hook installed and `commit` a file, it will run the pre-commit hook. If there is a change generated in the `README.md`, the hook will fail and notify you about the new change. You can review the changes and run the `commit` again, now it should pass.\n\n\n# Technical documentation\n\n## Setup\n\nTechnical documentation is produced by `mkdocs` python library. The documentation and necessary files are located in `/docs/` folder.\n\n## How to work with documentation\n\nTo make working with the documentation easier, there is a `Makefile` in the project root folder. To start the server just run:\n\n    make docs\n\nThis will create a docker image locally, process the files and start the live server providing documentation. You should be able to open http://127.0.0.1:8000/ in your browser. If you make any change to the documentation in the `/docs/` folder, it will be picked up by the server and browser will automatically reload.\n\n## Deployment\n\nDocumentation is automatically deployed to [official documentation](https://atlassian.github.io/data-center-helm-charts/) with Github Pages. Any change that is merged into the default branch will trigger Github Actions that builds the static documentation site and pushes it to `gh-pages` branch. This branch is then deployed by Github Pages."
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [2020] to [2021] Atlassian Pty Ltd\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "Makefile",
    "content": ".PHONY: help doc-docker doc-build doc-serve\n\nhelp:\n\t    @echo \"Atlassian DC helm charts\"\n\t    @echo \"\"\n\t    @echo \"Commands:\"\n\t    @echo \"docs - starts live server with documentation\"\n\n.DEFAULT_GOAL := help\n\ndoc-docker:\n\t@docker build -t squidfunk/mkdocs-material docs/build/\n\ndoc-build:\n\t@docker run --rm -it -v ${PWD}/docs:/docs squidfunk/mkdocs-material build\n\ndoc-serve:\n\t@docker run --rm -it -p 8000:8000 -v ${PWD}/docs:/docs squidfunk/mkdocs-material\n\ndocs: doc-docker doc-serve"
  },
  {
    "path": "README.md",
    "content": "# Atlassian Data Center Helm Charts\n\n[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/atlassian-data-center)](https://artifacthub.io/packages/search?repo=atlassian-data-center)\n[![Atlassian license](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat-square)](LICENSE) \n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](CONTRIBUTING.md) \n[![Maven unit tests](https://github.com/atlassian/data-center-helm-charts/actions/workflows/maven.yml/badge.svg)](https://github.com/atlassian/data-center-helm-charts/actions/workflows/maven.yml)\n\nThis project contains [Helm charts](https://helm.sh/) for installing Atlassian's [Jira Data Center](https://www.atlassian.com/enterprise/data-center/jira), [Confluence Data Center](https://www.atlassian.com/enterprise/data-center/confluence), [Bitbucket Data Center](https://www.atlassian.com/enterprise/data-center/bitbucket) and [Bamboo Data Center](https://www.atlassian.com/software/bamboo) on Kubernetes. \n\nUse the charts to install and operate Data Center products within a Kubernetes cluster of your choice. It can be a managed environment, such as [Amazon EKS](https://aws.amazon.com/eks/), [Azure Kubernetes Service](https://azure.microsoft.com/en-au/services/kubernetes-service/), [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine), or a custom on-premise system.\n\n## Get started\n\n**Get started right now using our [documentation](https://atlassian.github.io/data-center-helm-charts/).**\n\nWe provide extensive documentation to support our Helm charts. This includes prerequisites, set up, installation, examples, and more.\n\n\n## Support disclaimer\n\nWe **don’t officially support** the functionality described in the [examples](https://atlassian.github.io/data-center-helm-charts/examples/EXAMPLES/) or the documented [platforms](https://atlassian.github.io/data-center-helm-charts/platforms/PLATFORMS/). You should use them for reference only. \n\n\n## Feedback\n\nIf you find any issue, [raise a ticket](https://support.atlassian.com/contact/). If you have general feedback or question regarding the charts, use [Atlassian Community Kubernetes space](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes).\n  \n\n## Contributions\n\nContributions are welcome. [Find out how to contribute](CONTRIBUTING.md). \n\n\n## License\n\nCopyright (c) [2020] to [2021] Atlassian and others.\nApache 2.0 licensed, see [license file](LICENSE).\n"
  },
  {
    "path": "cr.yaml",
    "content": "pages-branch: gh-pages\nindex-path: docs/docs/index.yaml\n"
  },
  {
    "path": "docs/build/Dockerfile",
    "content": "FROM squidfunk/mkdocs-material\nRUN pip install mkdocs-awesome-pages-plugin\n"
  },
  {
    "path": "docs/docs/.pages",
    "content": "nav:\n    - Home: README.md\n    - User guide: userguide\n    - Examples: examples\n    - Troubleshooting: troubleshooting\n    - Platforms: platforms\n    - Containers: containers\n"
  },
  {
    "path": "docs/docs/README.md",
    "content": "# Atlassian Data Center Helm Charts\n\n[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/atlassian-data-center)](https://artifacthub.io/packages/search?repo=atlassian-data-center)\n[![Atlassian license](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat-square)](https://github.com/atlassian/data-center-helm-charts/blob/main/LICENSE) \n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/atlassian/data-center-helm-charts/blob/main/CONTRIBUTING.md) \n[![Maven unit tests](https://github.com/atlassian/data-center-helm-charts/actions/workflows/maven.yml/badge.svg)](https://github.com/atlassian/data-center-helm-charts/actions/workflows/maven.yml)\n\nThis project contains [Helm charts](https://helm.sh/){.external} for installing Atlassian's [Jira Data Center](https://www.atlassian.com/enterprise/data-center/jira){.external}, [Confluence Data Center](https://www.atlassian.com/enterprise/data-center/confluence){.external}, [Bitbucket Data Center](https://www.atlassian.com/enterprise/data-center/bitbucket){.external}, [Bamboo Data Center](https://www.atlassian.com/software/bamboo){.external} and [Crowd Data Center](https://www.atlassian.com/software/crowd){.external} on Kubernetes.\n\nUse the charts to install and operate Data Center products within a Kubernetes cluster of your choice. It can be a managed environment, such as [Amazon EKS](https://aws.amazon.com/eks/){.external}, [Azure Kubernetes Service](https://azure.microsoft.com/en-au/services/kubernetes-service/){.external}, [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine){.external}, or a custom on-premise system.\n\n## Support disclaimer\n\n!!! warning \"Support Disclaimer\"\n    Helm is a Kubernetes package manager that orchestrates the provisioning of applications onto existing Kubernetes infrastructure. The requirements for this infrastructure are described in [Prerequisites](userguide/PREREQUISITES.md). The Kubernetes cluster remains your responsibility; we do not provide direct support for Kubernetes or the underlying hardware it runs on.\n\n    If you have followed our documentation on how to configure the Helm charts, and you're using correctly created components, we will then provide support if you encounter an error with installation after running the `helm install` command. \n\n    We **don’t officially support** the functionality described in the [examples](examples/EXAMPLES.md) or the documented [platforms](platforms/PLATFORMS.md). You should use them for reference only.\n    \n    Read more about [what we support and what we don’t](troubleshooting/SUPPORT_BOUNDARIES.md). \n    \n    **Certain product limitations listed below:**\n\n    * **Jira** currently has [limitations with scaling](troubleshooting/LIMITATIONS.md#jira-and-horizontal-scaling).\n    * **Bamboo** has a number of limitations, [particularly with deployment and clustering](troubleshooting/LIMITATIONS.md#deployment).\n    \n    Read more about these [product and platform limitations](troubleshooting/LIMITATIONS.md).\n\n## Architecture\n\nThe diagram below provides a high level overview of what a typical deployment might look like when using the Atlassian Data Center Helm charts:\n\n![architecture](assets/images/KubernetesOverview.png \"Request routing via Ingress\")\n\n## Installing the Helm charts\n\n* [Prerequisites and setup](userguide/PREREQUISITES.md) - everything you need to do before installing the Helm charts\n* [Verification](userguide/VERIFICATION.md) - verify the integrity of the Helm charts\n* [Installation](userguide/INSTALLATION.md) - the steps to install the Helm charts\n* [Migration](userguide/MIGRATION.md) - what you have to do if you're migrating an existing deployment to Kubernetes\n\n## Additional content\n\n* [Operation](userguide/OPERATION.md) - how to upgrade applications, scale your cluster, and update resources\n* [Configuration](userguide/CONFIGURATION.md) - a deep dive into the configuration parameters\n* [Platforms support](platforms/PLATFORMS.md) - how to allow support for different platforms\n* [Examples](examples/EXAMPLES.md) - various configuration examples\n* [Troubleshooting](troubleshooting/TROUBLESHOOTING.md) - how to debug issues with installation\n\n\n## Product versions\nThese Helm charts support all product versions that have not reached End of Life (EOL). Please refer to the [Atlassian End of Support Policy](https://confluence.atlassian.com/support/atlassian-end-of-support-policy-201851003.html){.external} to verify that your product version is currently supported.\n\nThe Helm charts are product-version agnostic and do not assume or require a specific product version. This means you do not need to wait for a new Helm chart release before upgrading your product to a newer version — the two can be updated independently.\n\nNew Helm chart releases typically introduce improvements and new features to make the charts more flexible and easier to configure. Occasionally, a new chart release adds support for new product features, but these are almost always opt-in and will not affect existing deployments unless explicitly configured.      \n\n## Feedback\n\nIf you find any issues, [raise a ticket](https://support.atlassian.com/contact/){.external}. If you have general feedback or questions regarding the charts, use [Atlassian Community Kubernetes space](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes){.external}.\n  \n\n## Contributions\n\nContributions are welcome. [Find out how to contribute](https://github.com/atlassian/data-center-helm-charts/blob/main/CONTRIBUTING.md){.external}. \n\n\n## License\n\nApache 2.0 licensed, see [license file](https://github.com/atlassian/data-center-helm-charts/blob/main/LICENSE){.external}.\n"
  },
  {
    "path": "docs/docs/artifacthub-repo.yml",
    "content": "# Artifact Hub repository metadata file\n#\n# Some settings like the verified publisher flag or the ignored packages won't\n# be applied until the next time the repository is processed. Please keep in\n# mind that the repository won't be processed if it has not changed since the\n# last time it was processed. Depending on the repository kind, this is checked\n# in a different way. For Helm http based repositories, we consider it has\n# changed if the `index.yaml` file changes. For git based repositories, it does\n# when the hash of the last commit in the branch you set up changes. This does\n# NOT apply to ownership claim operations, which are processed immediately.\n#\n# https://artifacthub.io/docs/topics/repositories/#helm-charts-repositories\nrepositoryID: 46e7e8b1-a8bb-47bf-837f-63d7ff61a463\nowners:\n  - name: abrokes-atlassian\n    email: abrokes@atlassian.com\n"
  },
  {
    "path": "docs/docs/assets/images/KubernetesOverview.xml",
    "content": "<mxfile host=\"app.diagrams.net\" agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36\" version=\"29.3.8\">\n  <diagram name=\"Page-1\" id=\"aaaa8250-4180-3840-79b5-4cada1eebb92\">\n    <mxGraphModel dx=\"829\" dy=\"896\" grid=\"1\" gridSize=\"10\" guides=\"1\" tooltips=\"1\" connect=\"1\" arrows=\"1\" fold=\"1\" page=\"1\" pageScale=\"1\" pageWidth=\"850\" pageHeight=\"1100\" background=\"#FFFFFF\" math=\"0\" shadow=\"0\">\n      <root>\n        <mxCell id=\"0\" />\n        <mxCell id=\"1\" parent=\"0\" />\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-8\" parent=\"1\" style=\"rounded=0;whiteSpace=wrap;html=1;strokeColor=#FFFFFF;fontSize=18;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"784\" width=\"1530\" x=\"70\" y=\"1116\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-90\" parent=\"1\" style=\"rounded=1;whiteSpace=wrap;html=1;fontSize=18;strokeWidth=2;fillColor=none;gradientColor=#ffffff;dashed=1;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"120\" width=\"370\" x=\"1152\" y=\"1340\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"uEcu4RkkTLkbcE6ZgNvW-75\" parent=\"1\" style=\"rounded=1;whiteSpace=wrap;html=1;fontSize=18;strokeColor=#0066CC;strokeWidth=2;fillColor=none;gradientColor=#ffffff;dashed=1;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"418\" width=\"950\" x=\"610\" y=\"1282\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-60\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-59\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontColor=#FFFFFF;fontSize=18;\">\n          <mxGeometry x=\"60\" y=\"1158\" as=\"geometry\">\n            <Array as=\"points\">\n              <mxPoint x=\"200\" y=\"1428\" />\n              <mxPoint x=\"200\" y=\"1267\" />\n            </Array>\n            <mxPoint x=\"350\" y=\"1267\" as=\"targetPoint\" />\n          </mxGeometry>\n        </mxCell>\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-12\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-59\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#FFFFFF;fontSize=18;\" target=\"BTs9VdZK0QwFjo61O5EF-8\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-59\" parent=\"1\" style=\"aspect=fixed;perimeter=ellipsePerimeter;html=1;align=center;shadow=0;dashed=0;spacingTop=3;image;image=img/lib/active_directory/workstation_client.svg;fontColor=#FFFFFF;strokeColor=#FF9933;fontSize=18;\" value=\"&lt;font color=&quot;#000000&quot; style=&quot;font-size: 18px&quot;&gt;Client request&lt;/font&gt;\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"68\" x=\"120\" y=\"1388\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-62\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=18;\" value=\"External resources required as backing&#xa;for K8s components and the Atlassian&#xa;Data Center product itself\" vertex=\"1\">\n          <mxGeometry height=\"90\" width=\"330\" x=\"260\" y=\"1770\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-11\" parent=\"1\" style=\"rounded=1;whiteSpace=wrap;html=1;fontSize=18;strokeWidth=2;fillColor=none;gradientColor=#ffffff;dashed=1;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"546\" width=\"230\" x=\"300\" y=\"1214\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-21\" edge=\"1\" parent=\"1\" source=\"BTs9VdZK0QwFjo61O5EF-1\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-14\">\n          <mxGeometry x=\"400\" y=\"1210\" as=\"geometry\">\n            <Array as=\"points\">\n              <mxPoint x=\"550\" y=\"1264\" />\n              <mxPoint x=\"550\" y=\"1499\" />\n            </Array>\n            <mxPoint x=\"458\" y=\"1293\" as=\"sourcePoint\" />\n          </mxGeometry>\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-71\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=18;\" value=\"Kubernetes - resources provisioned via Helm charts\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"470\" x=\"650\" y=\"1254\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-72\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=18;\" value=\"Prerequisite cloud provider infrastructure\" vertex=\"1\">\n          <mxGeometry height=\"38\" width=\"340\" x=\"260\" y=\"1180\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-2\" parent=\"1\" style=\"aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/mscae/Kubernetes.svg;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"48\" width=\"50\" x=\"600\" y=\"1270\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-14\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=ing;fontSize=18;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"642.5\" y=\"1459\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-15\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=svc;fontSize=14;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"777.5\" y=\"1459\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-23\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-14\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-15\" value=\"\">\n          <mxGeometry x=\"692.5\" y=\"1355\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-17\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=pvc;fontSize=18;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"1167.5\" y=\"1359\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-18\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=pvc;fontSize=18;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"1167.5\" y=\"1549\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-89\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-20\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontColor=#FFFFFF;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-88\" value=\"\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-20\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=pv;fontSize=14;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"1297.5\" y=\"1359\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-30\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-17\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-20\" value=\"\">\n          <mxGeometry x=\"692.5\" y=\"1355\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-24\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=sts;fontSize=14;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"907.5\" y=\"1459\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-26\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-15\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-24\" value=\"\">\n          <mxGeometry x=\"692.5\" y=\"1355\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-87\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-29\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontColor=#FFFFFF;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-34\" value=\"\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-29\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=pv;fontSize=18;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"1297.5\" y=\"1549\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-31\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-18\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-29\" value=\"\">\n          <mxGeometry x=\"692.5\" y=\"1355\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-34\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=sc;fontSize=18;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"1427.5\" y=\"1549\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-36\" edge=\"1\" parent=\"1\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.005;entryY=0.63;entryDx=0;entryDy=0;entryPerimeter=0;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-17\" value=\"\">\n          <mxGeometry x=\"692.5\" y=\"1355\" as=\"geometry\">\n            <mxPoint x=\"1117.5\" y=\"1498.5\" as=\"sourcePoint\" />\n            <mxPoint x=\"1167.5\" y=\"1498.5\" as=\"targetPoint\" />\n          </mxGeometry>\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-37\" edge=\"1\" parent=\"1\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.005;entryY=0.63;entryDx=0;entryDy=0;entryPerimeter=0;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-18\" value=\"\">\n          <mxGeometry x=\"692.5\" y=\"1355\" as=\"geometry\">\n            <mxPoint x=\"1117.5\" y=\"1499\" as=\"sourcePoint\" />\n            <mxPoint x=\"1177.9\" y=\"1419.4\" as=\"targetPoint\" />\n          </mxGeometry>\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-16\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=pod;fontSize=14;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"80\" width=\"80\" x=\"1047.5\" y=\"1459\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-28\" edge=\"1\" parent=\"1\" source=\"8gCH14wMMlRlbYn2JeYQ-24\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=18;\" target=\"8gCH14wMMlRlbYn2JeYQ-16\" value=\"\">\n          <mxGeometry x=\"692.5\" y=\"1355\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-44\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=18;\" value=\"Block Storage (local-home)\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"228\" x=\"1152\" y=\"1306\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-47\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"ing\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"667.5\" y=\"1513\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-48\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"svc\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"802.5\" y=\"1513\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-49\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"sts\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"932.5\" y=\"1513\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-50\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"pod\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"32.5\" x=\"1070\" y=\"1513\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-51\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"pvc\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"1192.5\" y=\"1413\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-52\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"pvc\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"1192.5\" y=\"1603\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-53\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"pv\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"1326.5\" y=\"1411\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-54\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"pv\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"1326.5\" y=\"1601\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-88\" parent=\"1\" style=\"html=1;dashed=0;whitespace=wrap;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon;prIcon=sc;fontSize=14;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"82.5\" width=\"82.5\" x=\"1427.5\" y=\"1359\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-94\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"sc\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"1458\" y=\"1414\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-95\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#FFFFFF;fontSize=14;\" value=\"sc\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"30\" x=\"1458\" y=\"1604\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"8gCH14wMMlRlbYn2JeYQ-96\" parent=\"1\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=18;\" value=\"File Storage (shared-home)\" vertex=\"1\">\n          <mxGeometry height=\"26\" width=\"240\" x=\"1160\" y=\"1494\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-1\" parent=\"1\" style=\"shape=image;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAAAfQAAABiCAYAAACmniFgAAAgAElEQVR4AcS92bOl6VXe6f4H3P0H2B2+7+jovmy77zo62g7bFw4smm47wkYWtHFgt4WQMCAhwIhRUiksRCEJNIE1GUmUjGapJEyNqrkq5/HkycyTeXLOrEEFNNpfxzOtd33f3ifzZIKrFLHj/aa9z8kqVf7286xnrfev/bV7/N/2ud1/e+bshenM2Z1J64Vp+9zFFc614p5e2+cu8nj7nM99vd1f1TNn9Tk43z57YTp7/uLq7Pld3sf7cf0s7vX1/O6EZ3Cd63nfP6/zczu7q7Pt+Jyex7OT7u1Oy2u4fm7nEu5P53YutePd6bzOV+fHfTwznb+g53Af93Cu12Wft/XC5dV5v3YuXl7t8JjvmXYuXMZ7J17XPRzzOteLl6cLF6/oGu5fvLy6sHsF17DinPdxzuNdXtc1PIfzi1zzHK7xdfHS1XG8e1Wfm3vt/OKlq6uLu1emi7tXJ7zHr9Vs3b067V66pnvtud1LV6fdy9dWeOW9eA7Xcc7jyzq/hOdw7/K1FY8vX5tqvXKd1y5duY7PwnW9rlzH89Oly9f9ujbhGdy/fOX66vLVGyvd4znu8X2Xr1zHfZ3j+OoNPpvrPPczV3QPz/B15drN1eWr16crV2/UC/f6OZ7B+VWvOOfxtZt1rZ+34+nKtRvTFT2HZ8fr+q3V1evj/BrPeQ2fPeHeteu3+PIxn881PH/9xosrn2edcu36zRdX127cmvi6fovXr994cbp+g8e8rvMXpxs3X+KzWHMN642bL+F9042bL07X8+Jn4HNenG7cemnV7+H9fM/NF6ebt15a3bz1Ms/xDK7fuPXSbL354ssTn7n1EtebuM9jnd968eUVruEZHN/S8/jsSfdenvgZvu5n+ByevfXSK6tbL76CZ/XS+erWS7mm9UVef3ni+tIrXHH84kvf47NYX+R1rOP10svfW+Gle69ML738PbwXK6/jfO31yqu5xmdefuXV6eVXXl3hxWd9jmNfx5oXnuOx7+f69Mr3/rSOb/e+V773p/UZ+az2fN1bfF59tt9fz7XPqGd8Lc9g7cf4XXMt1/nePX5mnllt+t2X/xzaz8778vPy+9V1PLvpMzf8mfie9mz/Xdbuvfzyqx+9Rzzv/21bW1v/3dbZnY9tbRPkqzNnLxDigfN+10Af0MYxAW5g67igTVAD5oA7QW7IC/YD4oY2QT3gvssvAIT3+d1VB7eBbmgPqOOZehHoPp8dA978QlDgzhcAwFiwxxcCQTrw5r0Gb12/BFgD8AVyHAPGgLvBPu1cvDLV9X6MZy5cJqj5HrzPwAeo23FAnhVA5pcAAh6QN+gB1kAeK8ENKLcXrwPCdd9fCnLOewX7QN/QNrwJbEC8IE8YB/B1Xfd97yoBPIM4vgD4FXhzNcgJbcOaQA+8AX4fE/bjmHAvmOP61RsA8orXAHJdmwBywxtfAHx+nQC+co3vAZBXBDpgHqAH+NcG5AHxABsQ9/nKxwF5PZNnA++1cwEdoBbIb7y4umrAF9Rv3CLIA3Fcr+PAHOviOmDP5wz3DnGCe9N1g/yG3kvAB+ACtqENcAPggD0BLrgD6II8QM9Xzglow11AJ8gBe8Jc8C6Y80vAgDSuL14FcF/v57deBOQFeEF7QD9g1pcAgn0aAC/QE9oFeQJ9gNxA79Dm8bj+Kj4z97kCeIR5+wIAqOSa7hf4Az+AhDB5aQB/CfZAbF/rHnDc+N4Gt9tBkb9fANl/z1xbrHm+/mz9fv3M+ZcX/H5538bfFffrve2fVfvs2fv9xSLX+Lvo/fv7MsTPffl79+2fznf55NbWxb+1tX1hy9AmzBvYocJxrZR5npOyLrVueBPYfH4N5oC8QE8lHsAD2AI6FLdUd92jOg/crcjrGq7znmAvZV7HAHtehjTBP5S5lbrfx2fqWPcEaoHckIY6F9AL6r6f86z4AiAoF9TxXil1QH4G9wJ91PiOFDkgvRK8pcJx3fcCZ8Fban5+TSAn6AHtqHgDP88CxlDVekl1U8VTafsc79/1M1HhQ30vQG6lTnBHnV+Sei+oN1iXeg+8o8oN5gJ3rlt9G+5DfVupG9iEdN5bEIeSXwAeQIfKjvoWwANxKfLcM7j5fCn1NZjfpPruavwq4Gv13q5HcQPMM6AT1lbtOK5zKPfrt/glADBuap0A57lgzvNrOA7AZ2qcKp3wBsAN7g7zlZV37lF587mbL1J9R4EPeBPYfN8S5FHxum41LrVu5U3FTdVNxS7IB9xU9HOVzi8BAvaAOxT72suQXgHuUupR4QJ+IL5cC+KlwKHMS7kb3q9A7ddx3qOVcC6VzmtU6oD8HNxzQOde1DkALmi35wIoQqUBKBBb5T3tXgdR3s/nDTXex/ECsHX9dgBsYNzzd2q/S//5ex5HmWddvD9/Hr4fP3/xO6x9brtf9/y+fEZdX/ys3N/rz7bpffX7+efmvd9/5dVXf/4uUX3nx7e2zv6jM2cv3BCkZbMb5msAD9S3z10AvFfdageAcT/2+VgB6359ptr9OQ3ottybSjeUZ/AG+KXAoc5pvQ94B+J8xlCP6hbMabdTga9flxVPa53Wuy12QZowX0Ce6hsWfLPXCXCc5xrUOABuiNMyD9xjoTdQE8A6lxLPMwvYF6AJ6m7Ldzs+UJfCXkmN25qP7R6rXfa4n7Fyt2Xe4J4vAHN1bqu92+4+jt1OCz02e7PdS4WXGg+4YclDjXdFHshfLiudgC7rPVA3uAP0BcSjyGW/dxteYOf9QB5fBpbQhzovyPsLAQEfuF8T1GOpl4LnddnpVOjNWi8lvrgWoBPg12i3E/A45+sGwO5jwb/s9P4MjgFkrwR+FDigz3tcdZx7Vu28DxVOJQ6bHcrcljmOB8SHItf9stW7zQ6V7nMpdKp22eq206XCpcYL4LwH+N6U1Q7YG+xzmPMZWfBR7TMFPgA+lDlVugENNb6w2gvcgrjUN55p9jqs9+lFqHNb7uOeAA8oA+6C81KBv0qYBtxcrdIB07ouNdmhzXuGEEGCZ/v5Xmo1kFuoz7x301qgCvTyGf4ZvK9rZffnPYFuzjd9fq7hmbxyrdYNvy8/Gz+3/T71fH7X8c9hZu/330fHc7Xf7+Mz+/lex/1n92f4/lde+SuE+va5iz8ftd1UeNR1VLnP11V6h7hgLjAH9rkvS911ctXN+WXAKrwr+4VSj2KXvW5wV918rs4vjrp5AzwAHrDX8ZrFHps9lrq/LOyorh6bfdTOUUMHoKnAh2IXsHM9oJfdLrgT6AS5auS5N+z3hWoHyAPxrAX+BnAoeFrpXG23G+C21qm4+cywzgHu1LuHIpeiHlCXKu91db1HtXQeE8R5n78ASJ2rZp56OQEfm5319VE7l9VOeBPwhjjAWnVy1tM74F0/79DmMersCyu+zrs6j9Xega1jWeyx3+sa1XoHuerpsdwN84UCp7UO2HcVvsluD/xltVN9E9xlvUedw3JvKtwWeUG+rPVupwP4ttgDdgMbinrF+rkt81YvlzqPld5r5L2G7pq6lbXV+0uEPSz0qHLXxOu8A32o8lLqM1XuurhAT9v9pQbxUTfnc4D9LajxVwr2OR4Q1/2FzR7wa2WtHIq8LHWobdfK61ru24LfoNYF9/oy4Dp6gzrr6mWjB9qBmcE8YC5Q+1z2+wJWhEdBbUNt3PcCmawEUL3PXxraZ28EWVPPs8/Z8L5N9+safu7iswrM+Z0Wv/ftLP1NfxZea79X/eyXX5n97Nlz7YvR8s/ffwY+y59X9nv9/viZ+TPMfv73vvfmO0vv2zyhevmF7wxbfWdqqjwgXyr0Ot+WBV/PBdypmRPuM3u919ML+q12nnCcrfWE4xyaE7htrSsgV1b7OVv0UNpS7Zdsq1O5U8UX0KnqC96x311rt/0uVV51dNXPA/rUzSskN4O2AnOql0uN6/kAGCsVupU76+iuk6uefgWKPvV1WfC218dnyHYfcB/nVS8n6AX4bq3DUg/QCfnlOUA/6uMFeip6whqBOdfEW9iN7xGk8x5+DiCOewvbfZzPg3GCuJQ5AV52um34gL2F5PRcFHsHv6BfUAfME37j8RLqBnuvpVORq1ZOgMeGt1IflrtgTrADvIAyYC21jtAba+a6jvo6zq+z5k7bfAZxBt5ujaCcVLegHtVOqI9gXLPcS62XKo9qD8ib9W5FLjveyr1Z7w7ILZQ61Dvg3gAPWFuFE9Sx1qPcCfOmxAe4pc4rHOeA21DpL7POPtT5y7HmY8PTPsd9KXEDvGx12uuy33WNgBfQuyLn+wxywrtUvJ8leA11HDNMN7fWA/FS7B3eBWpb7gAxYfziqItvulbvC+ADdoAj1wL9DokAqAOkH+8Blw6xgC5rgQyf06Bb71l+fvt96pnFtXx21jyX89nP2fD5eW7tfQOsFRjcBNP+vnxWVj7vn1nX/PvjvK7132vTP5fFn5k/s78Hn/Xqq6/+89sge+9bqZcH5lgbzAHtgDrrADnT7oZzJd31/FDbVVPn+3x9VjPXtQH5FooTqAvoFxliw/OqrQPaZb1TeafmDmgXuA13nyOJHngz1c7rTrI72T6D+rimWjm+LFCd24KfB+KYeGdYTkAv6APMUeteqeibKmdanfcIcqt2wDsWe0AOWOc4q+FMSFOhQ51HqctKnwF8BvOWbCfcVV8HgKXMY7Orfj6/Pq4BwguIS/Gntj4HOr8MIKEu6/2SUuqqqTuxnmS7V6r2hSIvlS6Ql92eLwCwxxu0aamXOm+KvGrqUeEKs0l9S2lHiQPeSrsH1Am+9dXq3LY7oEzoR60T9ErDJxRXsAeUbbe7pq4aOa9fvxnljRXQVgLe9XO8D9dZV79+EzZ4nhPgR9181NJlr9dzZa2zlk6Ir9XNE3ijem8Ql9XOmriAbrXeriu9zkDcqJ2z7m57HZAPuBWWK3s9EG8WPG14Ke9blXSfgTshOlryL73i2rlAbOVOgAfOXbWPa6POzmuunXew4/pmsL8iy33U3g34brWPFLzhPIN0gK11hOByvcGF4N8AjoLOfu8tQBPgYd34WRue3/hc//n9PcvjnGfNn3Fx3uHcfx6PF1CdKeS9/hz5/fJzvOazsW767P7PZ9M/o/7+Oz774ouv/KO9yb3hzvb5i//8zNkL16GgG8hXexx3uM/a2GzTN9APyEOl236vOruVO611AHgB+eW5bfeLalcL3KPMuVqtq44OWMeG78p9qPOdSzPYF+Cl2JV8R42cbWu02eu4Jdz5ZSD2eyn3C5d1XWl21clbKI7wNdgF7SsC+FDrtNut3AnyjfBOq5rXQF1huRGSy/XAm6p8HfS056XGbdXThreqt8Ue0Ou5kYTvsA6w+YxVeiBfa1nwVuxQ3JeYaC+wp3aeNXCu88uy4m3Dl/IOvA3wea29gZ33nWBvsKeKtnIveLNeznY1QTzKPKn3rAQ3audNoQfaUeiEuaEfsGeNcped3lT5PAgn0A/gC+huXdN7FZK7xqT7aGeDJb9U71Hg/GIQqFu184vAOOYXA4L+5ouzNjYq8Ga9R51bkSsQJ0Uuax3HVuilxll3T2tbIO81kNdKoAPyAH7WJNdtrxv2sNkJe6vt2O5jJbgL8Atl7vY0tq3l2Mo+kAe8AfS8xvVqV5sF5ADfVkdHsI1fAHh9hOJUc39ptKIF2lkBFBxnzfW+Ako5XwLK751BZQG+fi8g6tf2ddxBGDjm98rvlLXfz7WsG+5Fre/5u/Wfnc+50+p/BvjMfC7Xu/is/t61f0b9z9GO87Pqef0e37v+8st//j9vQPf6pa2zF95HEG/vEOCB+lDko+98AHtnOoM2NrWyIaFesM4zuNatdlw3sFdKtA/FPg/KUWkz1b4APKEsVR41ToBTkedZQJytagF9T7RHrbPnfITlGIADxPNiLT1W+1DhUOMKy7HvnMeun7td7fJayp2qPSD32hR6U+W01BmK2xGcHZATlB2am6lx1tEH0BmE26DIq2UtKr3s9qj2i7TUqcAD6wZ+qnBeXwbkBOSh3KPQvRK6l66uylpXwl3Wemx1ATzhOIXg8gVAq66V5W6A81z95AXzKHM9W3BvUJ8r9IW9DrWNZw15heNcQ49qD6wZeltX66NuDlhfGz3rw2anJS5bPsBPGI52u2x4wN3KPPV1nifRntUqXMo8MG9Jd4bm3KbW6+QGt5S4YM1jgDqWeztWyM2w5ud0wFd9vRLxtN8VklNPetnst16qpLuB78DcgHfa1GLBZyW4m2InpF0z5zOANs5f7Ba8oC31LbArzT6/DqA76V7QjzqPChek1aeeY6yCOfvRBfSWbG+qvaz2gJwBuQrACfACLyFNUCfxnjVgNogJDb8HEAjcCwi8pnp3XWsA4TW8f3ktwANQ2r0OnBxnrc/v721A7J+zPF57b39fPs/XAvD+nv479OONzzRYz+63Pyeu1+fguv9553new/X2ntnz7XeefRaub3rP4vryPfjsa7eFOi32s6Nebnt9dWZ7h3Be2O1R3elBxzN8TqAGnAV+JN0N7+Waz6g1EN5jrYCcQ26l5GmnW5HnvRusd9fOG7gb3GWvM+Rm232k2APtWOo6ryCch87QQqdtT0tdSt6185Fin9fPbbsPsFerWqz1JNy7Moe6HkDX8Jgobqyjbl4DZmSxC9iw12WxA9wLS315D7VwQ31my8tyH+DfvXRtgNz19aVCjzq3Wq+QHM9d/9Y9B+A0UKYAji8ENVSGQ2PUe54hMQCvnxG8A/KstuSp1nFNsO5hulxLD3pBPACnCg/4Z+1rlW6ngo9aB7gJew+UAXAN84K4lLh70a268Uwg3mvnqauX9a4Wt5k6J7SdYE/bWhR6wJ2ku5V4Weq4HyveSpyWuqE+A3mUuuvkw3pnql019Zn9Loudz6WeHmVfgJ/Z7QPqUu5U6lHXrpvDSh819KqrG+xS4lLjA+JOugPaVuq5l6Cc4D3gnEBcwI37hrfr6BV808AZKPQB8kqxt2sD6HnOdXJZ86ONDfAogBvSde4auyCuFjbAJ+cAg1vSsgIG+4VNPdffs4ANn2lQCuTutOZ9fM5QrZLAbT5v9j78Lnfxwnv5/vYeXlu03uUzl8/y+vLZ/O7+nTe+J//M8mz7PepLwIY/86YvK/gd8jNO37hx42+tyfLz5y/9T2e2L2zFUi+Y23IHrPu9AfcMl9mk2qO41VM+FHlq4tVr3q10H0u9n62BM5wOVwof0HZNvKCOa1bjttU1US7wT3Id4MY1KGVDPDV2WO+Ac6ujy1Yf15RqlzIXjGOpE/YCs631TIlz7RxT4wxupd4zTEb1coTdDO8KvBnaOofyriDcBoiXxV7WOBS9Ff6APJV2hs5Eke9eAYxnwB4KnH3jgC/vD8AnGGeoVy3d1wfUocj1ogofg2YCfCl3TYNjul1wF/B7/dxAR22c7xGUa0pcYM4VLWm9pr4h/Ebl7escKrNX3XwAHLAm5FUrF6wNbF23Soe9HpBnJcip1Gc1c1jxUfKEuAGeujphbdsdQ2GGUjf8S7lHkaNW7mR7AX2k3VUvR/28pd+Xal2gb8NkoMATnHMwLsp9D9gzAAdQ81XpdralVShOfenVutZa1ZrNLgu97HjV0ZVwp7X+ooEuNV419LLdb2lCHKCtVw/H8QuBk+54rkJwArWs81n4TVBXuC2WOr8ACMwJwjnlXrXz9Rq6W9UA8LSraRWYx/XAXdcTlAu0seIv+ZwbVjjv13gckPk9Ba4NMCnliHt73O/vz/FyJTDx+236DP4+bvny/cAqa/0e+XPlz6C1UuL1ZSDPLX7v+rz5+wuO+T2Xv38/r2c2/Fn4+fkzbLi//Jz8uZa/V86z8n35d7zhc0/fuPHqgDpa0gLo5QoIR2nrWJDefA0QLht9dpz3Rj177SCP/X7bNXX1Cse5bh7AeyWoDXyAW8AG8HnMLwOuh4/JcYS5au0CvY8B6qHeR/htgDy2O6z41Mln6fYAPmpdLWk7AfroOw/otSYFr+eowA30oc49cKYl3GmjN7gP5e4gnOvkOw3mtt4B7EA9K9U+vwT0FrYGd0yJozpf2O0eLMP0+kyZx1pnfRxjXZNuH5AOrA3o9KTThoedPgO31ff8mq13A58KHmpc56XCqdBbOxuVe+CN9eoNPlvq3NcK4EN9A75S3FrrmM8K8lLqPpZKXwM5YN1a124R9lT1TsDP4J2Q2wLstN+dcAeEUx/3GjWedQbqAvuibs7rusbnY7/j89W65pQ71blHugbmvlaqXP3oVuqlwqvPPHZ5rPWsqatXe5tr5QG8AF6qm2CP4sY9taPNaue0463OM0wmcC+rval318RTU58n3TH1zZZ6Vqr4uc0utd1gXXVxKfOk4McaMCfp7vdWHTwg1zofKrO8F3VpQAAWAQfWfhwA5RrPAZQlVNp5f7Yf57MCMaz9Z+ez67kG3dnntJ+16dlN12bvb5/LZ/3P47bPLN+D88XvgffnM5bH9az/mee55e+a99X9xc9YPs9z/3McSj0Q3xvSGgQTKPeVte+qhS+BPtrOFiBfg/ZIpONnXZwee+rg9PATL6weevz56aHvvuAXjp+fHq7zF3C8Gvfz3At4bz2H53nua488cWCFV67z/MkDqzzziI8feeLA9MiTB/heHvOcv9eUe7n+6JMH8Zl8Hu/HMa89qWuPPnlwevSpg7z/2FOHVo8+dXD16JN8Zhorn8E9vHfyc3jfCv88cP2xp/le3nvM13Evr8fHfV87tFgPTo8/jWuHtD7NdYVr89dhXFs9/vThxfX+3OHpu88cXn33mfFMzrk+e2T67jN8rZ549gif++4zWQ9PuDauH56eeIafh+vTE8/WfZ/z2RxPTz57RK/njk5PPndkeur5Y6sneXyUx089d3ScP1fXpqdwrHM8Nz31PO/x+OkXjq2efgHXjk1P4/XC8RXWZ144PuH6MzjHeuA4j589cGKFe/U6cHz17IETOsczB45Pzx48sXo2xzg/cHx67uCJ1XMHT2Cd8DxeuPasz587eJL3+vr8oZMrvHDt+UO6/7yOcZ3XXjh8avXC4VPT84e44rjfm3APrwOHT/O5nGc9cOT0ii89M+H4oF54z3Tg8Knp4JHTuM714NEt3M/xdOjo1govXON6dGs6dIzXpoM43vA6fOwM3jMdPnZG94/p+PDxM9OR49srXF++jhzfnnRfz+BcL5zz2nTkRK5pPXpie8rr2MmzK7x0fnbS+bnV0RNnJ7yOndTxsZM8xn1c4+v4Kax8z3T85Ll6nTh1fsXzU+em46fO8fjE6fMrPI/XiVPnpxOnz/P45Omd1cnT51e5hut56d7OdPL0+enkFp7b0brFdTq1dYHXTm3trPyaTm3t1Ov0mQu4Xuenti7o+IzXrQvT6TMXp9NnsOq1tX1xtbV9carXGR7j2vx6f2b74nQGr7O7qzNnd3mM92+fQ5B51+ulafscX6vtc5fwwrlXiCQIrct8/uy5SxNeeObs+bwur86dv8zzc+cvr3Ad53ztIJs0XucvXFmd37k8nd+5Mu3guM4hinDtKq7xmOcXr+I5vXB88ep04eLV1YVxPF3Yvcbzi7vXpgvIAOF8F2HdazzevXR9hXt5QdTsXrrO+9WNc/kGr+n8+oT7ly5jH4kbWMdeE1dyDQOwICIwVnq8rlyFo3dzhWtXrt6se76Oa6urN15UO1sH9L0cC9Z3B3Mo3iXkNXtd4bbjp84G5AVsA5ggBsQD9r7yGQFcwA7M2wrYAt4BrwB+AJAWlLEOqPtY7+mQDsxrBbwDdQGdAAec8cVA4A7gvRLsAnjuC/YF6VW+DAT0c7DnuYBb5w3a/DIQgAvSh1aPAertFZjjWo7bOgP+DNrPAPwD7IC7X3zP4llCvD3DZw32grVh3s4Fb4D+yeeOANR6BerPGuhYeY/rFMBjncP7KIEtmB8tcAfgYxXYBXKB22An0AvkLwDUJ1bPEOgGvKAf+AvuBDoAL4AT4gPo03MHAewCfJ0L/oB4Xnh/jgVzQP2FQwL2C4cE8gAdAOd9A50APzQHu4ANaAvYBD/gDbgH4ke3APxxPq4L6oC7oW2oD7AH5scA+TOrQwJ3YA5w8+XrA+LHeZ3nBveKQD8mcBv8BvqA+NET23wOzwLc8xXg3jbICefVMYKcoC/Aj2vn8AWAIA+sAW9c6yvhDcg3iAfmWQHxfkywB+iGfq6dFMQB/4lgB9wF+unUmQsr3J/De5wD1oD5AHwBfIVrgflYB+S3AHRBnfBfgr0gLpivIMAIcoB9vAh6ARx/1wPkgrjATugT4gJ7QTwA72DvIF+d28EGV1ewFtQBcJy3lXAPxHcuBOBeG9AD7g0rID9ATrAb4MwLdZhfB7gF9F105gj8Yw3M4S4W1LlBlM8BaYNeUOd5g3oH/PwYLh/Lez/MWvq9QHz5njGyNZZ71jur9L5zWlfq+ItMCl3K3Gp99fATBwryVuxU14S8YQ11H9D7eilyXA/Ux7FhzPcXmPGzCGODeijvuQIHdPNlgJ/96JMHCGKAHO/NF4HAGvCGAhfopb6j1KG8A2+AWAqdqnqF9xDwVPBDteN6VDrXp3M+AE2AW5kH7Ib2DNhLkEeBL1eDfJKKl0o3wK3GqfL5BQHvjRqXApdSX17jPT0LBQ4FPwf7c0frGpQ54B6IU6nj/Hm8jvFFmEehS3njOoBO9Q2oS41LrfM4qlwrQV3qXIpcSn2uzgFtqvEod6zjmNCPEifUDXaCG+ocQM8auA+VPiAuRQ4lfhKK26q9IM7rzx/Sfawd4FDdeA8g35U6wd1hPkA+g3jUecAOlZ5rM2UOpQ6IC95U7u241HpT6IQ7gE6oHz8DIK8pdFw7cmJ7BZDzJbDj2oA2jhvQBfMo8ih1qXGD3cpc0C54nwzIC94EO6BOmEOVR5FblZdqP3WOCtz3ocD5LFYq81NS4BtVupU5VDuATdUueFOVC/B8P9Q7VTuUe4d7gbwp8QHvC9Pp7YFOjU8AACAASURBVIsFdgB73BPYobYHyHep3gFrXK/VxwB6VDpgD7jjHBDndR0L6mcJdYCcSh0wjyqPCqdahxLfkSofih3lTqn2qHSAPRAP0HEOlW6lboWOzBGVOK5DketcxwQ3rgPghriOdzE7A2Ffq3Mp9Jkyp0IXwKXGL1/He6ZdztAA5AH4AJ27PHqnR3TPUI3zXEAnzKHECfc5uKPYCfDp8hXMo7gV1f79q1dvBOh7B9qW4N50TqVds9lvD3IAG8/fSaEztHZ+d/ru04el1If1XjAH2GG5U5XnGDZ9t+QBaKt5w5vwJ9AL7EOxR7kD5DwW0GewJtxxffnq8LZCB4wF9KHMAW6C3OqcABego8YFdNvsUegd5rjG87Lbm0KnpV5KHWqc9jlA32EdNV7rgD0gTcjnXntffUbgnXtR3jiPMvdxVHutAblBT9gPeBP+BXKAPRY7nqFCl1qn7U6gS50vVfncdm92u8EN+NN2t91OyAfwUOM6lsWe61HmTa3TNs91rM/afofFrheUt6Aemz3nUepU57biuyqX1X6CVvpCmdOGF+CH7Z7zKHSDfyj4rtTLhqcSpxVfcJfFvg70WO2CNsEd6z1We5S6bfhS7odsrQ+LXcqcYMe9AD0KHJY74B3rPYod1rqgTSV+9MRZfgHQNdvuVOdnS73bYqfVDvXdYR7FLsv9LBW7j2nBB/Ky3gH+ufWOc8L7JO11wRtWe0C+UOZU6YC71PfaOhT5Du14QBwWe8H8NNV47Heq8QAdcG7HAffKij1WOyEOQA+Yl4ovmOMentnK2mx3K3Xa8gV1KnQp9sBccCfgaanPlXqUOez3Om7q3BCPGj9PW30vdV6WOux3An3nykKpz2x2w50gX11AKNhA5wpFjnPZ6ron6502u214HtNqjx0vgNtqF8ihwgfUodAD+Kh1rrbgZccPmJfVTnjnuu12WPF/dQodcAbk00c+D8Wtq/OA3FubFtx57razrtJPb+9MgCuUeKnxqps/D+gWwPtxoM66eAN6QK0vAVTqAfyooQvUgrjq4VTSBfAObsF5DnzVxqOks7IuDqUeJT7UuuGMOrtr7QXrqomjjg7VTauckKb1nto6wd6g7nMocQDdYNb7CfbDvObPI6T3hLfq5It6+lDkAbjAXvZ7VDrBHNgvAa7zqp1HfbO2HsAX0G21C+q03lsdXbX0qHTZ7bLiA22tUO6CeGrpe8I8dXMr9qh0gN3wtnqvc143qKnOA22r9V4zr2OpctTVVRvv6nzAfFjsgj0Ab7vddXUoccPbtXOq84318ljqVO8LNY66eRR41ijxnFOVN7Cv187PCPRltbNWTsXNWrpr5QI4QJ4aOgC+LUs+8E5dPWocyt2Qp2IfdfNV1dBdVweo1+32s9NRW/HHTkC5y3bHOiAe+51qfJUa+sxmH3Vz1c9TU1fNPEqcsI4qnyl0A51Q39ox1G2vW6UL4qqjj5r5hRUtd0HdKn3Y7YF5LPdmsRPipwTnpsoHyAPwQJ4w38YAsN2N9fRcF9yl1F1Hl0ovdb47bfN4KHQAnOp81M5RU4e9zto6jlk3jyrHOj+m5Y66OQAeCx4KnVa7oV618ihz185TS3ftfNTP2aYLkBPmVUePSi+QQ7nHelddveBO+x0K3cqcah3HALks91E/514S6JwpkK9GDf2mlHqrmwfolwVy1tNZQ+8KXcG4e1PqIxi3vzp6VHqvoff6uYCOf/F4XZwOHj09D8U50CYrnQqdUKfNnrBbIL7pHOE4vlQz97EU95MHBXgH2wrigXwPvEWhG+BS4gdlo0OZB+yLOrktdQfjHIQzyAX7AwrAKTzHYytyhuIAYdfRW+BNMCfAO8ylumcgj/p+/JnDtOkFYtXU/QWgVHgUdg/HQX0/jiCcQc9zqXJciwovoBvm7XwE4wj0WRhOFrtVeIEd5w3wDMJRtct2b8pcdXTXzKnQDe5xTAtedXVY7xWCYxCOwTgp9Sh0WfQMxjkUFxuetXMo7qhzKHMpdIXhaLmvKfMehjs5wD7q6YB7BecShgvwcY7gm1aBPmrcgDbQYcnPAnBS4LLdHZBTkG4E4kYd3YG4VeroDsHJYl9Y7bzXQnFQ6AsLvgJyhLdr5rHcE4wDzF1PlyovqA+VLogD1FTiUuYCONQ3FTsgHqs9xzm3Uge8aZ3PQZ5A3NxuN9ChvAn3st2jzGO524ZvyhygDtynE6fO0ULntVLopdRbOC6K3HVz2++x1m21lxIPxMtqT/1clju+APBZ2+hR5w3qZbXrHuvoVudNlQPwc4jTXmcdfa7IZbdDjUuhq4au+rlsdir1jWG4stYRilMYLiCXFV/wLogvgA6IF9gNcgLcwThB3hZ8D8IhGLdU6lHtBj3DcAZ51c0NdN5jDd0wJ9RtuRfMA3Vb7gS8VDuUO+x2vxyOk0IPyJsypzrH9StXb33/coA+Uu5pSbvzWsr8LhX6be12W/FdoQfqSPRKdVOVJzAnO31WU1dYzgp81M0FcKh9AHtxXYBn8r1gX9cIetrvVuapixvgsM+l4BV8a8eBetXRCWK8H/a3lToVfGx3gRsqXpY5nsE9vqK2ZZ1LeQverX4eld5X1tHrmUAbXwwIcwbbaMsz/S5Aj+S6gQ+IQ6Wv19sF94Acq4CvsFxd7za7Ic97ALWUOmG+6qE4KO6AXMp8AXZZ8AK8A3EKwVGFL+roSbhnVaI9gTkp9eMOzMVuT7q90uzzZDvq6A3iqqML8LbWURd3bb3b7x3qDMkl2Z7QHNV2LHbD2xAf6XXcr3r5QdXUu1JHUE5K3rX0JNgb6F1XD+AZjIuCL9DPw3BMslulM/jG455ulzKnSredrpp6Eu0OxrGuzlq7UvC21glpHqtWrlr6UOWBedT3DOIBeOAugKN2TgUORV4J98Dcynx23aE4ht907Fo6k+7jmEE5B+H6MZPvVOvzpLuhnuS7lLkV+kytb9luh1qvVLvDcEizV6K9189tt5ftfgEBuhaO2+FxFLgVORPtuWbo04q3Qo8Fz+fataqpE9oOxG0n+T4CcrbaA3UF4gx3qvDU0ZF6pyof6nyKUp+p9QZ2KPTUz7lCsRvoZbt3VR6oG+Ssrat+zhQ7bHan3lNPV7rd1ntS7b12zpo5Q3HXGHrDPatz1MeHUh+KXba71LkT76yRu76O47U0++ryFaXdlXTX/TXL/S8DdNrt6T2/i/Y1ghoA733kGyx3AR3f8tLKlkCcg3JMr6sFjYq91c97a5rUOyA92tOkzA3unmq38o5yN8xjwY+QHJ5bQD7ht6hz3pctr7o5bXWF5Mp6b1a7wnAKzD0Whe77FXorG37WwkYY65kRiAO0632EP+39KPABZ0MYtnteUe5ah5WO86a6CW+cL67jmabKS7nnvRtXwVs1dCjwBcx5jqR74B5rXWr9qGrtUuAIy7FFTc9Ikeea7fcZvHGNdXIq9WpZA8CHYrcNT0UOkBvmQ6Erxc7WNifdUzNnG5tVOK7FOu/HDMa1e8+5Va2r8wb5wBqK3ceEOurlVOlQ7rHVq5a+qKEH6KqdC/y21oc6hw1va5718qNbal8btjvq5N1mV8gNSt2vtLBFjcdmtyKHjZ70+6iZL2rosdhTU4/qDsS1qobOuvpoVwusvRbgbbNHmcdqPzsV0E8wzV62O+rfqqmrba3Xz2dAb21rLRw3QO5UOyDuWjpT7IG62tZgwfvVW9cckhuhuGa5D9DPautNxbtujjDcUOYAdaBu0Kt+boVOW92tbFbjtOJnylwQTxguLWxlt0OV6wW7vdfV1bYGaOcFONdxAK6V7WxOu5daTziO7Wux3Q3v2OtW7tWuJngzJDdhLkeBfLSsKRDnWnrq6Yb5sNxdPy9rvYJwmGw56ueEfCny3rrW7HbeTwBOVnxX5+2YLWxR7H8phd7DcaybVygOdfPbB+Oo0rORCnZEszLP9blCV4AOYEc9Hao4VrsUO3rPodoF+tTGCeF1u11We4XhBPMB9nkQjgn3tLIR+JV+H4E4pNsD9WbBB+SsiaNtLfCPDR+w045XPzoATuXe6uK22l0/V629AB2wt7XuzeHtUFxLvNuWF/Cj4Mf9grnUO+FsYKuWXqr8yPhS0MJwUeAN8msAh2I3sLnOVfqw3mdQR0DO9rtS7j0k5570nnQn3I8J7uw7Tw19nmpn6p096CP1PuCOnnS9AO7Y7j0UF6An6R6go4ZukFOlM/jG9HtT61TwlWJfJOAH+KXGWTe3pX6K7WtVS3frWj/P8VK1B/J9tRqvtjSeU9GP1jWDfrSppQ89a1PmCcgR5Meceq+auvvSW0iOYO/JdtntQ62PYByU+Uy1R40L8JVkp3IfdXQF4fwlwH3pqpsvlHoPwrllLRb82Qq/GeQMwHXAB94MvgHaDsTlerfgez969Z239jTA3bXztKlxJcirda2p9rVWNqlzWvF7Jd5nNfXWjy6QK/Q2QK5zJtsVfotiV/vaSLYH9AT3Wi2dAE8QjutSpUeRL6De6+hzZX5hKHUl3dV7jkR77Ham26nW1b7W1Lhr6CPpzkDczG4fbWpVO5dqZ+18qHQAXK1rUulU61Tp7j2XYh9gT8rdrWux39f70WWvo0UtSXf1pbOGPvrQ7612Pod6D8DdGeiA9/I16uiqnS9r6YD64eNbsNmZbu9AjzovOz01dCp42/BU50OhA7IKyfVaelfsDfCBdVZDXCG31rLW1bhr50u17veM4TFDoRPc+hIQyLs1LXV4g7hAX+1pHDpTahy2uurpUOgCdVfrS2D3QFw/5nOy2q3qWTuPwiek9VnDog/MqdA9UMZgXyr2Om9wlwofsK/zKHbW1zVEhi1qVuBDnauVTQNnmlpXvdyBONfLZbcL7qylA9hVMxe8eT6A3i13HTfLPTVzAH5ZT1ea3Un3NlRmhOJm8F7U0Av4C4hDiad1rSfdKxC3cn96KfW0rMVO71Dvx7bUNVxGStwtam5VkyKHKi9lHvUemCftznUMkVmV1S4LPnXzNYUO+MaGb6qckOe9mQ1PkK/Z781yt90usAPCseHbcSl2QlqBOSvytLXNB8rAWifcRz1dveaunRPsTa27fi5V3q12DJxxkr1UO9vWMmRGrWpQ2kjBE/SlxnG+nm7ntQbySrpbjW+1lrWAeYM6J8Rzv6+ANs4Jb64+FsDRkrZCGA731YuuINxaLd1Wu+x1BePaUBmAW8n2KHQNkWHLmkJx7kN3Lzotdx0r7e46+gjIaZCMWtlG8h0KvEDuvnOeu36OYFxZ7iMQx2uup7NNbcDd7WseKAPAc2qlh8ooIMeEewXhAP3b1dCl0AX0UudXbozBMpssdwTdOrBzDPW9PJYiTyBub5gD0FThm4bKlFLXYJk5zBOQ04p6ep8QZ2uc/ekzoKMebqBb1dd5We++n/q5II+hMwrHWelDYTssN9Q27XUDvsBuoOcewDvUusJuArZr6AC1Yf1YeszTrsY6u3vUh2ovFR81nrR71D0+xxBvUFdNHjVwA5v1cEI+0+Ksxhl4y7U2aEa1dbWktS8EsdoJ54CbIboRkFtT51bjM2Wua5V45+S4rs5ps0uh23rPNDiqdAbjYKmzhm67HT3pPHf4bW65U40z9Q5oVzjO8KYqdy/6AuoVgpup9MUwGbWuSYlLpRvmtNRPVq182OwjCFdta0qys3aea1HdXq3WWUsntHV9ZrkXzCs8l/502eiy05sVr5r41rDZA+8xTGZ18IiCb2lZywpLfQbyUuVKsgPM6knXlLhhwasHnX3oUeOLNcq8rHcn3KHQbbEPoK8l3BOUo93OdHsCcpkcF7Az9AaYE+iw2KXQAWc8o6lwHeTsM6datzJ365oGyfhahd566h195rHZudYgmWbFG+xMvdt6l92eCXKy3H0tLWoIuPFYsGfIzUE4ToGrUBzAHrg3YK8W7WpW5yPxLhWuoJyOmWaP5b6w1WO3y2rPQBkp88tKvMNyz7Q4rrDdNR2OawN7Hy6TlLtAXjX0AfMLV1cYLsP7rqcT7uhHd/952e2019WuBpgz3T633KXICXzsS1HDZjwlLtPiNtfOCXH2mRPkpcrTe+7edFzXi0NjejAu6lztaqmh/9VOiqv6+bryXirxvc5jvc8t9znMU1PHX9IF6Vnrmq13h9v0zFDlBHxUu2DM2vhm273GufIZQloDYzhwhrDuQ2Oa/R6QG/Sun0N1j350AjzKGyo9AJctnzDcrJUtENfK+jh71gNxp9+danf9PCqecE672qilN6iX8k6CneB2fVwQZ12ctnsAH4hHmWfgzO1q6IBznk8IzpAnrDEG1qod0Cf4o9ANdifbB8yt1D0tzmAnyI+iBs6AXG9dK4i/4KQ7R79yvCsGx7Bunla1rIT8qKOXWt+ozGWls31tCfTU1aHaUx9XLR2pdSn1kWKPcpcCx33caxY8e9QN8uo3D/jnA2Q0WKYrcRynjp7rsdYzOW6m1g11q3Cpc0+JY7282e88D9CxJgy3UOZVRzfAM1wmqhxrYI6WNajz1qJW7WqEulvSmtVedXPZ7WXJA87Vc7603Ql1jX2tgTLHT55z0l3WO5T5CL950IyuZSJcDZhBGC72O1aDnDAPyEuZayKc7HUDPjBPLdxrWfF1PardwbhA3cq7IN7r5cvjAL7BPfV01c1b2h3PqG1tNimOilzK3Aq92e6w0a3SC+DDcg/UOUTGSXe3pRnuSbcnBDdbM/Z1qHIMkdFrXGO93BDnkBm2r3GATEu661xQb+1sVuql1qXOMx1Og2UYhqvhMq6jt6S7lXq1qznhnmEz02WOeh3BuCjzst09BtZA/0um3K3g1X8OiEeh53hvsAPKUurjmc0wH/XzgDwbpTAk9/QhQR0WfGroSLCPFLtVu+e2E+QeNGP17oS61LdGvrqlzdY7oE8Il60+7zmPBV/P8flKum9U57LNaa/HjmdATmqdtjm+EERxS4En3OY+9PYZDe5luTPY5kCcQJw6eQ2XmfWh83kAPypdln0BXvCe2+0GN5R5rPOZSgegWxtbAE5AE96eCBcVHqBnzfWsqZ3nvM9r7zBvqhxDY9b7zgV5WOvVshbrvca+lu2uHnMqdKj1A57nPp8StwR71cHnfehS6FLkQ633UFwmxRnYHdpU4oE5YK1jhOFG6j0QT0iuh+ICawIcKXerdNXK3a7maXGZ3R6lnt70tK7ZWk8L27ymbgseytuvCsgF6AZ4DZKJSi+wb2hXC8gD9wZ1AFtQp1JX61pUeyAvmMtujw3f57j7ODb8CMXJSm+1dCp2DpfJZLgKxo3Jcaq1tzGwhHWNd5W9Tsi39jUG4Ea6fUMgjtZ6psJxclyBvNfPCXNZ8APWF/k+n28Eu0EOeC9t9uV5n+VORT4mw+Hvdc94j90OmNt2r+lwUeIOwkWpl0J30j0p93M7V9KnzlGwCcEF5i0MN2rmmhjHENxaHd3qXLa7k+271wJ3D5WhQi8b/uKl62hrK4VOdT6sdyTbUR/flGpvdXPPd68aetrXEIxL2xoVuQbJsAcd54a75rpTvUedL2rosNHvrY4ea76APgvHNWBvsNnXoI6+87WkuxR6QA6w5/jk1nnCVrZ6h/asdW0AeihzKmzb6QXzodIBc9XXGWYztPk84O4pcHXPqpvw7oDPsdrZrNIz1z3z2/cYNKOgm9U34Q6rXXa7p8QF+BwcQ8BXvd396vpSQAXe0u6qr3sSnPvUDf0KuI06ehR5TX8jwK3W53b73GIP6FfaoEU/D2obwN70EqiXm7TMk+54hon2vmaDlhoDm7Y0jYEt2APgqqlrgxYF5px0b7X1AfNsxgJgE9rNhmf/OK+zhl6btnhKXMJwBPcd29Y61AHqqHWBO8qcq+33cS1KHaAO0BfHstyHzb4+9tW96VbkGizDQFxtxoL3KNkuNV6ta4K+NmmBau/181jvSbQva+e4XhDH8RzkCr5latzoO9f0uFLqi9q5rfalGg/EAXipcc1zx3VZ7lVTX6uZA9ix2rn2pDugnfo51rxGK9tQ5t6gJUq8AnJS4aXWqca5iYssddbW1bpGyLN+but9tK/JdgfgRz+6auuAuMCPkNyw1wfcNeoVqXcobly3OqcV31Q4Fbrv8ZnN6lwjYNHCZiVO6Gvka6x3KfFS6rHb3ZueMBzDcVHmqqFXsj0w56pkuzZpka2uGnva1Jx8H3X0kWpnwl3qveCdfvSMfkXtPDX2tKXhHgCuc1nvA+ijdc0tbGpls0pv9fOAvNR51HqDeAC+5yYtNfp1Uw09dfL9rrLRo9KzDqB3mz219FwjxJ10nyv1zXZ71DrWIyfOzHrSHY4bg2bcxkZYW6EbxAS5Id0BD/BGhWv1uVPvVuytZa2p81jt/Bllr6cffdTT1Xee4JvT7QC/VTrt934cS96hOEBayl0QVwBONronw8l2b2Ngo+TzbCCOz8JxqXRZ8zxfghvnVOvzNrW6FiUPYPvZjfCmCl8MlKECf+YwgR0VHoDnnHB2OxvAnrGvSbxbkVdYbtTMDXMDHZZ6aubVwubd1ph477VzA36TOqfVTrXuaXEjIJd0u0e+BvCLEbCy3O+wKcuw4K3QGYyTVS+wB+RZrcarna0F43o9Xb3nngxH5d7a00qlewRsVHqz39mqVgB3Tb1b8QVw7LqWpPtIts/ntw+4Jwg3Hc6UuIBefem038e89ljwqpGrvj6HfLPfo8Ab1PtOa5oaB2inbj5WheIK3gZ5QI86+aYXoJ0aulYPl4la91S42PBqU/MMd+22ZqW+sV7OSXED4C3VruEyBrlgH4ArHAdw9znufG9A3qHO0a9nWtIdDqkhr8Cbe8839qCX1R6bXUBf7q6G4BuuJQwXoAPWnN3eYe7jrtJnUG+2u5T52G3NNfNROx8gp/rOrmtVO3fSHfB221op9MCcQTkl2xOQc9K9t6y1FrahzjlEZuy8pkCczqt1rWBuu121ddfYo9IL6IL2/hV6V+UB/hzom0EegC9XQBzX5up8wPwcJ8aN8w50HB84ciphNw2MEbhlt6tFzfBGLb1efA/AG2We474OMFNRB/RR6TznvHYrd1nobdCMa+Sx3n0/Y2AD8ATdqMgJ8wZww52z2622+TwALbVd411dOzfYC/55LvXzmgrn3vWRhCfAh+1OKDcbXuejPY2KPvBOmC7nWPNqdfW6hntR7KmTB9yb1mzWwpR7FLpDcAH9UOMtDCeIt9Y19aTbRk+POevmgXyUeFntY4AMVbvDcFTugnoB3Qr9hLdO1QYteAaqe8+XN2cBsMeUONXJfS2DZ1rvuXZYS61dMO9bp55iPR3XY68PaGuC3KK+TgXuZ9S+5vp6YJ7g23KFZV7XWiguir3sdyfdeZ5j77wWG77XzfvxkcWGLaypN5UekNtaV0hO89xbDzrVeYP5XJVDuQPQWQ32gNq2u55Ruv1s1dAb6Ec4rqbEoX6+GDBDVX4e89i1TeppHhPeqak3uKd9jSvCb2ldc43cg2aGEqcib3X0rZZojwI34AVvq/P+XKn0odgD8lLqqJMPuI+Ue0JyWTP6NYpcFvulQJx2euz1wFyrg3GZFpdgXJ8Ol+EyTL9r17W2lWoPx9F+dyCOm7Q4xY62Ndrts3BcYK4+c8Ba0IftDqu9KfSo9ij0XkOv4TID5E67j9Q7Q3GCdDZmkeWecNwC4AY557jDcq8+9EB5vyvgu3x2Cen9nAvMY7gMw3BluQPgSbzvDfNzOxhEsMu/5KDO80r4zYrd0CbM27H70GfQ17aqUe4EunvReS1q3GG4T37uG9Pbf/XD04//9HunN735V/l69/2fnr78zcdKyRfw04NuyEPNe7hMm/cu1V5K3fb6Jz//jekdv/rh6U1v/jX+jB//6fum3/roF6avfOsxK/UMk5HNHhVetXQr8FwHuGWrV+q9188L3AR8S7oT2rOQ3Hrvemrqrp83i30E4QL6AN1wTxBOwbjFYJmodalxTYzzsVrUZKlTeff6OhU4oP5cUu2tTW25JzrUeEa+Ju2ua6mTl/2e3nM8H6UOYPN6S7yjLq5auuz3bMYSuNNiVxDOrWon8WWgwnEC+gjCyWJ3q5omxbWkuxS70uyy4JNsT7ta4B6YY2CMFT2gPOz2MR0utfK0sGWITOz1Wdsa4T6HumrpLRCHZwJrH7NlzVCO1c72tDwHoOeYa2Ce+nnOa+2p9rVku6Gumnq33HPclPkM5AA3VfmY5T5s9k12eyl0bdbSe8+ZdncNvdnw2mFNwBfAfQzAx24HsAvse+y2BmB7Uhyh3QNyhjpr6QXujHldANz3S70vz6HY8+r18xwXxEutj6R77hneBnsGzGS4jFW6IU5lHpXua95djcob93uivY5TNx+qXIDv0+EQfquke46rXY1QpyL3MBmDvJS5WtYSkGuqXC1rgLWnwQ2YMyCnka9U37Hc3cI2U+g9FJfjBdB3Jtnu+1fpAHoHuwCua7eDeVfjea5AXjAPyPs6hzrq6IF5FDv+EgfA+4S4AfSWdHcCPtZ6QK26eern3i99w0AZJNcffOip6cf/3X3T//YD/++er3fd93Eq8ajzJN4F8pFqx31a8JVyF+hx7SsPPr4CxPf6Of/4jW8n2FVHV7sarXUm20t5x36vljUrfYIbx2xna9Z71Paopc/BLWu9t7ANi50ta09vDMQt1fnsvEOe8OYAGVrwSrl7tOu453p6V+mup0epZ812qrLaqdAF/lm72vGy4Qn1tjlLO9dgmTZgxgAX8Mee5zzvoHdALlusrqn1gPs5B96o1MekuIJ9auZzy13huMA61vtSnQfcy3XZkw5bPTVzHg+4S7kn1d7GvUKhU3kL5iMI10Ny2E2NaXdvk6qZ7qqjG9ia9b6VevoC6hooo0BcJd2jxtmylhBcbPah2JNu16oQ3FyNU5mPdjX0lxfMB8irhU1KfJF0T5K92+w8LrWedjSt3WqPMufqca9DpdfGLQ3krpsr2e4WtR3u0HGVRQAAIABJREFUl55WNUDcSny5BvIAde6V1X56XkufwbzPc5c6n1vwUeVYqcwJ8lE7tzp30t1wH7Xzmt8OyNOKF7znvegN6O5Fr01aCPCMgOUmLUq5U4UL5t5pDWE419J7IM796GW7p0VtuY5AXAHdCn1soQor3tPiotQJ8DW1XtPiPMN9zHRPXzoArtdIvzfL/Z9rP/TtuwP5Up0H7grG7c9uB4QB9NTTC+pU5V2d45k5zJfnseS3PR52QHz0odNqhxXvYBxg3qx21tCb1T5q521Ou9X69O2Hn179wBt/dk/Idvj+5M9/YCh17LRmda4aOqHOsJuuu0/dYP/Ktx6ffuCNb9/Xz3nX+z4BOA/LHcesnysdb2vezyjpbvAX1PeCd1fpVt+e1U6gA8qx3psaL7t9ea3a0GKzlzofrWpdoadljevSihewWUufbdAC5U6IL+x218dH8t3T41I3L8udqnw+8pX2uyBPFQ7IOxTHc9nqmvm+DnKo87zWrXfAWUqeVn3sdQbgAGVD3En3hOM0VCaJdsL7cPWfx5rn2tPuQ5kP211jXxl66wq9+tAD955yB+hZL29wX9ruCcVlFcxLaa8+/Yffmn7mXR+a/uVbf4OvN7/jP0wf/fSXCfjeuiblvtigZb4Ri5Lu7VqAjhWQ/+wDD04/88v4We/m6yd+7v3Txz/zFaTZ2brWrPZKtKNNTYE4qXKl2dVzHjs+K6CNf08f/PgD01ve+ZvTj73t3Xy9/Vc+PH3pG4+iBx3bn7KNLb3nusY+dPWiW4kH7NpGNRu1LEfANpgL2jOgR50D7A9/98D0yS98a/rN3/08Xx/6vf88fe3b32UpJuNfrdhn4F5X4kivY/e1GcDVn35ud/Xhb96Y3vCb35v+l3f9GV//x3v+dHrPH93MYBm2siENzyQ71uy4hkS7Uu/NeteAmRnUAXG/fvfBm9MP/tar09/+5T/n6+++98+m+778oqbHZftUwLuH4Xr7mlU6WtqWdjtt991rq6Nb16Zf/MLL09+778/4M/7Or/z59EP3/+n0+cdvcTc22+6sqcdqz1AZrsuxrzVYJupcKyA9h7xq6ZjdjqlwhDjb2AT0DJTxStt9UUMfA2OWwAao1661wTNU2rN0+1ypB95R5JvWOdCXynx/UAfY4TQAXg3qArdBHqAH5jgfcK/JcLNaeUCOFSobkO7QvtPxe+7/lKz1pyrhrlo5LXen3aPOk2R/6uBqvzDPz//UF76pmngDu0HOmjtt9kXavdfhpawPAcAa71pWu4AdsPu+Ic7Uut8jwOe5ZqcT4lHgeL9hvoQ9FXuHdu89z3Xa7NyUJQo9vehZkW4/5oEyTK+zDx3wt+3OPdA9u101dAffUjN/OhPjYru7hk6IL+a3R6ET4sNqx5x3WvG21tmPrmNeT42dSt118sV0OOyqNq+ju15e1xcwHxu1tDGwhPlIuPdNWCogF9tdYFdfelfmAPWmcwJc7Wm03QHsuqYaOabCUZWjRh4F/8BXH5re8C/esed/R2940zumb3znSdnyrJ2foVKPMk8LG4JxOq5gnFvYym5f/eevPTL94Jv2/lk/+Kafm771J0+xTc2181LlgrVq5jhWb3rgrvPUzn/74w9M//CfvG3PPxN+zmNPHiLYaa+3We4AtyHuevp87/PaHx02e6bEeZ57dmBLip2pd9fO8QUDEP/ZX/nwxtev/Iffn77+7SegztOWVqn2BnPdsw3fZ7o7BLf69J9cm/7GW/9i+ms/Om18/c23/cX0lSevpfccQAe4k4DPda6y3mW5I+imunrWS9NnH7kx4fNu97O+/vT1PkSGPejNdu919KqbL9rXpl/4wsvTX/83qz1/zn//tu9PTxy9aZhzUxaq8gDdc9u5WQtmvEOdA9pjWpzOBfIAPONe07bWB8rgmdqchfX1XkffN9CXMM95FPnyXMBeQn1v5b4ehlsCfV2hp3UNXxYA8nrtCOoAL2BdFrwnvQnkA9wBuybB1XVDviXZnXT/8jcf3fM/2IB1uf79f/LW6cGHnqZSrxS8h8coJCeoA664jxX18eXn3On8TT/xay3kps+JtT5fFZKT1U4rvdrVAuOh1gfMA3qsPHborfWjE8gtAIeWtTWYN7AXwK3S91ThBXOCXENjqn1tvoUqwm8rKvSoc+5/fkytas9rYMyGZDv70muAjAHPc/efJ+VuZV67rAHoGfOa+nngHlU+h7uBPrZLpSJPD/oS7lHnWPPa1HuODVm65W5bnareCn3Zvla18znQF0pdwTgC3WNeVVOPMq8pct6IJcp9Ux396NaEL553+v9y7n/mgQfX6uaonwvsbHNjCxuGzMRqN/Rpv3/mgQf3/bM++8UHWxjunFW76+Wl1D0lzrXyQP6+3/7Mvn5OQR1DZrApS4d67z8f9XGo+rLYXUMP1FFPVziu96B7BOxzB05OAPZeMO/XP/dHf0xlbmt+ZsUH7N1mV6uaAnAf/OaNPaHXofvf/Og0/c63bjaIy4K3Wge4M9u9NmWxOuc5lPnvPHhr3z/rI9++RXWuNjVNifOAmaqbJ9HOmvnFq6yPA+xv+dQr+/o5gvoN9p8n6T4DenZXc/28We/eF9096FbozVpPMC4W+ywgx5r5lRr/SoVeoTjWz+/Sdo9qXx8sMwf5JjWOa72WPgf6nWFOiO/MIc+aesC+szud2jqfoTO22YfFHohjtfrGIBio8qHMNfVtce3A6u2/+jv7+g83fyFl/cBHPk91X/Vyj4R1+G2FcFyAjlQ7AnZ5792sX3nwMQ2XqVnuzV5H6t02fMCNtcFb963Mv/i1h6dPfuEb0ye/8M3x+vw3pt/7g69P93/sD6f7P7544Vpdf2D9/uL5j3/my9PXv/NED8Jp4xW1rhXcAWcA/ZEnXpg+/YVvTbBp8cJf9jn+3U9+afrtTzwwfXDj64u+3lcc6/Wh3/vi6oO/98XpQ7/3xek/ffHbmuXuSXGsnSsU1232qqMD8oE4Vyn5rsxttScYpxXQTiguq6fGeXLccgws0+8N6LHde9vacsCMQ3FS54I9jvMaYTgAOva6jq3IS5kb6gA6lHquR43PVoO+Eu5Nmf/JY8/fVpkv/7/+D/7J26aHHn8+Sl3tasc1OKaCcc1mj4LHii/0t1Pmaz/rn75tevSJA+k3T/281HqfEudBMqyhf+kbj9zVf6v/7F+/yzBH+1qz4QN0AVwgTxjOapxKvZT5Thss07dQVQ19vzAP2PF3YYAeiLe1K/hMhls99MLl6W/cRi13oOP4v/03q+mRg1esyDF3ZL5JS7WuoYXNA2fStvbooat3/bMeP3Sd8IY6pwIfPekF9WzYYqhPf/DYzX3BPH+2//Gdf8EWtR6Uq13XlpZ7KfSlxZ6BMrW72gLostpTQ0/dfKbQx+Ysdz9YBlAuZZ6pcWw/2x/QO+gJ9I2BuAHtrsg31dCXQMc5etTb1Li1NrXU1fF/ZMOdQB/Ar+tOxr9wz6BFQr3Gvj5Vfekj3e6e89TW//5trLvlX0T9HMpearyn3UePueGdkBzr53OoK/z24d//o+lf/8z71l4/8hO/Pv3vb3jzXf0F1n+/5TFCfV//znej1GXFtwly2Sr1Ow8/M/30uz649vvgd/yh/+edf2W/D36/d/7GR6ay3A3zqPJY8lHyhrkDcIK7aukn2IcOZT5X52pLI8SdbE/t3KE42u6y2pNs13uyCYsV+5gQN/ZBpxpPIC7p9tTPVWMfo19TS09Arux2DJBx7zlt9gyUGTDXHPdxntR7m+F+uh3XxLjpZ971wbv+d/VL932cilzKXPV3jn1dB3mz289MP/vLH7rrn4UgK2z3altzG9uw3pNw1wAZtK4B0Mv/X9/p/Pc++7VhvQvastq9OUvS7Kmlt2T7XLED7h71qgQ7z6evPfjdfSnzwBzrb37k86XSAfINNfVAXXX2s7vTGz7wvbuCHyD4L373FYC8KXX1p3u2u+rrYz901tS3z19ivTwQ3e/6Ix/5XlPpVxSESyhuJNu50xqAfv7C1el/+Ln/767+THAe/sNXX5ZKVwCuTYrzrmvZEx1BuCs3aMPbam+Jd9rtVuKx2m8G7DVQBlDvQMf51Wu3vl+W+1ZNidt/OG4JdAEaMBfQUxPH9ajxQDxBuJznGb6nWtVuXzdPEK5Wp95pved4Z5ejJZled6181NY58a161VlLn9nyUu9NxVPN36ty/slf+ADHwSYUV0n30bqWnnTa7nf6C2Gv+/cD6E9r6AxDcgnGVV3dI2SHMkfAjYAP2P/TH31nIzgBz7/7Q2+567+89vpdc/1HfuLXAvQehpsy4x319vd96D9t/J3+2b+5+79M83Nvt0KtG+KENUBe9jsHySj8Vqq8X3MdHXY77gfwALfhPlPnBjnV99x2T+taqfBKugfaWAX4pTrnvugF+CW8A/Gsro9HnWsqXMbAMvE+30KVM9q7Uk/tnOr8dI10ZRhOyXbWz6G4b/fPfdM9vIdq3HPeDfau1p1u3540bAb2+/Z0rz+rku4YLrMGdNTT2U9O5Y7/jjf9zne6hsAcLfdmu1ut8/pItqNmPg/DjQ1YNAVOtfM2He7MhdvWzTvEl8f4/9PWHca+nklr2/bF6a//671rzHtBFyo9rWpKu6uWvlcP+jnX2m9Xz77dz/JkOGzOwlY2gduKXX3mFYp7/Mj+ygfLn/e//sqfa9gMh8vU5iwZLkPAowXNdfW1AFza0wD5ZrtPuY6JcbLZo9SH3W7Aj1nuUtr7h3mUOVYBXKG5Dui7Oabi3qjQ9w/1XkPvUD+/c0mDZ/pAGbetaciM29zSyuY+85oKp/Oy4u/UqrbXf8hQGayXlzqvfnMC3PfYUw7LHXX3vT7rdtc/8qkvy3KXvY7a+CztTvVuS132O5R8bHfWy1cf+OgXNsLzR97y6/f0O93u98091cg5aIZwzxCZ1M43uQW49obbhJ3y2fey/tQv3r/CXPcGcQ2UaYq9A7+B22p9DJRx3/nqWW7WMurntN1hvc960OcQD+wD7qjzRS2dtXE801R50u01VAYBugC8r4E5riHNzlWWe4179TOqow87vm/MQmAX6OdBOU6Jg3V+L/8u8J6HHn+BUK8+9eo1Vx2919BRS0eq+15/FiA9FDlr5mW7K/E+wnEo0dzLz/mH//RtBrfCcGpdM7hHQG7AXDY8a+ex3bNq6ht3VfNwmZ3pF9790btW6IA7ku8LZd52XKsBMhwq89ALV1ZLsO3nHIr2kQNXV9gnHbZ6WticcqcND4h3wD968Po9/6zHDl3jABkAHTuuxWJXPX2AHe1rH/n2i3elzvPnxZeUWbsa5rl7Yxb3nTMUNwd6s925+5ra1jrEAWvsvlYjYBfHI+1+a9P2qXtDvYN7DvSL06ijI/h2d5Z7lPy8jo5/0amlD9t9abXnvGDuOe8D6OpVh/1+8OjpalmLGle6XbX12h51Yb8nAe/w2uqX7vvE6l7+A/6Pn/9GheKqRc3BuGzMErsd9+/1i8NXH3xcbWhU5qyZC+jjnF0AqNcL6HOY49r7PvjZjUD/F//2V+7pL6/9/PMKuLFWG1vbE30voP/AD++vfXA/v0N/5qf+/f2qpTeAA9pW6lTeVT933bzOR3vaYjrccSfbZ1Cn6h62OxR3Qb3Z71HpVOJMuS8mxE3YVrhDnQA/NB8uk9BcbHjXzvmFoKt42u9U5m1+u0EOuFcNPcrcAbi0p+G/Nybe23XkJfo/47s5/uJXHy6gz9Q6wZ6QnGrrgP43/8tT9/yz/uhrjwDohnj60KXKR8pd5x//zFfv+edUII47r53nXuiy2D05rtnvSbZnkEzCcU64C+Sw3r33+VJ57/f8699+Ygl02etDlXMmOyz5Lz1x9Z7gB6B/9uEbqJEz6V4gp81e7WtoTyuof/Wpa/f8s/7g0Zux3bvlPhHuqa17Itx9X33pnn8OgK5AnGe4N5udIE8wbta6hiEzA+wD4FTivBdlHpu9J917Db1CcR3Q+zmu0a97tq7tH+qActR8rPhc07o30FNXZ/2cNrs2btnrHH/ZLYfH6BxQr3r56E/3ZDfAnOG5Jw8wrX43fxHhWfSs6wsBVHle7EmnOu82/GPcy/zg6pOf/8Zd/0Xx1l/4gNU5B8qkVU0qnWNgBXGq9jE2tr4AuMVtuu9Dn11tAuh/daBv7EOXat/0++DafzWg/2IDOqF+HG1oUuzuRU9d3a1ouW87/XgpctnsgHheCcgdh11O6A+IC+b4zHGtp9sFbdybAz3A95jXAXIq9IC+K3MpcqhyKXeq8JZoT+95V+eBOSbKOQgHlZ5JcVDpebGGLstd7WoIxN3tfzt5Hl+kCuRS57TZewgOx9p1DYG4e1fo+GeffdAHwFu6/ZS2UMW9e1Xo/8AKPQCP/Z5NWMpm92S4gJybtjjRHsivJ90v3LNC/84jz8pyH2NgY8E3pc50++qh5+9doR84qf3PodLnCn2E4RKKg1J/9NC9A/3I6WsAeXZgy6qQXCbHGeh/WYXuqXFU6xkiE5jX2oJyqKenbU1glyK39d4sd1ntAHjUutV51dNrP/S72ZwFCrxDv+DueexR8oF01mUdPdex5t4Aume7E/brQIcCjzrHOlPoUelrgMfEoUv8S1KhNwEcan1mr8NiH68O+gTnpl+67xN39RfTb330C7TsBXPsruYBM2xT0zAZW+5jlvtdJt1h0SvhrulwVN+pm1c/ucbDBtwKz/UJcGpRe30UusDdlbp70NmC9poDPQo90+JqHKzq4oF51dAJe81zZ+3c9XPZ7UORo56uNLusdkKeijypdvadp1aelcobUDbIXTdfKvIBdTxLiCfhHmhj21QdZ4XNXgl33OP4V9XPU1OvHvQo8w75BnQqdw6bmVvuqqkf3bqnujbKKlDdBLqt9tTRxzWq9OpVB9jvpYaOn9Xsdqn0RR0dA2RivT9/8OQ9OXZveef7VUNP21pUOjZjGTVz7YcOpb7oPy/An7mQ/dDZwpZ6OgbH7FeV9+fg4KSGvrDel0p92trevaca+t9861/Ma+hjQtyGdrXLnA63fe7ybXvCY30vV7SVpf/cSfcBdKhzv1BXRwr+yNa9fXH4e+/7c06KG0DX6FfY7QA5AM2WNfaiD1WeHdc4x/2yVHmroScQF2inhY1r4H7l6i0F5q7e+GFOiruXtjVAPXAfEN+/Mt8L5B3qHdqbjkuhd6ivgTyqXUAn1A+dGPZ7BeEUkkvrGsNwnBJ3UFPkMgLWk+P2O1wGE9wAa9rpAXipdKt1Jdw5MQ6QhWLH+u2Hn9nXpDjA/KOf+hIs9KTXtVqFD3vdyfdnEIKz5e5wHL4ApJXt9QE6h8RUq1oHO0JxrxvQoc4ViEtILmvfpEU96YZ41dMPnuBwGQCcKn1RQ6fNbntdKn+hymuozHy4zKifj5q5AV4hOMI84A7UU0M/VLXyAJtrFDvXZq9TqTP5PobLzBS6LXgqdo9/ZS3ddnumw2HntXf/1qfv6sswFPp7fuvTE2rkgvgc7Jkg19ZS6e+9/+5/1nt/+7OEuFLuUuLsNfcIWLau1Sx3Jd5/7K3vvus/0yc++1X1oBfIvUmLwG2Aj5p66uUAOVW6h8tYpQvmTLtzdjszBB3U+zn+2Ge+Qmh3kPN4zHVnyj396LDd/+3vv3zXte2f+I8vS5Wfy+5rHiJTfehjfjv70HF95/L0E598+a7t8Ld88mUCXfXzKz5W3TzT4dyuxqT7+YtXORFu+cXgdudMuX/tZQ2V8Xx32O9R6II6Z7or/V4jX0fNXCod4JcSh/Xewe5zA32o9avXCHMG5kqhA85btM/3rqF3VZ5jQLkfS3UL9IL83sNk9OxQ4qqZR3nr+lKJd6hvN5V+e4UOkHeoa5gBgOH2tIUKh3K3eu9BOU+Jay1u0y+97xO002ML9vUfv/Fnp9/95B9V3bwUOGBugHerXZa857uPATOr7zz87Oodt+l9R+r+81/+L7TaEaazZV/BOM5oD7RvA/GedH+dgM6pcU+gBx0z3FvrGv5dvdZA/3dQ6JnXnnBcRr2qZk77vRS6U+4cKNMS71Hrsttbyp3bpp6ALS+LvurmgHoAPrPa3Z/O+6XY+4AZDJYpZe4RsFHpM8AD9IH7PAjnWnpZ8LNQXDZuyXAZQ3tY7gY7bXdvlTpq6mpdw6S+202I6/8N4RiKGeFEKnGn3NmypulxBfkB9KqnM+eA9y8/c69z9Kzj3xMAXq1rTZ3Lfs/UOLWtQak//tSh1e0mxC1/HkbBtpGvM6UedU4rXsoc41zdk+7NWARzgb0NliHs3cIGpf7+20yIWwIeITr8f8QwX2GOO4C91wsz2nHvuWOXbjshbglCTHg7eAJ96LLak3LnUBkrdc1un2+jimsHT16Z/ubbvr9vqOPZw6evUZFTnadd7cIVbL4ymxAXhQ6V/viR63flBvxf9//pfDvVS1LnHjCTpHvNc7cqh/qe1c9juTeQN4CnjS3Al/XebPd7222tQzwwxzpUOmC8f6UeRY7PTTAusO+Q5/8BGsQDd8IcwN5otS9hnnN8M9z1sJI+cOaAlXsHOqfFZfDMALTT75gA95FPfmmFPnOodoTmEICDrQ5IG9TsNy9ow3Lv7WoZAauxr2MsLMBuuGNXNfSY4+e89ec/ML3ntz8zffoL30y7mRS3gI0QnM/dosZxr5oIR5s9gPfaLXhMgHs9gJ7pcQT5gHkp9tca6AzFpVZ+p5a1PlzGxwS5W9bShz5a1hKOy5CZ1NFju0upB86ulQfWBDvuDaUOkAvmHhpDMOf9vsYEPEJwttxniXdY6FLotSlLbPiy26HUAejY7VTpqJ8vFDqA71p6WfA5h1p/6PEXVvuBOmCcdPthj38dFvsIwG2qoyPpjtY11NL3A3XAHF/W8R7UzwvoGPd68txKM91dR6flnvS7wnFQ3EtwbzpHm+Xzh09xbnuF4tC6ll50B+F87lR7lLonxnmPdPWfa//zWO3sRTfUjxzb3tekOMActfOCuYN1pc6HQl8DPNQ60u63G/saqMNqf+TAFfegN6B3pV72O0e9OhQnxQ6oP3Jwf8NlYLU/fvh61c5juyPZjmMCPavtdsCcYN+9ttpvOA5DZY5v35DdrpY1B+PcusZg3FDntN4djosNL7td7WqB+ki235wuc2tUAJ0Qr5GvUe2G+mhbUw19f+o8NfPAXAn3C0q6F9j3p8wDbsL8/Pw9HeaB96Y1Kl5Ax7e6qPGssdpzjlXXOtQzKa7q6QrCqV3NG7kQ0KmvOzBHcDf1jr8UAOvAvEGcypznUegF/LLka/MWqW3PeR/At60+RsRyupyUuVR5JsSN1rRAn+1pUewKxiXhPux23H89gA4V3tLtE5V62z71NQc6QnGum6d1jefjmpLupeK9H3r1nacHfayx1aXWVVd3SxtVukJwqpO7la0F4xCCU8I9zwXYAL7a1cZe6EmxE96x3A/zfoE8qfasAT2BrXAcBsjAjlddfYDb1wxzWetU6qyf47lmt1ulMzgH2x0z3R967PnbDpnBZi0Pu1Ut6nxmu8OCb61rhDo3YRHoE44DmPHf5O2GzMAyx3/HI9muXvNx7t3VbLWzD9296Bgs41nuq8eePHjbyXQov2EnPahzvlA/dw1de6LLdi+Y98lxrqtTrdOW54YtNRI2QAfk2+5q09Hj26tPfv6be9bTMecdWRVs0GI1zl3X9lLm/bq2S92d0Jf+0AtXbjtk5m+/68+mh1+4op3XBHAOlmHwDRCv9jXb7eei0LNt6hVOjgPUHz14bfrBD7y6p1L/O7/859Pjh69N2YEtEM9qNa7e83nKndei1h8/ipnxezsCP/rRV6dj29dLnWf062KTlnWFnnGwtN4Tiht2u6Cuc4BdcOcwmU3DZWS3a7CMd1trafWAetMK8OY6VPg41nUBOmp9DujAG1DO8aaVit1w3wT12jK1jX4lxNdA3gGe48B9rIT6MxgrCjWNern3SMdYWM9v5z0rcgJfdXQp8AH4ocjRaz6uI9nOe0m4B/YMxwXWixU1d9a5PUGOij6KnQCXen9MqfjRiuZ7VuJOuB/iqi1SMwo26n2cW6m/LkAvhS6Iy35/vYGe2rnXZq+zfg7Qj2vYE50p9pFub3DXcBmk2mmzL612h99kp8tylxUvFV7XHYYb1vqmpDvAHNjbWi/FPgP9GuA9PCb18qy9nu7jg0c4t11gH0Dn7muEuoEeyz2bsizXhx9/YQXn6d+/9+Pcde23PvKF6U8w6pWKXBuvBOhYAe62GYs3ZuFGLJV6F8w5XIYq/YhAz//GMZr4l973cQL+gx97YPXIEwelyjFE5uS52iPdKXe3rpXNznNY7345QFctbdi8ZfryNx9bYbY7rHVA/EOf+OKKIA/AMcdds9yl1K3QAfK8nHYHsL1ZS1PnttxVT9fI15oS5wR8etMNd4z9XX39O0+sMMb5Y5/56oTWPLgXUOF5bWmgDOvkUesd4L7Psa+47i1S+Tx2UINaf/jAldU7/+BFToPDFDkcQ5XTYdXuaitup9pVedukhYBHzZyQp0rXHHdu0iLIZ7c19Jf/wudfmjANDruu4Rggx6hYW+yl0Bl+S6I9YTgo8xGKYw09Kh1QxwuQ/txjt6af/NT3pv/z/j+dfvRjr06/+IevrI6doQKvINwIw7n/nNBm+1pCcRkuw9p6r5kP6z12usa/4plFGxvP2cZ2tQbLAPKE+qxtbb8qvRT5DOiBeF83A30TxDddE8wvVpq918xxHGWOLwgzoG8EOwAeqA+FjqEz+ILQoc4w3GhhI9RTUxf0Ne89ypzQN+B5zao70O5rbHaq9NTSpfTdzqbtVAvegLwhXqG6AWwCn0p+D4sdUJcSH5uxGPS+rkQ8w3DPYD/z1zPlrnnt2YVtHoo7/JrX0Gd96AD6AW2lCtscEF+k3LmTGq6zhj52WSPwpcJLkbNGbrVOkPMYNfQRgnMdXdZ7FHngLlgxJ/flAAAgAElEQVSfKus98PZqtd5S7kOhK/mexLvtd4feUC9nOE4KXeNfaxxsgRxqvXZUW9jtgvyhY7Lco9ID9b7bWoEdU+SObaEWTuUOkPu42tRcH2eC3VAnvHEceKuuPge72thkvcOCh+KWFQ9LnVuqGuLb1XeuMNwY/RqrPRPjUkc/fur8Eu7YFlX7o58i4Al3AD4vqvFT53luZc6tVAnxptRLoSftjrUl3SsYl/p5q5uXUucGLcOOtxWPMbEBeNv/fKjzBvAOdqh3nrf7VPTapGW34L62D7rVOPdFZ92c89u521ra1bJ6VzX1pnuOe4bLnNu5siLIdy5nrW1Sz+9c9jFDbyuc83XhynyXNZynjh64Z/zrrmrqBvnqwu41Ar6BneeoiwPeF3YFe6tyDpEx1Fe7Gf96WX3pSbor7a7xrlVHb9umcqvU2u+8ZrqXQo/FjpVQHyNgpdKTcpfSvr3l3hV5lDlWAn42y31vkFN9V3ubnss11c9HKG60suXa5nUt6b4G7g7yAfPY7lnxxUBBuaqZl2qPHW+gU8kT1FLtqpf72IDnNSvwodxdVxfYmTgftXVPkJMyPyTAC96qtw+wMzEfq13WfGrmUe0GOEAfC951dKt+DZWRLQ/1Xgn319NyN8z574HBOO2sxjr662K5a6hMwm9S5QB7C8ctwE6VTtWesa+zZLug3i13TY9LC1sH+PwYsE7LGq332RAZWe0BegAfpQ6VjmtW56mhc43dns1Zmu2eQFws96qd24LnedXP04seu73tuFbwVivbbCtVqu/jZ7TFahvtmutcl9dzXpb73GZf1tRzLohrW1XBXVDvEPdx7YEugHNP9AAcQKbNzvS7gM3nDW5CHXDPq4B+WsAvFX6a+6DTdq990g1uQZ0huBGIS+08cA/Qt7hJy6xtLco8qxX7lDWq/PSZiwb7GtQ3AryUuQFvoPPZBcwxCY5DaKDercoL5FbsowddAK+aeQXjvEmLYU5wW4Gzna0fn0evOWF+JUCvljWDXMq9KfM+LS5BuUCc6652YLtowGP/c8N8ps4J9l0NlMlwGaxJurNlDao9PeiVdO9bqHrnNQyaIeil2Gm5e0/0UuMA/9WbmOFOG342y/1MzXIfNnqH9p2OpbC7Osfx3mDPPapwPxcrPsocz+hYQMb9vKLW11T6DOaBdwf6sNoD8qxQ67B7AHW2rj05gnGAtK12QX7A29BX+C02e4AdJR6Vjuu6hhq40+5S4dxtDfcaqGc96VHoAHRUu2AeiPcRrwPwstE10rUmw7Gd7XBNkPM+6IH662K5B+aw3g3zCsTh38lrDnSm3NWyhrY11s+9xmYPzLN2kCsAx2E0tuI5CtZDZ2Knj2tS4XXdCp0qu6XbZb0Pm72s9QTmUmcvy73gbqhDjQfafc11gb2CcVDjAfusjp66evWgu77u8FsGzdCCj1JH/Txwp1rHPumCc1LsWaPak2IvtQ7AH4GKTz+6Vqr3odY1YMYAp5pPSC5QHwq9FLzsc6XaCWjAHa+odNTK1aNu1c1zpd0JbW+petzWOq7BWi+gd3XudjWrcSl1Xksfet8P3QqdVjsS7067G+hlvXsP9GzWArVOoG8T2qXIodKhuAN1QLod8/rW9i5XANv2e2rsUeZlvQvysuADcSrys1LuUOAAeFfpAjr+TtcmLd6YRWNfpcJVM59t0oK/o1NTlyon0HcM8gBdQ2SUbrf9Lgteveax2bE2iFOVLy33gjtUOWx4tKXd5gUVHqCrlr6YGmeoy3Kf18+rdt5a1qLEl+rcYIcypzqXDe8+9DPZOjXroqa+lzoP6Hl/Ldl+Z6iXOseYVwIcdoxALqA3iHPu7zgP3M+6lj5s9032eqC+N9ABdkJ9Lf2uQTPDih/wjsXulYE2wruUu57Nc4K5r6E2Hpg7yZ7zwDtfDB7z9DiCnPula/MVqm0DPtY6IW9lHjXu2jhVOZ/rKXfZ8g7MyYJ/nUJxK89vX2tZe92A7h50tK+lXk6wO/1O+932eiBfUPdUOJwz8Q7FrmcH1D1QBpb7XhPjAnrY7YHzBqCPsa+9da0pcyp09Z/Tkg/MMyUO50uYe/wrbXXa8II2FXvOZ2p9XjevpHsl3GXFU6ET7gQ67faAvdal7Z6aetrTotytvgl03jsBBR4rnmCnLQ+g24IHpFlbtwUvu53XZpuxsJ4ugM+uA/AcLNMsdtbUEXQLvPuqAJzALtsd26ZKnfcNWQJ3B+SSfI/dXrV0gHr0n2uwDC311M8djIv9bpUeaBfIA/HlunVm405rM6AD4nkB1DiewdzqPGCXQlfLsOrkBrlr6Whbw6hXjXuVuPJzqqED5LHbdYzQG6EdlV5Wu1W6N2OZt60F4gnDZVXNnK1sVuYC+IA4FTnUeUHd7Wkc+dogr4lwXa1fdzCu4D42Z/GkuJZ0Zy864T7sd7Wvtbq5N2sJ0HF/0yz3u1foo6Z+Z0UeZR5Y9/PZtbuY4w6wsz6edabSBXfVygN1rHuDPVDHX8RR3Ms1cM91Ku+COBPoZaXzmZGItxXPJHypcry/lHnq5osVUJcil/qOOhe0CWKF6ALzqqvLfhfwq2Zumx1180OTetBrLOzrNsudKXe2rHlqXBsF+5or9MXoVybdA/LWZ14Ab9ccgNMwmQNjk5bUymOzV8J9rQe92+0CeQf7zHovgCsBj/AT4FwW+4B6lLn2RU8dnVPiWDunhU6wj/Gv661rs1p6n/OOujpr6FLlttxRT4dCpyJvK5Q51LrB3evm2Mhlpsihxq3MGYjTMW32VaudMzAnmAvem6z2wFwrw26srTvRPkJxDMklDLdpXVfrDeJrYHeyXQl31ctLlZe9PtrXDHNt3GJ4E+gZ/QpV7lp6rHbsjU5FToVedXXV0TdBHRB2un0N8ksFD6UegGel3a5wHK11wBvXts/SameK3deszglx2++jbc296FTnY64790mHImfNPLV0QHzNft+5slZDh/p2MA7rgLr6z9ODnjVjYLkS2qmtj3BcrPY1hU5VPgc6AnCzWnr2R3cYrgfkDHcNmRHYbbkH6Lbbu0o30Gm3W6Vj+9S7S7lHkS9XQB3XoNT1AtzvrNA70KPWBfbY7fzWV1Z7qXLb76mfE+oJxwHoG+EukAvuA+j9HMf1unBpeu7QCdnvbkub2e5OrgPYVOACetXLA3sq9gBdqtyJ99aSFrUusMtStyVvlT2z2RcwR1vaeAXoqL+ndU27qZXFjmAcQI4Vnx8Fr1r64dXrNMt9ZrFDlffhMq810DlYJgo9K1rWFlDn+YHjCsUNFU6YS52zPr6a1c0POO2uee21gQtAHbWeAJxArp5zQHrAPKCfKXdY7qXkBfb5EJkoddzzi5Z6ztOnnjBc2taiyF0zh2pnSxvOo9JbPR1ta912lyp3DT1wj/1usAvuCsV1oNOGh/qmKjfcDXWq8ah2bZ06gnFpXbMypyqXjV7Kvfebrxx8G8q87PfsrqY+dNfO1a7m9rW0rhXUdX3Y7WlVW9TRo8qxGuwEdx0L3K6jO+keJe6pcdqgRbutGdyBO1W5g3ALaC9t9lLlAPdGmz0gx3rm7EVBXMc4F7QB9FE7R42cu6rFYgfgZbML6NkXvSz38yPJPpLuaWGTcociT9Kdx8tQXMEc+5sjCIdd1mqWuzZqcR09ljusdtrtsdYN8rLcqdShzlsYLhC/dI0Al9UONQ6Yx3rn2FeeS7nzPlS490Rf2u5j+9R1lY4+dNTVlXBXX/rYG/2egE57nfDGv8Ch6AlwX98PzBN6C9QB5TpudfXU0Zcw7+d7AnwGdql1pd0H0KPWA/bzFy5N/YW/6MpGB7QD7oAcYB/qvGa2N5CnXq7PEdydardSj+W+aFGbWe+Vbl+fBgegW70T0P4SMAP2CMcF4Id132A3zAn6+16H3daGOnfafQyXYZ/s6wr0muOuPdGpypsiB9STbl/suMaUu2AuWFOlL633A+PeAPlyWpzq57kPMAvwBvrckq8NWQjwmgx3Ouo8wbhhs3uwDP7/Tnhrljs3bhkwV985Ae4BMzU1TmE41sgzWCbp9qyw3gvm2iOdEJ8BHWl3wVsATwBusUp9D+UeNc71xDbgXeo9dfMBdqbdnXRXwj2gB6xxTKvd66id4zqtc4fgaLHreA72AXLW088R1oF90u5JumM6XAF8Oct9nnSPKs+Md6vzzHO/ELWe61wDeaxpZwOU51b7sNABdMN7tTVX5qsz455q6aXQB9CjykfwjfAW2Avo2GntktvTNAJ2gzpXzXzZshbrvUB+mWE41dPVsgZ1jj70Gcg9VMYBOalzt601oM/S7TP7XQDfKwxnaF/TCNjFkJmCuUNxUOpOug/7fd6mxgEyc1VebW3daucxlH1rW7t9wr2De9Nx2e77AHpX4gF41kB9QPz2Cj1QH/XzbqvHWp9fC7hZMw+8bcET5FDpF/B/Cqx6HTp6egZyAXz0mkOhR6WnXu6xrrxe12pCXLWnUVkDxg7JGfSy4AFmq/HqSbeqjiIvgFtl5zmqboLdSfYcW7XzuShzfKaArvX1qKET6O5BpzpvPegYfPFaA73a1tyi1mvnme1uu1296KmZY1JcEu4EdR8sk5Q7AU7VDtvdkO696DxGrdyK3PdmCr2mwwXuGi4DwM/61GO/1+re9Cj0WpN472odih2ADtT7mutR5lUrtzpv5xw0Q0Vuqx22us5ntrtUeof3QrFHqcNap2JXSK6GzNhKJ9AdfGPtvMGcNXPcS33cAKdCL5h7dnvUOFdek9Xu9Dvr6a6l14AZgNsWuwbIDFXeJ8TxnvrMNWBmgH0ocQfgsgELlTdsd78I7FjtAjZnvct6lwUPW32m2PncIhgH670Nl0l9nDusLUNxALaBL6g7/BaVHqBj7bXzBeBppwPiCs2lbj62TI3NbkVeITmCO8E3BuJiuaNdLcdKuhPoAnsseLWulYrXBi1W4us1dLeoqXYudY5nKxh36ZoAL4BbnWv0ayXaxz3C2yDnFwD2oCvR7jGwhPZKw2Ru8toyGNeDcC0c95eroQPCHe5S5fu32Rl+WyThBej0nmdVEA7Qxv2o8SXMeW9WPw/IuzIP5OcKvWx2wtwgX4Ad+ztXz/lQ6gR91dCt1KPYm0ofVnxNh7PlbnVONZ5NXFw/x7WmvhOiUx0e72OdvNS5h8iMLwOlym3Ds46eQJxs+Njts9a11wvogTpS7mlbC9xfa6BrljssdvWfP/3CsflmLOk5b0o9yt2KvNXQNeq196PHWteqUBwtdwXlAN8G8ZOcMBZw6wvAsNoN8kXSnZY6Ffmw4cc1KnHvvBabfQnyBu9Kuucak+ujNU396LHZs0FLWtja1LhKurf+8wb2savaHOquj6s9LSp8UT8XuKnM2Y5mi11tagP0owc9yl3qfChzQZ2talLrSLqPYTJsXzPo+aUAStvAlzLfYLcPde6hMk7CF8S3dlhTb2G5WRhOG7II9KmjZy/0pNw70DvkcV2vkWyPOre9XnZ8KXPa7hcnBOT2qJ8H5lDtqp3TardS16CZYbkD7k67w4a3Ove0uMtcVUvH383cYU218pFqH+dW5ku7vRT6jtS57PaqpRPWqaujXQ1gpjJ3UC5Q95pUuxQ72tYYiDPMo8Bju2MdIbmy3WO/o32t+tGjztvWqVU7t0pHT3omxA2VHqs9Sl3nbl37/mxzlg7nuz2Wwk79fP9Qx/tmqfay2kfALhDHmna1wDxrKfSZxR6g9zVwnwN9zXYvsM+VuqEutW6o/8fPfZ0ToX78p987YaMUvN5z/6enL33r0bLYAXaq+Kd625qAbmAL3K6bR5Uz5W7gY390zHHXz/i16cd/+j7OdseWqTOwDwsdn8lRsTP1zvsHGYQbqhxtbQrIQcG/XkB3yp2tgwF5wP5aA/2nWijOCfcl0KPMpchrhvsJXQfoXVMf6XYl3rvtXsE42+6cEjcGzJRCD8zbutdgGSpxPedw3HowrlR5QTwWe9XEYa8vxr4C2Edou1O1l92+SLdTsfftU4+dYT3d4EbPebWvJQCHe0iyU7kD5hkwk/Y0TYljmr2H5Ah1QZz3HHorVd6UOa8lDBf1HqiPxPvYYU1bpHrs6ymvrXWtID4AvhaGK5Crhk7gs16uYBzT7ky6F9Ax/hWz25OCTxsbr2lr1XkNHcNitIGLFXls9awBenrQsQLkgLfVdyz2suEN9jWYB+5S4cOmpzpv9XSrcdfPU0d3KK6Nem2QR12cKjzKHCn3RbJ9xVBcauhKs1c/egCfXnSn3EuZE+YJxY0BM6qdA/C711Y7F9nKNhLuUuNQ4XOg75Yyz+z22Trq6SPZvrTdpdR7Db3q57HbtWKWe+rms6R71c/ZujYD+tY99qIPmN99EE7vFbyXVnxgvWldgn3vlHtgvjfIY8Gvq/Q5zGO/Hz25TaX+4ENPEaqbNmDItXfd93GAPDY6U+2x1wn5FobTc7LYtX2qRr9+5VuPT29686/tufHDP37j2wl2fQlI/7lAHoVOZc4a/AjBsSfddjzAHisex68H0NGHboWucBz60Z89wmNA/bUGOhR6ku2x27lmHGwPx9litwXPSXJsVYOKV9CN42ADeALdu60R6CPlHlXuVWn3TRCHSm/X6zg7rgHUuN9W1c09NW5pr+O5tLBZhWegzJrdXlunRoFnPTpmuJeCF7wHwNtwGQJ+BOWGBb+w2WOtE+QE/JnUxwlxQDt96VTvx6XKc7yEdyDu67NpccNy3yvZzr5zDZkByOe96LTRDXHCnSNeY8Fr9bapZcuzfk7IV72c+58vtlDl7PZZ7ZzKnL3nVUO3Ja8tVANyrB3mvm54Q7XPwR6Lvat4Jtrn9fSy3QP3brXTbj/HxLvCclDnVOmtnu4d1xx+y7hXD5cRzAN1QD4Jd0Odiv281DxT7lLoNVQGilzpdih218pZW+91c6lzKXW1qGkinOvlVOtW5km/l93eVHld8yS5hOJcK6+tVAl1DZWhYqflrpnuDMohCEe1noQ7Vqbc1W+eUBzWZrcT6KOGvkf/+V5KPan2fn8ehLs7lb4J7JtAvte1Oyn0QFuBuL1td9bVoc5LoV+adhb1dIAdNfUfeOPP7gnZAB0rdmDDjPjMcQe4YaXPgG4VHkWeMBxg/gNvfPu+fg5mRqNOXvBO2j0We2rps/MRjCPUXUt/PYAeuz3KfLm+1kD/qV+8X4pcw2RWNVyGSfcx/hWQfwavrtBdT1d7WlflY5BMVLpq6ON6t92h1ufWe9rZCPOu0G23j81ZYLO7ha0CcIL2adjn82ttBzaOgT2iEbDcLlU7rM2gbgU+V+mBulb2oBPqDeAMxHnMK2CO+5/+w29xhjs2Y/mXP/kb05vf8f7po5/68mywzDLdPhS6ku9KuceOH9unSp0zIDcdOXFm+uwDD04/88sfmv7lW9/N15t/7v3Txz/91Umz3rsVP2AOOGPGO9S4FDtHyPI4YTkn3Km+8e/1gx97YHrLO98//djb3s3X23/5w9OXvvloqXOq70DeEF8DesJx7DnXbmuy3a3YnXDPkJnec87jstk16vVbpw9N7z/xx9PPnPgSX7944mvT504/PT29dapUeQN4KffAPYo9K4CNY4FeNjuufXnrhek3Tj5YP+ffn/za9PmtZ2pTlpFwZ9qdNjygHbu9955Hqc/a1EYP+vTV7YPTe05/e/rZk1/m65dOfX36w+3nWEcPuNOyhlp69kTndLgC+Rguw5T7SLdTkZ+6sDt9evup6V2nvzG9/dSX+Xrv1renh3aOjzq6JsTNFDrAXRb72IzFyfYxMU5Abyrdo2Bts6+401qHu4+rrt4Gy8wUeofzXscBOQDcn1EoLjb5nWEOMAfiDMBlqAzq5B4so2DcvI6+CehpXUttfUA76jxrbPZ1oK+p8wb0KPMelHvnr//uviAbsL/n/k/Rfu/7nwfevJZtU6nmXVt/8uC+YZ6f86kvfHMAveDOoFvZ7wzAPXOY57bcZwG513P0axR61g711wHoU0G8ta0l8AY1/qwh3mrnseHLbgfUablzBGzCcE61Zy/0stszz1019QFznq+1rC0V+gjFSb0D4G3s61QgHwNmqOC7Mjf08Wza0ap+7vAb7XOo+IThsAbQtuETguOzAPdSjT/w1Yduu63pG970jukb33mCNXUG4RKCW/SkR4Ub6qm1c4W9jvv/+WsP33YXNGyd+q3/8lSl21Ev70o9o14VhNPkONfUAenY7KsPfvyB6Xb7ov/gm35uevSpQ1botSVqheM61HHsWvlQ6h4oE4gv+tAZkJMaH8G4p7ZOEa4/dOz3p02vHzv+B9MfnHq6LHjX1CdMihO8swragfh8vTg9uHV4wmdt+hm49mPHPzc9tn2iNmmR1Z5ec9bUNSVubMxi+91tbBwBq+lwf3z2KD9vr5/1r45/bvruuVMc/1qJ9qHKqdqTah/T4q64bU2tabj/me2nph8+/pk9/0z/6sTnpkMXzqt2PoM6bHa9NPp1jIDleWroGPFax7XbWmrnsNl5bNXuljUo+NTStSYktwfQ95d4hyLfDPUAPWtAv74mGDdba6jMnWEOwM+AXjV0/J8gIN+0Cu5R7lmrlt4S7gL6sN9hpQag+13//v/91unbDz1N6931dFrxOK7gW4P5Y08d4g5U+/38PIf6uhS6rHXW0NlrPu85J9Sl4PX8sNxx/npZ7qydL2EOu/3J546+Pil3BOFksc/mt3OjlrnlTpCzdS218xaW06CZ0ZoGFQcl3qbDUW3Tni/7vXrPuxIva93pdybaN9vv86Q74a7e85k6z/WuzBOSI7SRcHcrW2rqgrn2RSfA2ZNuu91KnQn3hd0esOOLZ/4/e6f1Mw882NLsGSajXdgCcdvtseHZjoZ7aF3D++/0M3IfCt4DZrgnOlS5A3KViI9SF9wRcNN0OOyuls+53TqHuibGIeneYV4gVy1d4bg2x91qvBLvBfbFhDjA/HaQ7UD8nVOPlIUukFd9PPV1rmhbSx09UIcq7591u+OvnDngAJz60dWHLrXelPqAeVnq2j71a9sH9/2z8Gx60Hs9Pfa7g3HZsGXY7hevrj565rF9/RxB/RzVOifGORg3AnKGOcCdWe622BWEk5KHItfQmbFdqm31tv8590Mn0Jvlnvu9bW0O5w7q2x1HqY+EOyC+N8gB7ijzrLlWUGeaHTDfH9ADdSpzQDyvWeI9NXSpc0A69npBPFZ71jWoK/3+67/5+/v6D3f5H/VvfuTzYz/0Bm9Z8UOVq8Z+kOG35Wfs5/yrDz6eVreMcy11Poc97fmE45iQp+3+OgG9We5ro19RS3+tFXpS7gzEeae13q7W1Hlgz9q5lHtX5WxV85aqsdZ5bYyA9YAZBuJUWye4fV5z3QPxALwr8hwv19TRA263rBXUDyy2UK3nXFP//9s78x67ruy690fwR/A3yFcIkD8C2AESJE4c2IDtJB3AyOSk04LtltRStyZSEiVKIimJ4jyPxakoFlnFV0WyyOLMIilK4jyJEjV028n/vjdYa++1zz73vVesqvZfgQwcn3OHN1SpWb+71h4O4O5qvLbdU0Z7KHVT4qbKk2pHEhxhfvN+e3LmavtH//GFef8b+sM/ea6dPneNMfJuLB3HgjqVuteeKzHu9LnrDdT3fP7d4J4//NPn2jPnr0dmu1vt7CQX6pzJcYqdmzU/euz0vD8Dn/Nn/+1VU+moP/fkuAx0rJkYV2x1qHRLlqs7xFG9M9vdOsMxVi77fb4wF4ChspPFLpAPAz3PX3n4oIH61ns8a/6LW9vb2UcPotkMOsExhl62S1UsPTePYeLb1ccP51Tm3c/GZ1376hHj57LgqdijZA1Z7qbMk93enHx8c94/Dz7zZ3cOFPsdyjx2WbMGM8pwD3VOO75bh87d1QBnlqp505ik1i2zHWq8wJwbszCWjs1ZSgydDWLmp8yfBXiBej5zwLyrysOCr6EO+BLgXsImCz4gPhDmXYUu691i5QK65hw/76pzHP+Xv162oH+8+mOCDHUo8oidd+LmZbMWZMRfb//gT36+qM/B3tJU5txlDdZ6dIxDJnvUqYd6925ybr9Toa9YNzJQEf/0Z0sX9Z30O5hrts1ZSiIc7fbUXOZnv/xg4Hf6owX8wZ7r87vXXnpzTZ/lziQ5i6kHvGW3K+FNx0yKUyyd7V8N4t2sdlfr7BZnqt3UO9R6OYaFXhR3KltDLbonvjEJjseEeNxfbPcE96o7HCCeVTkAjmPVmQ8Cut9jTWhK+VqLShAB3rdRNfvdof63r3604P8NvbJsPVU6oN2Np5fSNfRvZ492byrzkHued/+7Puv4lXc2uBpH3Nx3VUODGS9dU2Z7UuoE9LPet3t9086xSIaL0jVkwkf2e4qbh9UeNnwLiEuZ21yOkQC3++7FBUEJYEJ8PeLoD0KhZzu+gjsy2xEv74L0Wccr7p70craqBp0gL5nuqkv37nBffde+dXcRn3XvZABdsXObvWQtl675zmo/u7N/wT/TgcdXw3rvy3D3znERVy87rUmVI2mu6uGOY6r2KmYuhR5w973Q/49luav1q+2F/nUbm7SkDnBzATyuRcvX4ep8LsBTnXehnhQ6gC14D5rDXhfQMbNZTIa5VPoAdZ4Ue8TThyj0xQL9f7+8ggodsXNB3WfPhLfNWpgQd+GzBf/R0x+MBHTub27gZnc52uuKm0OtS5Eb6L0d7KUb7YGx6YHwhEr+53/8s0V/N33H7vzcyyu9VI093PtawKKxDJL+Bqn0//hXb/yjfx98v90HewF0ZbsL1n1zbvmarHbc5zXpJaZeIO9tXtFYxu33CuI10A3it12524wYu8XRS7tXO84Z8KXFK9W3JcsFwCuYs687st2553lR5J/fjZ3WBHImzHkCnAMfcXJT4rmMLZeofXm/heLu/vd/1jFeI5C7Io/d1uw4EuEatH+F1Y4M9kV91p8+V2x37+ee4+kEeiphO2+Ofa4AACAASURBVHN+cf9WkTAHeAvmaETjqpz2u9aANddQ7a7O54qhS53/7a3RBUMJIL58/16BercrXMpyV9b7n88RYx4GdihnNZmhQkfHOGyfaio97HYlyKnN61zx7OGftUMZ7rLWo7FMWO7eBhYq/bMnj5th7zXX+efvfsrac1ntyHq3OLpb7am5jKx3h7grclPmaveqGVCvR1bof+9Atwz4iKEb0Bev0KNTXGW3D4a7VLkAT0CnevRitQ+33QcBXucC7pXlXsAuu12KHHOOofcDHfHzEkN/7uUVC/6DhD9YKGEjwGG3WxvXKtM9rvn1xSr0tdsOe/c4T4aL/dBNqedytVDvl32Tlihj+7xdvfngQIAiQ/gfE+o//V9L2qOT59oqdp42ZVFi3OTpK83SFVsHfqc//s8vLeq/ySCQ/MGfPNcu/3hXwJyJcUqKq+Pp1u41AVylagF8wttsdibGxUYt7OUOBR7KvMTVBfJul7gCc38AgBWv0jRY6II7O8iV49gHnQlyyVIvtrtntTvcIyEu7HbWn5cNXAhw7x4nNc45g/zL+5Hprg1YTs1cXfR/p1Ow3b3ZDJW6la/Jcve68wB7O33u+qI/Cz0jAO4Ccm3EwgYzSoTjPbsPTC7qc/7Fnz7HrVVj05ZkvQfAuV2qb5VqSXJhxUuda6tUwV5AXwxoASxkvqcYusXNa5DH9csP7i/qoQGfM/voIW33iJtbbXqA3ZT6d9xpDfdc++rhokCLz7r+5HFAXNY7e7hbLTpqzq0N7Dc/tEcf31jUz4SHDYCa5WupdE2NZUydc+9zdYjL/dyl1PM+6CU2XlR6B+5WuobGMrYf+v+1zVlCoT9DmSvLHcq8Lymugnl/rFwAx5yhTnVeAR1qfDjMByp0bchCZV66ydUZ78VqJ8RdlQvsAXJluGvuKPUP1u5Z1D/gLXuPhTJXW1iDuCXGMevd90NHUtx//et3FvU5iKGj/pywrvq/h0qXUldsncdWh24NZs5d/rzBDmwnz85CrTcHxk61B49ONweOTlO9Q8Hv3N9rt49MtEhw2rFvokH5EcfIRLt9ZJzrHfuON/W18RZJShi4d6wXIIdCtzr0DsyhzgF1zUd759vRY2eag0dPtxiHjtmM74ikJhu9dueBXnW86+Bkg3MxY53Hwcnm0NHT7enz1whzQDlg7puyVPXonhRnZWtq70pAq9GM16PfNns+NmQpqt0gfkdQt01aPiO4o6GMQ5uJcbLaBfR+dV6UurLbZckPa/cqhQ5VzrVlt3PzFQIdx54UJyUuiMexAb9kuisD3mPqynA/Onl+Uf+bxoPXwbFpqfLo8c72r954xq13bx7zsBk/cWHRn4X/HZRSNYuT5xi6Z7Yju73ZsOPIoj/HatSpvEtSnKlwqnXF0mWvM44u+11q3ZvMBODvWw36XGpyrmsOdIBcG7T0QV3AP3P/9qLgh8/vPfjCO8eFtR6x9Gy7Q52jfO3s47uL/qwTj28i4U3Z7TZrG1VtyuKd4/Y/nF3U5/z7m5sZOy8A9/avLFmz5jJVGZuy20u3OLfdYbVby1fMps4112p9aB36sxR6hjeAHFZ7egDolq5laFcwB6yHJMcVkAvomA3Qg0Cuc6HKZbnH9qhFmRe412DPQJdaJ9w7ILd4+rftrbsPF/wP+N/8h19Yp7gqGa4kwgG+UAWqPwfwt+6dfyawlObPzdaPTVnwviURzjLd4zhi54C4qfkcR5clj3MEPO/5nEq6HJtN7/fwPihtjbMOZ9zvI+6xmDkbx/Rb7LODzwvsyny/MPtFiwx4jYtXLSM+jme/BJQbnL949cv24qwPO9fiHK4D3Bd9COI5Xu4gr2rRcT2y2iuVbglxpshjD3RvA1t2WQPMOVLpGkBdlLplueMcwD0I5lLoBPuQRjNq+9oFusfMI5Ye8IZa95g6gC1o57Vi6wB7nK/tdnV8o0pXT/ffRaFfuvql4ugBdCbFeatXJsUxs932Okf7Zf27WOgMp6UodNag5zp0XhPgd+3vLepzqNDLpizs/W77oHOvcy9VM7vd6s8N/IB6Oo5Yeq3Qv24Xq9BH719VYpwlxT1AwnRduqbjyw/uLQp+APrNR0+gxjXcbvd4uZWoRYMZKHQkxM31IDLXtTtPvqFClzqPWHoH6rDcfxeFbja7b5saFjthHrutlUYyiJl3R8l0r232GuS4VifHMbaes9wXb7cL7iXTfW51nuGe16HUQ50bzIsFP584usrVFC/PQLdzste71nufQg+gF7tdTWY+WLMwlb5i3d6Ik7u1Lrvdz2eV7t3iLlxfUKY7LPojx2cc5qVMzRPkzIZ3cKsrXFjulwLqeACI4fcRwvl8d51gHTAXxBPs41qocVflegBI26UC8hXoAWkCnWVsXzRQ7Be953sBfD/cA+KCOWbBHXMMgzqB7uVqBLnb7Woc44pc7V2HQL0LcoLaN2OhlR5qHHXqai5jWe3q4W7We7cWPcPdFPod79euuHlR6XbdjgF01KEH4Mv2qVTmps4tfm5wt85xDvQST+9A3K7bLmym3GNP9IipW4Y72ro+aBYT1/6j//SCZbnnDnKpHj3i6LfRIQ7JcdYpbrGfxW1UteOaxdEJdG8yo6Q5Wu+z1+8sCuhoPANrndntjKXXpWtS57gHAC8DXd+szpyzZbdrFzbWouP8r24dWRQAEUOXAlfGuwCu83lezIMDsu8RQ9fWqXVNOhW5g16Wu9WfLyaG/pe390RSHICuLPe+2ZU6GsnM9XAw7Nqr98bDbmeM3ICuPdEBb1nt3iFOSXDW4/1b7JZWhlnvsNrZ9jUD3WLogjoazDyjDn1hJWyEsiv1AvXB8fMM8Lym0u7LbJdKr0GuWLnUOeZQ6Iqby3rXMWdBfrBCr9S5SteG2O54GPjlm/NrLrNizR52vQLILeHtOmPoaQc2tYY1uKsd7MXP2snpK/PqSAeYr902qti52+2qRbfNWpD4RnVedYqzxDj0cQeAqcpTPN3PIbnOhqlvKXqUvAnSVOAZ9OcM1rzXgW2WeoG4oE1w4x5CXHPstvY5FDjvyTOALiVus9ny+RxUN45Nod8MhW6K3GDuAHeF/qVtxmLd4KJ3uyCOe6HMaccny71PqZckOSbDeR064Q/1p/pzqfRhsXSDt5rNCNh32quuxiuFbm1eGT/H6wBodYpjQxlPhuM1y4zXVqqmsmmtw14Pix0QN5CbDR9q3CHv2ez3bXbbHVBXcpzqzpH5Ltv9rZXbFwxA7I1Qxc99h7Vss7tC98YyhHqzbNXCP2vZqh20273+XCDnTmzZaufaW7/+5c/fWvDPtGnXWCPLXZntBnH1cK83YpECl+0uqKfzDnMD/sTdhceC37w9QZhnkGstiGe4I8t9zd3TCwbgmntnmOUOoHfK1rxkzZPkaLfj77X1eF97f2bBcXTUk1uXuNL+FUo8gO6d4XgOfdyf/qZB57lh4B52/sDja2lzlk5CHGDOzVkc6t9rL3QpdHWKc4UeiXABb7PeUbKWytao4lNv97Qfeq3Qs8UuBT6fOUN6vmvZ74Ptdqn0GuoZ5gS6wC2Qa65ALrU+HOgBdarzfmUu2x1JclDrUOr/7qcvDvzH/Mc/fbE9eORU++Sb7zhu3nlI9axucSUJzsrUdD46yNlGLWxI88Ibnwz8DFiJaCYzcvhkKHDFzgFXWe5un6s7XKPEOM7e7lVq3OGte0OtE9YB9JJEJ+hLkWd4C/iaBW2/hw8RUuvq2w6VfsEsdypyS4oj7COWboqcQBfopdYN4N6MxmAOy/1mA6WOY1rwrtaxgxqtdlfthPvVmwA2z/tx65Y7Y+qR8FZsdlPr12HBMz7uc9mkxc4jvu7x89I1LrLgBfVSrnYHtetWuubZ7AK4ZgN+Ar1vwoLzfUrcgU7QD1DnET9n/Xmx0mWp59mbyQTgw4LvJMVRsXe6xOHhaiF16FDncFEEdGsiY1un2p7navlq6lzWO+Yr1241eP18LXfUrMMxUUmazWr5yhI2xs1xPnq4333czlz4bM4Ocd3Pf/6N1UqIszp0y3YvcfR7T6jckc1OyKMGXbFzbzDjyj0UuQG+7IcOEP/NAjLd//zW9hYWuoNb8XMdx5yBjnu/fPRVs5B6d9x789FXip+bEn/MbnAlhu77nVuWu6l0xNJvPX6yoDp0qHPa7erpbklwYb9HYpyUu8G9ufH1V81C3IBl9yf7dlfLTWY8qz3Z7gQ8LffYEz1i6b+lOo+mMwZ3bs4igHOObnHR0z1b7gtT5V24l/j5/JU5AA7o02r3VrCEOpW6QK65H+jqECe4S6VXgBfoA+zDYR5WvNR5WO7fxr7oAjogrfWtO4/ag2On2qXvb2lfWrqGkJ84cYHAB/QJdJ/x8wJg3HkN/d2pxqnYbWtUz3AvUDd1DTBjV7VV60ca1LP//KUV7dsf7mi37j3mqrzch3vLRi1ltzWBvlN/nhPjMrxdhbtqTzY8YCwlLphLweuaIG3XQ8VLzQ+cw24vCr0R2DG7IifAYbXX8XSDezemPgjotOARLyfEYbMT8lToHXBHwxip+Lhu6ly2eyS9RS162qwFKhwPAR4fL1C3DHjFzGMzFkC8ttnrGLpBvJwrpWsZ7Heozg3sKcvdmshEdnsX7q7OeR1xdIHaFXllu1fxc+8OJ4DH7ICnOk/NZU6dvTpn21cBEDA+dday25kAp73PraEMM9wZR781EOrs0Y5Y+nygDpgzu92sdod6SohLFrxtvsIOcQQ84L5x51ij7z3X/Gf//dX26ud3AW8bfTBXS9iAeZSr5di5lLmUet/84Ovmxv1H7V/eHN6OVWoTMD98z2Lnvie6xc+tbE1rQl093AFzwf3Kw/vz6kgHmM8+vO8la9V2qiWG7qVrSIyTMvftVLk5izWXefbPBJhf++qhq3PfpEXg/toVuit1baOat0098OjqvNyAn90+0N775inVObPcabV3t1JFtziq74C6Z70ru52la36PJcXZHume1R5KPWLn3niG9edhuf/wd3/xE/zfgwXutEZrPSXECfCDLHeBW/CWcs/n41zAHCDX6Id5DXEkUpTEOYK9UuhS5k9TeRrOFbgHzAHxeQBdMKdSJ9xNsRPgrt4D5q7QpdTxs0KNEeYAemowA9gK5jMXb6Td2QzYvLcvc53laHVWey5VS/c7iGWZW6OZbMED1ma9B7TdqsdxJLYJ6JgF8Txz7Wq+KHdmq8d74B4NU+HDE+H8OjPdDdqe+c6kOMXSZcHbnO12KXMB3hPlDOJMkLtpyXGKnas8zZvISKl3W766FW9AL4rdbfZbngh3W13iXI3b3uiy22M2NU5VjnOpS1xaG8gLxFGqdndga1iUral0DXP0ca/V+UC4U42XxLgK5Ab3ZLNbMhzvwQMA7fbcJc4z3bUxC+CONaA+V5MZbNQyfe4aE+AQI6dCH1iqxni52r5q9zUrY/NY+ulz1+dsMgPLHOCnIr9dlasF2JUE5xu0QKGj8Qw3XNHmLHho/rc/HewI/LN//T/a197dWMPct1RlHF115t4lDvB2C76UqnHDFitjqwHeH1dXT/cb9x+279+ZGmoh/82tQ+30/VtKhAO0K4CnY7Z8xd7nruIrwAPqb96ZGPo5aFpjHeK0lSqAblA3Je72O+rRY1iGu+rQtT0qoD5XkxlY5tefPNImLQ22U81Z7pUy95I1nPPBrVOxXepnTx636AuvB5/uvOr+qfbe029LlzjtjR7xc3aDq3dasy5xkdGOxLhQ6d/Jeo9tVFWm5tnuiqWXuLk2aeE8X6ADQoJ2d6Y6B9z7yta+JpQF60EzQIzzv0tCnJS6KXQlxRmwDdQF6JbpXkBOi31QU5k5YucZ5lhniFu9egfuHaAL7J/fui94F3UeWfDcP93Kzy7dIPRTBnw5bzu3KRHOoN5XshZbqXbUvG2Z6la7IO8gpwqXSue5osYLxKnMa3DnuHoAW+DuzlLymAVtzRYvL1a7zmv2hDiz4WmnC+hmrSvj3TPczVp3eHfVOYCds9yxvoSyNQ6sGTsHqGnHK44e9rs2aZEyT8cCtlnqBnOHtRLjqM51H+ZQ6MhuN7vdFbypcFju2XbPXeSkyvPs8fT2mu+y5hnuTJLTWmqdKt1j57ThVYJWMt4N3n4P1bhfA6wRN/fYuWW6q3TtJmEfsXQHOxR4s3LtSPvrZeu5ExrWUuVhs998gJK1gLrOe5MZJsKlGLpK11hHjvO+B3pz+vxnzap1+9pX3t3Az1q1fh//DSJenkf0cy+7rIXVToj7+Vvex11AV4x9dPxMg97uz7++mg2RPt5wgA9d6PvOuHndES6sdoHdQF6S4byRjO+TjvPcDpXHyWq3ZDlPkivA525rzaX797gJC3ZcW3p7ot1891yLHdg8Rk6IY+0KvQ/sUuOuzA3msf/5U8Ie26MC7FvunW9X3D3RvnXnONezDx/krVMLyBFDz/XnBLlb7B43HwZ37KIGsG99cKFdce8kd13b9uBCex2tXm27VJWnwWJXnTl2XLNGM4qjezKcxdBL97ivn/4G8XTC/eRXt9r1D8/yMwDxHY8uNVTlBeDYLz3F0H/rO6+xDSzr01Wyxjaw1t5V3eFcnSuensvWCHBu0mI2e8lux3EqW0Ni3MIs92FxddWmC+ym0t1Od1t9EMy758x6lyrPMxQ6jvuVumAuhR7qPBQ64J2BbjCXIpdK13Go86EqvVjtgrfi6TrOgLc+wW67s2ew1jbfvveYQLIadFrlRZVDWTvMcd1rywPupdacsfKi0APoDmyWrtUtX6GsCfKixgFvH8VSr9S6lZ4B0gn+5V7A2mPlTH4jvFMCnCt1QT6UusMcQOfrBGy8PoPe4uaW6Y57CHRLjMPmLdzARXFyAlvJcB4vZxw9Zbczfu62O0vXXJ0T5mokc+2WJcZ1FTsAD2gncBPufswkOVnqjJdb1nvEycvuah4nL7XosyxRk0IPcMc2qma5F3u9Brti557ZDpXuLWAL1Dud41yxw2InwEsM3crXTKkz8a2KoxfA85onwkUzGcts5y5rVrqGjnE3bdc1Jcup4YzOS73zGPfaVqthrVcgL+VqUuXKcDd1TpAD5mbHe1tYHhu8eQ2qXDurcRbYBXUcJ1UeGe4O9jagbruuAfyMr2MmoNEwpjSNCZud58p5j5nTho/OcGGxM9OdrV0tlo6s9xrcJfNd5wlni6nfe/BNXDdo25aqUN+2FzpVOaAe6jyD3hU5r2Wwd5U67PiHjwh37YEO0KvNq2/KwnavWPMYpWted65j1p0X0BfAQ6GjJh2KHUD3/c8b7I8OFc6yNM1mrxPqzG6HEo8e7r5lqsXU2ViGqt3hHtb7099wC1UcQ7HzPEH/g7rCDQG5StcI6bDZVbIWitzADhVucLcsd9rznvFOhe6Z7FTpKlcrO64F2JsfpNDn21gmq/MMeMAZ1wZZ7l1w41h2u2aeG2i3DwZ5F+4AOaEueA8EupR5bbcL6lTrQ0HejaML7JjLqGD+DOsdSv3rb75vH3711KHuqrxY7VTuagWLeeYiGsbcQFIbY9+y4AHjGeyqJvucNnsuXbMucQXafA+733djMxvd9kfPlnq1TvFznCfElQHfibMLyB2Q84GAsE+Wu44Fc5+b81eYIGcqnPD+guBmPL0Lc69Bl3IHwBVTN5hbYpyVqbE23UrWIpZO252Jbx4rt7pzt92lyjtq3brFCeyw3bX2THfvENdnt5eac4M5Fbrb7rgmy90Arkx3nmc8PivwYsFHvLyy29lcxjLbo0TNLfk49oz2UpfuIBfEo9Wrdlb7Iu22ZqoczWgC7sp01+yAB9zbGzcfmFLX7DZ8F+QGcFr0VQ26qXFLjPNMd3WMY5Z7gbiVr31JaBvAE9hdlVPBh0JnyZq3fPXkNyXJNWazW0JcZLmnNrBU6mbD416AHIqckA9lzhavT6Jne1blVObFajfLvWzKAij7MItdLWBlr999AIArMU5rQd2UOu4F4DPYHd5U3fl8BvagNWANCx7Z7hi4x9Zhp6MbnEPd7HWB3ErV4hyT5KTG3WJHwhwy3Ps2aZH1jti6wZwZ7IJ3KHNC/glL1aDQdZ72e2S5O9Sl0A3a3ELVAI5EOVPihPfXTwl3qHEee/KbgX3gFqpq/WqzNmgp8fJis7MuPUFeyW+uzivb3cAe26dSoQfQM6gXsya0AfQK6vOrRyecCXPthd5V5MOhXin0PphnZW4QLxa84F7mUOeKo88j093sdwP6QJgPsdtluwvqmG/cvBe93kvGO0rdTIF7ohstwsp+jxh5f3c4QLckw1mTGcXEk9WeFLfVoBuoSz16gXrEvctrCHk7b8lx8R5FqVPdmwJ3eEuNU6kzIc4UuavyUqpmcC/WO9V4gbnH1Uv9OeLk3WEWe2kuoxi6stwj6U3KvKvI7ThgL7jLcs9la8hkd7XOuc5wz/H00kQGMBfEy1rnCsRxT7bXpc5TrJzZ7YR1yWq38rSUAZ+bzADYsttNoacM9xJHZ0a7Aft+xMtxHDF1j6UXu/1BqHVu0tLp6S41DmjLfpcCr45htVvsvDSUQQ16xNM7O65F5ziDebLiBW32eUetehm2+YqpcSbCCeJS5ISyst5T/Jz3JcvdFLuXs1GlmwonwC2ZDqCnepf9Hur8jsfUNQPwsM5tpzWrPWdbWGW95y5xUuapRh1wLtb7E9jpVOEF2lToVN6CepnrWLmA7vAOJU+oE+hPqcoT0A3kSaHbvaHYVYce2e0GdCtRs4Q4U+cCPdQ5AO5A10zo02Z/8n1ZQ42b9W4WO2x3JcW5Wh+oyr2MrSjyH2i7y353oAfA1UxGPdxLYtxvI1EOJWvKdBfQQ6X7nugAfCh1W1Od+3mu3WZnxruUOma0foWKD6DPpdAB6y7kK3VOiNs9xW4fnu2uMjU+BHjHOJ2jtS64h8X+DevMu6q8e9wXQx+o0h3sqe2r7PZQ6AL6M+LoAPhQdQ6QS6HPA+oG+O/bW3cfUY0yU90z3meoypEUVwPbAK/s9hrcBnFX7SxLi2x1lqy5UufDgtS9wT+seLPki+pGK9hIlKttd4Ef1wl2gZw2upS8VPiwOVnv/B3IbrdYuiXBAe6hzg3qgLcy4K1k7aqA3ompd6z3gDo6xaVkOIufW705QA84B/C9BaxA3jerLO26b58avdtVskZIl0x3la8VZY5Yq+LlZY44eu4YV2z3rNCh3AnsosjZ471PkSuebjXmpTucH1OR96l0NJDhsNpzxdezQveYOcCeB5S6qXMqdDaZEdTdWqcl7za8lalZ8xha6IR9BXKVqRW4q6GMFLw2aeGxJ8gZxBEzF9D74ucEv++0xh3XBPI8A+JmxReLPdvtUPDaK93td7PjBXPfOhXd4ZIl73BX2ZrF0ZHRTvs9tXudT5Y7FbvFxaHIszJ3q/1rxsoL4MOKV2xdcwDcVHjpHFeDnlAnyGHNQ43TcoeSN7BH/LwodFPp1jXOYE5ljm1VTaFzdtibYodqh7XOEYAvAI9rfAAo502NG9gT1JUMFyr9KVU5FTqAnVR7Gwo9xcwVPye0bc9zNZQByEtSnO2oliz4Ur6GxjJqLiO4J2VuMfKoT7fkOMDchwH977yXuwG7rkXvQrx7bEAu5W613T5/oMt2jxh6WO9dpV5s9S7MccxYeXeuytUM5tliz+tQ6AFyALtrtetYMMex1gnii4C51Dp+FoBL2e7YSpWADyUeu7Il9U0Qlzh6sdGt5tzj8RW0qd4NxrLrqcQN3A5+h3iJm1NR877UEpaKviTHKU7us2WvJ+tdwHc1bglxAn0N9qLM3YZnjborcLPfByhyWO2qPQ91TmtdneGYBMfadEuGQ0MZz3RPKv0SYugOdYLd7gHk65K1nOHOHdZuM9NdwKdqB+w9nl5Ue6h0Jsgpxm5KXGA3pa5EOZsB9lS69pk3kuEGLcx8j01bsjUv5Y6Md/VulzpXFnzE0l19mwIvG7OEKgewSxOZ2m4fkACX4W1gp4Iv9rs9CDADXkq9b07q2xQ64+MRMy9qvGzSInDjGhS4zbYbm8XLHzKODqvdFXqlzmWz0373vdAjpg47PalxKfBit39lWfCAuGLpmjvWO8GufdCjJax1krMa9NhtTbuyAfJl9Cn0sNh5jwGdfd4J6S7EdeyA7tahC+gAtNZRtibljWtpHbXmbrP7HujfNkieY6c4tX5FYpwGQV7A7nD3zHeCXMpcMXQCWza8QR5/i6tStWK3U6Uz+U1gZ5MZQtv7ufuaTWawJrA9du7HlUKnOleCnNnu3Gktq3YvU6tgXlq/ynaPWDo7xH3rALfZ+rkz+c3PS6UD/NygpQZ6gXMX3nMdh9JelN1e+roT6AFz2ewWbx8EcJ0zZe6wF9Blv1ez7PVcvpbK1OaMn2e4d9cGcoBdqpxrqfR5KXQkaaBLkc/ffN9+ftOy4F2ZezKcZbwrdp7t9JIkRzUPhR2xdrPtTcVTkReY0zoPoAvcnE1tZ3j3K3MDvsOYsBeYCXmPswPS5y4Xy92Ow74X2JMyN5BndQ5IU6HHTCWe69GT1a7SNevdLgs+4ue5wYwBvMTLTbGbKu8odEGdoFasXBnwCeoG7lDpbr3n9q9o91oS4cxm9+MbcT6y3QVxKXFZ7ZoztEOhf64WsJEgV6x1tIH94l5fyRpB7yCn/Y51Z+tUNpXRTmvev102Oy15KfNavQPcsMxNpTu8GUu3xDfv/W6JcEqGw/0qWeNs9jtL1KTYBXEAHvFxHXdngX1uhU64c+9zqvGoSbfd1hQ3r+Fe7cDGuLlnu2tXNqju0hXO167a7ZpawAbIVbIWCl0Z7UqK62v12kmSA7Spyi2mXuLpnfh5FUu/P/eGLBXMTakrbh7KvAK64F6AbvufW8tXtn4tYLdsd4A7FHmx3U2RM7aumLqpdCTUFZvdlbupd+sMp/7tqe2rwd0VOlR5x3ovsXOHuQBPte4xdMbOBXHfXU3gp8Uum12bfzHUDQAAIABJREFUs1h5GoHO5Dglwnmpmux2zYT4D38P1c5a82y3+1oJc6HSv/vuB6tDn8tyB8xlpdta9nqx4mXB676AvAM6H2stmz2OabEL4AK6gVrwxqys9XxOa8HdlHe5V6/Jiry7phoX1EOlQ4EPGqbKZbvnmVB/BswBbrPZke2OdQE5we7H9x48oSItAC8lbA5wqPIoV1Oc3S13JckxYS6DHACXWhewLaPdAO3xddnuES8X0KW29VqHNeraTZWX7PZQ6w5xV+elJl1wxywV/qyZNjtq0GXBm50eip2laq7cK6UeCXBQ6tZcRtY7G8xcK41moMLdaqcal+3O87X1zutXAvDVzmslGc6y3ktNutnsaizjMfTbUPFYF7vd7/MYO5W3QC6VrlawAn4BPNu/8jV9neMiq51gD7h7chzhz4Q4A3r7mZLgvogadJzD/uew4VOM/V5Y7bTZma3+wPZJz0D3jPeA/IBYOiDdVekCNc6z2YzH0pNidzud2esV4AFzz2qv4uiw102tWyw9qXWPoVuDmWK5B+AjZh5Z753adIJbcfSw2dE8pvRuZzJcH9StwYxluudNWsx+d4ArUa7FsVnzKW5ume4NoC6FLiXenQFzQFrntdZ5A7ipcylxnMPwxLeAuax2AR1zgbpb7Jbljvi5Z7fXqtws9m5NOjvKQZFLpYcFj6x3i6Pjb/P3hDaOs1JPUI/Wr4S5x9YBbgd8qPOvn/5ANU6oG8wt8z0nx3nduRQ5wB5xcwK9JMQphm7qvGzGwiQ5NpNhp7jYI91t94ihq6GMZql0j6Hn7VNhuS/Mdifg1cddM+Piwy13Abw7C/CMow8pUxO4uzNBrkx3QV/zM1Q61DTgXlnuOq5gnpU5IG9Q1yx13jcvRKEL7FLqT79n9j7UEkvXAG/LaNdsXeEs1m2Z7mHNQ5Gn4fFwwN5BLFBjlsWuc7qnmgV0gbw7Z3We1n3KvXOtPe8lcchqj45x1sudcfgMeKrtkhSnTHbAXCOUusrY8JooZdM6as8d7tlq11qxdbfaI8Pd1bjK05DZnhPjoODdVmcWvO4DrO08rjPZzcEdEE/HsNwZMxfcA/p+3kAdu6yxkYzD2+LoArus9iqOXmLsodal2r0WnecF9Wy9q4Ncst/NcifcI9Nd9egWb7fsdir0gHgodStn03mp8grmt6DWqdhLGVudGIfOcAHwkuluYFc8XSo+AM59z+tMd1rvVq7m9nspXTOoW9w8IO6Z7Ck5rsTLBXNmvNNC99K1xwZ1u87YuYHd2rz6OmLqSoazGnRku7MW3ZR6gDtZ8Mx2N4vdgU5Yx7pW47LYw06//yAlxT1grD0sdoG8O2eAG8RprTOWbk1kWNYmK15JcZzDcnelXjLdv6MKV7marHXvHifbHQAvGe9IhlNCnMXZraTNy9a8jC2gHrHzDHRmt7PZjMXQ7Tjsd0L7W6s3R8Z7tHr12HrE07+1Pu5uubMmXWvGzZkU93do96oYerR+dZhX2e0Z8AnmUOn/EElxc1nq3WtS4/m84CzAD1Lquqc714lwWaHPodIB6wxsrmGpD1Ll+Zyp7a4613FAXYlxFdC7Sn0A0KXMk/1elHhdg95/frBKpw3/9HuqDoDQlTni5x4zH5QQZ3XrSnjL1jzO2XkDe8p2p5oGpKXgu8BOjWQc9LLNzU7H/Rn6+L5S5qHeB8TaXZ134G2v7cCcKt5L0wLmUaqW4ukCOGHOHdW8pztBTojblqre+pUK3EEeteje4lUNZjwmrpawrEMvkI/mMxY/75atWQKcb9DiYPekOMbOqcRz3FxAL7FyKXOBuqvIkQxHy91j6RXIh9jsiqFrpkJPyXBIjhPADeqmxh3wBdZKjKMN37dBC5Pg3Jqn/a44OqBt5Wo2VxC/2a/QeT3F0k2xl5i5FLyAjmMvVXNVnhPicmJcgTqgXaCurHfvDBfNZmi1A9xNqkW3GnQvWYuYOmrTPY5us8XUczY7AK7h26hCcVvpmnWR81pyKXEDfxVHTzH12nIH6KN8zax4r1M3RR57n4dC9/p0KvBB4NY5B7er8286dehFmRfARx26gx0uLG1226glusRBnXtiXNqkBaAXvN1ad5jzvIEbEM/wjmS4H6zBTBz77mue2S6wa1ZGu5rMuKXeRBmbl67JapdCf+rtXw3q1lyGDWW0QQvs96pjnMXOzW4n3KHICXK33iuFTpBbQhyS4cJyT0BfuDLPQCfI2Smu2PNdcOdjKOx8jDVVdxVDF9z7bfdBCh3nAvIZ9hXkBX3F0+uZQH8mxK07nErWAGbGzDPEsRbc51Dost5hs1e2+9M6ni6o42eEzVwseNtTXRZ7wNqhPGN16wI0Qe73AMhZjcuWj/Md2z0ATmveoaxGMg5y3tMBeiTAJbjzwSFBXDF0wtqz1mOdga41rXYkvpWGMinTvc5uL/Fzr0N3hS6rHbOtLSkuwbzE1d1iJ7yvR6JcSYwzeLv1nvdDt7i5erxDnVvimyl0qHQN2OdS7bEpS6evezeW7mBnFnsuZ0vAZ8a7Q77E0Ov2r9V5xMy7UKdKjxK1UtYG0Hudea3QPWFOWe6AN9ZS4FGH3p8IV2W6e9y8st3V0z1Z7K7KK6iHUhfgDexel347VHuV7a5mMlTh0bud+6FHq1dcc1BHQlxS6oyJC+RWh+492++x97uB3crTGBdXhnuGO9X4PbPWbf/zr5UIV8XQLVmuqPKAOMrVbKABjSBNkNs9tNYHZrrLYgfoAW3NAjiue2lad2YNerHbw4r3DHdtl0rV7hD/zjvFEdyR1e6NZmCnV3uiK0FOKh1gJ9TLXOLpLFvzLHdLhLPYuYNeVrvHzwl6xdI9Zl5i6ch6p0JHN7jf0nJXHXqBuLrDqakM90Hvs97VMQ5la6V0LbZSJciLHY9sdkuG87i5mss03HWthvo//FCS4oYDfZAiN4CXGHoNdPyHnNtyrxLgAHGNKo4OkA+GOsCdAZ7XAfUK5E8ZC5e1LkXenas4eh/YAW6pdK0N5rLdB4JdcK/A3h9DN8WeVDqgnhPlnn7ffsNyiu9Zg2uw9gQ4t9kB+oB6ttstZk6gZ7UOaLsap+Wejg3gnhwn5e2x8/QgEElxPAdoW3lbOY9zPmi9A8rpXMAd57LdHhb6FTaTMcBjLbu9mgHxsn0q4uEB8hxLN6VuGfCxD7rtwKYYOTPbZbFDscN2VwtYO44ytkiOK7XnKEnzsjSUqtVwB9gJbpWrqZtc1KHzNbmpTMduV+c469/er9gtwx3KPMXMY5vUBPaImUuZaybQAfXPzTrPVrvWTH7LWfAlSS4y3wXxDHWqclrv3lwm1HlY7sx676r0sOCjbO2h16F7rTmtdgO6LPUM8g7MpdgVazc1fucR7fVsxbu9jvPs227H/Y1l3Gqvlbop8mS9S6Wrg5xb7h5XB9gVV09bpDZq+yolnsrVXLEXoONaQF2Wu89x3gEf1ruBu0qOSxCPuLrHzavEOPV15zXbrIXwlvWupjKmzhkrZ7y8LlnD3/LvLI5eEuMI82SrF9jXpWqDYumu0mG74++ztk21TnFU31/7usTOBXSLnQvgBnEq8lyHDuUe5WtQ6UiKK/3blclOG75W6wK3KfI+oHuinJR6zmjvWO1hw1cKvQB9kRnunjAntW4gl0ofDnUAWAo9oB1QF8RNtcNGt3sM4nhtANzXcQyIZ6XegXoX4DqGMscawOY8NCmugFyJcFmpzz9+noFuar6Ct2LpeQbgE9TxMwOOALIUOtaWGGegB9wJaYI7zrnaVv24W/C4x+PsgGuf3e5xbjWmsXsI6wJzt9y7wPbjLtD71DsVeGkww58vqXJCHceCNefquHPNk+Bwn+LpSpJzZW7d4jyeDqh70ltS55069HIP4uHN5Ws3GSd3O54Z7Q56Wu+AuuLmbq2zRI3KHGD3JDiLryuWPth6R2a8NmNxmGd17mvVpxf7XYDPMXSVqQnkmqnGCXRAnWq9zKHSvblMyWSnLe+15nmde7dbYpwpdTWTiWYxgr0seEEdMK76uFscPStw35ilKHSPl9s9gD1rzksGfMl4t7avtNcd6K7SaaUL4JoFbiryu54Yd8dL19Ty1ZPikNkumx2NZMrarfW7APpXUN601qXKi+1u9yEpjvF0bp/KPu5597VWoJelbolxBnmHOFW23RdqXap9QLOZuZT5U9atQ60T2jY31i0Ome48H8lxAnsGOmLlBnRLhvO1FLuVr7nFrsQ4z2SnWldWu1R6d1Z3OMFc7V4L2C1hDp3jDO74W1z1cIcCT+q8U4euNrDqCpfmsN55zhU6YuieGOetX7E3uu+yxhp1tHqNzVrcao/d12S9K56eIY+1Ax3zP3yXW78+K9Nd0O7O0cM9suGHg1wQHzYH3CtlbmAXyIfNAfI57fbaYu8Dek6GC6gL4lLnmA3CgnmlzGW1Zwue6rwf4oqjV5Y7wD0A5LLduzM3eaFC91p0Js0B3tbutSjyuM5rhL2y3ZNSr0FOsAPYhHa+JmjzXEeF61oCeVLlpXwt3+fgZrtXQRyKHUqdELckuYB8ynC37PYAO2vQSxLc1S9Vb277olvMPPZBN2UeGe1RrqaYukDtdrsB2zLaCfME77q3u2e1e+tXQRyKOyCu0jVB3TLZCXUqebPYmTyH2Lgnyalb3N1qgxYHcm75avF0xtUD7pa97k1lBHHMkRDn5WwBcy9d69jusNi1SYvF0QF3t9qLOmcsPWLmle2eE+I8412tXx3mgr3msN4tOY4AB6wB7oC6xcsfEeJS6QXgFjM3xa6GMhY7R6a7Z8Ars90T4thAxteW7V4nv6EkrdjpYce7Qkfr16psjSCPZjKEtQPb4+XWGU7n1N4Vs8PbVDuOUXse2e3lWJCH0hbI3XqnEs9r2equykORZ4sdNns6phUvWAfcrXkMFTwS4Ahxqzf3+nOz2i3bPdaEu/dtN6iHSv+OcDfbHX+3vae793IXyNXHHceANuYMcWzMgvO+QYtqzyuYf60+7SmW7rZ7JMFRkas8zZLhSi26KfRIjIvYOWFuGe9ecw5Ql01ZonSNyp0lasx290S571C2Fl3jauudcXTWo1sMvapDP3PhWnPm/LV2xpuYEAJY81jzZzw+e/F6exbWLoBxAetyrPNnL33WnrsU2dTtuctIliojWn1evmE2K+3WG+0Fzch2Rh/vPGip4g/85+1FbpuJ64ijMpbqf8Dt+FLESU2ZXfJNOTBfugaL1QfWTHyCMtP4sr187cv2ynUcYw0FpqHs5cHzLGOids3+ON9qZ2/gD7D9kb7KmOjtNmaev+XHUFa322s3bC5rZCyjccjgcf2Lu8ycHj95sZ04ebHxucU8fuJiO3HqUpw7fupSM4HzPrDmuVO8D6/n8fFTlzD3jd70pbY3fbnpTV9uJ09jvuTzZZzn/ZOnr/h1m+3eK83k6Su4t506jfXldurMFYzGB49PzMw2GH5N9+hae2Jmtj159mpzYuaqz7Mt1zj2cyd5zzVcb7FF56lz1zAan3k8ff56c+qcXZu269iqE1toNqcvXG+mz1+39fnrLdcXrjfYXhPXtJf96QvsvY/+AHgNrrESgbOf8y1y+QAVG/Bwhzx1/Svd/BT64APSRX+A8gcuPUgh5HEe9fwqDywPUi3OlX9XWlt448IVdtNr7LqFJs5ftpl5CApfdJyM7GzIFWG+waztTodzcjrwAMT8A25oYw9IJR+BpXyWc4AwRKrZx3pwhQDPt/Zv6rbPfs4TCC3noPzbwr+5q3AxkPnv+Qd4ELrmnfawxjUe24z7YyipUKEJnyNkce3z0iaXlQAemvDwBJv14MFIDzuqFqjL+phPwFI/nGcOQjwM+eY1LA20dXIuvIYfyYNWz8+chLrcD8mH8eCDB6MIV3TW9tDEkEV2OxiO0IPQF96IJ44jwdASBVMZIMMWdmwlgPFw1KkWQBIhHA88FNlDlB2765GcEV7Xw1VxOFjHH9UCLTa4kqvhe8wjdOHVAf3NeDxkYTkJ2rLWO/CxV355QGJIg47HA/bQ5wNUhC4U3njIev/27oMn7b2H5oDgAag8ILnjgWs+7j/yByTM6IHvA6ELXzf3H9MNae8/ehrjgZf6qb3uAzw4+cMTXvvk6Q//kvuh/+3rH//5L15f3WI8/8aa5hevf9I8/8YnLcYLS2y8uHRt++KSNS3npWubXy5d2/7yTYx1DcZLb61rX35rXasZ65ffXs/xK5ubXy3b0P5q2fr215w3Nr9+Z0P762Ubm1fe2dhyvLuxfcXHa8s3tTHe29y89t7m9rX3tzSvv7e51Xjj/S0txwdb2iUcW9s3Vmxtlq7Y1mIsWbHN1iu3NUtXbmvfXLW9eWvV9hbjzQ93NG99uKN5+8MdbXcs+2hnm8c7H+1s3/kYY5eN1buadz/e1b67elf77ie7m+Wrd7fLP9nD+b01e5rln+B4d4v1e2v2YOZ4f82e9v21e9sP1u5tMFasG8Hcrlg30jdWrrdzK9fvazVWbdjffrhxf7Nqw/4G84cbD2DgHMdHGw+0H2060H686SBnrjcfbD/efLBdHfOhdvWWQ80nZeC4/URj62i7ZhtHswbrraPt2m0Yh2Os2364Xbf902qs3/Fpu37HkXbDziPNegxb47jduGus2bjraLNh51i7afdRHHNs2mXHOIexWWPP0XbznmPtlr0czZa9x5ote8fbrRoj4822kYl268h4u23fBNfbMe+baLfvP95s33e83RFzr9mxn8ftzgO9BmPHgR7W7a6Dkzjm2o9xrt19aKrBbOvJZvchnsP5ds/oVLPn0JStD021ew+faPaMlhlrHe89fALXY+z79GQzcvhEi5nrT09iXY39R041+46cbDHvP3Iq5gNj0+2BsekmjfbA2Kn24FGe53zw6OkGxxiHjp1pDh07jdEeOnraj8+0OB4dP9OOHsPAeR43PDd+pj08MdNwYG3H7eGJM+2nx8/iGudPj59tPj1u6yO9s82R3rnmyPGzbYze2fZI72w71jsX4+jkuWZs0o6PTp5rj06ebzhPYT7f+jmc5zg2daG1cb4dP3GhOTZl8/iJCzjmmEhrnMMxHmrxYOpD62bi5IX2uF87Hg+udu9xPNDy3EXc0/cgq4dbPMBi3Zu+1PjsD7h6sC0zH3b94RcPtRp4mMXDMAYeZu0YD7v2wDvXjAddf+Btps7o4Xc2PfjiAdfG1Bk7r+POzAdnezgu9w+4J96vc23oeX9PvH/cg3P6LDxo45r/LHFPvr+seS+/aznH94331/u6GEgP+vz95GN8VnwPf794n/z+6T35mjmupfeH0Kh+l3Gs8+l9u98j/x70uu6s74LzuqbXQeS8RJjr//3itY9ffv711QHy598wqL8AiC9Z02oGyF8E0A3m7S+XrmteenNda2Nt+/Kb65oM84D6svUtwG4QN5Bz/c6GCuavvrupfXV5GQQ5YJ5A/vr7mx3kW9s3PtjaYAjoSz7Y2i5ZgQGYb23fBMjTENAB87c+3NFyXrW9QP2jnc2yD3cY0D/e1Sz7eFdjMN/ZvuMgx/G7q3djNID6cof6e4C6QP7JnvY9rDED5Bpr97bvr9krsAPugDng3n6wrsAdEF+xfqSCOYC+asM+H4D4geZDgzzWBvVNB5oM9tWbDzYAukH9ENcA+OrNGAcF8uaTraOAPAFeQH6YcO+HeQC9AdjX7/i0MaB/akDfcURwF9A5b9p1tDG4O9B3H20c5s3m3UcxCHLAXOstAjvncUKeIB+ZaAH1bSMGdK4B9H3HY+zY3wPYAXnOhPn+4xngAjfBLohr3u1w95kQB9QN8JPtnkNThDkBPnpCIG/3jhaIE+h+POJAx+xQr2AOkO8DxMdO4TpnhzrAjmOHOmesW0DcYR9QJ8QN5s1BwJxAd7g7xLsgF9AxO8gbAf3TiRnCvAa6AxxAr2HeGMwN6FhnuAe8CXKAnXB3iJ9vAW6B3CEeABfICe8a2o2uAdw2LjYOeIe7nS/wBpTdofL3wnHvVJwnuAVvA7i5Ur4eAnO5V4A44R8wN7fK4D4Jl8ucLgEecwwArxzDzcrgprvFP/DFzQpIusMloBbQdEGA93TYJEgYcHFe8BWQBswCi2ZBR+/rs72nA433+mfrdZi15mvSd+u8V3xnna9el79j9/snoHZfO/Q9ut9L79/5/nq/gXN6eNHnYNa67zXle1b/7XRf53VXfzN57sq/Eser+RdvfPISQA54U51nhb5kbfPi0jVU5Zyp0NfxmDB3dQ6FTpXu6tyB3kCZ29jQQKED5lDlmqHMX3V1Lqi/tnxzVukF6u9vaV93df76B1uaN5I6B9BNofu8clu7dNX2UOhvrtwOpd6+tWoIzD9ymLtKhzoH1A3sptCpzqHWV5s6f9fVucAeCv0TKvLm/TV7mwC6gx0g/8AVeoI6wQ64r1y/rwHUV8UMZb5PCt1UuSv2SqFvPAB4N0mdN4I6lDkHFLspckLcQW5rU+VU5wC5KXSo86LSpdAB8qzUocyhyKHSfbQbdo5Rmdt5A3kodFfmlULfc6zZsudYs1kqPQF968g4lTogDqgH2E2dU6lTpe873gDi26HUocgd6JyLIu/CvIL67oOTvL77kBQ6VDohHmCXGt8DYBegN6HKE9hHDp9sEtCp0qHWR6DQocpdqSeFbhA3lU6QA+oHjlKlO9x57GA3uEuh22wKnFCXWh+gyglxKXPBO8AO1U6F3gDsUOo2z1CRQ6lXQBfcQ6Gfbcegzl2tQ6kbxAVyzQZzAN+gTkVe1lNFmQveDvYEcyhuqnRB3ZU3Qk0XoK6l2Nt+mFN9U3kD2DZMrQPqHH6+p5nnBXCFowRxHkN5U40D3lLpArtfI7gZevJwFECeQlECdHd2Zd4fogIsOhAhBDJQHUwZDsPWBMkgwAo85bMMQJ3P4fsOer3g2Jlxf/4uAhlmntfnptfxNVPFFYjX53vL9+RDAUN3z3jP+Mz0Wfn7DFrHZ3deU6lyfK/yfStwD3093i//PCdmZu9Nzlz5/Qri3QOHOq33Fwh02Oym0KnSab275b7U7HZZ7y+/tb7hAMzz+m2DOUEOmCegd+12qPNX3t3UAOoCOiz2bLeH1Q6oQ5GnAVUOhY7ZxraWdvtKt9rNeqcylwUfljvUOUG+o30b6493Nmaz0253pW4gp90OdU6lbrNZ7263U53vhjKn7S6gE+RmuRvQTZ03H7jtDpBnZS67nXBPCv3DDbTeDewb97dU5Wa5E+YAuuz3otBhvR8C4LM6b6XOabu7ze4gD7AD7uu2H27Wmt1egZwqnUrdlHkGu+BNZb6TQIdKbzfRhudsdjsg7pZ7AfrRdsve8WbrXgN5WO57x7Myp9UOkEOlb6dKd6VuaryRUpflbja72e2y3XcdDBueVnyt0g3mtNyzQh+davaOuuU+egLrdq/b7z6H3Q7Ijxw+2RLiXJv1TqAL6g72DHVY7FDmUupmuRewy3aXUhe8cQxlbvZ7sdZdvQ+12qXQPyXgacG3gDbUuSl0QH2GlvuR47DbzX7HPNYjuAVvWOxa03ovIE/KfMos9tpqPy+LvR13kE+cuBjg7ih0wpvnzHIPmHfvA6RlxwPuYcFDqYcND5ibcodaLzb75YC95ZEI3Jeh6pMaN5AbvLMFnxV5WO3ILQF8w3q3tSlws9/LGkDCwPkEfJ7DH3upRt3XAZjgMwgYg84RZh0Q6z7Nes9qTtARNPleDji9FmGDdhDU9Hpc87Vekz9H5zTna7HWe+mzy3F5+Bjwe5rzPfm9zd3IkI7XlM8obsKAz8i/E631Hpr188fPoweQqZnZdZNXrvxel98Dj3/5xpp3AG8DOmLoZrsb2E2pw3ZHPF0wD2X+lmBex9Cpzt/ewDj6r12ZZ3X+yjubGlPpm1qDudnuBnVa7oijM4ZOuL+/panBvsWsdlru25oliJt7LD1b7oC4KXSz2aHUA+geT18Glf4x4U7Alxi6xdFltdN2N7td1jsBD+sdA8rc7HabETev4ugOc1ruAHmGelm3q9bvN7VOiHdUuuLoG/Yrbj4I6Ml2N5gT6iVuHpb7AKgjdg6QNwZ1qnJY7AF12O1mvQPotOC7ljtVOuLoHcudMA+FLqibKm8iju52O4EOZV5i6Q7x44C6x9KhzGW921wp9GK5S5FDiee1xc4PujKn7e5Aj7XH0C1eTpDLdg+7XWB3eEu1C+iuypuszmmz98fQQ51ToYftbrFzAP0A4ugeOwfQB6hzAtytd4M5YujjZ5rD4zMRP69sdwCcMXSDegXzCapyKnaqc8bRw4IHvN12LzF0KHTEzX12q93UuStyKnepc9nugLJDHUAX1PM6LHnA2iEOJe5qXYpdcfKs0ivAJ1V+UXHygHhR7QQ2QW+WOpNEU0xd1y1O7mq8ShR1K50wN5UuqJvNXgAP9V/B21R6ThzFuo5JBwwcYoJFhkJ3jdfwdRk8aQ0w630JsS600r3d9w4o+Wv0Pn336Tvge3ffP/0sfa/T+5aHAwOpgZd5B32vSZ81EMrperx2yM+I18c9ne9Z/ax6OML74DtrDHlNvLbzu2hOnL36VwPBPdfJ55esXRcKXTH0pUqKW9OWpDiDOmx3xs4RT/eEOE+Gc6udMXS33jc0gnqfQkcMHfZ7JMV5/Bw2e4qjZ5hDoct29xi6kuHapSu3NxXQGU83tT4ofg5lDsBXSXGREOdAR0KckuJcpTN+zuQ4U+geS2ccHSpdIPekOMbOocqZIJdi54I6VHpW6oB6jp8zQQ4QJ9CrpDgmyoVC9xh62O61QldyHGPpHjsH3Alx2e1Iklu3HQDPULc4eoF5gJzxdLfeGTtXYpwnxRHqfQlxeyyeDnVuCv1Ya/Hzcc1IjrMYOoCeEuIM5kyQg83udvsEE+OQHAeguzqn+s6JcFoD6rssUQ7Wuuz2lvFzj6VHMhxU+aGpxpPkLHYupX5YSt1s+Mpqd7jLeifMk91O2x1xdCpP3tZIAAAOuElEQVT2kwZyU+dMkKNah+1uCXI2MymumxxniXFduAPglUI/ZklwFchltWuGzS517uuw3mG/KzkOVjvi5W6502JnEhwtd1foAjps95wIV9vuBepmu5v6NlhLsds5T45zkBP+ncS4bLNLnWvuXnNFrth6Arws+EtU44J7iZFnJZ7VusXRmQRX4uW02A3qBLir8xI/T9cEdADDLXdT6YCCAyadNytZ13TdgSFAaOZ7DgCXrmsmrATNznsBTF2YVa9LsOL5zvvk1/LnGAI5fVcqeoExgY6vtc+KBw+9Jn/uXA8K8b3xvvqM7vfH8ZCfQa/XzJ9tyM/D97f3qb5v/n3oc/RzoJLnN5MzV/7pXNye89rzS1b3qNSXrGVcHQpd8XModCXDQaVLoRPmb8J6d8Ar092T4pDpLsv91+9YprtluJtCN7sd8XTPcofdDrgrMc4z3QH0khyHLHdY7z4rux0K3ZU6oQ51vnIbs9wFc8wCuJQ6YA6wI/kNa1PoJX5uNrxnuVtyHLPaYbkzCc4U+uCkuJQQl7Lcq2x3ZLgrht5nuSOuTusdCXL7WyTFAd6WFHfArHe32xPUmdmubPdKnVu2e9juhPq2UVntlumO+Pl2z3Kn5U77nclwjKGHKneoM27OWLpnuI+1G2W3W6a72e4phr6ZcXPCPBLj+oHu6hwwV5b7yETDDHckyJndjix3g7ri6CkpzgFORS6Ya4btbla7ZlPmOKdEOGW8M9sdCr2T6Y6s95QIV+LpZrkzju7xcqwZS2eCnCtzKXaocSTICeJdy90T5EydMzlumglwUucGc7PaM8QjGc4Vuh9TrbvdDuXdKG7uiXDIfLfYueLosNsVL+/OUuwRR5dSd7gzEe4c4uMeT2ciHG12nBPQBWgcC+Qszexkt+s+Qb4/091Uega41sdPKdPd1Lrb7Yy3K1YOgGdbfRDQCXda74yVU5EX4NeJcBFDL1Z7WO6Mn7sql+XuKj3b7VwL3ICM1KhDXLCXDZ/hUEEjAT0g5sCa6zX+HoNhpNcn+Okz6Sbk67hH9zngdG93rkCp1+H7d94P98W9+n34/TqvufsZA4/zeyQXIN5Dn49Z687n6X3xGr0uz4PO8zV6v6mZ2cvPjJfPSfOf/OQnL7+8/vdeWLrmssXODeaCerHb1zLD/eUMca4ZT4+yNah1H5YUl+LoALvK1ZgQR5W+iaVqVOquzCPT/f3NSIpjMhyUObPcV2xrFEuP2Dni6Cu31QrdS9cA7y7UBXTGz5UcZ9a7ytYspp7L1pTlDutd5Wqf7LGyNctwb95fK+sd2e6R4U6Ie0w9Mt2p0F2dm0LvZLqv30eIW9maZ7qnsjWAXSDHjAQ5lLFVWe6WFFepcyXGSZXDZi/rkhDntntktpvVHuqcitxs9yPtegd7wBxxcwM7Yuiw25Xljqx2WOwaVrYGq33PMVjsUO202qHSmRRncXQrW9sHqB9X+Rqz2rcz232Q5c5Y+WCgu0I3gFvpGkrYHOJU5IqjA+QcFkenSleSHFR5WO+pbA0AV4Z7qHRPhnPIU52nkrWInZvdPp0y3c1mV6a7gVzK3OZUuiZlzhlKnYOla7TeWcYGi51QN3hb+dogdS64U6GbKjeb/ZypdI+n5+z2nBSH8rUSTz/fHk0QTzCnvU6YDwB4P7Q9qz3i6LDYCfJIhIMyR9w8Q5vnPFmOcfSIpUf5WtyvjPc0O+jNdlfcPM+T07LeLbZeMtuvNLGetiQ4A7jZ7GVtPRsM6rOh2FG2ZkDXnJV7ZLwDCgLHoHW+FtehugWSAQq8Ak0CK893juP9/f3ioWEA8AS1eE15r/LggJ8Z75Ugy9fp+5bXlPh13zn2spjjelHh8Tvp/B7zzwoLPI71/fo+s07Y43dODwfxen9d9TuYmpl9Z97x8vlA/cUla+9FDfoSZbrXtehRtkZl7gpd6lwwT3XoptKzQrcadAO6KfRXl29qXJ2X2DngbkCPGvRSuuYJcp4QZ8lxKFvb7sNL2Bzqb67awbp0gZzKHHH0SI5zhR6WO1Q6StaQGLeLcXOWrcFq98HacytXixp0Wu5ee67kuFSPjuQ4la/BZs+x9Eqpr/KadCpzQrzUoCPTXeVqArrq0QV0QB31567QleGuWSVszGx3211Z7g1sd8Dck+PcggfIj3jpGmrPP21Vg65Zdjti57Dcqxh6gjoS4txqJ7yRDMcYuoDudjuAjhh6Uuhms7s6x3lY7BFHH6DSVYcOZa74udaeDFcsd2a5T1lcnfXoUOtWa665Ez+vYD5y+ARrzwVwJcepDt2y3JkBH1Y74L5/bFr16IR6VuqWGKcYukP8WKlB90Q4wnsupd5V55X1PmF2PJS5Rq5FR0Jc2O1euobrUO2DY+ilLh0wB9SzQj/qyXECuoNcyXE5dh4xcypyb6hEwDv4ZanrOkCtcwZwqfKYlQ0fCXFS4Qn+bsGHpW5x805CnDVcyirdsuCt9jw1W/LmTAF1lqxZvNxj7FLhDm4DNhU87fZalRvcS7xYlnECH6GRwCcQVfAQiDqvywAVfPg6g6tZ/Xht9f79EMNru58Xx/7aeF99l/Se/GyHpr5H9Zm6lmGp30UXlv4z8vP8Hn0Xzfy+eKjp/D78ewx8KMiv5eu7n9v5PfGe7vvrdzF59sr/fBajF3z95TfW/z6g/kJVuqZadMXQUYO+PhrMsFztrfVNUuYqW/NadId5aiYTKr1bh87yNUuMYxxdDWWY5S67PWW7E+jWXKYvho6mMihbg0LP9edqMOMwZ7mal6zRek+la8xw78TQWbLmIJdSZ1IcSteU6Y6kONah74kYutegM8u9ynRPSXGW4Y4SNstst1i61Dmay3CdM91dmR8o5Wuu0gl0QX0zG8oE0NegFn3rIdjvUY/uEGdCHErXPJaegG7q3JPivB69rkOPkrVQ50cbKnTLdq8S49Rghna7wxwK3YclxI2Ms2wNsXPE0rdDnSPLPQ3VnrPBTCpbUyx954FJxtUZOz/INevTHegEPYBtNehWcy6Ah+1eVDrK1gRymy0pDpntDRW7K3WqdGsuQ7vdVbvB3GPnwxR6st1THN1i6rVCZ815ajJzGgpc6twS5DoNZRzmUuVRgw7VbuBmyVopXSPQDeAVyAH1YrVHM5kxnZM6l93OunOq9ChR60CddrsAn+31YrGbpa5rE0mlK5M9A92hbhBXDTqVuWW3F5gT3kp4a6xG3YDeuSdq0nMGvMH9EurNo6sigByWO5vJXGnUPTGBPOLq+EOfLHcqXJxzAOBYSl0PAHbNVGiAWMAQKBwyGTjVehAE8R4Jrl1wVa9P74/z3THotbyn87n8vGHfWd9Fsz5HP6sfx+9Ax7oPDxd6bec19rMk5a37hsFdDyq6r3wG3QX+vP7748/pzsew3wNCE/dOnfvsnywY1vN9gaDuSj1q0pEcp1g64+cqV0tzqkFvrVtc6Q5XZbpHHTqT4ppIjKMq34I4unWKQ/z8gy1NVYOu+Dnr0K1kjQpdXeJScxmVq+UmM1LpUueYue40lkH8PCfERfmaW+6IoQvoWBe7HQ1lHOTWLQ6NZKDGNajGlQjnteg4x5Ey3dlYBtZ6xNA90x0K/eNNVoOeVboS4qrytU4dOjvHbR2dA+YWN68V+mFltTvIqdB5Tklxpsw9np4UOsDN8rVkuxPmZrtTrUOld8AednvUoJcGM4qhR+maZ7ezcxwUuCfHxZxUuWe559g5rfYmJcV5HL10iUNiXI6hy3I3xW7d41J2O5vJUKHTZj/FGDoVOhrNWMw86tHZYKZ0i0NXOHWOKzXonhx38Cji51DqUOkckekOhV46xXn5WoK7VDm6w8Wa2e2MmTOWrvi5lDrVOWPpFlfPsfRUumZla6lDHDvFWSMZS4qjKveEOKx9GNCtO5yDXKpcSh0w9kx2s9YFd86EdCTMVZY7YV53k2O8PClxZbZjRixcxwbtTjwdcXLAXSC3enOpeNrnnuEukFsmu8PbytZYfy51XitxwRzAABA0AIy0jmsCC8CY4BjgyMpV9w4AXUCnCyh8pu7Pa30fv6Z7CGT7LuV1dk/Y1PHd9L6aq892m7w61/+gEJ+L9xA08T19zev63vhe/n7d7zD0vH83fQ5fN+g7+e8+vy8fHvTfpPMa3cd5ama29zvHy+cD9r9548Pff3HJmt6LS/NY13v57cHjV29v6PWNZRt6v0rj1eUbeq8u29B7dflGH1hvSmNj7zU/fu29TT2MJRxbekve29JbsqI7tvaWrChj6YqtPYy3MVZu6x8f7ei9ncY7H+08ruNlH+3sLftoR2/5asw2sLaxK81Y+1izp7d8tYade2/Nnh7G8rV7j2NegbFu74Axks5hbWPlupEexkcbMPYPHxv39z7aeMjH/t5Hmw7FWO1rzBxb0rzlUG/NltHe6i2jPh/qrdk62jfWbR3trdt2xMaONGPtY0OaN+wc623YeaRn81hv4640do71NvkxZo49Y71Ne8Z7m3aN97bsGTD22rmte8d7NiZsHhnvbR0Z720bmajGjv2TvWFj5yG7hlljl693HZriOcw4h3kP1zi2c3tGdW6yxzWOO2Pv6FRv75ETPM/16Ake41weI0dO9UaOnOjV86ne/iOdMTZt5zCPTfcODRrjfh4zx+mYR8exPt3DrFEdT8z0RjXGZ3pHJmzg3JGJs36MuTMmz/aO+BibPNvDwLGtLwyYcc7Oj3O+0BufsoHzWg+cT9j1Cb9/4sRF3o95XuOU34fZx2Q6d/zkpeM8PnWxNzlt90xOX6rWvVMXJ3vTlycnfMbaxsXJyenLMXqnLk9y6NxpvA+uX5mcOnNlcvKMrTHjmOemr8R1u8fO8/rMlckpjtm438778czs5BRHui/O6ZrNJwecL+euTJa1Xof3nI3zJ8/6+5y1c7pf53mvX7Pv5PfhnF5bfQd7//L9+7/n4NfV30+flT9f3617LR/r/mFz97N1HP890u8mv699dv7Zyu8wv5afOzM72dfCdT5g/vGeH38DP/4GfvwN/Pgb+PE38ONv4P+/38D/A1XWhnGEy1MZAAAAAElFTkSuQmCC;fontSize=18;\" value=\"Load balancer\" vertex=\"1\">\n          <mxGeometry height=\"25.48\" width=\"130\" x=\"350\" y=\"1251.26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-4\" parent=\"1\" style=\"shape=image;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAAASgAAAF8CAYAAAB8GCb4AAAgAElEQVR4Ae29yZMdx5Xmm72vhZb1dlzUH8De1zPjUr3p5kK9fWItalXVJtWqqhZlRbMqPXGQhJmYkQASMxJITImRQAIkAZCUiASpgZIoJZsSVaJIYiBGqq0so+1zjy/8hIfHeOMOEfek2TWP8BgzrvsvvvP5ibgzM/rX6yvw9OnTZ/B5+PDhc/g8ePDoBXwePXnynYcPH7+Iz+Onf57l59GTp0vJ5/HTjx+FP9Gjx0+bfAL7+3o5Od6Tp0uPn3y9wHPh+eFc7Xk/fp7/B/6ne/eib/T6y9N/Tq9A164AOuajR4+effDg8fPotKYTP3qy1nTqJ18vPHr89TKg8vDRk3sNIdIEPGPdJv5fPybocC0IN3uNHj6Ha6ZA61pr1/OdqCvg4BMrnBg8hM60AGcE/6eBGdTaw0dP1lqFZtWZQmyiuoSezKivACAE9WNCLADIqJ7pUjwjANBAis4qsq+XJcAQWkKFjbq96PH0CrR+BXAXtmHYoxdwhyaEJr1j6vlV9dVieD18/KK52Si4Wu9DusOWroBVRAoihRvgpuBqqVvpbupeAaoihGYwYdEYp8mIVgBVVVfp9UwbefJ0yXhdT59+W8PEuj1P1w9eAamMFEbpTqewauF6xNBCiHjv3tNngo1QK/UK4ApAHRkTFOrIjuxMzRC9wqYF2DTLCfON/I+NV2ny0x4+pz1ziq8AgfT46dN/Re6MhmoT00n9Tju18wwNzWjvQwVW73FFhaRAUhh1UTUCWFRY6mP1AFdQScgiNlnFU5RV3cXOp+fc6KaBx4ZmrYelj/x0AlkmE/vJk++YRx7a8QWmNsRQaDSCxvjaC56hfPr022q4TxiqELoZL8k+1Dq+BqJA1Gs/MW0AD2A/+Y6GgmOCFaGk5nbH7vIT04Gn6rrhwfG1qqyGDCuEb6qUpqpjqSJrHehfL2sY2CKoTPa2ekraUVvvqAp649M+ffrtFrvr9OwKIRxkqYZw2pHUrB96GzCjgRoClvBV1dLQG6IqMVVixW0gHgks6arTtRhggrekakkBpWppYtrAx0++/vo7U62qEMY9ePR4tzbKiWmUxXdXVR/Ten1mpwpUAJMmUiqU9MbUuTbQb1ApmDrXIKOHj55kPg8ePYkePHzc/IPtxQfHUFh1qm30C1QKptE3PoIFIPmKnwePo/sPHkX3vnpoP/cfRnfjz517D6M79x6Yz5d3voq+vCs+mL/zVfQF68U86kx9XHI+r04u/+LO/eiLL+9HprzzVfQ5pr+8b45lzsEc70H05V17Xji/u/ceRPfuP4zuf/Uo+Xz1gLBU0I0Y9N0GlXlYVz2m1tSBgw4UzJMIHZMdFZ327v1HBjgETVKKDm7q7tpODwjdwTIzTyBhWTxNIIn1E1AVgCkNIQuwbB3A9JUDVAwnQMqA6o4tOe/Ke9HnX96L/vSF/WBazqOe2xNsEmqEmaq2Fm+aT56s6ZxHpaNy9RsAOo0Nn2wIBbUDAN0zH6d2qHru3nsY8WMVkJ23YHKKiBAinAgudGD3AZQeWPVCQKGM1VIKWjG4stDJg1FRvQMS1JMDUfE0QeTDieBiif1xXdaxNCCLFRsgRtgDYgqw2u33Y2SoT3z+gQnn9KHdXNWUqKDYx/kqhpAB0X2EXlYFWUX00IQznE6BCYopDstYyjCNEErKgIqyyomKiWUMKkKKgAqEcAQU4MXp6iVDO1na/ZRCKlZJBA/XJ3hYEk5mvVhxJcsSBWYBxnpZYnurMr9KwkqEzCMOo7p2vI8nUk3ZJMuv1+iX5+48CYwewvt5nIRkiQcEL8hAyYHILBPeUAKlnDoAyKko59VkYBWHcr6aSpSRAVIMKYZ2hBOVVAwtQIihXnUgAT6EEYEWh3lxPUGDfXI6VBrgpNTWvejzAHDK1JWEUd1pqL07d78yIbUNG9X/kn0fEdTEqClVTU+TkS4a0gzPGDbIUM0BiuFbXHqwysAJIZ0PqrguUUqx0Z3M5yonek5UTB6cCCzCKoaTBBOnqaA4nw8tAomwikFljHJnkoeglF9HLypfCZXBhyDDMcrWLVqO7XENGC7CJ5SddgqnV8aqpqZVNSXKKAnT7OhYAiWEbfzE/lEaUGIkLV5uldSjJKQzvhOA5QNJzCfqCXWxH5WASYJKQorTKf8JcJKAiqcJKZQElaeejAKjYV4p1COksmoqH0JhPwqw4DYER1uw4f4GLam08H1CaU0hpFbHoqZARvwU07Rc8ARKGLKPwzX4R/aDOgElTmMoHNNiSDwNqni4n8P+cciXUUkCSmaZMMcNmMoABVgRTARXDCjrQ0k1ZVUNwWPARADFcErCQg9WTjkRQgzlQmUYUOjQCAUJnuJSjOYZWFlgDQqVYW6P/wfXdOqA9eTplZGpqT99ee/5vj83lwJSBkoWSABVopQIJVnGgEJIR0hx2oZ5QknFaomKySgqry6BE4ElcpfoOTnDnH6UHc2DQpL+U6KYpEoSYRyXEzpJGCdUEuu4TvXSQUjmQBXDKAStMJDoRxE02C+nUfrzctmop3Eu8LLQPqYgJFx59Oj/PDtUb+rx4z//a19Vk4PSE5vcCKUkkhydWnIqKgUoKqUApKxyomIS3pPxneLQjkqKACoN8WJPKgGVSC2gUgqoJwsfG9ZZBSVCOoZyhFUMJKomCSEoAcyzlMv8abuOVFYuSROd1ICqNAfKQYqgwbYM6wgXU+eP2glIYTnXnbSS6qrHsFp99OTJd4cCqXtfPezdKF0GSvEjHCkwpRRUiXpiWBeHdpDyVE8WUlRNAkpCKVkvyo3qBcM9muWpNAPCiSUVVFwKBWXU1D0LKCqlbOnCPgMhz4cKAygUyoUgFgNJZI9b0DgAFc+HVVAReLIQc+HhpEGK54NwF+2nh7Bq35fCz9v0RTkRSijtM2WxYorVknk8hOop8ZucaqL3RPVETyrxm6ig4iRLgimlogglrGNUlM2BMqFfrKAY5mUgJTwoGuXOHBeAkr4Tp0XplBRhxERNp6gMnHxVVZAT5YMrPE9ApUsAhqkIxYCyCsiuw1G8cuD4kCIIulBCWaH99KUPPnr8tD1I9QVOBFPyoOpDAorPcqXLfBVlR2SCxjjh5CkoKqm0B5XNgyKMACdOm5JQQj0VVDzt4OSpJhnmiWkqKBfeUU05tYMOwbAumY7rQtDBOgZmwqMKrcc6AyMBJGmMQzmUAcpfXgQZgoll0bqTvgz/N763nqiqwSHVh7AuDCbCCSWnredkVZXvP8UKyiRdElAF4V4mtKNCEv6T8ZzikI+KiiWVlQ8qzhNYcekgJRQUocTwLhXWWShZSAkYMZQzMKKSorJyfhOhZaBUoqgILwsnqCQRCgJSAlQ+eMLzCPFsmMeSYMH6nGYZquOyLpc9AVVzSHXdECeYbCgnXvFhgOSgJAGVgVPiPz1yxnkq7BPpBYQSVVQ874/YMdRj6JeEeBJOZYAiqO5bIGVH7zw1JUI7AzPmPSVmeKyiqJz8UigjAocKKwUcKikJoeA0QWXDOkCEoApDyZrhBJJdx2aQT7oyGjYgewCq+sb5vXtffafL8S7hhHDOAIoP4hrfiXCieuK8C/HoKyVlAirpRVVIM0hBiioqLuk9EUxmPv0sXirMi0O6VMgnFFQupKigYkiZEC+VqOkpKKqoGF4EENMKytQT1+N26ZJgooqyYEoAVRreOYNcgskAKzByJ9ehWsoDRl49t5v0Ejc6tPWO9tvVyikISKjqap7Tw8fusZNiSAFGBBSnHaCMUR6b5ikvSqgnmuSpMkdFUTU5NZU/mgcAZTwoKib6T2YEL/TAMJRTIMzzwj1nkAfCuERd2dCOgDFgCqohwkaWaRBRdXFfKBMoxe+FMvMlz+FhHaeibKgHcEi4EEosJx0sbZ4frgNuqh2F1AqeTilNQXjU0bcREEgZxVSoogiltIoClIogBShZdSVCPC+0A5T4sWCSCgrTUkkRWA5OVSAlVZOctpBKg4rmuFNQ9n1QDlaxkkJ4xw9DwDjkA1gkbLieXy9BZKfTwGKCZr38J4Z00kTnKJ4FFzs7kjWnEVD8/9F2ugipx0++Pl4IqD99ca+TiZgSTnKaIV4CrUQ1SSDZ6QRKTDGgguI8SxPuWTABUikFFY/eJXUpSElg0Sx3I3lUTgQTSk4HQ71YTcFTsnBKA8kZ59aPciCK/ak49JP1hI/xlwSMDIgIqzgEJJS4TRZKUlHlTfseVPGbDCx4LKDQGamcCCPOs6NyniXrp6FEhjrafcdAtfrgwePng5BCaPfFl/e69g/FbxLIhnYSVAmgmPtETyrzbm0HriS0k6AyIZ57Bi8BEdUTS4AphhVTDBjmsTQAEtnjEkjYBp8MmOhDiRAPcAoCyvOeaI6jdCqKIZ5QTzGAJJQMjGS9gJcPpmJgWSAZQzwwesd6ACX8sVCSywiqIgjZ9ctzpfoGLlzPjgEK5xsO9br6E1Ah34lAkpByb6vkmyv98M4mbKZCO6omWRpIWeXEx18AI5MXRTAlcLLP4VngMKwTpTHGYxUVKyaCiuqJpYEVPSgBKgLKQioweheb44miEuCy6glwEqCKwzkJKDlN5URoyfk0rPywzldRMawq+U4esMT7nwifIkD1DTx1/h+0m65B6uHjxy+mVJR9O4F72VpX/iEJIH+aCZmst4AClKCSJKTiebznm2pJelCEE5fFgMpN1PQg5Xwo5zMlKkqkE0gwcTqooGI40WeiesoFFQEVlwzpqKiYLmDqYzgRPlwmwcPwT9aVT/uwIpzSo3gWNh6MctQUlZMtrefEUI8dWKFlVSNuoF3p0/Y8v76bMsw/+u3vX+zWP2BhSvg8fFQc4iXqqTDEc15UAirCSZYJoJyKKgz1Yh8KprgDE1WU50UJFQU4pdQTVVMCKDtiR2VFYFmllO9HAUQyzLPJmlRQLJl6IOYLwjoCqji8kwqKgLJ1BJPMKGddqEwA5Ckp1ssyBKlQXXqbfoWD+H871r9XHz0SDxV3duQukFbgoCVyoKRqSvlPVE9eFnn8U0YJqIwxHmeXJ4ByI3gZs5wqKoZTSEWZsI8hnvGcsqFeRkExxBMGOWATDO9kagGnWabyoGIIxQCiQqJ6MuEdEzDl2w0qpxwQTCEVFf+yS+xHSRjBP3HzwnuKzfFkWTxip+qpGKqdSz948vSKCfPuPfo/z3aMruZu4IPIn09UE8M5qicDq6z/FMwiz4R19vEW6zlRQdnkzYyKCkAqSS1gigFKoZo4bdRTHP6lIBUb4kk4ZzLJnUmeAZUM7zgNSCWA8vwnaYTLaQEvqCWplCTAqKTCZVo12VQDC6Fy5RQDyodT/MhLVfXjQ0xu1/dptL2O9fNVE+ZBSnXsxCNnjIdCO1snPShOJ/6T8ZhsSOdARmjZEnccY5hTMVFFxTlQBFLQi4rhxNE4p6AY2nmlCOcMxDxopSCFEI+feDTPhXeB0I5gQik+ViGJEA5A8qBEGKHeTHN5XIZBRMVUVlpgQQkRUNgflRHrOG9LoaTipM0ysGA7rDPNcML/jzbTsX6++uDBoxdmHj7+eqFjJ55SUDh3Xz1hHuBhmZjiRkUxrJNGuXs4OIESgcSSoDIlEzXdoy8GWAzpZLoB6+IwzvpQzjBnqIcGZBTUVxZAGf/J86AMpES6gfOeCKmHFkgM62Ll5NQT4YRSTFMtCaVkVBIhJUI7qaTqwYrP3sUQE8/ihcHkhXtCSfmAckCy2/jLQ/PcJrSsD3X4/+53T0Gh/66ZefToSSffLW5VFOHE0kJJAovqycCqJLwLhnkAUgpSPpycF0VVlZQpODkoObM8riOcWIocqAyopA8VP9aSCe0MlGJQxQqK5ngWUDmGuFBLVE8SQs3hBCgx3EMZP/Yi1BM6VPZjVZCpF+Y4AMJ1JUxQJ+fltP9aYLmsL9P+/4+23TUh8vDxk4WZR4+f3OvaiRvVBOWUUk9ZSAVVVBLeyRAvDudC6QUpQDk4JRCiWmJJKMW5UAzvCCWWDP9SIV2snhI1xVCOpfGgHhi5TnM8DKd0OGdCOyqpOMwLhnhQTYmaciFaEuIJ9RSCVgpg4g0Ist7CSULKhXUETZGKkgBB2CZDNzmN9cz+vIeIWS/30/fpjiZsRo8eP7k100U48ZylUgpNpwCVMsljOKUUlYMUFJMJ9aCcctWThRVARR8qNZrHkbkYWAAR4cTSwCmQTQ54mRAuVlScTpXCMLfhnZekyZAuVllUTiwliIKwEqCiWkrKXPg4qBmAeUBLgypeN1ZLWEZA5ZdUS27ECuta6PiwyoZ4XLfvQPL/v86N4D1OcjJXegKorHoisBjimdIASXhQMYgIoyTEo0GeAZQcxXNqioBKVBVVlIGUewYvDaac8I5qieGemPcBBXOcI3oOUsKDEqrJhHgpk5zeE/0nYZKL8A5QsgCLHyIOwIngCgIoCCkb2qVCvWBYJ0M9wimuK1BGvpKSHdaHVNG6cruuTqPN8IbewXJlBr+E2sETT845HeY5Y1wCCtMJoFJGOZSSVVMZ1UQ4pRSUM8UBJdyZMnBiaMcyUVIYuXM+VKKeAKJAukEKRoSU5z8RTjbMY7pBrKRi7ykBVxLaueVORRFWAkaAlDDGDag8Az0PTNl6AomhnSgDz+TlKyjAiW81yKooQqTv0OH/WVbiu+9y377/1eOVmc8+v9PpfwJfAGHkl0mIBwgRTBJWwo/KAIreUwpUMqwLvMkgx4cCmKCe+ElARThJQAFiVUK7VA5UILyjekpCvbQv5eBEZRQrKR9CMagIHZZlIZxczymrtDmeKKh4FK8YTE45ufUcpNhZ+cYDzrOcBmOc/yvKrsMJ/frO3a9WZn7+y487DyjeJQgoA6M4zcCop4exsmKIl0DKKSgZ5hnfSSqnZJqqySop6z8JUBFCAlSEk1VMUFAWVIlqogclwCQBlRnFg5oS6QWctkoJ4R1DPAEtEdrRME/CNuk1CdUkAeTWtb6RmY9BJtdzIIr9JbGOM8eFekqN5rnn8hyAZIgnpxnuWUDZ9R2sqKCottBh8wCFbWXH7vo0/h+0LfaJLpef/OGzlZk3377di3+GX0QIUomSMiqKUKJRbg1xGeolgKJ6opoyIZ0AUhLmuaxyqiRTijAP81Y5idIoKP70VFo5mXUZ2vklARW/kzwJ46RqksqJ9QZGsZIyr11BGEcPKv5xBEAlx4OSAOI6rk6GcQ5QbrkEE5cLRVXXgzLrW1CFAERImWVfZuHVdRCFzh/fCdo6+0LXyw9//b9XZo6cutybf4hfiPSlEjhJ9cRpYZLTIKeSSiAVQ8n6TdKDctOJOU4gxQqKQLJwSv8Eul0W+1IipEuUVVwXVFCJimLKgVNOaUUlwjoCK/amLJgEnEQoZ5YRVPShWHqmNzpFGkJ58z7AmKzJkvlQUimVTAujXALJQskpI39ZqHN3ua5Pqol9GOXbt36xMrN++5Ho7v1um2nyn5LTJrxLwjmO3j12fpQAVMaDSsI6l2XuQyqTYiBDPBHKEVAOSuJRF6Oi7DyMcQLJhHkiL8qY5p5JDuUEIGFZUEXRKGcZQyqlmggmUwofCspKwIiKSQKJy1FyujqsLHz8nCc5n35gWMDK5DgxzHNpBmWQ6WM4h+8e7Vy2+z5M47u6dvO2BdQ7t37eu39Qfkn0oYw3RfWUCvdsmEdIpVRUroKCHyWyyCWcqKQEpJwHJR4QzvGdDIwErDifKeM0g6Dv5CkmAzChnmw+FEftvPCO0BIqKgFUXOeDqBhQVE8sGe7FkCoN7wScUr+J5yBFj4klYWV8qB76TH0FE/vtz3654gB1tIdhHv9Rv6TXJEM6AgnLktAuVlfJfApUFk4pQHlQMh4UoRX7T/ShWDpoWf8Jjc4opyI4CcVk1FPGFKeJ7tIJnDFuQz4DG0KIHlQIRiKsS7aR62FaqCwfWuH5GFIxlDiShzumVExSSWFZ+uNSDVhPIFUpuxry4XpChfdRMfn99OZ7P3eAQpj30crve62i/AtgVRUNcxrlLpwjtExYR7PchH0FqQYEkgcrgCgLJT4c7Mxx+k8EVUYxxd6TA5MHI5rhGWgJWHGd2DDPeFExcKiYJGRMKCc8J8IJ69r1pEJiHdWSnGcd1nfwkYAieFwp1FKiouLwTnhRPqDM9gXL/fUnbR7nD/WLdui34b7Of/LpZ4BTGlB9NMurfIEGVEm4lwaVgRSUEwGVUlFuNA+NJzHKCSmUcQholRJ9J6YZMGmzIaAErJhRTh8qaJQz5Ev9aAJDPOZCcV56URYsIWBJeFWbJsAsmKx6srByIEpDS9ZjGgAJhW2yLqSQuO2kASh0PjhXXE/c1KZBLfn9NFZPaUBBRfXdi/IvhD+PVwf7YZ6BEyElyrRB7mCERkUwmWkT3uUoKOZAiZAuZZKL+kRNeUa5g5GnpozfFI/uYTpWTCbcE15UErolIZ9IM5BqKrC8GpRiwAVDwTSMoKCkokrDKVZQfAi4wFeSMJLThEEIYFw2rhLnie9mWqHEvvjRyqdUT1lAbdmzEP3xT93PLOc/O0gplVUCKaOgXLKmhZRL2kzgJFWUmHahXqym6DkxkzwGVmGIJ3KipHKyoBLJmV4oB3WFcE6CysKJqQZUT64EgExY54EqBCa5Xnq5VQOuzkLIqiemGKT9pzSYXAho62Wox2W2TsJFQihjnMcqTK4/jmlcg2kL34r6JK5FHNqxtKN4UE/8TGuoV3ThsMx6VrGJLkCVqCX6TnFYZ+pTcGJo50I9k3ZASAm1RC+KaipRTwJO0ofKjuIF0g5iOBkFlSRpAkY5gPLMcAcYCzDO04fCvJzm8uLSwYtQyldQhBHDPDufBxbsL28Z66usw3XbKHE8dMJpV0l5fU2EdvmA2rDjSNS37PK8CzJIfQIs+k8M7VgSWClIEU4o44xygEmkG1A95cKJIV6c++RCPKgnCSY5nU3YdKGdVVbJvAcmo4w4mocwj6oqni4CUxZYDkiJgvJM8nyj3IV4gAVUEaFGeNg6lzWe1MtMcs8wl+oqNV0BcNx/qMS54dookJJXpxSa/L/86BNCSZZZBUUl9Ytf9ecZvUFAVHVbhoRM5pQKCgDCXTMd4tEkj6EVUFIZ5RTnPVE9heEU+04mxBOQEqN2DPMSKAX8JQkiQojAMdsx7PPKYsVk/SisYzuwVUH0nqqoJ2OGB+AkIYF9Y54QS6Y9OMltBpmWMMJ3DR+zarvR9Z5GK5/8h4SSnM4HFPyoTz79k15o9/Ks2tciDS1rnjtIxYDywETlxDKBlFBOCaDiNxoUKqfYi6L/5EI8hnaeghKwMmASSqkIPoAWlxNknLdlWj2hU/ND1VQOKKgmp5zktIGQp3pSgBIqKg9GUkHlrYNzhCqiMlIYVVNIeSD+9I9fSCD50/mAgpLadeBM1IfXseRdnHHUyx8ZRRoDPSwb8rkfTMgASvpPXooBOktaTXl5T/GonYETvajEhyKocsI3Ed5J4FBhybpq0wRVrJ4qv9FAwikbxoWAQqOcJdfhPEvWszSKKB5Vww0C6hcgwg1nHG2mr8fE9X/r3Q98KMl5B6h1wihnmEdI6cjeYHeJqg1Mwou5VRZcLtPcKKo41CsdxRMwMnd9Me8SNAkoWwIyDOGoigyMYmXF5T6MuK5fnzsfezTV1ZNTXACIg4lVVJgncKQSSuqg2OIQLwFQrIQYgvPB8qrfl67XvF9UgBNA5QBFKIVABSWl4V7zL6Othow7OMNGk68Fgz7xtwAx+y5zG4II/wkd0fOg5LwBkhzN8yBFYBFOdn0X0oUglA3zqJy4nVBQgJUI+Rj6ZcusipKwssa7Bay9BnbEDCoVwFcAjb8Noy8grCtRTlRRWUARVH4JT+rnapx3RuInMOPD0fFzhi6kdM/9JZ4WRgEZDiYhoJdWEHtSxSGeg1EaVKiXn1itCd+Lau3O3a8ivI7afO4/MM8oGhjHaRzITQOkFTqTAZ2qN+ECQ5xQkmUxoJBy4INKUxC61SCqNpyq6xF8Tcuqx9H1+tfOclIJJJD86WJA+XDi/LnLN82dTRtR/xqRfqf6nbbdBhBu3/rg1z58qsw3AxRABV9KzXNtzG03Zt1fv9oUGBHIEK8CJ6xTAVA7jkShUI9qSkO+fjUoBYR+n220gfsPHkcNQjofXGlAhUbwCKKiUtWUNuo2GrXuox/taEDVJCGVBlQRhIqWUWGpmupHA1NQ6PfYpA20pJraB5SE19yR8/jBvc4Mxzf5InQb7cDaBtJtALlNA3hNEkpyukBBBVIMJIgwvW5bNg1hx76T0cef/CH642dfmB8V0C8y/UXq9dDr0ac2gHCu4QidBFHetAeoClDyIeXPE1CAFD7X3/1AR/sGeOC4T41Z/5f+wBmpA/Evr+TBpY36lZl12w5nkjF96NSZ37HfKigC6sCxCxGy0OFPaVpCfxqowmY6v0v4THgtb8VHVQaFlKegzAPDgwHLV1AAFAGH0T6ASt+QMJ2NW6HW3e99xGAi2EKAsr5S05QDH1D75x2gCCqU516/qYpKQz8dTJnwNsBQbkSKiWBimQ8oCZPQNFML/GVFgAptA1CpourunVVVUT+/uyGb3wRQWZkFVAgihFDRMq5TBCiu45fY5tP/+Dz68s59vaNO+B1VgdRPIOF7RRiHtw0McVSuDEj+8iygfHhUgZLcpimgaKr/7vd/jJZ/+itVVQoqvVmNqA1ALY3Q+PYhVDRvAdVkJC9vGx9Q0iQHyELA87dZWLxqjHX8BNbyT3+tDXVEDVXVUX/Vkf/dTqBaCoGqXEFJdeRP+0Y6oOXDJs8kl/vytyGguM7swTMRXvHy0crvFVYKK20DA7QBqKWf/fLjUaUJhKBTp645oEJKCEDxYdMEUMdjBUVAyRKpCjDWP/n0M22oAzRU/46q8/1VT4DShx990hUoSYBVB1QekCQ8QoDyQzx//dA2voIKbYM6+FWfff6l+b057WD97WD63db/bjsMpeEAis/llSmoEOj8baoCisAcQ3QAACAASURBVMY6yktX3zXKSsPA+o1ZAdD9awZPqSdQqgmoms/n+bAZpoKSgJJQ27J7ITpx7g1jsONL0w7Y/Q6o32H2O0QSJdMCxpRIKWEyjOnqIR4VUl64xXofUE08KAkb7DekulCfByieC8t98xeiy2/8RE129aw6fbOSKuntn/x8GECYtH1aQOWlDLCD1yl9QDVRUEUmuTwXCaiq22D7Iycvm2cCNRzM3pVVqUzONZFAmqDkyVFCzAIqpFBCdRIOedM+oHwFFdqvv42voOSxCFPsRwKqaBu5fWj66CkHLMhm7aST00mn6bsAkD79jy/MiNuUAsmHX/UQL9SxQ3U+bJooKMImBDN5zLYAxX0SfiYkfPMnxsPSdAaF1bAgiZ///uT3n5m8pCkJ2XwAlc3nA6oMDuzU/no+oHwFxe1k6W9DQMl1QtNVAeWfI/YVqgsdA3Uw3ZHVDh8Lv66s0FJo1YUWlDlghHwkqKOemtplwKm7PB9QeZ21rN6HTRMFVdVP8gFVBzpl/0fZcgktPI4DP0vDQwUXwjQoI4yuAUY/Xv6lwujm7bpg4vqjBVQeQHyoNQVUGVSaLs8779D+EB4ixQEv5oPaUnD1E1pGEX36mbEBbvz4g+j9n/8m0jCtMYgIJL9sA1DpN3D6sMlTULLT+9u0HeKFQDKsOvl/yWNIxfXOez9PQkVVXZMLsLv3H5hwHgoZ39m5yzeiffPnTcgvv9tLb/zY71g631w1yWvXBqDSv+ziwyYPUPIL9rdpCqg8OMhjYbrqev525fNpWIePlV2H8KLyQmeA8oLXpQAbHsCogqB0cc0vv/mT6KyB0IUMhELfPb63xddvyA6l0+2Aiddx+ICaBJM81LhCdcMDVxrioWMX1aEj7J8/b/K3ADGY9ehQ9L4Asj9+rhnzNK5xLXBNAB6qH1wzwAc5cLMHzlQCEL8Tv13sPHA6mj+9FF156xY7kpbtgonXsz6g/C+LXyJLXw01BVTZcXA83yTnOYyqrJpdP4rzYYoEYIbX02DUER90SnzgieGDDkuwQaXhgw6ND0IadvJxlTgHng8gg/MjaHDe/D8QbhngnLpswi78z/jf12/PKtSm13/L7uPRtrmT0dz8eQMkqKUr1xVK14YDI0JJlmlAVelwZeBoC1BVGtW4AVXlHPPWkdfaf69W3jZV6su+nyr74Dp4tQ0+UBxmev/pBHwEIEokukKZsM7Mx4BkHUoMIHCf3C/2zeM1Lav+z5t2zkebdx+PoIB2H1404Dlw/FJ0+OTlaOHstejUhbei80tvR+optW52S+jUmU4DqkkD8RtHE0Btj3+NmMAJeVD+cXCuXB9laJsm/0+dbULn5G8vQeQvG2S+yrGb7n+Y+657TlXOBUoH0IHSObhwKZo/s2SAA8UD2ChwJgY4deCEdesDqqzDNQGUv00ebNhYWXYBUKEOyfMPLatVV/NNE9x3mWKT5yenuT1K1iO05LRc3uY0lA9DLSg1qB1VOp2FTh1IpQFFH2OQxuXDZtSjeGWdb5D/LW/bYXfQvOPK+nGfgzy+nJbnWGWaIIIKQsil6mcqQJQHrTSgBmlYbHw+oPJMcnksfxupoOR6PAZKwHRYCqpMJcrzqDrNfeb9P1X2w31w3UH2xX00LhuqN3k8+EHIK8KIGBTRCM1XPdbojO5BrnU+oPzOUFWZ+LDJA5RsqP42ElBYL68jVgJUCx1Jnusg01Wv4SDHkNvmXTe5Tmp6yNdq+9zJCKY0lJEO0U+1MqoKrTSgUo11u83dqdvIfdi0AajQeaGuCqDKzr9sed6xZX0b+5D7K5uucjz/BpO3zyr7MtsG4VU8pA/vCAoJnpEOzyuQGijkckDlNey8+kkDVN55jrK+KizaOqfK0IlvQkXHrXvuuw6cNsP2mmGtQGoAJF9ZjR9Q6AA+1PwQjx0IHU92vioKituGyrohlzy23V+xgggdc1h1dUHS5DzyjgEoYXRNDW2FUgtQkpAaP6DQUaoCyu9UIUBlITLYYyb+MYvmi4BXdF5Fy+Tx8gAh1+F0aJ+hOq5ft9y0a16h1A2jOenwa49/FP39jk+jb758J/l8a83n0b8fWokWr/40Wa9lyAyy3+EDqu00A9nJQoCq09HkvupsV7ZuKF2j7Fhly8uO2ebyvHMBlPYcXtQHZDsEJoDnhdf+GP3F3/1nNPO3UeEH4Dp88ReDAKXtbRsAKmiWOpXiq6Fxm+RNOi46aAgyTfblb8P9SgjIaX/9SZjHM254HERH3roVwkEx/eU//LkQSiFoAWgToqIaAKpkdK9tQBV13kEVFDt/0TG4zqSWg557UViKx0fU7O4WlAgWhHIh+FStQ+jHfY2xbA6ovA7bNqDyjoN6Caiqb+Es2p9cVqXj562TVy/3P3HTQhkjNUDB1E0wASaDwokQmwBItQcodspxASpv5G8UIOD/XnSsOgZ30X6GuQxgunRN3w45RsUwsGqBh1TFbyKEykrAbozXoz1AseNUBpS4Y/vbVIWNVFBVt+F59qmsAsii/1fB1F215MMDRncZdOosB+wWr41thG90gCrqRMMAFM3ooo456mVFfs+ozwXHmzt6XnOXOjQi58PIn4d6qgOfquuO0TQPA6oIJmUdyYdN2SgejuVvE1JDoXMaloLisYYRlnGfPEbZ9Qwt5z5Cy6rUIbFSPab+qCaCqm31RIA9+y8PxxXmhQFVpZHnrePDpgxQ2I+/TQhQoeMNC1ChYw1aN2pFFwLglj36kn925j6Wf/WPT4aioACqMYV51QEVavChTuvDpkmiZtURuTYBVfX/C/3PrGtjH9xXlbLq8fDQruYx9U8x+ZCl4hlG+b1DH49DRVUHVJUOg3V8QO0/dqH0ndP+NiEFFeqMZYAKbVP1/xjFeoOGalXOEeGcPiPXfzgdvjQc/4mw+6e9n3QTUD4EfNgUKShu628TAlSoM5YBKrRN5+rEaGedc8djKXjvkn+X1fl+wqrPgLpXp+GXrev/AEIRoLivYQCK8OMxulBWPecy5YWXwuljKf0EUdENhmpnGOW6478Z/c3uxu1bMxt2HFlm563aQbh+qPRh45vkoWP42+QpKH/bkIKS68jp0LmyLlmvoVrhfsZdbtw5H526qKqpqBP3eVmT5+6qwgwKbdTXbunG8sLMuq2HdzfqWDmd2YfNuBSU/z/VG0Wz73kCuOpt5x6a9o/vz3O/CRwLXm3sbxuah9ekqmn6VJOExrfWfj6UUTyATx5nVNNL15dfnFm/9dB3Qw2+ap3sYNjGB5SvoEL79bfJU1D+tiEFxXX882J9Udlkm6L9jWIZvKZjZ5bG0oBG1VD1ONXAizCsqiKqs96YEjVX33j7g/8xs2bzwWfa7Eg+bMYFqLb+p0mGFvKazl95R+HUo2zwQWGMpMo68ClbF4+6jCO8u3bz9urS8vI3ZvC3fvvRpbY69I79J1NvGRgVoKrmTrX1f457P3hMRUO6aspi0E7fpe13nvlVq4D6m9c+G8sN0PhPhk4zM/ChXqzU4XJ8J7ltbUAFHnWpCpuiEE+eU9+mkXTZpU6j5zpakP6vHX9oBVJ//e/3x9XOVq+98/63yaeZNbML31i//Ugr6QZ+iOeb5KGQyd+mTUBN2gO6gGXTc4LfpM/QjbazdxWuUD5l4VvRcjw2M6bHWwDFlQROnKisokp+qsiHTdshngTcsBUUjxXKO2oKmbSaO5z6lZr0svQv2OC1u5oRrnCqA0woqSbvhvqfa78Yl3LCcdPqiYBqS0X5gIKCKuvM/jZtjOL5nb3L8/hFXoWTwqkOnLguDO5vvlLtHVEw2MeSkJke5MiqJ0Jq/fbylAOqirwO78PGD/FC2/nbjBNQZf9f6Pz9ujb2wX0CTmqGK5wInKYlQPXPe38XIVcKIOIHr2iB0pqQX3NZXbq5/Bx5FCzXbneZ5egkofCGnSdU+rCRIV5ex/W3aRtQeccNnf8w6poef9/R8+OU2nrs9J1dr8eQr8fi5RsLQSix8pU1+599ZeP+6EdbDpa+gcDvyOyEPmwkoPxtOO+P/LUNKB6nSyXSCJreLXU7VVxdawMXr74b/fC1A3e/v2b2GfIoU768cd/HL2/YF726aX9tQLHzNwLUvnTuVNuA4mMlPMdJLxVOCpiuAWaQ87385nvR2q2HI7Dn5Y37rmTAhIrvr9/7glkBK23YF/1wc30VhY4/iYAaP5Dss33F52HXUTgpnAbp7F3cFj6rYM/q9zfMZX0oqiexYjVIecmbkw6oJmqK4WsxYNyDwnV9O+5396FFDeuG7HN0sQP3+Zz3HDkn4RRWUb56qg0pkRs16YAiDMZd+tDT0TpVTn0GUeh/23/sYhZONoJLq6iXNuxbklDyp39UI9zzARVKM/A7p79N2x7UqGDk/19Vj4uX/GkqgQIq1In7WhdUTrG9BP68tHbvGuNFwTX3gRSar+pJ+bCpNIpX0yQnCIadSV4FMDyXKuuG1sEbCfTXfBVOfQWR/3/BEN918EyeckrqX9qw764FlGeOh+DEulc27ovWbj1UOMJXBKi8zuxv00RBVX1+LwSJcdVtxuMr+lPj6rtNie+GVIINO+YTCJErOaUN815aN7c2Z4Xgjr6/fq7wLZM+bPIUlISVvw0AJZfnAWQSFFTeuZXV67N1qpp8ddHn+XOXb7pUAhHKFbBn9eX1+747U+Y/hXaAZM5XN+0LKikfNj6gQuDxt2mioKpuEzp+GUyabFO0T3hO+mydAqrPQJL/2+ETl5GEGRQ8Ib6w7qWNc7tmXl6/3yRnsrJOGfKlfNhIQOU9NOxvUxU2UkF1JcTbiXeHX7+lYc2UhDWyo07bdFW/KZ85c7dm8hfahM2y5S95IZ8PGwmoPFXhb9MEUKFtipRP0bK886xbb44h8sTwc1DT1kj1/51OpXj64vW6IV1AYc2tDAwoAOz76/aax2OQBOnDZpyA8oEyCijlHVN/2GA6O+q0ARqqqSyFoEz0uOUtAYo7hDcFCMjQSwLKD/GYce1DLaSG/I6PeXmcqtuE9jPMOpjh+sMGCqdpANX86aVGXhP5kS3nVmZe3bg/IK2qhXfZHdrtDp94PfrZh781AAklavpAKAIUIeZvg/n6gKryTJx7ZCV0zDp1ew4tqt+kXlPvw3qEc0iZyeNB0/p1246szPzgtfYBhRPCr9wuvfVeNHfkbO03alY1vCWg5DZNnrerA56ydTfhF34v6C/8ToNqmOb/sd1wLiuKNs0eW5lJXnNQLTehNiXt+6XSyZ2+F1SkoIpgIAFVFOL5xyvaZ9Ey7McPU/319eegNJzrO7QAJjxH1yR1oI6a2n/s4srMhh1Ha0OnzkG4bghU7NzDBhSPM8wSXpP+4orCqc9wGhWYyIyT599cmdm6p/3YkQcIlQDVmi1WUVHZjBJQPGZbsEI4N68/Pd57n6XP4Cn730YNJnADkZ35+alte0+Y9z6FYDLMOoAKb+6EBzZKQLUGpl3zEX5AU99CoKqprIN3dfk4wETm4IHiGFAL0Wu7Kj/A13o4+L01u42v88EvPkpG5Yr8pPUi8bGqBzUolPyRRCRcKpgUTF0FT9l5D2tUjvCpUp69/DYBdSLatnfBqJkqGw5znV0HzpiRv0JAiZfjjQpQABxCuYMLl/TtA5o20MtwFmoJ6UHDSBeoywycQwzRlRnACWHexhGZ5VVOFuHf/792T+FbEwCNUQAKPzeuoZyqpTLV0dXlUEt7Dp8b+ohclX7PdXBOHqAspPDwL1eanHIu+sFrB6I1gfdQ1QdU9URNgOmIekxsKFr2SDlOklryORN7T2xvTkFBRb2269gEAsomcOGhZAsqB5kyQIVG7Hw/yfendh04rekCPeqMXVU2bZ83oITR5kkI4XwocR55VXipnfjfASh4UO6zdlv8+1RDStzkyQxSIgQErN5572dJmCczyX3olM0j6x1h3PklY8zJC6TTCqvOtgFACeHSrgOLExXC5fX9Qycu+9eaCsqGePSjJjPUy6bC4x81cDnxerTn8KJ5UJmqieX67U5xSVAhhMO7mTS5Uv0lccf2O0jn5qmUts2d6gSUCCsvtON1lwoKkLKg2rL7+ESM6vHkq5YIA1/eMBfh3enIr5JAwjSghBBu4ew1TRNQZcRO0Pny4tUfT8wIXNW+KtdDUibAGrhRhBSUBdXm2eMRQim5oy5N4x1VBlYb5oy3plBSpRToAKFOMfF1DN0w+tYFS6aIG4CT5zvJ6x8A1Jzzozbv7jak5IWBAQfZi3fWxElg8kLotCqqiW4D8JKYpzTsh3RlvxnmdAmc8H34gCKc6EmdiDbuHM3DxMO8EKF94+IosFRVTaqqwk0UQOqalxTqa6E6QBa/9FJy/cMelBzVw3SflFToYqGOCguNQiSKlV1AXa7Ka+A2wJANrzBBGkBfFFJeX6ugnHhNpYJyqolmuQQVPCk83Jt30D7Wo7Egzl8494aGhQoidpqBS6gj5CRh+H/DzvE9BzuOPlsDTrjOBBRDu5wy9qW27Jk+SMkvEXc2hZaGhSVhSQIwKCPCCDc6wKjv6kj2F38afSdntC65Zt61lSEe4CRVVBhWW/cuRGu2Tn4yp39xhjmPhgevgOFhzS8h78vR+g6pNgz1Q2mjDUAZdX10re3+gl968eBTZZ6AkmBaiLZBMfHDLHPOx2pq/bYjUxXu1f3CqLYILg0Tu6+8pCKCX8QQbZpVUVm/wLWZP321CoxC6+SFeDGkCCeWMZwIry17JuM1LWUXadKWQ3ExVMQdF/CCMa/Ka/wQgxJiWCYhpIoo/CRHUd9CGy/IcQoBya8joKCgpIpieCfUFCAlVZSYVjVV/8vL+2JxxyHAcIdGJ4GhCoCh4yjEmkOM8MENAdeUAILKBYBUCbXTjnEdA8/V+fCpMi9DvDxIeWCimvKApWqqnS83D1x+PToU7lD4EGRQY4QZgIYO2Weg4f/DB/8roYNrAEMa1wTgAexV/YyubbagmiS4JKComrySYR3BJJRTSFGt3340+tHmQ+pPTdjbIHBXQ0elOkNDQgdGR0aHhprgB5Djh+EnIBD6EBJ5ZWgbCRQeByWPT2WDc8OHIMb5K2xGBxv/plg036Jq8gFVoJwklOS0gdTJOORjaZXW3NFz5leFcScr+od02WQ2NP1e9Hup2wYwQjckpU4PylNNhBFKX0GxLkdJAVB8kRx+/lzveNrg6zZ4Xb8bbablcE4qJ04TUNIgl9MCXAQS4cX5pISSOhlJQAFUB49fiNZuOxS92uE3I2iH6UaH0e9pNN8TwIQwvUFeU91tCCgBIgIoVCYw8oxzUZ8F1MVo466j5gM1paAaTSPSzqrXue02MEIwEWQ0yQEoelEFCorQEkDyjfIiQAFUeGkcQPWDTQfUo5owI73tBq376wckxwCmEKAIKU9N5cEoAytrlmcBdSFWUPOJkiKo8JbLLr1eWDtcPzqcfo/Vvke8hndEoRyB5JehEI9KqoJBDkjNZUfxaJJbD4ohHgA1bxQUVJT84CFkjPpt2DFdT3ZrR6nWUfQ6je46IV0AaR5DGpXzAVQ2T0DlhHUZlSS8JwMnMW+UVsgkJ6CsDyXBxGm8Jxww+/VvPomuvPmegkpDPw3/R9wGEMYh521CwERwEVA54R0BxRIQktOB8C8/xLOAomFOOKEkoKi88NPn6+BTvXbA/ACC3kFHdwfVaz091xpqCTlMYw7jCKNQSZNcKijxoLAEklRMctqDVBmgJJg4HQKU/EWWNVsOTt3L8hQU0wOKUX/XYzS9QxAqqgsBSqgkqiWWhFEQUHkmuQzxnFFOOIUUVN6PcEJVGVhpTpWGQCMOgUYNkbaPByjB552wEK4ITljmh3hSSXmg8uGUgpQzyrMKSgLKphlIONUBlPsxziMmBLxw5Z1o654T2lm1s2obCLSBjkJJQosKyvegAqAioGSZgpQ1zMsAxRQDCSk/xMsoqB1HMj/CiRCQnhUeqTl47KKGgYFG2vadWPc3uaEnPKUeQKkKoHxgidG6FJSonFieCDzqklZQdUxy6UOFpgkolIQawsAfbT6oBrvCaipUFaCENz5M4AicBE3TaYZ4UEw0xz31BMUEKKXAJIAlFVXwWTwHKKimKgoKo3ghIPl1ElB52+BXJJAMOm2/SKNKZ3KVzqDfDVQScpUmePStKZD87WSIF1BNBJMPJ38+htT2EkARTr6K8kO8PNg0AZTcxprsh8ybE/WZwP524EEBMGnb4x1eTAfomMntA6fuvKegCCSpmvw6LpPKSQAr60GFHnVJZ5KPClASVpg2wNp6yDwXqMBSYE0KmAiknoZtdSCVAyhCiSWhxHkBpPKHhQmoeomaPkxC81VCPIIotD3r1m2zJjyAlYSEG/drkqj6WEP3seAhbdefLMuDlgzxYh8q+OMJwocipIyCcua4fSYv9KgLAJXOf5KhXijNwGaSh0fuCBWUElA0yeXyQacBLmO6b7Gmu/pYqrIGUVkcZUO4hlcc4zXJI3inUpePQUBJY1xM+8pJhnVcVuFhYZrjBJNMMcgDVBW4SEBV9a2q7LdsHetlOWi9slE77iAdt4/bKoya//qOgDYBRYUk4CSVEqdZSlChTsyHPCgCypZp/ykEqKpqqAhQDNvKYMPlJgk0J9+K68hSJo2iXoaHeIZQPa3pgDZABM8IQ/3I1IZvpMqoFThB+dGDIqBESYUkAcRplgJMhFQIUBt3Ov9JwgrTIUBJNeSDQEIiBKii9eW2o5omuH605aAdPdwEb2v/0L2NPqqScf5PeMkivCKEZwqi1gBUFn6GAOWpKIJKlhJMCazgR4U8KJcHZdMLsrlQ4xrFM5AyqulwpbyrtqBGiPrwMsrLAGw61Mc4geMfGwCiEqJHpGpoZCDKAxVDPAklOS0UFUBEGLGUoIqnswqKgMqCqYqCKoJCSEGF1icQuMyfR70fEobW4fajKgmwNVsOmWRTAMxBTFWYD5nQPEIwwAfJjQjDqIBgUiPRUcOxsUMoD04yxPOgRLXkQ6kATPkh3sVIhnghozxPQfnQ8MFQFVD+dlXnAYjQuuu2l48whrYL1UkQyunQuqE6nKMEGWGG7HkJNHhiCC27bOgDNFQ6BA6gg6xqhF2ADlTPuctvG/BMWVJjUUfv6jIqKKgjQIqPu3jKSQJLqqYAsLIKKp0HRdUky8qA8kzsyoDytgt19Empy4PiMM6PcCPgkAOGDyDHj/HONh80Cg7QwwfPOvJ5R0BwzdbD0abZY0ahABj+BwAJfQAU+QFcoGqobPhrxWJUp6sdTc/7ZiOlJgEVQ8rAyFNUVFIsU8CSuVChh4UvCAWVzocipPIAhU5Z1GErA6pA8bSphupAhMf1VZM/X2efzdcNK8W8/W3ZfTyamz8fLZy9Fp1fels7X7POp9et/LrRJI/VEwHEUoIIdVRPcpp1cVmmoEIh3mz8TnICR47i5XUS1HN9lFW3KdpfaNl4gNFeCBn6n+rWYfDj4MKl6NSFt6Irb93SjlXesfQatXONqKAIKJY5IR6BJcvKgIJ6smkFPqR8BdUkD6rqNnU75zjWL/Peqp5TU7hu2jkf7YsV0pXrCiQNMRuFZ21AmoCSQIrDO0KIaoqqiWUKTAzzQmkGWQ+qDFBV1VCbCqppZ64Ki9B6IRD55+HPh/YzaB2OsXn3caOSFl+/0UbD0n20oyCm/ToyxIv9p7zn8HxYpeAkQr+5HA/K/PS5SzMAoCyk7CuAfQXVBFBtKahRACENlHr+T3rbwUJBKKXDJy9HCqWxKYRpB1DZ/+8rqFg9SZXEaZaEkz9v6kMKCnlQNryzYJKPupQDKqQyTCfdkfagygA1CHhoaLNsExKj3hcGJg4cv6RQUoVTBodJWE5A0XtiKUO+eJpgYhkEVEhBMVGTqkkCqvxRl0wHFikDg4Z4g0Arc14FI4VtrZsL6wrH3nngtDW51VOahI6n51DtBsEQj8qJpQcoQCkHSHZkjx5UCFB83Uo4xQB39DZCvKphYVuw8PczCDz8fbU1T7WkqQAawnXU6JcKKvaSAKKiDxWU95oVpiBk0wxaVlBCLQyqoNoCwaTtZ8ueBeMtaUqAgqmjYKLCJKAqQEkqKAKMsBLLygDlDHIX6k2Kgqob8tVdf/12Z4gXJaCmgee2Sdc7g5zeGK6jGt4KpY5DiXBC6Yd4OaCSICKMWHKZKfNMcmuG25E7N5pXJZM8r1Oivg0F5UNmVKEaoYL/wz+Hov85tEzBpFCqAqUdZ34Z/f2OT6Nvrfk8+ubLd8znhdf+GK09/pGEwiRNU0FJ70lOi7CPIAqCya5X9VddCCaWw1ZQEgahDj5I3aBwGeTYML5VMSmciuC0ePWnESD0F3/3n9HM30a5n7/8hz8bYB2++ItJBFRIOXkPDgNQBXCq4kEBSEw1YFY56soAlVE18UheGwpqEEBU2bYpwPJCQFwL3AgUTAqmIjBh2c4zv4oAniIw+csAMqissn2PaDkVFOAD5VSgngAnH1D+fDBRM22SM8yjeqoCqDwQdAFQeefepH7jznnz9P+IGsekNFI9j2pD8qnr9E97P6kFJh9UUF0T0M7oQfkKygMVQeSXDPviMhziyUddsv5TCFBlSZfs3HUAFVIyeSoltG6ojufBMqP0xIgj16lS8rx4TFwjZHzrqJyqpirQ+PdDKwPBibCaAEhRQXnqieEcgMSPrPPAxPAOZf4oHuDkRu66oKAACMLCBwvh4dcPOu/7ZQh/L13Tnyeq0jF1ndsRPKS6YR2BFCq/d+jjcSopKigqJgkq4UH5cAoqKZusmQWUVFDpH08gpMo8qLxOX0dB5e1jUuuRy4TXm2inU9VUpw1gdC4EmqZ18KQWr/10XO2QCkoopZAPJRUT4STrkum8NAOa4zbdgGBi2QVA5SmpYQAOz8ppOKdgqgMmrAv11BRERduN0TSXgKKKkrDypn0llYDJvdEgq6DSJjmhJMthAmqUYBkUVlBNOjqnYKoLJq7/rbWfH/L+TwAAIABJREFUDwVQz/7Lw3ErKAEnCSH6T75qYn3gcZcsoPgsHpM1sz7UMAE1KDS4fRXPqYlJToCqalIwETRNy7/6xydDARTU1ZjCPHpQQinlASqBkpe86cErDCj3JoMqaQbDGMVrAo/14s0JBFUbpYQdlKSqJoVTUyjJ7YrCtEGXjcksX5nZse+Ul/8k1BThI0tOB8K78Che1iSX4R2mJ/md5G0AKW8fUI46QqdwkpBpOn340nD8J4INeVVNz63xdjdu35rZunfh40wqQUhFsS4p3StWbJpBlVG8dKoB1dREhXitq6bww774uaXGX1yDxD09Vr9B2EdAXb15+8rMtr0nFjIZ5FRJKEOfHPWU/9PnbhTPPupCP8qW4waUDLny1E6VdfK2lfVqhPcbFOO8EVDtDKNcd/w3I7+hLt1YXjOzbc/xtRZCDO1YupE5mYgJCKXnuR7qQ2kG5SHeuAElAdJk2k+uzNvH9n0nNaRT9Te0jt5mgqYPuZ2LvxraeedAfXXpxvJ3ZzbPLTyXBlRd1URA2TJrkjPNwKko34NqG1B11U7d9fMAVFQ/d/S85jYpnIbayYeVZgDw5UBkmPWrS+8uPzszO7vwjW17TtwLhnIM9eg7MdzjfCDUywcURvLSHhRB1Sag2oRNW/vCc3Rj+IL1mFMGRIRhvvJpY/6br9wZR1tameHftj0LcZgH9cQQj2WsqAIwcqGeDe8wnwWUC/EIJL9sE1BFKqaNZUXQCi1TM1w9p1HenJBU2QaU5D5gwI/yf8CxjP9EQNkwTwJJTqdDOKO0Elhl/agwoKxykga5hNQwAFXVF2oDWqF94DfnFs69MfIvdtQNSY83WQBuW0X9zWufjaMNry7dXH6GfDLltrkTS6VhXii0i8NAvGqlTEERUCwJqWEAKgSNOnUhNVR1e8Dp/JV3xvHF6jGnLKwL3SAAFamAmk4jMz20/2HXXb15e1cKTphxZnmOSU7/ib4US09NZRUUTXLrQRFKKAEqlJMIKMKoLqgUTpOlKIbdmSZ1/4NCCnAa0+MtWfVEWm3ff/JyoqKoljIg8kI+AyiGeqE0g4sGQoQRSwmqOoCSj6wM8rqVuuAhsIpKvPHy/JIqp0nttNN2Xk0h9d9euTsuOEVL15dfJI8y5ebZhWdSI3qElCz9aQMoB61iBWUVk4PT5CuoIiDJZaqcVDlNIgBhcGMUrkqYB4N9HAmZ4rqtLC0vfyMDJlZ8f83sM+u2HXGPvjCsI5TkfApMxQqKnpNNM/AhNZwQb9QmuXpOCijR0cbi3RQdH6D6572/i/763+5HCN+Q24QP5qG0xgwmc702zR5beXHNbD6gXt4wt/vlDfui9duPumxxhngsc2BVbJK7JE3CyqmoLKCavM2g6jZS9RRN1wkBdbRO4VQEB11W3j72H7sYgT0vr5sLh3ivrNn/rFlhw77olY37o82zx92vuBBOVFByPqWkQnlQ1iQHkEL+E+qrelA+NKQH1Tagqr5qReFU3vi0g+o1KmoDh09ctnACoDbsW0Ukx6guKV/asG+JgEL56qb90ZY9MaRygeRCOyZtZj0oJmpKFYVp9+I6H1BVYSMBtbB4NSpSRJWW1XyTgSZhascr6ni6rLx9nLt8M/rhawckoKJXN86l0wy+t2Y2UU8ZSO0WkCKoPNVEOJXlQTGs870oH1BVYdM6oGr8TJQ+vlLe+LSD6jUqagMXr76bgVPMn9WUF0XvScKJ01ZJxb/wIv2nDKSgpsJpBvSdZElYFYV4fkjnq6DhACr8/iZ5bIWTdryijqfLytsH4LR26+GUciJzTCm9qFc2zN1LLbSxYLJxEu5JKGXUlA33siGeS9QEjGRoR0hNooLKGwVUz6m88WkH1WtU1AZCYZ3Pn5c27Ltr/Kfvr5l7zl8YmgekEuM8A6dqeVAWUOVpBr4HlQeLQRRUSJ3xBwykWsI01kUSpr47XDteUcfTZeXtY/701bywLhFEMX9WMXA389K6ubUhIIXqvr9ub7R+h0hBkIrKTIdCPJrk7lEXX0VNooKSkMJbMDXPqbzxaQfVa1TUBpJUAi9CC7EGo3kvr9/33Rl/9C5n5RTdoGicMc6RPKuiwiFeegTPD/UmGVA4N/1hA+14RR1PlxW3j8tvvhftOngmxZAqnHkJo3kvb9i3XGXl0DpQFhZUDlJZQEkF5f/81GQ/6oLfqtPGV9z49Pro9SlqA/CbCs3wQjU1dwuAqk02bgNfasPOdMhXBCia4n5ZpqDkA8Iy9GriQcFnCvlPcr+bd+sv/BY1Ol2mUKrSBrwEzAacmVsZCFAE1ZqthyOoKTzuUgQophnUBRSNakKEgGkCKO4jr9Rf+NXOV6Xz6Tr57QQpBLjJkw/Ny5YAhRN4ddMBo6aKAGW9p/JRvGCiZiDLuwxQBFkejORy/Tmo/AannVGvTdU2ACPczwwfCFCvbtzfAulcmLh225Hovfc/jAiPg8ezHpT/TF5ZiJcHGB4DZRBqFTLDAU0kXl5565b6Tfo2Sm0DDdvA6YvXB/CaHD/SMJtbmfnBpvRzMOkV8jYsrz+4cCn62Ye/jQ4e9xM1nVHOUG9cgMJPQV1648faKBs2yqp3VV2vvwqsvXAuy5R1246szMCAbgtK/n7g3m+NkzrpP/nqCZAaNaB2HjitSZcKJb0xDdAGkDpQM6+pNmd2Hjy9MvPa7LHaG/ogKpsHqLbvO2VSEsYJKAVTf+/kqtJG890STO35TFnlRJ4cPnFlZWbHvpNDBxQPmAeqagoq+xCv9KD4eIw0vo13teNIpGAaTeNVSPT3Oo8STOTFhaV3VmZmD52JhuVD8UB+SVBt2DHcRE0FU387jMJwNN/tOMAEXiBN4drN2xZQeBDWh8go5gGqH24+GO09fDYZ9aszIicVFEbxoJ7gaSGX6fzS2+oxDOAxKABGA4BJvc4Yldt14EyLKQP5oVyINfOnlxyg8JxM2+kGoYMW1c3Nn49uvPuBAVXVlAEJqDMX39J0AQWS3pQGbAMAUztJlvWAJNkA4XL5rfccoBDmjUtFyRPDNM4D55P36hOZEyUB9ZP3P9TGOWDjnNS7uZ7XcNXcuMI4v+9zHqOD8Xe+MjN78IwBwq6Dp8euoniCLPHrMptmj2XeNQ5vCe8DV0ANt+EqGPp7fQGlSVBL7OssjXp606inWEHFgIJqGUXKAU+kTgmfCs/7gawy41sB1d8OpHAczncLKO05fG5s3lJZv4+9J6egdh86E+0+tGhUFMo1Ww6NxTAvO3Eu37BzPsI/gQxWBdRwGrHCoV/XFVDCzX3ttoJ3gA/wVhP2zUFLeOFe27OjeA5QZ6Id+09NXKiX949vnzsV4X0zt3/260g9qH51Kq+h+g1X50v8xq5AiX0boR1Eh/e9Ww8KKgohHj9b97bxqoTmLj5Puk4JZYW7xNnLml7gfcn+l67zJZ27q9eP4dukK6VQv4bQCFx3p6BsqIdwz37w3vDQjrpQBxojhwO/wAIzMPCPa11PO+k0fddo2xgs2nVgcWI9pSq8OHTicl5/XJmhekKY53+6DCl5YZDXcfjE66quFEp5HaET9Rx5Q6Qw7lwl2b8Gmcb/UnBTcYBCeGfVE0DlpvsCKV5EPOS4be6UMdo1HFTfqqBzFHWckS1D2IabK4A0igd02U9GUZbACdfYAcoZ5VRSgJSFVd8gJS8+wkEASxWWwmrcsKJC6iuQZL+rACcLKBrjVkERTlRRbn7jruG/lkX+A+Oaxl0KdytcQPWwFFrDhNbFqz82HhLykvoSslXptxXhFAPqoA3nCCi/lOHea7PHO2ucV7lweetIlQXJrca7gqsuuAAj3PAAIyj2voVreX1H1uN/xi8L17h2dhSPKsrBiOEdFZSb37Hv1MhfzyL/yUmZRloDGhqVlvpZCi12PKmMphVGfj/FTT4nlaAIWEwzsDlQaUA5KPmjezv3n47WbJnsrFT/Ao1inuEhPS2oLQVXf8FFEMEzwlA/blqjaGddOwbC10ASZhGYuIyAkkrJhnwOVnIZp205Lb5UGw1CKi7krgBeaOC862o5mSBjaAYIMTzrYiJkG224yT4KcpyqtH0CykKJoR59KF85heahpkb9Rs4mF2qStwG8cJdBB2DIqAAbDbAAIFxr3DRw7aGEoIAVQoM9CdIwpPOhZdMMoJbCUGKYxzKtoCSwVE0N9oUWARSdBQBDxyHEqMIUZFmQYRBDgseHD24ICqDhtVeAvqWBJD6Lx7cZhEAl4SSns7BSNTW8L70IYHIZYUagQRGgweCDjirBBn8MHRmfSQoxCRicF84REMYIGM+f/w/+N3zwv+L/VuiMt/3he2hghBe1PTeKl1ZRABE/WRBJ5eRPH1q4FF15871oww41DCU4ujQNs58dHiVDUDTAvA/UHYFBaOSti3q5f0xP47B7l9pE0bniuxvQa8qDlPSgCKKQSgrVcf10CUDhPU2//s0n0ZmL13VUYwLes1PUuHTZeFVHl68/wNRiOBeClAOU9aAY4kn1xOlqkDq08HrqRXJHTl1W6a2Q0htVz9oAXi7XMHUgBKK8OmeS25COaqgajPzwDvNUUHzbJXwDvARv29wJBVXPGmmX7/567s2U44jARGA5D8qN4hFO9ZQTYeUrqGMxoAApBVWzRqGdSa/buNvAiMHkAOXMcB9I/jzVVXGZp6AAp50xpCyoThpF9crG/Sr/VVlpG5jANjACj4kgyisR4jHFgOChgsqbZ324LAIUIUVQIS0Bod/WvSd01G8CG+i479p6/PEoxwkAE4HlQjwbojmT3IV8YRAxpPPLMkBJSAFQgNX++fPGWEd6Al7Vqw1zPA1Tr/t0X3ekfyDnbIJy4mJAmVeuAEQurOOong+gsnkfUL4HBUDxAzgBUgQUjfUT596IfrTlUGd+XUY79nR37C5//1RLE/pQu1NQBJJfOiD5oV9YWfmA4igeocSScAoB6tSFN6Ite45Hm/ccjzbsOBqt235EVZWGgNoGWmwDE6iWQsrNAsqlGDDE8+FTDU6AWVVAAVSElK+gCChAih/86vH67UeiH752UBtqiw21y3d/Pfd6yhVQwlsZWnpOLgSUtuvSgKJ6ksByCsqHVng+A6jTV5KQLq2ebKhnPagLqeROAArqiXDyS8Bqy+4F9asUVHqzKmkDgNKQs73bhpLcX+hHE6RaoicFGMn6MJyqKihAySoomuRZQAFKeZDaugdwOm2g9rMPf2ue/ds0Je9MV9VQTzVM4/WiUpq0h8AbmO8yzSAU3klA5UNJqqyMgkKi5r6TKRVlQzsHqf3zYUD5ygnzgBNKAorG+sLi1WjdtsPRmi0Hox+8diB6ZaM25GnsnNP4P8PoJpQ6FL5JpZQ3nQ7xoJLSYZ5UTXI6BKuz5meqyjLJnfdEDwppBmFAhRQUALU1AKjji1eNRwWfih+8NAuwelWTQTUUKgmFugY2vAFiz5FzJi2gZ1CSsCKgGMLVV0xSPQVDvIAHlfaikGYQBlRIQVFFhRQUwRQqqa5wt1F1peqya0BCu8VrbGBy9yB0kxAqmraAgmrKV06EV0g1yToqKPu6FYZefpoB/SeppPJG8XwFZdVTfogXAlNeHYGl4aDCahJhBSBtj39Q9tzlt4s6cZ+XFQHKD+n8eQknNx30oERypq+ebB5UPQUFFbXzwKnUyB88KAmjddtcqCfrMQ04hergX6FhaEio0Bo1tBCyQSHhhj5FCqkMrnzdCgFDCDHU4zyXl5dVAEWT3JbZTPJQHpQM9+QoHpWaDygfQHXn4V/h88PNarqPurP2/XhUR/CQ9Ners++UF6N9Ms1AQonTAJIPKX8+Da0goMQoXjrEQ5pBE0CFR/HqQqju+iYs3HpIodUzw3mYQJQwUnVUCKOQmqJJLj0oCZxiGPkGedAk994HlVZPfBYvG+L5/hMVVFGaQT5wsiFd/rrh0HDDjnA9oLV266HoR3F6w6ub9qsJP4UAA4jw7nYa2VBGGqrVBpIPqXQelAUO1RPLkIqSEEtPZxRU6ShefpoBoRQq647i1QXSoOtbcB1WcPUMVgqigaHjQ6ho3ikoG8pJKKXBE1JLoboMoDwFlTbJ8xVUCEqsG4UHJQGFh5Xl/CDTAJcJFbfYUBENHqpLjfnJMeZhWFMN8ee6MJLW43yjIkiMc5lTUC7NoJ5i8iFVBih4TjLFACFfXpoBgRQqB1dQg4d9g4DK3xbQQt267dacXyO8LpNsakJHffvooH4RFRCG8BGOEUD6A6gjVUZVoecUlAWUD6fBPahjXoiXNcnHBShPFQmPiX4ToeHDZNzzVGEYZVwTK7EfxaONRo3FMJuGhFQAh4oHj3sAOhgdI3jgBUH9qB80kQAqA5VTUPSf0qBqA1DZZ/H8MK9KJjnNcaipLod444AbgYaS6RMAG+GGVAoDuE0HzKNBUGxUbQQew1C8Q77OB/AIffwfAwVY+CFgABlkTmP0Cx+oHMJGgdNJ4JQByV9eRUHVg1RZiEc4yTCvjRAv9CzeOGDQ6JhCvTXavoFHRpWI44WSWuuqxy27j0e7Dy9Gh09ejhbOXosuvfHj6Mr1W36D0/mbUwGWtr5nlwcF5eTUE0M9wolluXGeBVTe+6Dsq1asB5VNM4BSCqUaUEkN6kG1aXyPCiqTcpyNO+ejPYcXo/nTS9Hi6zcURAqdtoDk78cCKvsWAwmi6nBCmJgBVMCDsrlQElD2RxOYFR7OJLfP4NEwL3vUpa3OLJVGW/vM28+ojlX3OJt2zkdz8+cNkKCMRKavTiuchtkGXIhHD8qNytUDE7fLACqQZmAB1ex9UG15UHmdNK8+Dyqs75si23ngtPF9zi9N7YOqw+x4uu9qYF+ZmT1oQzsX3hFMfilVVf50HqAIJZT0oZByUPdhYYR4ozbJCaFQ2RRooX2Ns27TLmRBnzb+0ZW31DtSlTgRXplVUBZOABI/+QCiUsor8wBFKMmS0KoyisfQjuWgHlQZDNoGT9v7C55/TbOdUDI+kkJJVU01VTPK6+RCPKegACepnjhdDVplgCKUrHoqziT3TXIa5JOkoIKgaDCq1mQ/TaFnwrfTS5EqpYlQCaPs8F07lhvFk+opDSsJrHJIZQB1eikJ6ULqqUmIBxVVVUE17cQAxiDbVgXOKI6Bc4HRjRQANbkVSh0KXx2g0lAKqaZQXRZYWUBl0wwAKqek6meS453koxrFqwqaSV0PID914a2u3Tn1fCcv3BrHdwJAScj4uVDpZXbdYlBlACVG8aRBLiFVx4MCnGyIV/xGzTaA4Y/M+fNtHKONfYRUGNIC4C116G6p56pQ8tuABRTUEz8OQgQRSwmr/Gn/V13wiAJhxBDPqic7gmdDvCp5UO6HPAGoKgpqVEAJAaIN8NTdB0xvhHHqLWkY59+YFq/+NPqnvZ9E31rzefTX/3Y/evZfHpoP5lF/+OIvfDhMwrxUUFRPABKhxDIfSGkFFkjUBKDEGzXTkLKhXj0FZRM2qwCqbgf31x81eOo+XsLzpb+kYFIwhcD0wmt/jP7i7/4zmvnbqPDzzZfvTBqoOIoHABFQIRhVB1UmxPMyyQcBFJQTPnVMcnbivLIMQk2hIY83LCWXKCZ95m0S7vYTdw5QRlXA5IMLQPNBN6Z5F+LJUTynoCy40stCAHN1PqCOCQ/Kwck+5oJ5hHt5CspPM2AOVNUQT0IC0z6MQg/J+tvIeX97uWwY03nHS8CkuUuT0pEm7jwAGR88deYRBi5e++m4/y8AKq2c3GieDPUcgPyQzp/PAMpTUHL0jl5U1bcZUD21qaCGAZam+8wDktzfvvnz0aVr+jzcmO7o4+6wlY4/KJwIMoR8Y77OFlDOGPdBVB9SPqBoklM9UTU5UNX/VZc+ASoEpVAdkit1VE49pjJgwOwmYNoo/37Hp+OEFD0ogoheE+d9YJXPZwAFBRUwyR2owoDKC+8AJyipqomaUn1wOgQALhtVWfUctuxZiBbOvjHORqLH7tDwP0bn2gAT9wEPa4yhHhWUDyY5Xw4lGeZlAOV5UE45uWTNPA+KnhNLhngWUOk8qEFeWNeGEd422ACwA8cv6buWOgSHMnUz7OVrj3/UKpwIqTGa5k5B5edBEVCEFufDZRmgnHKSgKqeB4VETQBrmGkGVdWNhFJdw11u609vmzup4ZyCqbZyhWdEqLRZ/uU//Ln2ubQE47SCsga5DyJ/Pgwmqqj6gGoS4g0XUD4w5HwTeMnti6YxOgfPrqUvV/czZZD7q398MhRAAXaHL40lkdMpKJdaUASkomUWXBlAiVE8Gd45JQVAhV/5y9AuVO460CzEm8RwDtDavu+kjs5NGVDavhG1qZr8fX3v0MfjuOH5aQYAkA8hf35wBQU4WUDZfKhmgDod8RXBKBcWr6Z+XHOYSqdIBTVZhsdT2m6sur/pGvGDwvGh0uY8kj7H0KYAqMWPHZQkoAgmlsVgciHe6ylwyDQDKCinnOBB1X+jJtTUoKN4RRBpK+u7CiAxQqepA9MFkmF18j4C6urN21eQqLlsAcWETQKJZTUwOUBdSgHK/+FOp54IqHAmeV6aAUfyBkkzKAJUG8uqQA4/0aTPzimc2gRWm4rJ39e6478ZuYJaurG8gHeS73YjeICSDyZ/vhhYGQ8qk2YQ+unzsAeVBymoqNqA8l6HWzrqJtavoobqgE2NcAVTm2DivjDa5oOlrflxmORL15f/dWb20JnvphUUAURYVQXU2QgqqhxQTjnxtb9VH3WRZnltQMWv4W0Km6rmetH+t+zWkI6dScv2If2ttZ8PBVAYHRzD97W69ObyczML55aeAaCcigKgJJwIKJYEWLgsA1Q6xLOwqmOSI8RDLpQ/iueb5HUUjb9uEWT8davOm1E6/U25cTT0qTkmwrC2FJPczz/v/d04ruHq0vLyN2bwt/vQmSUX2hFOElScDkOJ/lNVBZU2ysMelFRLoelhJmpWhU7V9eaOnle/SVMIRtLJ237UBWHjWMI7+E/8s2GehZBN1iSQqqkmB6izpSGeDyeM7NVRUIBVl95JjsdVxiCP9ZhTCkTApMk7oKRiktPjUk/Xbr7/38mnmdnZhW/sPrR4L6ui6gKq3INiiCdBVdeDCqUZNHkWbxihHFUVRvI0v6l9n0VhX35N/9eOP7QS6v3PtV+M60a3ksCJE7MHT79IL8opovKQzl93NB5Uw7cZiJE5gmRYpcKpvCMpbIZ3jf7mtc8GgtR/e+XuuOC0eu2d9/8/cikpoaL2Hj17N/08HhUUy3Jg+YAK5UHZR15sFrkN8eo8LGxf+zsJHlSeAtM0guF1PIVa9WuL8Oz/qZl68F/+NooAt7Fd5xu3f5tAyZ84sHDheauIACRCiWU5nLCtDyiZSc7wzgLKpRtU9aCYpBkK8YpG8fJAMgz1tHBO3900tsY9pb5T0fWGJ/XNV+4YUAE+0l+S01j2X//lYbRz8Vfjg9PN26tLN5ef8bmUmj9w7OJxCycJqWpwCgHKV1CAk/Wfmikojug1zYMaBpS4Tw3rqt/dizqVLhvOdcQDv8iV+n//7b6BEUrMQ2mN8aV0BOKqScxM0SgwExvmK2lvqbqKKlJQVE7SIK/70+d2FC/rQTUxyQmW2mXAy1I4DadTKaym5LoWhXY+p2b3Lz6798jZVRfuNVdQJsTzXvlLULlM8vCjLlRLsmSYN2wPqsrzdASbwmlKOpGGkFQ7bZcrpaFdBlIHF19ooqIyCkq8D2pQD0qCajQh3uHUK1wIJFkqnBROqvIGagMI7Z71+VNpfu7oOZN6UEdJZQDlPSycDu/yH3UpelDYPuqSfh9UUYhX+mBw/JyeBE/etNyXwmmghtn2XVj31z2FB1P825VglLeSzY8aVogHQNXPJIeSGnaIlwco1iucFE6qnAZqA4PDidBiEqdLPcgHVkZBnV4yo3YyvOM01VTVTHL6TwBU3RCvSapB3jYKp4Eapiqd7imdtr+z9uBESNlwbzE2zmsAKhDiEUzWLA//aIL0m/zpunlQVD1tlEf09bxtN1bd3zQB68btu1feXv4f5Eqr5fzZpeeRbZ42z9OwyiioUkDVC/GoouoqqDbgpMpJlZOGdQO1gZXGhnhVks0ePPfM7kOLXp6Ug1QZoFyKgfWf2vKgikzyMjghlCt6IR1+DkozxAdqmKqSpkklZf/XVbxfvHYqQVUo+euZ5/aOnJvdfSgb8lUBVDrEq66gMHoHBTVoiJfnLYVAtnn3QnT+yjvawbKNTq+JXpMqbWB16cbyGp8hI5nfd/T8d/2QLwOoQB4UTfImHlQbgAqBKFS388Bp/elx7YRVOqGuE2onN27fWbq5/NxIYJR3EIR8+49dSEK+DKACHhQzyB2gqmeSwzAHpJqkGdRRTvpGAg3p1G9q3AZWr964fTx5ZW8ePEZZf3Dh0ot7j567WwaorAdV75eFGeYNyyTHu8M1pGvcMFVJhJTENNUNc5RuUKBBTR1auDj70crvVvmrv/7rVgCoph4U1VPolb+DmOQI7zbtnNc3YE5TR9L/te2bifGaJko15QHt3eUPX/jZL1dWPv7kD6vz8KDih4WpntKAqqugFiKAqk0FhX1duvbjtr8w3Z9CYBraAEfoxus15cGoqB6gOnHujRVpijs4yfdBVfeg2jTJ9afHNZRTn2mgNrBy7Z33B3uWrgggo1iG3Idzl2++eODYhVXCiSUVVd6jLnkPDIdCvDpv1ERe07EzS9Nwd9P/UVVc+23gxu27SzeXX+xEOFcVcgDVifNvzB44djEBlR3Nqx7iUT3lAapslI4+05W3brX/pWlH0Gva9zbQRzD5ALOgemv24MLFlZ37T61CRYUUFNRTSEFxFK9OmgHAhGforlxXMGlIM1BIM40QXr02DWAKgWrx4vUXDi1cXNk/fz4Z9cPo36kLbxgj3H9I2I3i4ZW/pyKOFKIMhXiJYlIwTWPH0v95MEUH8/sWPKZehXI+iKrML11ffmH5g1/fYnpCGaDyRvGKctUvAAADJ0lEQVQY4iEDfOGs/rqKqiVVSw3aQHdH5arAZpB1kBb/wc9/M3vm4lurW/YcxyeopOBF+WkGJ8+9Ee05vBgtvn5D75yD3Tn1+k3f9XNh3LsNX787SMfv2rbwqU5dvP7CwWPWpwqBygfUT97/UDvW9HUs/c4H+86NWrr29vvfmfowrikk8f6YE+euzs4dPb9CVTV35Fy0cPZayoNSQGk40yCcmUbAObVU9iOZTTvttG63cOGN589cvD577ebtVXykSa6AUkApoHLbgIXSjeU1Y3+7wDTAC3J06ebyCx/8/DfHP/z1xwDVqgIqt3FOo0rQ/xk38Ru37169eXuXQmmMVASsrr/3wQtvvH17Fl9IrK60gQ7mTej16+b1U6U0RhZVOjTuFkvXlxEGrjAUVOmv6qqnbcBYHfHrdF9UpVQJEZOzEgx2jFDgC1RYKaR6Aikbut24fVxH3yaHNa2ciVFXN5bXXL1x+5YCS4HVEWDRS8KPDqhKaoUEHdiJMdpvLD+PF7qrwlJYTQisTMgWm9sJkDRHqQNAGfYpxiOD8K9eNMByhjsajZrGeg2G0QYckBiywUNdXv7GsNu77r8HVwAeFtIZjMpKh4UKLQVWXWA5GOE34pCTdH35BTw10YOuov/CpFwB+FjGnGRoqEqrbkft+/oWRC4PSWE0KZ13Ws/DKC34WQgPb9w+7pnwqrb6qbbSILpx+xaSIuOb1/OqjKaVBh36vzPgQrpDWnEpvCYbXg5CN2/jwdoV3HwURB3qhHqq9a9AYshTdd28vQvGPDqASH9g5+h7SDTO/4/XOCljCB1PIASfCF6kGtf1G7pu0c8rgPAgztkyYWNs0qPT5EGMHWycnX2Sjs3r4Ur7XNpKfA134ZqacIwAUrO6n51J/6vxXAGjwuwo43NLN5afjzvbix7MLNCyYaXruPGbIWLlNimQyTs/V0/g2JAL/6eBDnxAMzpmR8ieM7BX9TOeRqpH1StQ5wrEoeUzcfoEOq+BW9KhbedGB7egs6Enwk9+AILBPhhEcPsz+42H3O1xJWAcZCxooCwVNnW+cl1Xr4BeAb0CegWGdQX+L5YzNaxKyS5qAAAAAElFTkSuQmCC;fontSize=18;\" value=\"Shared database\" vertex=\"1\">\n          <mxGeometry height=\"84.73\" width=\"66\" x=\"380\" y=\"1329\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-5\" parent=\"1\" style=\"shape=image;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAAAMoAAAF8CAYAAACOgSR0AAAgAElEQVR4Ae19y7Nm13WX/AcAYQpUISakUjBgAGEYBZgCgSGDkEkqk6SSAibhZTFKGJBkAlUJie1Clg2xFZnEiaw2JTmy9erX7ZfU6m5JrXbrLVlNYsckkPRHrbPP7+zfXmet/TiP73739nHV57X32uu191m/s/Y+5/TVQw8Z/3v2xaNH7rz94a98+50Pb99996PdO+9/vP22NTiVOfDuB9/ZvfvBJ0cffucPPvvxvXs/ZsBhzDq6ffsH3rjz7i9v4NhuDA/izVFA8+HH9y7eu3fv4TE6es5Tzx49/Nbd948exAXa5rzdGDgHPvjwkzfvfe97f8sEy2u37mwg2bZXp3J7xSCobXdg0ZXlwtVbn641sMltd98HJQc++vjeM0NV+eyTTz387Xc/vP2gTH6b5wb02hx494Pv3L9377uPdGC5+fq3f6JWcZPbkuxBy4H3P773mQ4o3373oycftMlv890AX5sD7330yScdUG5/+71t27Ud4rdDvJ8D99+TQ/2dtz/YFslfpG1ttrW5/9FH9x55qLYEbXLbduUBzYH7d9/7aAPKA3rxt0pZXyk3oGwg2apkRQ5sQKlYpO3OW3/nPa1rtQFlA8pWUSpyYANKxSKd1rvkNq/6SrkBZQPKVlEqcmADSsUibXfe+jvvaV2rDSgbULaKUpEDG1AqFum03iW3edVXyg0oG1C2ilKRAxtQKhZpu/PW33lP61ptQNmAslWUihzYgFKxSKf1LrnNq75SbkDZgLJVlIoc2IBSsUjbnbf+znta12oDygaUraJU5MAGlIpFOq13yW1e9ZVyA8oGlK2iVOTABpSKRdruvPV33tO6VhtQNqBsFaUiBzagVCzSab1LbvOqr5QbUDagbBWlIgc2oFQs0nbnrb/znta12oCyAWWrKBU5sAGlYpFO611ym1d9pdyAsgFlqygVObABpWKRtjtv/Z33tK5VAMrFKzd2F67c2AX6WteW/oUraAvF78buwuXXRr9OF/zeXid35cbuvPwuv9b9hIe2UN33eKyTa5+7/Nqu+XfpehfTuUvXd+nvNdUP42cvXd95P9HnsaF/1POFZn4vH726k5/IoN1ELwb9l4U6v5cuvrrDDzKh/0qn89LFV/pxodbv1d1LF14JP4yjr+iLF17ZLfY739tiKu1Zv2u7F8/LL9h54fy1Xfc7d233Qv978fy1+0dXrz/y0Mv9hStekIv9BXQuABY9R3GBXCoLLYvPVC3+cJEUHxdExtFupsmiYxE1fSUsJha1hdIFwIUAff7c1eHivHDu6k76+HGf2xg36dmru+flJ3bQPnt1962+LTT9Xen7Vzr5b52VfsXv5V5GaP/75stXdvN+l3t9ofH33EuXd9+Un/BeuryT/nK/S7vnXrrU+RXwSB53BeTqzftHV28FoESw4E4W7nwueBrB4gJjuLvhLtbfrfo7lQQrif/yBbqLDQCxeD5IACDQEYg6kMS7S7jTaJCEvtx15C403IFawCKyHmDOX+sSO4xHoJhAICCZ4wQOBksKDg0W3a8ACoOJwCKgaQMLwCF6aEeQABwACCjAMxUwEqPcSDpgXL6xu3j1pv4FoPBWQAATwAHal3LZEgg4QGdUFw2aDgw9YGKbtgEDMPpKU9EfgcCrMgIOGTsfbHcluO9HoMi4DxiAJZTvvnTngOOBRPHN5C+Bg8dRTVRF4eoi7TFwAA4ZQ7uCGiDRYClXHAYIAKPA0lcTBkorSAQcck3PXQrHCwMcDJb752TrxUBBG4DRe+Wk31hVOqANFSTskyMw4r457ouFR1uxIkBihZHkdytHDxpzfNh6hYphAyQABwCpqS5ih+WT9gCQdOtVU1Wqt2EOWACSCBgBxASAAFAAi/Rnb8MAGgWYzNYrBx6Z40sXXt2dt6sGA0O3HaDIgXSoLPFgebY7ZBoVhqoMwFCiuqr4fTqvFEEzBoosjAkIr8IwiIZDXl9NukqTVpYAkhQEektWB5LMdoyrRGu7oqoIMCJQchWmEkQCEAIK2tO2YQBLvqoAIKCoMDKvly9ex1mjA8DRtVsaCKW+AxT1VAbnlBQ8BJgeKN14qcoIAEkmC5CL2H71lUXOKtkzi701q96GafDQtsyuLBE0SYXIVQ8ek0qC/lBVAJhQXWT7JVWjqXJoMPFZBcBRPFSWFDSVwAAoQDVQjMqit2R5EGXAgoM+DvkvXe5ALzf1/iAewHG1GRy9XndeCWeUcwoYkvD4hS2YnFfCmQX8ARQCkgkVhcHSJb/akqUAUo8oO8BYoIgVRaoIKgnoJMAkW7EIDAbOkOxI+ikUoBkBJgAnAAYH/cZDPsCB7Rcog0XxxsDpq4SAofEnIMA2TAOE+9xOgWNUEwCkp6IrOTNhW1WqJjKeVhQLMAIQgANgQYVJqDroMxDOXgxVBJTHABLmpSDB2YXAQmeVTp/6AIhFc0DRYBr6CVDCoZ9BgvZssDBABGjcT9oBJItWGAIMV5TxdgwgqTjDKHAwCLgNEKXAyD0ti6ARwMo2Vw7khcN4Xx1CVTlqry4RKOIMgPBoBEb6RKyrLjOqigCDAaOBMhoTYOBdSwNIhuTXWyw+l3B7AEl8MoYnW5HaVUYA1AQeAQPrJOAQ4JS3YAKu6idlqDJMe8BwNRm3w3YsgAjAqaAKOPXAAGgiQGSeknO8taoBishMAMm4ongAYb6AZQAGtl09lX1hByY6g3hVhCuI1dZgiX0BCT0N688sqCD2+5Z0m5arLO4Yg6Zr+wBBlakFSyIHgLhVJZxdAJxqYOhzi9pqSeLzbwwQHPIBCq4q3Ma4ogIUnGF62lJNJB5ZJ109JiZ+VQUi8FFFOZLPNWJV4XYKFFSTeG4ZgYeAwiA4S3wPQAAEqgj6Y9onPw78ZmXBmQU0VIZSZRGwuDIDSPjdCtrxsXGS/H2lsHioIu4YgDNQBkpDBbGAAp4CyXjLBZAwBRByIFFjRlXBNgxUVxoBiFz7murBoOE2JXwrQCAfgGKdTRgcup2eVQCc8VOwobr02zIGCgMo1x4DBGcWbNfSaoHK4tN20IyqTEV1KQKAt1lWG8BwK0s85HtVJVSdApgAEgKNJCdXFwAHNFQb/sxFAWI47Bt8BsvZsK1ikEhbfktsr6aABY+OlW4EyrkjqibU1iDhfgqYABQZHxIf712okgxjIx7pYewogiIHGDmviN3WcwvAxECwKonFC2cUVJKabVjd5y5mZQFoHAqgTD7gCzAAFKE9UAIgcu9YpKoYYBiAgqqjKIOlb2MbJgCRj1oXqAJL2ohbLwZAbburGN1j47gN64CCs0p/nhnAg/MNgFBBBSABBAXQVB/wY0XpwEcvJAEIUAbQqI2qIod/5/MWK+ktHqoP00ROAJKtLCrROenntAkwDJ60sghQACYFiAEwDpgIMB1AKp9e7RNEfWUZf+tVC5LuU/L+3UqoLNiCBaoBM2zDKsDhVR2AxgROB5QeBHgiBmqeX8ZbNg2GWsB0cgDOcIaxqwyDQdoJIPQWDADJgiQ8EZOKIMkW6Ezg9IkPcGiKSjOpmvQHeWyxZP6lCqK2QYtViqPxx4+e7b6i9J+s4ADfcmYRkDC4QpVR55X+jOIBIM/vq1X2hWS/7WoEhiQ4fgISDQwBZhE8CUD86tKB4kLYfmXBocHCfWfrxQCRNvrJdsqsLM75RYACeQUaVA+rqqQvIp0q0lcZWQP5d0VWdcA5wRo7Jl4KFE74KW0GjQaM9eg4D5D+a2WjAnVbpiJw6MxSCSCAhcGjgeL2B8BIlfAB0wKSkSxXGFQZ0A4g8YnYkOhI+FaqAIKqAqCkVSVsvyIvbsECoGJf5lSqIPsGg1WxFK/fevUVRcCBqqKBwod9PcZ9+4AfK0wHGCP5a0HTBJIeIGIbyV9DE8AYVcUCy1CNBsAIWGzA6C2X2MOWTHTQ1nIDH4DpqweqSKACllgR8L7FqjIWLwEYwCL20CYageEDJchc6SqU5BCDQCVjMsZyLW2pRrV2S3I03j/16v/5qgaJ3oIBLKAMED6zCN8CDKpMN67A0tnqP3UpgQZnFaa6HQDV/gYfQAJYAIoBCM5bfcjJHbMDiHvIZ/CkoBiAwNut3DmmAjAMmgQEBCaTL4BggEC+Cihx2yU25LrXvAdpAUStLCX7HCCGfwosSd7922513kiAoMY0iBLZSzjY0yNjehI2AGHi2YVB0VULtQ0LvP780VhNABRQDZgBEASYEYikknRA4arCAIkHfQ8cRb4GSbIFC+cUq8KYoAAILKoBQ0DBOQU0Vpiw1ZJ1mQoQTnBu1wJkYTnaevVVZfjDCAoYCRD6MV2BLBmuLDKOqtJRVVUGADXwARoLMOEfffWPleng3slSH6DQ1AKFx0vAMgClfF4JFSgAR4NDb8P0eAcEFyA41IPG7VgzWAAgAzQRHHhEHM5JU84hBwAIr+rQYZ63X3RmkeRurTYAjIAhgEMBhKsLXkr21SX39r6z1YFo/HIybLUy71oEGJWH+gQwlWeUEYAGsHBViZXEOr+MgKC2YO64eVbhqiJtHyi5sWH7JfoACtqqujzff6y48N3cS9598sdAGSpKtx1Lv/8CALJUgawWLFxhNFgiQMZPwryKklaY/kNKVBG8ye/7tR9SJlWDtl4jkGDbBdod6gEYvQULfQHB6ClXLVBYzgRNPOAXD/AZQA2VSAOk/2Bx6jbrEIGlqtsYKPg7VN22Ctuxim0YwGMe9PstF2Q6UPRVpQOBOqvkgGFtzwCWfFUJZ5YAoPj+JKkeAFKWjt+tWEABqEBDBfHAwpUm/dyet1/cHlUXAASgQX9EI2iQ+OEsE9+pVIPpbL/NunQ9e3dXSZfI5sYOCEDxqVcCDAAElM4kuW2YdWbhdysAygAOtQUbANRwRgnACVuxOsCE9yt5wIwfJwsYhqQ3qok5hu0X5IfKkgKDzylZMAAEJSrgEJkRSNLzirXlsngAlKaylW2tIvsAxhIvLJWN/p8C019I5K0X2gwiCwwMAFSUktwAigqweJ/k6+qCigI++jbFU7Fp1cWqIlkeQDOABdXlWv+ETIGn27al1WVURXKAcUAiQAi/CJrqCtJvyyQOueZr3/H3AarKOXBFCYd2bL0AEpcWtmMloISq4hzyqaIwCFvb4Ymb+Ii/1Eb/IlT+RlnvUyjaAFyk44cIcSw9P2lwipz8RZhABZx4GjeuXlKd9I9BKLqhwoEW/p3NCJzxUxqci0BLYJR/k37plWl/qKEyKUcA/P3zr+9+94Xbu//+7Ld30p5qZ4ZeAMr5S+HvAQtI8HMBwof1/sCfJl/67RcqjJaRiiK8lKr3Lv0f2bt45eZOfhd6ij544IMyX3j6VxrX8uO+/F1mtqv7PCbt8LedoRP8p7wgA1lQ2IXs8dK773y4+94f/Z/dnbffXz1Z/+vX7u7+2X++t/tL/+L/7R76yV3y+3M//We7H/2F7+1+6SvvZuOorUgVH0eiooSnW1IFOqDIH7pWoJH+AB6pJgyYQnXRIEGfQRLv+vFzFxmXmCSx9I+TDmPCC0mYJqrF82TZrtXO8TAWkx5xcMKDpylkLD4AImOQAwUPMsvTK6++vvvw43sdSNYGylefv7370V/8XgIMDRTu/+V/+X93ojOjWtTo4oyigEIgAWAGkGjA4KA/ASx80BdQjH4XBSjXRyABMDwAIGEhhz6o1tN9yHm0Vd6zY/OR6AAM+q10GQC9evOt3R9+948GkASgfFCTXIlMzd39C8/c2Um1YCDUtn/q17+T+JsCHCvGnqcrSth6yVYsB5Du/FFZUfis4m/DnLNKV1HKQAEgaiiSUyc7dDEOWpLT49CrpwKAAIpgC4BAooNGuSAPuRbKtsp6b919PwGIgERXFCu5rCQtyc0BCcDEYCn5s2LM8DRQUFniWaXbjtFWbKgs2H6hwuDLYwIQgwTbrRKNW7AAnlJFQYIjYblvtZGUJcr2IAse+vNoLvGthBYe+LptJT1keczi8Xhoy6NR3moBIKB33rYrytTk/J3nb0+uJAAJ6L967COzskyNrQePtfWywCLAyVcZCwAaKNkPKYcnU+kWrAYokkAeKJDcGOfkxhh46GtZ8CEHCj4o+KDM53YYl6REwmtqjXFCc8KjDcpy7e0rr76xu/e/v2tWkhxQ1HsHM1mtO/aFqzfNAzsSv5X++Z/+s91Xn3+z2r8Vk8HzKsoYLFJJJGlB0Q79/g9TUDWxgAMetmAWcEJFEbD0T8QKZxRJQPwk8dD2KCenyLAOtzHG8rl2q3xqywJGiC3KsQwDAHLM022ACFSPh/6rN++MziMAB9Mln3o9+pvvTzqT5AD0tx/9/iygGNXHryjhnBKriAADv2H7NQAn/gWXbqzhYO+BRUDVHfYbgOKBA0nMFG1JRNaLiRn5kOGxWh78gGobpX7UQ3J7wGAQWG3mia20/+ad97JVZA2gLF1NAJ5P/eRu98Vn7jSBpfCI2AdKAEX/31vstl0MmtgeKkoPmgEoTnVBNUF10bQDBwNtIaAwGLiNhGcet5HIwkMb1OLBHmSmUM9usMVJPo4p+tPAgiz4kXqHdgYHt70zirFlSZJV36l/9am7i1cTgOWnfv3jxHcpNm+831L6QIkVJYKCzylo6+oCoHTnk64KvbZjcHBbg8TqC2A5cZdoSzJpO+CBYpz70kYfVOTAB4/7Hk/LtPWR5OJb2mkMoc8yGAcv0nfe/6i6kgAsS2y9pJr8w1/6g9WAIu9XvOS3+BrELHN09dYYKOcv3egP7gIQ/K7vInDSLZgLGK4KTtvadjFYpLqsARSAIEcl2RgE3LYS0xq3eJbuVJ5vH0BggHD7xk7ulO9/+EkzSAQsUysKJ58A5Qf/9R+vBhTZfj13/o1qsHhAQUXp/tN0ERAARqAADf5z1SIHwAQaD/fZyuIAhUFhVpq+IklCHMcPYEFCgoLP1Et21oGMxcPYNCrAABAsivEAILn4H3/yB5NAEoDyfgc0TvzWtgAF26Q16JRzSmYOpadeKXAioGJVyR7w+0RnQLS2xack1nH9JAG1b/BAkfiguaRdSga+U18MCAZMAIj4lse/c0ACoGSSquou/o3zr68OlP/wm4t9k9YOFFQSHPY7Ki8kL78WvwXjg71zqAdgsP0CBR/0UICCxJRk4x/zdZuTmAHCbZaZ0s7bAnACaGrekeAckqNLbL3kJeMalQQ2paIsCZTuvzMfK0VaQYatF225Utm0smD7JeBBO6H9FkxsAAigFk/GBJicmIfYRoIjaUGFj3i1DPqQYcpjOT7k2J8tf6OrJKUXiTlw8NgSh/l9VJRf+p/5r4sbqmJ/mO8+UUlBIokr//ZAfl17ONjj/AL5FCwASZf4FmAELD2/k6XzC1cVnFnEDpLtUCiSkRO0FBuSmil0mMdtyz6P17aXqiQAyxyg4NAsZ5SpH0CiauSoVJRfe+pu1TawAjAElH77BGBIgtb/UrAkQDDA0oEI1YWAgurCVOJBQp0mqpOcQaHHuM9y3GYZbsvBfalKkgMKAFBKOsgJUOQNei7Z54wJUOQfecGfFVduTMn3ZxRUFFACSfqUKweeCBZ5ShYrS6wgANBACyARwBxiRckBVpLUG0cCI8EhBz4oxr0++CU69+kWgKFpqaLUJqC8FJwDhpzu35n5GYsGSjijACCXw3arvpIEQET5CBYBCv8GcHCFEaBIPwOY01pRGCRogwoAlgDL1PckGhi6bx3ma8HBCbjWm/mFD/KyfaOKImDBjyoKQIAtGQ744I9pqAIBJABSe1Xp7Pb/XUkk0EmiSPZczCyj29IHz6IYZwpfwrv7Tvsbdw0Ir1+qKAwG3e5f4HVnh7W2XwKU3132Xz0GoOCFYrdlUmABQAAIbMWkr8eCDCpJBAkqi1QP9zEyVRc+1AswkQCngSLpZS5oc7JrniUHHusxr/XbLQ8QHr8VKLlq82tfW/57L3znxaDUgG3sp0CRJJbkP3/lRqguUlmwLeseEcenYB1QzM9dIkDSdy6ZqoLtFyhtxcSPJMGD8PNAogEBUGgqcmuDRMDTCpRcUkpVeeQX6v+NfO5cImPyjVftX2rJAVjFHJ56mRWlrywdcPpHxKFiCBDyvxQgEThBDxUnUj6/iAzOLPKIWPoPAkh4jgAM89Bm0KAtY9K+8cbdyZ+leNXD4rcApeauLu9UrL+2UgKFHl/pH23FMwoDJbb7qoKtWFdt8gCRpI4g0bIRGKFKxQrTgQPVRNEHGSgADFPdlr785F2J/iMQVpIvwbMO8+oOXP3+And1eVM/ByzyTsZ7Ew8fU2OUw3z31CuCQ7Ze4dcl81BV+qQHaJyKwgd9AYzYkkSPvwCW7qzSPxXjahL4/acw/fbLBYr8hypP8ZZMAwJzBTBAhb/0C8USmLii1FSM2gQVsPz1n2//oli2W63/UKs2pl4uPaN0id0DxQIMzis4xHfbMvecwgBBm6qKVI7+J4d9tJkKSMQHkuRBpABMbu5zP3IsAUOP11SUqQASvUf/x/tV1UWqiBzcS2eSqbEQmMZAEYBc6D5didUlAoi2Y1QpwnZLtl3Wv2VhkEg7BQtAwvwOLP3LxqSiWFWEedw+xdVGQIOKcsf5k0I6uZfs54CywDZn2Lb9p6+80/3jrh/8+T/uPncRYMj2TP5KpPy1FQsgS/ovAoWrSWgHgOBpWAccAkrcWgEUFhWABKAE/QgYAQYDZqgqAhb8J5ZPeeLnKoY39vrtd/ZyeNcg460XJdOQ4K28wr9XN+3mAJEba41N5OVfOHb/cEsS94LacgWAhKoi/9wUIJHExdYraSvgoLqAAiQRVBEoupoANAKYYesl1QK/FtCcsiqDrdjVPR7ex0Cx/67XcH1wnU44JcD5h3lv+9WdU3Cox2EdVIElgiJWGDwV6w77fYXRQBkqSv+CcnQBGCgWEMDTlPVOeHvpDx01GHJ93npRMsUbWQVApuqNciHji33MPKf4QOGKgnaoIPHs0oFGkh3AUUDpDvvuO5i6iiK2h62Hl/jgn/DkH+ZZmMean6fkAIKx3NYrSc6r+/3PQ0wFEfQ4dvB6Slsv2V7R9ku2Yt2Wi3g8DnDwNmwAjgKMrixiJ+UJaML5BdUFVWW09ZIkYmDgjlJIrtokPHS54zqXACRCuaKohGqqKkvpzqwWNTEDKClIGBC6HcFDT8CcigIwpOcUCyR+dZGz0bCgDBIGCIADyqCxeDx+gtpyLjnOLRfAkqsow7XC9TkdFEAJB/QIAjrEOxWlqwr9wV6Smfu1lQVA0tWE+2LXXHwNGqvPvBMECK+qvfv+x8fylAsAAT20imLmBwF0TsXpt2M4o4SPHcOZIp5BrAM9KoyMCSDQx1bMAkm+ouQrzAgonPCoFqAY4z4WzAINy0H3QOnthj95ioRei540oBSBVD5LWUCp34YxSKQ9gKU/owznFzqzdGCkF5Px6VcATGeH3qsMQNGJDgAwRZIDABgDP2eDZQ6sfZyPgi2wTdl6yV09c1i2dw24fsdAVazYenFFQbvffhlv6e13LgFgA1hwYO+3Z+k2C6BI3+TjDX840IuMvEehrRcSnYEAHpIbi4q+R2GDx5nHbZY5hvZa/1LRAkENz6soKrkOPfmr4zu6NrxwBDgsGrdXNkDiuCR1VxGM6mIBxefFp2AJUAACj0oSYwwJrfvML7WtcfD2RA/hKZcGj1VR+BywFGBa7LTIDjmC3CjTXEW50X/zFSoFQMAUZxhQqSYjoKCy0PbLB8j4vNIBRZJST4Z5SFrIoA8Z9GUcbaZaD/2cPOuv1D6Up1w1QBldn34NGUCezAnge2eUUFkCAMZA0U/HIniMA34jQLD96s4uPfBGCymJiWTmNic2xkEhB8p84YGP9hQK/6BTbJDOoTzlGgNluU9YplQC79swBuUUu0NOITcijRVFviEKT72kkoR2CpQIGABFb8W4n5xVGrdiAItUHolpmIAkUQx+3EaSIVG1rKUPHYyBQpfHuQ0fzIOu5k3ov/LaWwfxKFiDRPrW1it7XbCWK1IAA3TheCJQOpB070NCNQFoUhrPI9huSTUR4HAf2y/QBDStFYaBgoVGQqLPFGOa5mRkDMkMOfS1Heav2D6EF4sWSAAU764uCZobm5LAc5N/qj7p9UDpvw5OQeEBJoIlbrnyvBFQUGEM0HA1SSoKEhZJzQmNditlm55dDQYtB59aDrYtfoF3iAd4Bg2eeq241RnvFrDOE+gCcQagdBVBtl6oKKD93x4eAyj+4y7ebvnACdu2ATACkMpDvvg270JIxNaFs/Q8nsdnnyKDH/jogwrfaoNH9FAP8ClQ7P+cAt2Bk3cmzDevJdZtJbqA/3CYD0AJ/w0N+fMxHTAILHx+CaAZVxC99dKgGUBC1URs8RMw9LmqCM9dXEmwqYsLXSRpyQ7Liyzr8Rj4FmU9a/zKzd2hHuAtoCyQgMXrd+vlx3bf/d0f3u2+9FD3+/7v/NDurW/9oqnHlWNyXth5ECuKVBP889IABm/rFfg40GtA5CtMqCyiM1QUbltbMQEKEpEnwTxuswwSEzwtx31po6/b0PfssR5kmAd7Hq8fl2rCCXmo7X0d5t979mcGgAAooN85809MsCwMEPgIQJEE4arSbcHo3DKuKD1Yhq1Z/VZsVFkyQJFvxLIVhROY20hI5iGBmWfJMa9P4AFA0AUffdhmXeZBHlSP9f2TUE0EvDijrJSUXXLe+dYvuCABWN599meQyFVUKs7EKmhsvbrKEv7pb1dZ+krDVQaPj4XnbblsfqgoApahqgAooKqqmEBBQnLiSbLhx+PgWRRy1pjwvHH4ZQp5zYNtzUe/17t6/WRUk/0A5Uay3QIwNP3TJ/7C7vLlC911nwiAmDPh38Yn/SGf8Ee6L/bg4KqC9lBdhuoR7vIMnNAen1uwLbNBI/Lx37TAHs4s3Rjeo0hSIeE8WpLxxjUffaG6jb4XA/iQgw30ZZx54F+5ufvw43snYtulgTIlQUs6ly+dL1aTAJpPuSEwhvwAACAASURBVOeVYr7gWhVoH2s8owAYQsN5JRzuB6DQ4R5JnVJsv0LVAEiYdrb7agJ+qC4RMAAKqPgYEpYnhYQDD0mHvkUtGW2H9Vie2yzjtbVd9GGH6PVbd04MSAJQ4lOv3DuTEiC8ZJYDvK4eXl/OMZ4djz8hLn/rBcAANAyYUCGsyuJXFQEGVxYGzejcQo+PO6BIMiKxvMRcgr+Ej5INjAvtf4f8clGAoX+5M8oST56un/9KNVBazykeeAp8u6JIEvMPW7MOLHIuoc9d0qoC8ATA5J+ApaDywDIApQQEJGBJbup4zj6Snm178pDt6aG/XNQgCRVluW+9rAS9fOlcJVA+tXvjhf/SXFEsnwVe/9TravrUi0EibbnzCdXVxQMMKodQtLHVylEGi8hJv/PPCYi2l4gY96jW033R0zzuW23mwa/Fg20aO2nVhIGS23YVEm+U3Ol2qO4w/ydf+SsjO9pvarfirIvrl9JyRUE10eAZQJM95KdVQ4PEAhGDRc4pLlDSieSTG7JIUKbchpxQ8JmXa5fk9fiVm7uTdjZBdVn7PYoA8Pq58vbr7u//mwEoOUDkxjSwnH4KFFQODQrdH84r3TYM263+hWX/5XHckuXBosGDPgAjvpzgl+VzIqMtFG0LJDVjkAElEJ6kJ10ACVeUta+LvIH3DvF7Opsgx1KgaEB0d3N1XoHMUFEyT8NCxQCQxoARWwAGUwHJ0J8DFE5Onei5MZatldM6oqd1qX9Sq4kFFD7AJ215N3Et/hG8KXf2axef3X3nzD/dff+3f2gnW617T/2D3c2XH0MCj+gUHyXAyz8F7v77KEh+TWsrDD59CYkfgMEvJUN1yf9BvQEYDBJp1wKFkrA08WRc6+k+A4DbIsey3GY5aWMMOldu7g7t38FzxSi1sfWyziicqNyWNbfkk2uh121PfR0nYiJ+rCgyyEDRfRmzeB04UFWMt/gASaRULXpQBIBFfuyHp28I/CApQKAvKoGii5vkTtJbeAs0+vEwJdToDn8c14yr2EL+Y0UpVQ9zXMClANadX7IHfFQce9ulKwsAOnvClKhVtrS87mtgNPRPyjddFkiEp4FStZ7G+nCFkeRmwKXtyU+rRsBluw1xx4rSJaT6OFJ4/BPD6KfA4cfH4d+1iFw80FvtWEE0OLgvdhomtK6sBRaLJ0nBfGqf9GqyJFCO67pOqDixogAANdR6ZMzAyQPEf7divaA8KKAYd8Wqi01AOenVJAAlfsIi8594l17lprZSLABKfwdUFaQGNEhklu2AYlQUPuDjiZjocQWRNr9fgf2qhJyayCU9SvSmOJTepVdeP4g/su1tqWr5OMw3rUW/xpzI3J5ia486ESic6Eu1u/OKBZjuExjZevGWLAVIAEzDC8dSsu97XIFELupJ/FzFAo8FFD5v7DGBhydpE7ZTLZUwAOXi1VvDv26USXpA4e2VbL+4r3W69yzyz4oFKPj1wBh/+hLPK3r7JXb3ufCL+mKwXLl5KqqJtfWy1uy4q8XC/rmihO2XTnju67NJDlSiNwDEqCppNUFliYDBduwggMIJX6pMkAXt5W+8eXf0Fa51tz4JPKuiWGCxeFPu/GJn4cRvvfniqVd4/MYvDhkgaFsVpKsskgzO+aarLPwXXpLtFgCiaQTMQQClBI6K8ZP6uYoFXAEKJ/ycbVeN7s1vfWl398wv7t77vX+3k7YFwA5M9BWAJzORH4AiygEk/fdaxmNiDZKgkz4+BqAs2lUX5xN9PuSHSnOKgHLl5u40PBJmwMypKC2JeuXo4u67X/xHu92v/tXk9yef+7u7a+eeMwHTUnlqQNrHG4ECsHQDHVA0ePKg4IoSbUSd+m2YgEQqTKAnrqKoLZfcYE7DI+EWoLQka5+ISdJLAl8+urD7k8/9cAIQBsyf/sbf3F07981Ez7IFHmICBb+SKqAMlWUMEgBBDOuKgTHwtQyPo7J0YOjPLny4j+1QVU4cUNQ27LQ8EvaA4t2VeWsm+cD9mmR97/f+rQsSAOa7X/zH1UDxAMFxeTIXhz8u0X+wJknKwiHxGTSxQgAUoAIGuXuOtmhqG9edWfhpWPbMcoIfD/eAOS2PhD2gdCBQN4fAi18Nc0558qnOjWw1AVB2v/pw9syi/c7ox4oiKJfvtuQOEc4rKdUAAECE5sZYDu2abRi/kJwxwQT4x2HnJP4LRgaF1V77jHL9pd8rVhOARQ753nWtqVyeruJHoMhAZ5jOJ8JDcgfw1IOCt1vRRlqRqgCjqpyagLtIhyB3kv/NiQUQ8NYEimyFbj3/m9VAkSdhe7jWeOGYbrnkBWQASagq/EJSkj6MpUnf8WmbhW1YCTDD+xTjvCJj8LeHxVh8wU/bIV4DZcE7drL2184/Vw2Ut8/8x0RX8iQXV+WZRNtMKwonI59XQju+vfcqRA1fg6w7s+Dl5PDmPr5XOalAOW2PhAESod5n9l6CenzOt7R9Y/env/E3KsDy8O76S0/ppO767T51sUj6Y6CIA+tJBoCTA4MGgSdrnmmcA/5JBcppPMQDLHO3XpJfpUR+t+Kp1/c///dNkKSgSxJ+qry39YrGu3+Y1T/VCOcUPuSPt18eOMDnrRgAg6oiMsO5harLChOfumDVeqfxEF8DlIlbm9G6ynuU7z/299yqIhXn2vn69ygzcygFCqPcqiohsQOINGiQ9BYgwKuhHVDoDb7ozJzk3vVP03ddAAfTlorCOdV6HQUIHz/5kyOwyIvI6y/bWy7tw/Pv8bV+3x9vvRzB8I6EnpczUEQn9NMKE/gprwYsIgPAxGrDPqQtdkHbfESbVMF6nzo+PGzoYuofLiQyxMOHnLLtkmSSvXz4oQ0KvlDN033ICl+PWTzI56hnB3ym47Y8zXPzpH/FkBtvHZNzyNtnfrH73uvm8/63XtpuDRhqZEYvHOEoVz7DuxY+2CNZA9WVJUkq58NJyCCBByrbLwaNJCW2ZDP+ftjwN8P6P27R9envHeMPhNfT67tzl8JPwIJ1LNHcOpd0vXF94XXf06vli72lbdb6LsmZuyAB7vyPJRsqSl9NZJHsagLAjO/0fC4BKGTSaINqkA0g6asH7u6gApoIHDwpix9U4g7PlP+9C/5+2EDpv80iPjRQ+D+Zx2OBH4Aic/AuWOlCt46XErY03upvSfm1Y1vY/hgoU9AnwMG7Fp3sAEGJykWwZAawoLqgotAfChf/AI8GRQBSCh4Gi8ijwgyVpfvvsrw2AgqDg9udjQ5k10fVZCnQTLkuXmIvnETJnL35is81/XpzXYifHubFqDtRo3wFgPTfdw2JHhPeAo34EEDkxjRgwlYs/mtJAAOf53NlCYBJgSGJzIBhoAzVhAFDlYUBwW35z+ZxX7Ze4oMvjLWWaySL5YfjyLXn6Obs6rE15q19zOkXbkRpRRHh3IQwZi2u8DrgdB9G3hoBoQUYAIpMHG3QWDnCFo/7sZ0HClcd3baqSwqIcaXBlkxitNZmzgVcQhfXzbNVGvf0avhi27N/iGvlzCkCBYjSwY/7MnG/8ghY8Lt4Rc4z4ydSEozF1zwBF843AFq3Feu3XwIMqSpcYVBlNAC4L364z+0BKP1/Fg/bMfHFgBlXlHCIt5LCWkPrguAaWGOtPO2T9XNjLFfbxpw1rdWvkYPtGlktM0e3txWBoo1z33IEnjwFY1lpd5WlBwMSXINA9y05zQtbsPAkrANHl/A4xFs0VBbedjEopM3bMIwBHAyapK22ZgIazFmvBfexZszbRxt+5wARNtaI1wIuYl3Tb8NcwhklBpUmfUuQLCv2JHHizz6TCFg0GDSA7H6oSN1WqwAW0Q+AGFcRjAEgoAMo+nMLVxNuo8IITxad1wAXQXgWH+PHRc3k7D+GrYnpEOdUEzdkkPPoF+j4MF9QaLroASjjx8WSoOLHBkHcqmHblZPTW7EOPLQ1S/v5v6iPygOgCHBiO1QsgIMpgIK100nEF4XbkF+aav+w7/Exvjbdt3/xt5BPe+uFi2nddWoWE/qQzQEmB4LyWF9Z5BwkH1Xi0bGcW0ZgGR/wUUEsCoAMVLZbAhzaduEQj3mCLnRxRlvaqdcDcR0alfnoXNlnjA3XyQbK3GAFGNoGtmHTtlqhyuQqTH1laQMMV5UBNASYUjWRddDJMOob5zysX8PFHK259gOba1GO9ZSB2gbKnAmzLl8QgKe1upSAJT46m6gociYpnFusCgIetl8ACKgFEqkumJfE4c2d1yHIjW8kkKm10eIPtplqP7rPsku017ZfinGmfxso2mlXIo27XumOheA62h/uxTaSS2+tchVDyyb9/rzTAcQBifjE1izS+uoiQOnAdOXGsAVDNcE89boddx/XZ2p8c6uCpT81ljXX0ouJ+HVA8YIkQ0nZF75epAAOvFfpq8DwZCwe4BMAGO9gZFyqjAcqgKADRg+a8XklfQJmPSJGhUFFAeXK0sWibiBITm/NhO+tW04HY3pdwWdqyczxyba5vYZNtq/btf6s+Yutmmujffb9eUBho15wLCNtTFYSGYmWA4cHCNaRSqL73vZLQCOyAFSg9ZUFgEE14flhbsxDW8Zq1wg6U6mOY0aCJDfAXDzaZ052n2MLxdX+eLh2ktbFCVUlIDskdtirc5K3tiUerTNswQCIobLM234JSARoUlXEZ+1aiFwNSFiG14/5LT5LsgslkXmnzsW8lN/S/GrGK2PxK4o3UVzAgaqthxUcZL23+CHRY8KLDZ386HfbLme88y2g6CsMACO6VoXBlizQuqoCWWuemicXIfzGh/fKC9QERvifYtu73rC5FEVsyIml7C5lx4nLBgomM8V564Lj7CK+sB0DKObT+MVxBI1VVbAVqwRL9/Gj/ZcQW+dfs8Zzrgfb13ZKfdad2xZf2h9srrFmsL0QHQMFiNLB674EIDzI64C8RdFy0g8AAZUzxLii4KzCj4u5zaCy+AAKn03iB5QASnrIl60WtltoC7XmoHkt8x/pGv+kQcss0beu6Ry7mLOmc2weiK4BlIqtlA4eC8N8F0AVSWABhYFgtQEka4x5FmAEPClo/MoitnieJ6ltXadDj1/yaF9xZ/yMgYKF47tNxkBT0njggc8IkPEf++Zkb2mLbZa3zipcZULbBwpibaWyhrymrfo5+dbrU7oOnq+pep694+DrOeg+YlLXygcKFDwKB95FUo4GQIHv6cEfb8dqqwUDgtsCDt3PAQYH9rjdCv82X2wgPqbeXDQfaya63GZbc9pYW9jQ/kt8jK9NvbjW8iv+ZvrMPx7GwoPqiWi+DkaSQfO0jVF/eL+CT/XTJOeEt9qwNyQ17NGTMBnztmC56gLbmup1wHjz3Cu3vZ4/+D0OOgf4Mp85+nPnW3GdYkWpEDbvpl6QfDG7hVD/1oHH2YY8QpZqIjyuKgEUYRtlHdYt0HRgUQ8Ggt3+pSPAM/rSmA/34YDf2apMZPFhradOhlFfrRGvC+xpHZapaXvrHmIeP8ausQkZy7bFg/wJohEoHDQuBi4Oj5XarQuj5XUfAAngSM8bGhwMIG5DTmJHW2jYktmPi/XhvjTvKeMyV2+NPb7lp0VW62td3dfyJ70/cX7p1muiEbfSsD0BX9LP3J25qsiFiZXFfnSM5LfOMsJj0AR7XFECUMSHd26RMY7dShYNcEvmuHmlOawV30lYG5m7rI+zRqGiWBPRPPRRbXhRHeMdgDRAWC8E55X7/r/RMtqKRbAIACxwADhCPZBABmeVoW9sw3TMS/Vz67aED1yzJWzlbHjzWMu/50/H6MlZOax1Vd/eeikht2KInBeMtoHgQHm81kZtZUHSM2XAMJ/bYSuWfu4i4xxrTTs3n9yY2C6N1/hnmbWSlX0s0V563kvERDbi1gsLaiWyKGCclEPFyBxAIestAvO5DT2m2I7FxE7PGyIbx8LWyutboEm2XXJ+6SsLx8DtUrwsK22sK68jeCNZ2payDOtqnTn91rl4vjhWyHgxi8+l/MLXHFqIJQKl1Ym1KGIjLEDcTmm5QkDZu7dUFPER7vL5x8elLZkFIrGNrZgABf7mxIx1lXVYwg7srUW9xF7a36GsRWUcOKOEi4hFqlTOJnVuYT37GlSJjQEkfLjPVxEGi25bVQXgCVuwCHbE4cWN8RzF2ooMt3M6eiznPzem7ZT6ni2PX7Knxz07U9dF29f9bF5R9dZ61I9AIWbYUvXfZOngx30BWdxajOxUbM20Tl0//mtJ/ouUDABuAwQWNeWMBfQucF28Y+CV9Ba4wFU3M31NS3GVxnXca6zbHJsTdOcf5nnRcgHwGLdZH+0OeBmA4bwC+XDIj0/DBAxcQTQ4oGfJyFinbwBl0CuM6cTjfmnutT5a5eb4naPbGqfI83pBX4MP/DWoMd/yGYWDNgxU3bH0ZKxJe7Y9PtuMT8OwLUsfCyPxNWC8Ptteul0zn6V9evas6+DJMn+qHtuw2pxr1vhaPLkm3pz6mOZXlJoLDxksBPoycW6XFgL6IoeDNkACXau6eIDw+LBVoi2xl2zpcZ6rHmvtrxlnaywsL3EdamwcZ/KfpuMBHTwuGijLSlvzLX3N0za8vod0yAMoATj8JCxWFwGEeQ5RXxV3coVtFfxatGaOeq0sO7W8JW3V+vTkpsbCayY2Stfb878En2NR9sZbr4zwtG2WSrwl7WtbASwAiND4PkUDBQsBGTmviAz4x0n1vDgWjM1NqFxi58Y4lpb2GjZb/M+UHW+9eEK4GLg44ozHc85ZJyfnjbGftG3/W3VtB5VGA4SBgbZQgETixrzF5tx5cFw8jxo+y9S058bK+tyu8X0cMnuMcVxR1p6wJCFP0EueuXEAKF2V6b4JS//VpNhPgNJXPo7NiqE8fhhVyYodvNIcILc0XetaLx9nmqPuGaXGMd91IV+6AKVx2FmCjrdh2JJJ9YjfbwEsS/jM2eC5c1t0uM/tnL2WsTVswn8p+UvjsLNv2rgm463X1IBrHQNgoOzPs8GLzW3W9dopYNJDPbZlrKvt6z7LltrefERPxnLjJdut43Pm0errFMpHoCBxsaDoLzVpKyngaykfYseLO27F1ItJ9bChNRZrXjU2WufuzavGV63M1LnU2G+Zr8y1Rn5KvCUdjIP2c4tA8SarFNynQnpioic8zYefWrsi79kIY4XDvfxT4OE8gu1XPJ+wffjxkrIlZszTomFtCnHPBDD8WnNZah7wUaJY15KcNT5H17IHXuMajIHCBrgNBzW0dnKefevi1vjNyYQtWP+PwbrHxvvZ/mAtNM3FWhrz1k30cmMlu7XjS/nw7GCtauOplZvhLz71CuUuJJJnsBSQTNDT9fglm944FpPt1gAsbMHCYR42Sj70OPvUY3P6nl2PP8fXPnR13Lq/jxgW8jGuKEsYzi0Ij3Hb8psDniVv8cQGDvQYl60Y2uEGEfvMR3sq1UDkfnnuy27N2Pf0+Swb05Q4cDMsrd8U21qHfNQDBQGKMTFgLTzLaKe1fQpuSOZa3Rq5XIxr++b4JA5vHUXOWl/W57aWbZ1Hbk26WCr+DC7H09pujbfV/gLyces119jUyeIigZbiCAk2rgAlvdpxnXSWno516ty1bcu3xdN6LX22J+2lYm+JYSlZnstSNmFHrYtdUSAEGpVDgnoBaj70wRcKHmzWUp2cOb2c7FT/OX96jH14sWBNtO6UvmeL45hidw2dmpjm5ElLzDWx9PZSoHgXtcW5yPKFk2AQEBZg6A//inLe3hf2rDi9MY9v2dA8np8ea+kjBtAW3Smylh9ckyn2ltax4lvax0R7ASi48AwU8NjwlIlM0Ul9xm0Wx9Rql3U9+8yXdroe88Csba/Vl3Wx1sabv45D6+q+ln9A+mlFOc5J40LiwoDOiQk2YUP64TdO+lZ/Iq/tww9oq03oLUU9/6W4l/Lv2bH8e7F6Npbgl3zS+BgoMkgCk548zdYftmQ4E40T21so6yJ4ssLv5rvyU528f66Y6Tx5HVvnlfPJY1w1md/aLsVXGm/1N0We17NWv9dZ7qkXHNcGk7tAng3mtyw861lxWuNRLiYyeK3Us59bA/HRMsfamNimxMX9Whv7kPPWbB++DR9GRdF384XvttYCrHGxSknIi2HFxOOH1ka8WDehaC8Rq7Y/1eYpugb9Yb4CDFg8b9GwKPqCiV7uQpbssj9tOx1Lty081tpGTDl/rTZr5eG7Vr5GLjeP3JjYLo2X/LM+tz09nn/arqvsNT483xl+DxT1N7QkQA7SM1AbFGxBHn3Pbo4PGzkZb8zTFX43Z3lbXnHTgH1L1pubJQs7HvXihbznS8ZzY9CvpbAFWqtXKyd217KtY+h8NVzjXn+89ZIBBA2qndX0PV2Pzza1TGuSNcvTnDkOtL2E1XFCPkdbY2Nbc3TZjrS9ObHclPmxPtraju5Dbg6dujalWPpxGyhzAmbdXBA8xm3W53aNDMt7bZ0g0s8tspb37LbyLZ9LzHGKDa2DPmjN3Fpka+yVZKz1K+lMHT+6egtbr/H+z5u4DtBLJI9fG6znn/VZpuRvFDeVX7aT2CcZ5k9p5+KTMR634rF4XhyQBfXkPL7oeboWX6+tZ/cQ+BNjHVcUayFaJlijLzI6YN1nn55NTi6WX6PdxazOckv54blLe5/zwhy8Ncb4PmjtGge58c09F+PM+d0/unr9kYf4QuWc8ViL4xZZ9mG1p8QqdrSeF5NOUk/Oik3zRBf6bBc8LT+3v5ZdHVeLH73u2pbut9jWukv2VRzjiiLOZHIiqIRn3+nG9saPdFsXduri6Fi0ndK4lu/WbULFET96zqN+xu6UOK3YW3lT/OZ0cmOIrUYGsgvT8GZe7nZeEHwnhHOWbbmo0F+Sciw1djEfUE+H7cocIQ/q6bXwPVsev8X20rK8HkvbXsreijEu+wkLg6b2YrMOFkxPuNYW9EtU7OHnyeoY5sp5+mvzc/PIj4UzQE4GsdfIQNaic/Utmwvz8kBpSVBOeEwclIMOCTrecomMJc+6te0pdkSH58C+eB2m2GZbaOfs8FguLthqpTwf6Hpzx7imHCOPwbYeb7XPNvfR1vEqn3mgKOHkS+IpE+dguG35mWLfstPK64BMj4Vx4VvtWPLFOWfOIlPsWToWz4vL41s2TjPv6NqtMVCQoKCyALJg3LcWpXVRLfnWpGyNyZNv9WvNfwmetSZstzTOssfVtmK01n3umlt+psy5Jg554Xh09Vbb4+GpAdbosQy39QJYC69lvL5emJwtxCA6aHt2wa+Vg7xQ2NexsYzX1v5KNnLz9XwcN5/nWJrf1FjZh2EjBYolbPEMQ8m2zBufY0t0eZG47fnz+IgD1JNbgz8n7qXiWTqGpdZxKTu169Tgr/+Epf9q1lP0+F5ALJ+249tU5nt21ua3JkytfK3cnPkdwvq1xq9jRh8U9sb9mDeQ2TMdn1EQgA4W/KUo7IOKXW6zH/AlAdHm8ZZ2SR9bE53snh7ka2LQNlnHs88yh9ZujbllrWrnuoZNw/cYKLmLyQZ0gJ6ex2dbaGubwvcuhseHraA7vhPBB+ISCh7rrtm2YpcYLD7iQLxhXvbjdUu2Rh56oKX1yMUJG6eF9mvR/vVwaQFwQUFL8jLeIqvtrXnRJK6a2EqJpWOe0196vjw/bs+JsUV3n2vXEpeS7Q/z/fN7Cdq6EBZPGTL1PBlcEKGebY8PmyHWccXA+FRa8jvF7j6TIbcua8xtynqwTk1MuTxhW9JGbml+TV/HQv3+6+HMiy4S7p5sSV/zSkFw8J4u7LJsya6MW/KeD8uepc9ypXGWndtuidvztU9QejGsxV9ifSbGFr8exgJ7iSF8jEXZsFfGBDCeCwayOZncWJ0Pu9IgbrGfi0PGWBbxMC+nD/klKPtcwl6rDfjf13wR3xx/LbqVshEoQ4D0+QZ4a9J4IWJyS/Dgs+8A1vxBluWttgU0iye6nT9aD72oVoyWz33z/PnMWzueh14LHluqzT54rZm/lC+xk7GbAsVa4Ixy1UvGQgCDjRo/VnzeQk21V6Pn+Vyb3zL/XCy5OXJC5myUxpaKteRnyjjmD1phIwWKKMyZoKWLYKwxDnDuBSrZZ19oIzb0W+gUf7Df4lfLzl0nxFCi7EfHUNI9hePWe5RYnpdYrNIil8aXWnSeC9u0/Fs81pnSXsOmF4eAeA6QtV0vdo+v9Uv9peyInyXnTXHHioJgvYQipSEY6PCY18YERIfbnjz4LT6gsxTVcdasjef7OOfhxaT5fG302Nz+1PmzHrfnxtOoj/co8SBtGQgLGCuNJSM8JJY3vhZ/ql9PT/i4KFPBMeg7j94tu148tesGn5Z8bsySz/GWtGX5Eftr+2C/uBaZ9Y8VRRQtQTHChpaYgOUnCZz+q73MR3tODK26VqwWD7G1Uqxtix7mANqi68nWzGkpf7AD6sU0h7+w7QAUGAWdE2BON5cU7Jvbnr0aGU+X+VaCIE5zzKkQbNNriz0rbvbD49z2bJb4NTZKMhgHLfmU8RbZGnslGVyzktzE8bSiwAguXM1kESB0YENTjENej0vfG4OupcO8mnghD1nY9nxDXmiNDMvn2vBryegxxMqyFo/HrfYUHdjRuohR80Xe4sHO0nSur0r99KmXJEKl4vD+w5t4biG1juUzl5SWvNiET21/n32OjdstMWg9a161vBa/S8jq2OfYFFuwByr2crlR6y/Yzp/NyVYKFAwsEQhsaWpdYC3j9XmxIBPAPZ5wyxwkJi1v+RKfHh/x5Cjrcjunw2O1OljjWnn2MaXt+fH4LT6WsNHiz5GNQMkFpJMIxnBB0Beas8NyVnuOLttDvFZ8LMdtz3e0VX7qx/ak7dnUcty3dBADy3ltS9+TreXX2KyR0f5a5sW68NVyfVlft2FP86kfzyhaWPdJadh2YaIs6wXv8S27Fq9Wn2Ox7Gheq12xj3mLLa3PY9pXqT+y1T/94zmJ/ak+2E4pltK4Z0vPoWSnZtzzVaM7V6b3Xa4oZ9PD8gAAHplJREFUXpAef25glr74Yn/ctuRrebiooLV6OTnEBpqTPeQxjh9toWgjdt0Hfx90j75jRcHEPOeaP/WuBj9MPVvsU9rcZ32vLQDI6Xn2ABwvLs/fFH6ND5YJcxqfyab41jq8HuxTy3GfdZiv2911oC+x9fhx9Svjj0DBBUCS7CNwDpLb+/Bd66NbF7rAen10v9auyJXmXBrXvlrltT76nh2PD71TTOPWqzRJvsPIgnHf0m1dVEt+ThJ6MXHc3Lbk98mzYrHWhGPicUufZQ+93XKtZa5antdizly13d6WDRQIg7Y4Xipg7XMtu9qP1cc6IAb0LdkpPNidojtXxwLYccYzdz4r6adAwaJ1iM2gdpCbcG7ITUQnoO6LLi4iKOyhDwp+C52jy36m2MFca3RFFteA/Uq7Rl/rHGp/33PJrGk8o2CxIkj8w3PrBFg+bcdDKfMRy74pkhV+vYUbxgsfb0JuKbrvNWr1p9evNG9tH31Q6Os++HukoaIgENDaAHKJ1Gyr8mND+CxdFMiV5gI7Vrxiw7NjyZd8LT0+N4Y5+rwulp1anrcmlr4nCz6uJfpTKc+tt5FuvTzDHIBhpHsB6fE9m1P4VXFUAs7zz/OYcrE8ux5f5pTzw3P2bIDv2crZyPmGXdAWWegsQdkvt5ewXWkj3XphQUHZyD4DnON/zThr42Kw8RrWtlvmoGV1v9anJWfN15Jbkjd37ZaMhWxFoFgLLEFbfDIQqgkd6lm+dqFZjvXFDy+cHuM4amNlneNq83y9GKbMNafj+dkH/1DjKs2d4maghIM1DZpbqtF4B5J4KC85l3FOFG0P+sIPP8TV5gN2gr/6Dxo5NraBdmkccktQvTa6X+ODbzSW/BSblp0pPMu3xfNs52RzY569DL8/zNOb54zw8DGkyFgJg+AijckNnrbv8bWc1+c4uM3yLp/mzXHo5JIxzRP7zGN99r1k24uj1cecWDHnOTZa4xX5Of5adB1Z/zCPBZkyqTk68IvkfuXG7d2tN99Wv7tu/+abd3f8gy7zpC38lMJmHMM4bIDCFvetNnig0GO7aGNMZNEGZR63oWvZhy7LWLxb/VqwXeFBNuXLdQhj8Mn64AWfcR1TfriWbP/6rTvJTdjKH0lgTmLkiSW7FI/8xa0XjNPgUDWQtCLTBdzfiVkW+kxZj/mdHbqb6zHuv/vBx7vtf6d7Bb77ve8XgcI5sY+2AqIBlMoErgnWAooEYPG1PYDwvQ++c7qzZJvd7g8VUFSSHgKIxkDRCct9ngASmcdr2iU9Pb5VlNOPJF1ROM+QUzovwC/RmptyycbFqzcjULxArArAstLGr8Lh6O4QdPnQnx7c7rz9/k4W0vrJnQg/jEtf2uAzhYwe133Y0HzW5zbkPQo70PHkhI8xyIJiDBR8oeBpqsfQh67Io81jmg+ZnH1PRuugz/4+/PjeKC+m5NKKOuknLHAERA/UfcoVExy6QqHHvFxbyzMQWU/LYYzvGloXOiwDPaEYZ17H789jaAdqP/1iXddP/8WAjo91vbbYhB6oJwt+rRzkS9Rbp5LevsZz882NWfEZc40VRSt0F8c4r4gRNtQahPZT0+fks/xZvBq7ItOqy7HAh8WbYrvTMdYcfjyKOQhF25Ot5XtzEn2MLecrvOdayp41x5m2U6AAADA6LIi6eBi3AirxYLNbcGWXdbUP3U9lxwnPflh2ahv+QWGH/egxyMyha9i04tmXH8t3C++Y4kyB4gWMZKgJMoLN3pbBx2AzBxZnDLqw5dGaeKELWdjGPDBu0RoZS28uL8aa/+IAcp6/0nhOz9O1+Gusk+VH4vX43lw039H3XzhqA16/dhEgh0T07E3lw36tvrMgo0Mlxys62k+tndq4WuRGsTg3Fm0zmZOho+1q/do+/HTrNvOr7lqfkMN1sa4ZZCwKPTVWBxRHeZRUyjjtZfPVBXpYWKufi2Gkp97V4MLDBmj0U/duB/I1VMdUo2PJIHaMoS9UzwMymtbKsZ7owBf4U+xAt5UutX7ar56D7ou84dveeumLoBfMMTZcONt5emFFxpLzbGPCViwYq6G8CJ5/badezn+Kpm1O6dfG4dm21s7iif4UX1N0vFhb+OwXbVBth68/xjxZjMt7lKOrtx55SBi8YNKGwZwRyJBBd4FZln1Bl8e7eIa/kphWI47H0gmxp3v3jmdsMeC7ROEHVMsL3xrjWMOc0ri0Ha9vrVewF9ZG+/HsLM334prjp3YutXJhnWY/VYtAsSbHF18C474ln+NhUTHBLnlp34rxnI2aMdi3ZHNjlnyJt1zM6c3A8qtj131LJ8ebei3Zr7S5D38l25YOdFvpkrYyvp2tFydwxR9Q4IXhtuW4NrnmLgD0QTkWjoHj5TbLL9XW9nVf/Ei8+C3ldy071tpavsJ8yjcDS9fiWesmcrXxWDZzvKNrtyJQLCecUGxI+FoefaFoQ0dPTNvlcW6L/iuvhc/sw6fb+nP7+Kk8PvdO5XKfi4dPxvEZOT4FB9V2wIef2E9jwufjTCGb2kw/N8eY1uM+2mIPbabgjz+FR4z4pwToRyp2oj6va4wT84AcfOs1gS3Io+/R67e+XXwwhFxamupcdOznt16ipJPeMgQZSXK0IacTP/Lz+3XY2b4efvA+ikSOtFDkC3QsAEAGFLIWVXnrA4WNsVPwYQjUcubxEnuFQ/YGlAcTKMgzL4c0n3NKj9X0C/58oGjjCESAEX52RQBwIK/tcB+yzJM2B70B5cEBCl93nRNWv1WebUAXFGNOTsYzighaya0NwWAnbxz0tTxAhQDEB9psK9gbg+8t+sze+kRbePjEmyn40AHF5908rvUgCwodi7Iut6ELaunyGMaZJ23wLSo8/LSs5rO+NwYb1rjm6Tiha/HBA9W2Pvz4k+TmqPPC6lu5asktxLMrCpLdS+iScwaDnhBssw3NQx9UZFtiYT34MXmFbR90l6YSi56P7ls+rTlAjsdqbEFvScox1Ni15C1eydYUnZJNjPe2baBACJST3bsILAO9Fsp2Jbjc5OErJ1PrG7Y8ee2jJO/ZEb62lZPVY3N0a2x59qfMF7ZEF+0w/+UeEes5rdyPW690QuMtUC4QTvKwIEE/tYm3yD2dcDeHPfgDzcc2ngvscKywwWPgTaWwhTjRn2rP0kMia9vgWzpr8XQMrX40sFh/tm16Nyh2G+2lFUUuKBtAGzQ4OMy7AmLkxc4lC+R50cL80zXoxieAWvSW+GEOHG+rXdGdpd/PHzaGmCauC/Rb57GmPOYGH6ofKwoELIo7ojUmPD1xOAFlPciC8phuQ8ayo2W9vqe7hG3P53HwMR/x7c0ZcfE42qCQ2Sed6lvr6X5uDi2y6R+X0HcNVao8p3yBXBmyBfnu7q18evpL8hsXaKgKiFvHkruJYGyqT+1L+kvasuyvwdNrl5tDbsyLDevsjbfyDXt1FaXVUUleL1xJ3ho3JjMktSWvedDnWLgNecihX0OnXGyxW9LD+ECHG037Nq9lXvBXM/eSTM7vsn7GZ9NSbJnx9IyiBXOBI6ksGVkMjGub0s+OUfXpZFVf61v+tU9cnBpZrct9yw5sgrK81YZcbg2gB3/o75MizhafNXOqtYe518RhydTydDx6Dn3fB4pWYIMyCT3eGpjoYzHYttXWviyZHC/npzVu8TMnHssfYs+NQWYpijVhn1PnJTZgB3SJOLWtqfEhlpE94yYMWUXHQAEIsJBKobi90cF4+rA/0IlPULT9Ln66cDzOsXGbZaStx/QF0uNan/stsvA9rEn9hSxeF47pkNqY6xIxta411tvyrWwtd0YRw8r45IvHiyd/zT5+zh0/+WZe+Hy77hNyfOqNT8DxyXjo86fmY3vQ1RQ2LL4ei5/Ap/ahG+JI5wkbYSzGCB2haEMWPFDY1X3mcxtyoBizqMgIH7Los6w1Bjn+zJ6vvZXAa/OcHE4rCt85uc3BsSFvUtDV4wO/oXpsH0U+GB9FIjc411rayEtQSzfnQ+up3PUrihJMqoMegxOh47H2JzI8yQ0oDwZQcM2RS+ivSRt8xYrCaONk94zVyPAkE/nhsWb6CI9jgO721+w3oCAXLJrklTrTeblr2cnxhn8KzM5yCnPGLBCIPfZtybx1N/1r9vicWz7V5jb6modPunmcZdAWym3W023IsU3IwI5FIQPKMrCFMd2HLPOZBz54TGHT4kGPKdo5eRljOWnzT+uiDxnun4S/Zn/u6vXxnyvqErjhHBESPq0ODCqNbN2HLPig4M+h2pb0AUg91uLH0/X4Jdtaj28gWlfL6nHu52RrfeTk2NfUtraP6zPVXoueXh8dS29rfEZxBIczioxDBlSMWZPj8ZbgIYtJWLYh0/lWJZfH0PZigQ+2o2VFphQD/EylsN/5ysyH453qC3rwif5UulRMpblPjW8BvXBG0QtWmrg1LskFPqgVICeh+M3JWvqap2PX47o/15+2J/01bFp+1uRhDnx9lvS3xLX24kHsGNd98C1aOd9xRYGxmgRkGQQnNG2nT73iWOSDB981tPPTuD207Lb4tmS9NYAvS2cYWyB+sZXzAV+tdA2bOoZ9+NA+a/sKQPGpV60BT04ZHrZqIm+NIcGwWJaM9gVZzff6LfI5WYm1Kr49J77EXBMX1ic3R8i0Um0T11Xs6DG2jbghA1rSYxvcZn3mL9SuA0pIlPSwjolKIBwkLxSCrE00yOco+8rJ5cZqbfAcc/ZkrMYmy3Bb6+uxku/a8ZJdHm+ZO/u3rj+Pt7anxgE/PKccD2OgSi8CRQ0kFQHKmsok9MJYExPbWk7bQr82jlo52J1KrflMtSV6ubgxJrRmvSA/L564BZ5jp5vbAmdOKwa9FlPmzTrc7uLOPDzp4ymfUXSQmAgnELcxXqI62JK8Htf6U2IQm2M78YylfZb63lqV9DA+Vx92NNVz1OPo18pBPketueSuUX4s3c3k/MqYngdi0fySHbIVK0qNEstYTq2ALDm2U9uGbU++1s9idsp3oaqqzPMpzaE0zrZq255Nj19r96TLqfnHilJKID1xZWi0VRB7sAkKG1oX/Baq70DSZz88bvnj8Ra/hya75Ny0Lb6GS8ybr49lT/u3ZMDzbHl86AnNyTgxhIrCimhzInGbHXZO6a+NiK7jqLu7emMeX+xfe+3N0Sfc+GQ7fMadfmLOn3ZzO9WJn7GLDD73Znlux/H0c3JLV/th3dgO/m0faTzQ0Xahq8fRR2zoW/rggbIOeKCeP0uHZaEvFP/EIOW9vbt+605z9dW5h7zM5RJkJtBYUSxlOBXagcB4/MnAAqDAs2xqHnSYz/rb18On/6NI+e5Lrn+XZ5ktLfKRc4XbGOf84fEZ7b6i9FVhcMRVgtpwVEpukYMt6IBqXUsOExXZ7evh0w8U+VAS+eFRK0882Vq+zsWMXr6iWIpewOI05xjJb9nM8TagnH6goKIgD5BjkS73CBs+NIUv4Rt57D/16hLf2mpRhTEMDiVUB5Lre3ZE587b7w+fv8udB59nC0VfU4wJn8fQZwp7kIMu8yHPPC3njcEubDBlGyyn+RgDHzbQB9V8rSdyLKv70GfKMroNObapeXoMNpjKX7PP5ceUsak3ZscXtl5tz6lhrDaYHBDEltjpgKm2bLX2EU+JFuPI7I9LtuM8pq1ljf19y5TWa0o84Vofzxpx1dCxF+Yat16eEfBhqCV5oaOD4n6NDMtbbdhArJABH31Ntbwe9/rWGlg81p/qi21YbbbrxeDxLXtL8TiupWweh50+hyJQOAi9sJi0ULQTedqOMX/ptpX4zLNjs2POxSY2YSuxb2xFLTve+lmyOR77zsnJmJb1rlXJTmkc61KUo7XK6WBM0zCndSqPvj6luSR/exjCCBh9puyA5XCRmMd63GYbzPfa2ib0Nd/TZz7iZB7auTHIaDpFR9vI9afMMWcPYyW7PL72HBFTidbGwbGzTY/PMla712s/o4gifpbhpXneAlkTt3gt8Xi+WmycVFncgKz4p6wr1pJ1wbN8CI9lIWPxMLZHmm69ckHlFhIBewsBXVDIC2Wfos99lvPaWp5j4LanD/7Yjr1l03LQb6GluKx1arE/V7bkvxR/yb/W5zXVY2yL5Zhf28a8JtiJQIGRGqd6MhMcjx4j52wgtpyMFbeO05JhHvwIj9uQqbUncdbKwjZo6xyhJ7RVF/LWXNmu1YZu65glv09eLu5MHBEoWogvdO1CShCsJzZzgWEMOqA6llxf68AmdMbj67+8gu9aqmOu1VtLrjWeZnk66M+dQ21utvpRc4pAEYfslNtwopMOfKEwXCPTyRuLBRtsN9gOye3Z9vXCUxNrLtqH7otNz58l28U58aPQGl3tc4l+d81nvjvKxdGy7t41zNnHGK4T2+A25GbQAJQWowhqitOcn1q7LJez58U3RYdtzdVnWzVtnm+NPMtIrF68Hp/10fZkPf6gZ9wMMSbU0xe+N5bTg23otgB10O1jVroRKDDOgfBFwrimcACqHLgTZtvsE3Y6XmahLX3haT7bq2ljfiyr58RjtW3LLnR5bAlfsJujlh+OI6dbOxauxzrvQmpjWEgubr0WMphs38SmLD5fAOsCwffcJIcdUMuejoXjgTzzYGspyv5h0+Mxf4iNtko8DltzafTTdpbLxTJ3PRHT3LlN0e9j9z+KLBn1Jo9JeeOwCzn0hWKxQTEmfdjjNsY1Zdvc1nKlvo7Dk0ds3niOX+sjZ+O0jy21RjoXGuzGiiJG5IJ3lD5J0cati9Lg0PxKNOejiymzBbPiKfFy/ljXAsCcuVr22F9r24rF4nl2w/XuH3hQpYJ8iy3ogJZ0c2uRGxP7JduIYUGKM4pdZmsSCkFHap8TMO4F7/lifo0Nlocvi1caK/mCfittsVsjW0qq1vjmyuuYdX+u/TX0rRgVb7z18haeFb3E8/nxQMd21pi0ZdObkyXLPJlPra4l560H+5A26+r10X2tW9u3YmG/JTs6jlpd1uN2N2+jipXiwLi2NfALj+ghJ9SzARkaTyuKnjwJJm/StVzntN+2hQDsCjUEQFsp+BCbaEOuhrIOt3O6VtJA3huzbEMWFDaEWrzAb79pWL7Z11pt9itt67pP9c22W2x46+rZaPXjyMeK4giYZwoJypIHTy8o+EEvDyJvwh6fbUPG4mGshuqLUbJnjYMHW6A1/j2ZnA295p6NGn7OT41+SQZrk5NjGW7ndFYci0CZ4sS7OFhoPV4zYei2xlNjGzYR11RfsMMUNplX2/Zin2Oz1vfScnPW1FsHiZHt5uSWmo/yEZ96wYFcHA4qBBm3C5BbgsKPBMVtzzYSR03CrXqenRY+fLIOYmVea5vnwO05dlp1IT/HP2yccjoGCk9YFrB1EQPQYuKzvdq29mklq7alk1fbGMtH8NfY1/pL9UtxLuWnxk5NLFpG9z0/cn30NfJkp/CXtq3mNQYKBKYmD/S9yepxy4/FY3tzFqVkm/1IW+Jlf7X6mCco27V4PM5t8Qf/LXpso9QOPujGkXkaVRODltF9jic3xnLH3I5AqQlYZCCHi8cT4IvKfLShAxvgM4UM80rtnD1PN6eTG3Pt0ZM8T6aG7wGxdl1KcuXxCBgd75R1ERusx21tf6m+t4Y19rE+ykY4zF+4cqN//Js+kbKUlIHkfCDyWAgtN/DVHboq+IokhH2xJ765X+NDy2Dumu/1a+Q9GV4ryDDP8+nxa+c++KIKUtKdE5cXr8cvxeLptfKxDhm9+1ev33rkoYtXbtzOCCVgqJVbekErJjM8588tMMZq44O8zDunw3LWGlm6Fs/S1Tz4mqqv7S3dr7lWnk/MTY97fC23Uv/+7dvv/chD5y/fOJJFnzLB0sXicc8+ZLAYoNakvTGx7dkXO7kxyw94U/Wi/ngr480BOqB6XcAXWmuDdbw224JPS3buWlg2l+B5cXlzSeZLxwkvlkuvvH7/9nvvPfzQyxdf/RwLwYE2yDL7aiMW9qcXJo1Tbx/Hicq2rLbYY7/chjx86lhkXPMgC90ShT7rgce6iAtyoCEGf94sx/ZKelp2zT5itOa97ziv3bz9yUPyvxfOXf654DxNMiwEgkbfopYMJgkafITKxfK44JZd8CAPW+hjnClkmLdkuybepfzJPPfprxR3Fw+daUryGM9dL8isSWtywopReNdvvfVMB5RnXzx6+Pzl14aziKXAk5DxkmOM80Vmu9xm2y1t8cH2S7pL+NQ+lrSZm8uifuifUfB8tH/Lp+bpPtvjdk4uN8Y2Wtp6Li26LHt07db9N++89+MdUOT/Xrx47VkWQFsmIU5rJhPk4v65FGxuHEBDHB7luNheF4vxtIzlxabue34Omb/EHJK1o4ph2faujSXbum6e7VY7Wr41Nsi/cuN2OJ8AKc+9fPRj5y7FqjJyZCSdltF9XnwZg3MtN7VfsueNe/xSHK16PP9W3VIsGPfsCn9K0nn2xF92bEJ+YA6ash+vrXVCfPbRwZKt4cn1e+Otdz4DjAz0xfPXnqkyoBaNE6JOPxw0eRFyeloulwAsy+2cfWtMdHN+LJ1W3hz7lu78+foPAKy5WTFALjcmMrlxnge3S3rwPZfC56s378hj4YcHgKDx3NkrP/LyxVfvyyQgzE4tXgi+bYETm/2dCLY1zdmHbE7G8sW8XJtvANzO6Sw9xn65XeOH1ycnL3L4iVzOTy7Bcz4OfUyv1eVX37h/++4H/x7YGNHnXrr8c2ePrseDfX8+4QXSRnU/tyg1svCFCwbKdiGT8IzyXysHO5Y8xpjm5Kx4WbfUrlkjy0aLXk42N2b5reXBbm7tam15cvDhjdfwL7/y+u7122+HJ10jhBDjmy8ePXruUgQLG8ckJSC0eRxtSRYZD3Kx4uiJ5GzAFmhny3kxqu1Gnbhv9WQgC9rFbYAO4yeV1qz1XJDz2tSuN+ss2fbma8UF3iUByVvvXLh9+/YPECT85jdfvPyobMMQOAyhDyp8LyDIeNSzKfK5MW2vRbbVtpa3fE2d/3geEdR6zOov5de2HW9u1vhJ4FnXyotbZK+8+sb91996+5lqkAA+33zx6JEXzl1788KVm/dxpxkqReaOyxcQejpAlpExLSfjmgc5i8/2WxYIejoe8HN0ih+xZ8U/xX8uNs+PpQPfLfOx5mDZtngtfiz9pXnyruTVW3c+eePOuz+L3J9En3vxyk+8dHT9mfOXX5MKg99wjrECx2JMXVDoa9seX8uV+kNyZADPNpbyyza9du2aIaZaec/fIfIxNx2bx9dy0i+sy32pIK/cfOuTW7fvfrq5iuSQJG/wX3j51R87e/m1nz13+fqjFy7fePTshWu//I0XLz1z5htn7z/9jbO7M984uwNFW/qahzGh+LEMjzOf29AD5THd5r62LWP4YUz3PT7sMoUuqNaFrPD5Bz70dF/bgS7k0IecR9k+2loXfNhGX8vpvicHOxwT2jwGe7DDY+BBBvrc53Yvf/+Z586/+fy5q5+RfD26euvRq9ff+PSN19/+5+aj3xwAlhj74pNPPfz5L3/ts48/cWa3/bY1OIAcuP/5L3/9mce+9NQjS+T34jYe+9LTjx7AIm1gfbBvWPe/8KWv/fLiyb20wQ0sW0U5zpvlF54481tL5/Rq9r7w5TPPHudibb4fVLA+/aYcA1ZL7KUNy95wS9YHNVmPb96PPfH0p5fO5dXtff6Jr9/bwHJ8SfMArv39E1VNgMDHn3j6yQfwYm0PEo7tQcLTbyL3ThR97MtnfmUDylZR9pUDn3/i6+UPGQ8RQdvTrw0k+wKJ+DmxQPn8l5/+3D4XavP1gAPzy2cuHmLBKMa0PSJ+wBN3/2eV8GeFipl5QAKfffKph7c7/AaUPefA/ce+9PXD/GTFw+YXn/j69inL/u+oD/wTty/81plnvZw8OP5/++2n/9qe7yQPfIJs6z1U75NRVR7/6lf/4uNPnLm9Xbjhwm0g3n9lfVNu1gdXQSSg3W73qb6SbCDZf2JsYByv+W05r0heLgYYSfA5v8ef+F8/+viXv/Yr2ycrWxU5wJ3EZyU/5+S36H72ySd/4KEDnNx2hxzfIbc1Od41+cwGlOO9ABsATsb6b0DZKuq2ZazIgQ0oFYu03fVPxl1/zeu0AWUDylZRKnJgA0rFIq15p9psn4xqtQFlA8pWUSpyYANKxSJtd/2Tcddf8zptQNmAslWUihzYgFKxSGveqTbbJ6NabUDZgLJVlIoc2IBSsUjbXf9k3PXXvE4bUDagbBWlIgc2oFQs0pp3qs32yahWG1A2oGwVpSIHNqBULNJ21z8Zd/01r9MGlA0oW0WpyIENKBWLtOadarN9MqrVBpQNKFtFqciBDSgVi7Td9U/GXX/N67QBZQPKVlEqcmADSsUirXmn2myfjGq1AWUDylZRKnJgA0rFIm13/ZNx11/zOm1A2YCyVZRCDtx//Ikzn3nosSfOfGb7bWuw5YCfA4//1td+fLE/zboZ2lbgNK/A/wfGeXPcGRtNMgAAAABJRU5ErkJggg==;fontSize=18;\" value=\"Shared file system\" vertex=\"1\">\n          <mxGeometry height=\"90\" width=\"47.84\" x=\"391.08\" y=\"1464\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-6\" parent=\"1\" style=\"shape=image;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAAAMoAAAF8CAYAAACOgSR0AAAgAElEQVR4Ae19y7Nm13WX/AcAYQpUISakUjBgAGEYBZgCgSGDkEkqk6SSAibhZTFKGJBkAlUJie1Clg2xFZnEiaw2JTmy9erX7ZfU6m5JrXbrLVlNYsckkPRHrbPP7+zfXmet/TiP73739nHV57X32uu191m/s/Y+5/TVQw8Z/3v2xaNH7rz94a98+50Pb99996PdO+9/vP22NTiVOfDuB9/ZvfvBJ0cffucPPvvxvXs/ZsBhzDq6ffsH3rjz7i9v4NhuDA/izVFA8+HH9y7eu3fv4TE6es5Tzx49/Nbd948exAXa5rzdGDgHPvjwkzfvfe97f8sEy2u37mwg2bZXp3J7xSCobXdg0ZXlwtVbn641sMltd98HJQc++vjeM0NV+eyTTz387Xc/vP2gTH6b5wb02hx494Pv3L9377uPdGC5+fq3f6JWcZPbkuxBy4H3P773mQ4o3373oycftMlv890AX5sD7330yScdUG5/+71t27Ud4rdDvJ8D99+TQ/2dtz/YFslfpG1ttrW5/9FH9x55qLYEbXLbduUBzYH7d9/7aAPKA3rxt0pZXyk3oGwg2apkRQ5sQKlYpO3OW3/nPa1rtQFlA8pWUSpyYANKxSKd1rvkNq/6SrkBZQPKVlEqcmADSsUibXfe+jvvaV2rDSgbULaKUpEDG1AqFum03iW3edVXyg0oG1C2ilKRAxtQKhZpu/PW33lP61ptQNmAslWUihzYgFKxSKf1LrnNq75SbkDZgLJVlIoc2IBSsUjbnbf+znta12oDygaUraJU5MAGlIpFOq13yW1e9ZVyA8oGlK2iVOTABpSKRdruvPV33tO6VhtQNqBsFaUiBzagVCzSab1LbvOqr5QbUDagbBWlIgc2oFQs0nbnrb/znta12oCyAWWrKBU5sAGlYpFO611ym1d9pdyAsgFlqygVObABpWKRtjtv/Z33tK5VAMrFKzd2F67c2AX6WteW/oUraAvF78buwuXXRr9OF/zeXid35cbuvPwuv9b9hIe2UN33eKyTa5+7/Nqu+XfpehfTuUvXd+nvNdUP42cvXd95P9HnsaF/1POFZn4vH726k5/IoN1ELwb9l4U6v5cuvrrDDzKh/0qn89LFV/pxodbv1d1LF14JP4yjr+iLF17ZLfY739tiKu1Zv2u7F8/LL9h54fy1Xfc7d233Qv978fy1+0dXrz/y0Mv9hStekIv9BXQuABY9R3GBXCoLLYvPVC3+cJEUHxdExtFupsmiYxE1fSUsJha1hdIFwIUAff7c1eHivHDu6k76+HGf2xg36dmru+flJ3bQPnt1962+LTT9Xen7Vzr5b52VfsXv5V5GaP/75stXdvN+l3t9ofH33EuXd9+Un/BeuryT/nK/S7vnXrrU+RXwSB53BeTqzftHV28FoESw4E4W7nwueBrB4gJjuLvhLtbfrfo7lQQrif/yBbqLDQCxeD5IACDQEYg6kMS7S7jTaJCEvtx15C403IFawCKyHmDOX+sSO4xHoJhAICCZ4wQOBksKDg0W3a8ACoOJwCKgaQMLwCF6aEeQABwACCjAMxUwEqPcSDpgXL6xu3j1pv4FoPBWQAATwAHal3LZEgg4QGdUFw2aDgw9YGKbtgEDMPpKU9EfgcCrMgIOGTsfbHcluO9HoMi4DxiAJZTvvnTngOOBRPHN5C+Bg8dRTVRF4eoi7TFwAA4ZQ7uCGiDRYClXHAYIAKPA0lcTBkorSAQcck3PXQrHCwMcDJb752TrxUBBG4DRe+Wk31hVOqANFSTskyMw4r457ouFR1uxIkBihZHkdytHDxpzfNh6hYphAyQABwCpqS5ih+WT9gCQdOtVU1Wqt2EOWACSCBgBxASAAFAAi/Rnb8MAGgWYzNYrBx6Z40sXXt2dt6sGA0O3HaDIgXSoLPFgebY7ZBoVhqoMwFCiuqr4fTqvFEEzBoosjAkIr8IwiIZDXl9NukqTVpYAkhQEektWB5LMdoyrRGu7oqoIMCJQchWmEkQCEAIK2tO2YQBLvqoAIKCoMDKvly9ex1mjA8DRtVsaCKW+AxT1VAbnlBQ8BJgeKN14qcoIAEkmC5CL2H71lUXOKtkzi701q96GafDQtsyuLBE0SYXIVQ8ek0qC/lBVAJhQXWT7JVWjqXJoMPFZBcBRPFSWFDSVwAAoQDVQjMqit2R5EGXAgoM+DvkvXe5ALzf1/iAewHG1GRy9XndeCWeUcwoYkvD4hS2YnFfCmQX8ARQCkgkVhcHSJb/akqUAUo8oO8BYoIgVRaoIKgnoJMAkW7EIDAbOkOxI+ikUoBkBJgAnAAYH/cZDPsCB7Rcog0XxxsDpq4SAofEnIMA2TAOE+9xOgWNUEwCkp6IrOTNhW1WqJjKeVhQLMAIQgANgQYVJqDroMxDOXgxVBJTHABLmpSDB2YXAQmeVTp/6AIhFc0DRYBr6CVDCoZ9BgvZssDBABGjcT9oBJItWGAIMV5TxdgwgqTjDKHAwCLgNEKXAyD0ti6ARwMo2Vw7khcN4Xx1CVTlqry4RKOIMgPBoBEb6RKyrLjOqigCDAaOBMhoTYOBdSwNIhuTXWyw+l3B7AEl8MoYnW5HaVUYA1AQeAQPrJOAQ4JS3YAKu6idlqDJMe8BwNRm3w3YsgAjAqaAKOPXAAGgiQGSeknO8taoBishMAMm4ongAYb6AZQAGtl09lX1hByY6g3hVhCuI1dZgiX0BCT0N688sqCD2+5Z0m5arLO4Yg6Zr+wBBlakFSyIHgLhVJZxdAJxqYOhzi9pqSeLzbwwQHPIBCq4q3Ma4ogIUnGF62lJNJB5ZJ109JiZ+VQUi8FFFOZLPNWJV4XYKFFSTeG4ZgYeAwiA4S3wPQAAEqgj6Y9onPw78ZmXBmQU0VIZSZRGwuDIDSPjdCtrxsXGS/H2lsHioIu4YgDNQBkpDBbGAAp4CyXjLBZAwBRByIFFjRlXBNgxUVxoBiFz7murBoOE2JXwrQCAfgGKdTRgcup2eVQCc8VOwobr02zIGCgMo1x4DBGcWbNfSaoHK4tN20IyqTEV1KQKAt1lWG8BwK0s85HtVJVSdApgAEgKNJCdXFwAHNFQb/sxFAWI47Bt8BsvZsK1ikEhbfktsr6aABY+OlW4EyrkjqibU1iDhfgqYABQZHxIf712okgxjIx7pYewogiIHGDmviN3WcwvAxECwKonFC2cUVJKabVjd5y5mZQFoHAqgTD7gCzAAFKE9UAIgcu9YpKoYYBiAgqqjKIOlb2MbJgCRj1oXqAJL2ohbLwZAbburGN1j47gN64CCs0p/nhnAg/MNgFBBBSABBAXQVB/wY0XpwEcvJAEIUAbQqI2qIod/5/MWK+ktHqoP00ROAJKtLCrROenntAkwDJ60sghQACYFiAEwDpgIMB1AKp9e7RNEfWUZf+tVC5LuU/L+3UqoLNiCBaoBM2zDKsDhVR2AxgROB5QeBHgiBmqeX8ZbNg2GWsB0cgDOcIaxqwyDQdoJIPQWDADJgiQ8EZOKIMkW6Ezg9IkPcGiKSjOpmvQHeWyxZP6lCqK2QYtViqPxx4+e7b6i9J+s4ADfcmYRkDC4QpVR55X+jOIBIM/vq1X2hWS/7WoEhiQ4fgISDQwBZhE8CUD86tKB4kLYfmXBocHCfWfrxQCRNvrJdsqsLM75RYACeQUaVA+rqqQvIp0q0lcZWQP5d0VWdcA5wRo7Jl4KFE74KW0GjQaM9eg4D5D+a2WjAnVbpiJw6MxSCSCAhcGjgeL2B8BIlfAB0wKSkSxXGFQZ0A4g8YnYkOhI+FaqAIKqAqCkVSVsvyIvbsECoGJf5lSqIPsGg1WxFK/fevUVRcCBqqKBwod9PcZ9+4AfK0wHGCP5a0HTBJIeIGIbyV9DE8AYVcUCy1CNBsAIWGzA6C2X2MOWTHTQ1nIDH4DpqweqSKACllgR8L7FqjIWLwEYwCL20CYageEDJchc6SqU5BCDQCVjMsZyLW2pRrV2S3I03j/16v/5qgaJ3oIBLKAMED6zCN8CDKpMN67A0tnqP3UpgQZnFaa6HQDV/gYfQAJYAIoBCM5bfcjJHbMDiHvIZ/CkoBiAwNut3DmmAjAMmgQEBCaTL4BggEC+Cihx2yU25LrXvAdpAUStLCX7HCCGfwosSd7922513kiAoMY0iBLZSzjY0yNjehI2AGHi2YVB0VULtQ0LvP780VhNABRQDZgBEASYEYikknRA4arCAIkHfQ8cRb4GSbIFC+cUq8KYoAAILKoBQ0DBOQU0Vpiw1ZJ1mQoQTnBu1wJkYTnaevVVZfjDCAoYCRD6MV2BLBmuLDKOqtJRVVUGADXwARoLMOEfffWPleng3slSH6DQ1AKFx0vAMgClfF4JFSgAR4NDb8P0eAcEFyA41IPG7VgzWAAgAzQRHHhEHM5JU84hBwAIr+rQYZ63X3RmkeRurTYAjIAhgEMBhKsLXkr21SX39r6z1YFo/HIybLUy71oEGJWH+gQwlWeUEYAGsHBViZXEOr+MgKC2YO64eVbhqiJtHyi5sWH7JfoACtqqujzff6y48N3cS9598sdAGSpKtx1Lv/8CALJUgawWLFxhNFgiQMZPwryKklaY/kNKVBG8ye/7tR9SJlWDtl4jkGDbBdod6gEYvQULfQHB6ClXLVBYzgRNPOAXD/AZQA2VSAOk/2Bx6jbrEIGlqtsYKPg7VN22Ctuxim0YwGMe9PstF2Q6UPRVpQOBOqvkgGFtzwCWfFUJZ5YAoPj+JKkeAFKWjt+tWEABqEBDBfHAwpUm/dyet1/cHlUXAASgQX9EI2iQ+OEsE9+pVIPpbL/NunQ9e3dXSZfI5sYOCEDxqVcCDAAElM4kuW2YdWbhdysAygAOtQUbANRwRgnACVuxOsCE9yt5wIwfJwsYhqQ3qok5hu0X5IfKkgKDzylZMAAEJSrgEJkRSNLzirXlsngAlKaylW2tIvsAxhIvLJWN/p8C019I5K0X2gwiCwwMAFSUktwAigqweJ/k6+qCigI++jbFU7Fp1cWqIlkeQDOABdXlWv+ETIGn27al1WVURXKAcUAiQAi/CJrqCtJvyyQOueZr3/H3AarKOXBFCYd2bL0AEpcWtmMloISq4hzyqaIwCFvb4Ymb+Ii/1Eb/IlT+RlnvUyjaAFyk44cIcSw9P2lwipz8RZhABZx4GjeuXlKd9I9BKLqhwoEW/p3NCJzxUxqci0BLYJR/k37plWl/qKEyKUcA/P3zr+9+94Xbu//+7Ld30p5qZ4ZeAMr5S+HvAQtI8HMBwof1/sCfJl/67RcqjJaRiiK8lKr3Lv0f2bt45eZOfhd6ij544IMyX3j6VxrX8uO+/F1mtqv7PCbt8LedoRP8p7wgA1lQ2IXs8dK773y4+94f/Z/dnbffXz1Z/+vX7u7+2X++t/tL/+L/7R76yV3y+3M//We7H/2F7+1+6SvvZuOorUgVH0eiooSnW1IFOqDIH7pWoJH+AB6pJgyYQnXRIEGfQRLv+vFzFxmXmCSx9I+TDmPCC0mYJqrF82TZrtXO8TAWkx5xcMKDpylkLD4AImOQAwUPMsvTK6++vvvw43sdSNYGylefv7370V/8XgIMDRTu/+V/+X93ojOjWtTo4oyigEIgAWAGkGjA4KA/ASx80BdQjH4XBSjXRyABMDwAIGEhhz6o1tN9yHm0Vd6zY/OR6AAM+q10GQC9evOt3R9+948GkASgfFCTXIlMzd39C8/c2Um1YCDUtn/q17+T+JsCHCvGnqcrSth6yVYsB5Du/FFZUfis4m/DnLNKV1HKQAEgaiiSUyc7dDEOWpLT49CrpwKAAIpgC4BAooNGuSAPuRbKtsp6b919PwGIgERXFCu5rCQtyc0BCcDEYCn5s2LM8DRQUFniWaXbjtFWbKgs2H6hwuDLYwIQgwTbrRKNW7AAnlJFQYIjYblvtZGUJcr2IAse+vNoLvGthBYe+LptJT1keczi8Xhoy6NR3moBIKB33rYrytTk/J3nb0+uJAAJ6L967COzskyNrQePtfWywCLAyVcZCwAaKNkPKYcnU+kWrAYokkAeKJDcGOfkxhh46GtZ8CEHCj4o+KDM53YYl6REwmtqjXFCc8KjDcpy7e0rr76xu/e/v2tWkhxQ1HsHM1mtO/aFqzfNAzsSv5X++Z/+s91Xn3+z2r8Vk8HzKsoYLFJJJGlB0Q79/g9TUDWxgAMetmAWcEJFEbD0T8QKZxRJQPwk8dD2KCenyLAOtzHG8rl2q3xqywJGiC3KsQwDAHLM022ACFSPh/6rN++MziMAB9Mln3o9+pvvTzqT5AD0tx/9/iygGNXHryjhnBKriAADv2H7NQAn/gWXbqzhYO+BRUDVHfYbgOKBA0nMFG1JRNaLiRn5kOGxWh78gGobpX7UQ3J7wGAQWG3mia20/+ad97JVZA2gLF1NAJ5P/eRu98Vn7jSBpfCI2AdKAEX/31vstl0MmtgeKkoPmgEoTnVBNUF10bQDBwNtIaAwGLiNhGcet5HIwkMb1OLBHmSmUM9usMVJPo4p+tPAgiz4kXqHdgYHt70zirFlSZJV36l/9am7i1cTgOWnfv3jxHcpNm+831L6QIkVJYKCzylo6+oCoHTnk64KvbZjcHBbg8TqC2A5cZdoSzJpO+CBYpz70kYfVOTAB4/7Hk/LtPWR5OJb2mkMoc8yGAcv0nfe/6i6kgAsS2y9pJr8w1/6g9WAIu9XvOS3+BrELHN09dYYKOcv3egP7gIQ/K7vInDSLZgLGK4KTtvadjFYpLqsARSAIEcl2RgE3LYS0xq3eJbuVJ5vH0BggHD7xk7ulO9/+EkzSAQsUysKJ58A5Qf/9R+vBhTZfj13/o1qsHhAQUXp/tN0ERAARqAADf5z1SIHwAQaD/fZyuIAhUFhVpq+IklCHMcPYEFCgoLP1Et21oGMxcPYNCrAABAsivEAILn4H3/yB5NAEoDyfgc0TvzWtgAF26Q16JRzSmYOpadeKXAioGJVyR7w+0RnQLS2xack1nH9JAG1b/BAkfiguaRdSga+U18MCAZMAIj4lse/c0ACoGSSquou/o3zr68OlP/wm4t9k9YOFFQSHPY7Ki8kL78WvwXjg71zqAdgsP0CBR/0UICCxJRk4x/zdZuTmAHCbZaZ0s7bAnACaGrekeAckqNLbL3kJeMalQQ2paIsCZTuvzMfK0VaQYatF225Utm0smD7JeBBO6H9FkxsAAigFk/GBJicmIfYRoIjaUGFj3i1DPqQYcpjOT7k2J8tf6OrJKUXiTlw8NgSh/l9VJRf+p/5r4sbqmJ/mO8+UUlBIokr//ZAfl17ONjj/AL5FCwASZf4FmAELD2/k6XzC1cVnFnEDpLtUCiSkRO0FBuSmil0mMdtyz6P17aXqiQAyxyg4NAsZ5SpH0CiauSoVJRfe+pu1TawAjAElH77BGBIgtb/UrAkQDDA0oEI1YWAgurCVOJBQp0mqpOcQaHHuM9y3GYZbsvBfalKkgMKAFBKOsgJUOQNei7Z54wJUOQfecGfFVduTMn3ZxRUFFACSfqUKweeCBZ5ShYrS6wgANBACyARwBxiRckBVpLUG0cCI8EhBz4oxr0++CU69+kWgKFpqaLUJqC8FJwDhpzu35n5GYsGSjijACCXw3arvpIEQET5CBYBCv8GcHCFEaBIPwOY01pRGCRogwoAlgDL1PckGhi6bx3ma8HBCbjWm/mFD/KyfaOKImDBjyoKQIAtGQ744I9pqAIBJABSe1Xp7Pb/XUkk0EmiSPZczCyj29IHz6IYZwpfwrv7Tvsbdw0Ir1+qKAwG3e5f4HVnh7W2XwKU3132Xz0GoOCFYrdlUmABQAAIbMWkr8eCDCpJBAkqi1QP9zEyVRc+1AswkQCngSLpZS5oc7JrniUHHusxr/XbLQ8QHr8VKLlq82tfW/57L3znxaDUgG3sp0CRJJbkP3/lRqguUlmwLeseEcenYB1QzM9dIkDSdy6ZqoLtFyhtxcSPJMGD8PNAogEBUGgqcmuDRMDTCpRcUkpVeeQX6v+NfO5cImPyjVftX2rJAVjFHJ56mRWlrywdcPpHxKFiCBDyvxQgEThBDxUnUj6/iAzOLPKIWPoPAkh4jgAM89Bm0KAtY9K+8cbdyZ+leNXD4rcApeauLu9UrL+2UgKFHl/pH23FMwoDJbb7qoKtWFdt8gCRpI4g0bIRGKFKxQrTgQPVRNEHGSgADFPdlr785F2J/iMQVpIvwbMO8+oOXP3+And1eVM/ByzyTsZ7Ew8fU2OUw3z31CuCQ7Ze4dcl81BV+qQHaJyKwgd9AYzYkkSPvwCW7qzSPxXjahL4/acw/fbLBYr8hypP8ZZMAwJzBTBAhb/0C8USmLii1FSM2gQVsPz1n2//oli2W63/UKs2pl4uPaN0id0DxQIMzis4xHfbMvecwgBBm6qKVI7+J4d9tJkKSMQHkuRBpABMbu5zP3IsAUOP11SUqQASvUf/x/tV1UWqiBzcS2eSqbEQmMZAEYBc6D5didUlAoi2Y1QpwnZLtl3Wv2VhkEg7BQtAwvwOLP3LxqSiWFWEedw+xdVGQIOKcsf5k0I6uZfs54CywDZn2Lb9p6+80/3jrh/8+T/uPncRYMj2TP5KpPy1FQsgS/ovAoWrSWgHgOBpWAccAkrcWgEUFhWABKAE/QgYAQYDZqgqAhb8J5ZPeeLnKoY39vrtd/ZyeNcg460XJdOQ4K28wr9XN+3mAJEba41N5OVfOHb/cEsS94LacgWAhKoi/9wUIJHExdYraSvgoLqAAiQRVBEoupoANAKYYesl1QK/FtCcsiqDrdjVPR7ex0Cx/67XcH1wnU44JcD5h3lv+9WdU3Cox2EdVIElgiJWGDwV6w77fYXRQBkqSv+CcnQBGCgWEMDTlPVOeHvpDx01GHJ93npRMsUbWQVApuqNciHji33MPKf4QOGKgnaoIPHs0oFGkh3AUUDpDvvuO5i6iiK2h62Hl/jgn/DkH+ZZmMean6fkAIKx3NYrSc6r+/3PQ0wFEfQ4dvB6Slsv2V7R9ku2Yt2Wi3g8DnDwNmwAjgKMrixiJ+UJaML5BdUFVWW09ZIkYmDgjlJIrtokPHS54zqXACRCuaKohGqqKkvpzqwWNTEDKClIGBC6HcFDT8CcigIwpOcUCyR+dZGz0bCgDBIGCIADyqCxeDx+gtpyLjnOLRfAkqsow7XC9TkdFEAJB/QIAjrEOxWlqwr9wV6Smfu1lQVA0tWE+2LXXHwNGqvPvBMECK+qvfv+x8fylAsAAT20imLmBwF0TsXpt2M4o4SPHcOZIp5BrAM9KoyMCSDQx1bMAkm+ouQrzAgonPCoFqAY4z4WzAINy0H3QOnthj95ioRei540oBSBVD5LWUCp34YxSKQ9gKU/owznFzqzdGCkF5Px6VcATGeH3qsMQNGJDgAwRZIDABgDP2eDZQ6sfZyPgi2wTdl6yV09c1i2dw24fsdAVazYenFFQbvffhlv6e13LgFgA1hwYO+3Z+k2C6BI3+TjDX840IuMvEehrRcSnYEAHpIbi4q+R2GDx5nHbZY5hvZa/1LRAkENz6soKrkOPfmr4zu6NrxwBDgsGrdXNkDiuCR1VxGM6mIBxefFp2AJUAACj0oSYwwJrfvML7WtcfD2RA/hKZcGj1VR+BywFGBa7LTIDjmC3CjTXEW50X/zFSoFQMAUZxhQqSYjoKCy0PbLB8j4vNIBRZJST4Z5SFrIoA8Z9GUcbaZaD/2cPOuv1D6Up1w1QBldn34NGUCezAnge2eUUFkCAMZA0U/HIniMA34jQLD96s4uPfBGCymJiWTmNic2xkEhB8p84YGP9hQK/6BTbJDOoTzlGgNluU9YplQC79swBuUUu0NOITcijRVFviEKT72kkoR2CpQIGABFb8W4n5xVGrdiAItUHolpmIAkUQx+3EaSIVG1rKUPHYyBQpfHuQ0fzIOu5k3ov/LaWwfxKFiDRPrW1it7XbCWK1IAA3TheCJQOpB070NCNQFoUhrPI9huSTUR4HAf2y/QBDStFYaBgoVGQqLPFGOa5mRkDMkMOfS1Heav2D6EF4sWSAAU764uCZobm5LAc5N/qj7p9UDpvw5OQeEBJoIlbrnyvBFQUGEM0HA1SSoKEhZJzQmNditlm55dDQYtB59aDrYtfoF3iAd4Bg2eeq241RnvFrDOE+gCcQagdBVBtl6oKKD93x4eAyj+4y7ebvnACdu2ATACkMpDvvg270JIxNaFs/Q8nsdnnyKDH/jogwrfaoNH9FAP8ClQ7P+cAt2Bk3cmzDevJdZtJbqA/3CYD0AJ/w0N+fMxHTAILHx+CaAZVxC99dKgGUBC1URs8RMw9LmqCM9dXEmwqYsLXSRpyQ7Liyzr8Rj4FmU9a/zKzd2hHuAtoCyQgMXrd+vlx3bf/d0f3u2+9FD3+/7v/NDurW/9oqnHlWNyXth5ECuKVBP889IABm/rFfg40GtA5CtMqCyiM1QUbltbMQEKEpEnwTxuswwSEzwtx31po6/b0PfssR5kmAd7Hq8fl2rCCXmo7X0d5t979mcGgAAooN85809MsCwMEPgIQJEE4arSbcHo3DKuKD1Yhq1Z/VZsVFkyQJFvxLIVhROY20hI5iGBmWfJMa9P4AFA0AUffdhmXeZBHlSP9f2TUE0EvDijrJSUXXLe+dYvuCABWN599meQyFVUKs7EKmhsvbrKEv7pb1dZ+krDVQaPj4XnbblsfqgoApahqgAooKqqmEBBQnLiSbLhx+PgWRRy1pjwvHH4ZQp5zYNtzUe/17t6/WRUk/0A5Uay3QIwNP3TJ/7C7vLlC911nwiAmDPh38Yn/SGf8Ee6L/bg4KqC9lBdhuoR7vIMnNAen1uwLbNBI/Lx37TAHs4s3Rjeo0hSIeE8WpLxxjUffaG6jb4XA/iQgw30ZZx54F+5ufvw43snYtulgTIlQUs6ly+dL1aTAJpPuSEwhvwAACAASURBVOeVYr7gWhVoH2s8owAYQsN5JRzuB6DQ4R5JnVJsv0LVAEiYdrb7agJ+qC4RMAAKqPgYEpYnhYQDD0mHvkUtGW2H9Vie2yzjtbVd9GGH6PVbd04MSAJQ4lOv3DuTEiC8ZJYDvK4eXl/OMZ4djz8hLn/rBcAANAyYUCGsyuJXFQEGVxYGzejcQo+PO6BIMiKxvMRcgr+Ej5INjAvtf4f8clGAoX+5M8oST56un/9KNVBazykeeAp8u6JIEvMPW7MOLHIuoc9d0qoC8ATA5J+ApaDywDIApQQEJGBJbup4zj6Snm178pDt6aG/XNQgCRVluW+9rAS9fOlcJVA+tXvjhf/SXFEsnwVe/9TravrUi0EibbnzCdXVxQMMKodQtLHVylEGi8hJv/PPCYi2l4gY96jW033R0zzuW23mwa/Fg20aO2nVhIGS23YVEm+U3Ol2qO4w/ydf+SsjO9pvarfirIvrl9JyRUE10eAZQJM95KdVQ4PEAhGDRc4pLlDSieSTG7JIUKbchpxQ8JmXa5fk9fiVm7uTdjZBdVn7PYoA8Pq58vbr7u//mwEoOUDkxjSwnH4KFFQODQrdH84r3TYM263+hWX/5XHckuXBosGDPgAjvpzgl+VzIqMtFG0LJDVjkAElEJ6kJ10ACVeUta+LvIH3DvF7Opsgx1KgaEB0d3N1XoHMUFEyT8NCxQCQxoARWwAGUwHJ0J8DFE5Onei5MZatldM6oqd1qX9Sq4kFFD7AJ215N3Et/hG8KXf2axef3X3nzD/dff+3f2gnW617T/2D3c2XH0MCj+gUHyXAyz8F7v77KEh+TWsrDD59CYkfgMEvJUN1yf9BvQEYDBJp1wKFkrA08WRc6+k+A4DbIsey3GY5aWMMOldu7g7t38FzxSi1sfWyziicqNyWNbfkk2uh121PfR0nYiJ+rCgyyEDRfRmzeB04UFWMt/gASaRULXpQBIBFfuyHp28I/CApQKAvKoGii5vkTtJbeAs0+vEwJdToDn8c14yr2EL+Y0UpVQ9zXMClANadX7IHfFQce9ulKwsAOnvClKhVtrS87mtgNPRPyjddFkiEp4FStZ7G+nCFkeRmwKXtyU+rRsBluw1xx4rSJaT6OFJ4/BPD6KfA4cfH4d+1iFw80FvtWEE0OLgvdhomtK6sBRaLJ0nBfGqf9GqyJFCO67pOqDixogAANdR6ZMzAyQPEf7divaA8KKAYd8Wqi01AOenVJAAlfsIi8594l17lprZSLABKfwdUFaQGNEhklu2AYlQUPuDjiZjocQWRNr9fgf2qhJyayCU9SvSmOJTepVdeP4g/su1tqWr5OMw3rUW/xpzI3J5ia486ESic6Eu1u/OKBZjuExjZevGWLAVIAEzDC8dSsu97XIFELupJ/FzFAo8FFD5v7DGBhydpE7ZTLZUwAOXi1VvDv26USXpA4e2VbL+4r3W69yzyz4oFKPj1wBh/+hLPK3r7JXb3ufCL+mKwXLl5KqqJtfWy1uy4q8XC/rmihO2XTnju67NJDlSiNwDEqCppNUFliYDBduwggMIJX6pMkAXt5W+8eXf0Fa51tz4JPKuiWGCxeFPu/GJn4cRvvfniqVd4/MYvDhkgaFsVpKsskgzO+aarLPwXXpLtFgCiaQTMQQClBI6K8ZP6uYoFXAEKJ/ycbVeN7s1vfWl398wv7t77vX+3k7YFwA5M9BWAJzORH4AiygEk/fdaxmNiDZKgkz4+BqAs2lUX5xN9PuSHSnOKgHLl5u40PBJmwMypKC2JeuXo4u67X/xHu92v/tXk9yef+7u7a+eeMwHTUnlqQNrHG4ECsHQDHVA0ePKg4IoSbUSd+m2YgEQqTKAnrqKoLZfcYE7DI+EWoLQka5+ISdJLAl8+urD7k8/9cAIQBsyf/sbf3F07981Ez7IFHmICBb+SKqAMlWUMEgBBDOuKgTHwtQyPo7J0YOjPLny4j+1QVU4cUNQ27LQ8EvaA4t2VeWsm+cD9mmR97/f+rQsSAOa7X/zH1UDxAMFxeTIXhz8u0X+wJknKwiHxGTSxQgAUoAIGuXuOtmhqG9edWfhpWPbMcoIfD/eAOS2PhD2gdCBQN4fAi18Nc0558qnOjWw1AVB2v/pw9syi/c7ox4oiKJfvtuQOEc4rKdUAAECE5sZYDu2abRi/kJwxwQT4x2HnJP4LRgaF1V77jHL9pd8rVhOARQ753nWtqVyeruJHoMhAZ5jOJ8JDcgfw1IOCt1vRRlqRqgCjqpyagLtIhyB3kv/NiQUQ8NYEimyFbj3/m9VAkSdhe7jWeOGYbrnkBWQASagq/EJSkj6MpUnf8WmbhW1YCTDD+xTjvCJj8LeHxVh8wU/bIV4DZcE7drL2184/Vw2Ut8/8x0RX8iQXV+WZRNtMKwonI59XQju+vfcqRA1fg6w7s+Dl5PDmPr5XOalAOW2PhAESod5n9l6CenzOt7R9Y/env/E3KsDy8O76S0/ppO767T51sUj6Y6CIA+tJBoCTA4MGgSdrnmmcA/5JBcppPMQDLHO3XpJfpUR+t+Kp1/c///dNkKSgSxJ+qry39YrGu3+Y1T/VCOcUPuSPt18eOMDnrRgAg6oiMsO5harLChOfumDVeqfxEF8DlIlbm9G6ynuU7z/299yqIhXn2vn69ygzcygFCqPcqiohsQOINGiQ9BYgwKuhHVDoDb7ozJzk3vVP03ddAAfTlorCOdV6HQUIHz/5kyOwyIvI6y/bWy7tw/Pv8bV+3x9vvRzB8I6EnpczUEQn9NMKE/gprwYsIgPAxGrDPqQtdkHbfESbVMF6nzo+PGzoYuofLiQyxMOHnLLtkmSSvXz4oQ0KvlDN033ICl+PWTzI56hnB3ym47Y8zXPzpH/FkBtvHZNzyNtnfrH73uvm8/63XtpuDRhqZEYvHOEoVz7DuxY+2CNZA9WVJUkq58NJyCCBByrbLwaNJCW2ZDP+ftjwN8P6P27R9envHeMPhNfT67tzl8JPwIJ1LNHcOpd0vXF94XXf06vli72lbdb6LsmZuyAB7vyPJRsqSl9NZJHsagLAjO/0fC4BKGTSaINqkA0g6asH7u6gApoIHDwpix9U4g7PlP+9C/5+2EDpv80iPjRQ+D+Zx2OBH4Aic/AuWOlCt46XErY03upvSfm1Y1vY/hgoU9AnwMG7Fp3sAEGJykWwZAawoLqgotAfChf/AI8GRQBSCh4Gi8ijwgyVpfvvsrw2AgqDg9udjQ5k10fVZCnQTLkuXmIvnETJnL35is81/XpzXYifHubFqDtRo3wFgPTfdw2JHhPeAo34EEDkxjRgwlYs/mtJAAOf53NlCYBJgSGJzIBhoAzVhAFDlYUBwW35z+ZxX7Ze4oMvjLWWaySL5YfjyLXn6Obs6rE15q19zOkXbkRpRRHh3IQwZi2u8DrgdB9G3hoBoQUYAIpMHG3QWDnCFo/7sZ0HClcd3baqSwqIcaXBlkxitNZmzgVcQhfXzbNVGvf0avhi27N/iGvlzCkCBYjSwY/7MnG/8ghY8Lt4Rc4z4ydSEozF1zwBF843AFq3Feu3XwIMqSpcYVBlNAC4L364z+0BKP1/Fg/bMfHFgBlXlHCIt5LCWkPrguAaWGOtPO2T9XNjLFfbxpw1rdWvkYPtGlktM0e3txWBoo1z33IEnjwFY1lpd5WlBwMSXINA9y05zQtbsPAkrANHl/A4xFs0VBbedjEopM3bMIwBHAyapK22ZgIazFmvBfexZszbRxt+5wARNtaI1wIuYl3Tb8NcwhklBpUmfUuQLCv2JHHizz6TCFg0GDSA7H6oSN1WqwAW0Q+AGFcRjAEgoAMo+nMLVxNuo8IITxad1wAXQXgWH+PHRc3k7D+GrYnpEOdUEzdkkPPoF+j4MF9QaLroASjjx8WSoOLHBkHcqmHblZPTW7EOPLQ1S/v5v6iPygOgCHBiO1QsgIMpgIK100nEF4XbkF+aav+w7/Exvjbdt3/xt5BPe+uFi2nddWoWE/qQzQEmB4LyWF9Z5BwkH1Xi0bGcW0ZgGR/wUUEsCoAMVLZbAhzaduEQj3mCLnRxRlvaqdcDcR0alfnoXNlnjA3XyQbK3GAFGNoGtmHTtlqhyuQqTH1laQMMV5UBNASYUjWRddDJMOob5zysX8PFHK259gOba1GO9ZSB2gbKnAmzLl8QgKe1upSAJT46m6gociYpnFusCgIetl8ACKgFEqkumJfE4c2d1yHIjW8kkKm10eIPtplqP7rPsku017ZfinGmfxso2mlXIo27XumOheA62h/uxTaSS2+tchVDyyb9/rzTAcQBifjE1izS+uoiQOnAdOXGsAVDNcE89boddx/XZ2p8c6uCpT81ljXX0ouJ+HVA8YIkQ0nZF75epAAOvFfpq8DwZCwe4BMAGO9gZFyqjAcqgKADRg+a8XklfQJmPSJGhUFFAeXK0sWibiBITm/NhO+tW04HY3pdwWdqyczxyba5vYZNtq/btf6s+Yutmmujffb9eUBho15wLCNtTFYSGYmWA4cHCNaRSqL73vZLQCOyAFSg9ZUFgEE14flhbsxDW8Zq1wg6U6mOY0aCJDfAXDzaZ052n2MLxdX+eLh2ktbFCVUlIDskdtirc5K3tiUerTNswQCIobLM234JSARoUlXEZ+1aiFwNSFiG14/5LT5LsgslkXmnzsW8lN/S/GrGK2PxK4o3UVzAgaqthxUcZL23+CHRY8KLDZ386HfbLme88y2g6CsMACO6VoXBlizQuqoCWWuemicXIfzGh/fKC9QERvifYtu73rC5FEVsyIml7C5lx4nLBgomM8V564Lj7CK+sB0DKObT+MVxBI1VVbAVqwRL9/Gj/ZcQW+dfs8Zzrgfb13ZKfdad2xZf2h9srrFmsL0QHQMFiNLB674EIDzI64C8RdFy0g8AAZUzxLii4KzCj4u5zaCy+AAKn03iB5QASnrIl60WtltoC7XmoHkt8x/pGv+kQcss0beu6Ry7mLOmc2weiK4BlIqtlA4eC8N8F0AVSWABhYFgtQEka4x5FmAEPClo/MoitnieJ6ltXadDj1/yaF9xZ/yMgYKF47tNxkBT0njggc8IkPEf++Zkb2mLbZa3zipcZULbBwpibaWyhrymrfo5+dbrU7oOnq+pep694+DrOeg+YlLXygcKFDwKB95FUo4GQIHv6cEfb8dqqwUDgtsCDt3PAQYH9rjdCv82X2wgPqbeXDQfaya63GZbc9pYW9jQ/kt8jK9NvbjW8iv+ZvrMPx7GwoPqiWi+DkaSQfO0jVF/eL+CT/XTJOeEt9qwNyQ17NGTMBnztmC56gLbmup1wHjz3Cu3vZ4/+D0OOgf4Mp85+nPnW3GdYkWpEDbvpl6QfDG7hVD/1oHH2YY8QpZqIjyuKgEUYRtlHdYt0HRgUQ8Ggt3+pSPAM/rSmA/34YDf2apMZPFhradOhlFfrRGvC+xpHZapaXvrHmIeP8ausQkZy7bFg/wJohEoHDQuBi4Oj5XarQuj5XUfAAngSM8bGhwMIG5DTmJHW2jYktmPi/XhvjTvKeMyV2+NPb7lp0VW62td3dfyJ70/cX7p1muiEbfSsD0BX9LP3J25qsiFiZXFfnSM5LfOMsJj0AR7XFECUMSHd26RMY7dShYNcEvmuHmlOawV30lYG5m7rI+zRqGiWBPRPPRRbXhRHeMdgDRAWC8E55X7/r/RMtqKRbAIACxwADhCPZBABmeVoW9sw3TMS/Vz67aED1yzJWzlbHjzWMu/50/H6MlZOax1Vd/eeikht2KInBeMtoHgQHm81kZtZUHSM2XAMJ/bYSuWfu4i4xxrTTs3n9yY2C6N1/hnmbWSlX0s0V563kvERDbi1gsLaiWyKGCclEPFyBxAIestAvO5DT2m2I7FxE7PGyIbx8LWyutboEm2XXJ+6SsLx8DtUrwsK22sK68jeCNZ2payDOtqnTn91rl4vjhWyHgxi8+l/MLXHFqIJQKl1Ym1KGIjLEDcTmm5QkDZu7dUFPER7vL5x8elLZkFIrGNrZgABf7mxIx1lXVYwg7srUW9xF7a36GsRWUcOKOEi4hFqlTOJnVuYT37GlSJjQEkfLjPVxEGi25bVQXgCVuwCHbE4cWN8RzF2ooMt3M6eiznPzem7ZT6ni2PX7Knxz07U9dF29f9bF5R9dZ61I9AIWbYUvXfZOngx30BWdxajOxUbM20Tl0//mtJ/ouUDABuAwQWNeWMBfQucF28Y+CV9Ba4wFU3M31NS3GVxnXca6zbHJsTdOcf5nnRcgHwGLdZH+0OeBmA4bwC+XDIj0/DBAxcQTQ4oGfJyFinbwBl0CuM6cTjfmnutT5a5eb4naPbGqfI83pBX4MP/DWoMd/yGYWDNgxU3bH0ZKxJe7Y9PtuMT8OwLUsfCyPxNWC8Ptteul0zn6V9evas6+DJMn+qHtuw2pxr1vhaPLkm3pz6mOZXlJoLDxksBPoycW6XFgL6IoeDNkACXau6eIDw+LBVoi2xl2zpcZ6rHmvtrxlnaywsL3EdamwcZ/KfpuMBHTwuGijLSlvzLX3N0za8vod0yAMoATj8JCxWFwGEeQ5RXxV3coVtFfxatGaOeq0sO7W8JW3V+vTkpsbCayY2Stfb878En2NR9sZbr4zwtG2WSrwl7WtbASwAiND4PkUDBQsBGTmviAz4x0n1vDgWjM1NqFxi58Y4lpb2GjZb/M+UHW+9eEK4GLg44ozHc85ZJyfnjbGftG3/W3VtB5VGA4SBgbZQgETixrzF5tx5cFw8jxo+y9S058bK+tyu8X0cMnuMcVxR1p6wJCFP0EueuXEAKF2V6b4JS//VpNhPgNJXPo7NiqE8fhhVyYodvNIcILc0XetaLx9nmqPuGaXGMd91IV+6AKVx2FmCjrdh2JJJ9YjfbwEsS/jM2eC5c1t0uM/tnL2WsTVswn8p+UvjsLNv2rgm463X1IBrHQNgoOzPs8GLzW3W9dopYNJDPbZlrKvt6z7LltrefERPxnLjJdut43Pm0errFMpHoCBxsaDoLzVpKyngaykfYseLO27F1ItJ9bChNRZrXjU2WufuzavGV63M1LnU2G+Zr8y1Rn5KvCUdjIP2c4tA8SarFNynQnpioic8zYefWrsi79kIY4XDvfxT4OE8gu1XPJ+wffjxkrIlZszTomFtCnHPBDD8WnNZah7wUaJY15KcNT5H17IHXuMajIHCBrgNBzW0dnKefevi1vjNyYQtWP+PwbrHxvvZ/mAtNM3FWhrz1k30cmMlu7XjS/nw7GCtauOplZvhLz71CuUuJJJnsBSQTNDT9fglm944FpPt1gAsbMHCYR42Sj70OPvUY3P6nl2PP8fXPnR13Lq/jxgW8jGuKEsYzi0Ij3Hb8psDniVv8cQGDvQYl60Y2uEGEfvMR3sq1UDkfnnuy27N2Pf0+Swb05Q4cDMsrd8U21qHfNQDBQGKMTFgLTzLaKe1fQpuSOZa3Rq5XIxr++b4JA5vHUXOWl/W57aWbZ1Hbk26WCr+DC7H09pujbfV/gLyces119jUyeIigZbiCAk2rgAlvdpxnXSWno516ty1bcu3xdN6LX22J+2lYm+JYSlZnstSNmFHrYtdUSAEGpVDgnoBaj70wRcKHmzWUp2cOb2c7FT/OX96jH14sWBNtO6UvmeL45hidw2dmpjm5ElLzDWx9PZSoHgXtcW5yPKFk2AQEBZg6A//inLe3hf2rDi9MY9v2dA8np8ea+kjBtAW3Smylh9ckyn2ltax4lvax0R7ASi48AwU8NjwlIlM0Ul9xm0Wx9Rql3U9+8yXdroe88Csba/Vl3Wx1sabv45D6+q+ln9A+mlFOc5J40LiwoDOiQk2YUP64TdO+lZ/Iq/tww9oq03oLUU9/6W4l/Lv2bH8e7F6Npbgl3zS+BgoMkgCk548zdYftmQ4E40T21so6yJ4ssLv5rvyU528f66Y6Tx5HVvnlfPJY1w1md/aLsVXGm/1N0We17NWv9dZ7qkXHNcGk7tAng3mtyw861lxWuNRLiYyeK3Us59bA/HRMsfamNimxMX9Whv7kPPWbB++DR9GRdF384XvttYCrHGxSknIi2HFxOOH1ka8WDehaC8Rq7Y/1eYpugb9Yb4CDFg8b9GwKPqCiV7uQpbssj9tOx1Lty081tpGTDl/rTZr5eG7Vr5GLjeP3JjYLo2X/LM+tz09nn/arqvsNT483xl+DxT1N7QkQA7SM1AbFGxBHn3Pbo4PGzkZb8zTFX43Z3lbXnHTgH1L1pubJQs7HvXihbznS8ZzY9CvpbAFWqtXKyd217KtY+h8NVzjXn+89ZIBBA2qndX0PV2Pzza1TGuSNcvTnDkOtL2E1XFCPkdbY2Nbc3TZjrS9ObHclPmxPtraju5Dbg6dujalWPpxGyhzAmbdXBA8xm3W53aNDMt7bZ0g0s8tspb37LbyLZ9LzHGKDa2DPmjN3Fpka+yVZKz1K+lMHT+6egtbr/H+z5u4DtBLJI9fG6znn/VZpuRvFDeVX7aT2CcZ5k9p5+KTMR634rF4XhyQBfXkPL7oeboWX6+tZ/cQ+BNjHVcUayFaJlijLzI6YN1nn55NTi6WX6PdxazOckv54blLe5/zwhy8Ncb4PmjtGge58c09F+PM+d0/unr9kYf4QuWc8ViL4xZZ9mG1p8QqdrSeF5NOUk/Oik3zRBf6bBc8LT+3v5ZdHVeLH73u2pbut9jWukv2VRzjiiLOZHIiqIRn3+nG9saPdFsXduri6Fi0ndK4lu/WbULFET96zqN+xu6UOK3YW3lT/OZ0cmOIrUYGsgvT8GZe7nZeEHwnhHOWbbmo0F+Sciw1djEfUE+H7cocIQ/q6bXwPVsev8X20rK8HkvbXsreijEu+wkLg6b2YrMOFkxPuNYW9EtU7OHnyeoY5sp5+mvzc/PIj4UzQE4GsdfIQNaic/Utmwvz8kBpSVBOeEwclIMOCTrecomMJc+6te0pdkSH58C+eB2m2GZbaOfs8FguLthqpTwf6Hpzx7imHCOPwbYeb7XPNvfR1vEqn3mgKOHkS+IpE+dguG35mWLfstPK64BMj4Vx4VvtWPLFOWfOIlPsWToWz4vL41s2TjPv6NqtMVCQoKCyALJg3LcWpXVRLfnWpGyNyZNv9WvNfwmetSZstzTOssfVtmK01n3umlt+psy5Jg554Xh09Vbb4+GpAdbosQy39QJYC69lvL5emJwtxCA6aHt2wa+Vg7xQ2NexsYzX1v5KNnLz9XwcN5/nWJrf1FjZh2EjBYolbPEMQ8m2zBufY0t0eZG47fnz+IgD1JNbgz8n7qXiWTqGpdZxKTu169Tgr/+Epf9q1lP0+F5ALJ+249tU5nt21ua3JkytfK3cnPkdwvq1xq9jRh8U9sb9mDeQ2TMdn1EQgA4W/KUo7IOKXW6zH/AlAdHm8ZZ2SR9bE53snh7ka2LQNlnHs88yh9ZujbllrWrnuoZNw/cYKLmLyQZ0gJ6ex2dbaGubwvcuhseHraA7vhPBB+ISCh7rrtm2YpcYLD7iQLxhXvbjdUu2Rh56oKX1yMUJG6eF9mvR/vVwaQFwQUFL8jLeIqvtrXnRJK6a2EqJpWOe0196vjw/bs+JsUV3n2vXEpeS7Q/z/fN7Cdq6EBZPGTL1PBlcEKGebY8PmyHWccXA+FRa8jvF7j6TIbcua8xtynqwTk1MuTxhW9JGbml+TV/HQv3+6+HMiy4S7p5sSV/zSkFw8J4u7LJsya6MW/KeD8uepc9ypXGWndtuidvztU9QejGsxV9ifSbGFr8exgJ7iSF8jEXZsFfGBDCeCwayOZncWJ0Pu9IgbrGfi0PGWBbxMC+nD/klKPtcwl6rDfjf13wR3xx/LbqVshEoQ4D0+QZ4a9J4IWJyS/Dgs+8A1vxBluWttgU0iye6nT9aD72oVoyWz33z/PnMWzueh14LHluqzT54rZm/lC+xk7GbAsVa4Ixy1UvGQgCDjRo/VnzeQk21V6Pn+Vyb3zL/XCy5OXJC5myUxpaKteRnyjjmD1phIwWKKMyZoKWLYKwxDnDuBSrZZ19oIzb0W+gUf7Df4lfLzl0nxFCi7EfHUNI9hePWe5RYnpdYrNIil8aXWnSeC9u0/Fs81pnSXsOmF4eAeA6QtV0vdo+v9Uv9peyInyXnTXHHioJgvYQipSEY6PCY18YERIfbnjz4LT6gsxTVcdasjef7OOfhxaT5fG302Nz+1PmzHrfnxtOoj/co8SBtGQgLGCuNJSM8JJY3vhZ/ql9PT/i4KFPBMeg7j94tu148tesGn5Z8bsySz/GWtGX5Eftr+2C/uBaZ9Y8VRRQtQTHChpaYgOUnCZz+q73MR3tODK26VqwWD7G1Uqxtix7mANqi68nWzGkpf7AD6sU0h7+w7QAUGAWdE2BON5cU7Jvbnr0aGU+X+VaCIE5zzKkQbNNriz0rbvbD49z2bJb4NTZKMhgHLfmU8RbZGnslGVyzktzE8bSiwAguXM1kESB0YENTjENej0vfG4OupcO8mnghD1nY9nxDXmiNDMvn2vBryegxxMqyFo/HrfYUHdjRuohR80Xe4sHO0nSur0r99KmXJEKl4vD+w5t4biG1juUzl5SWvNiET21/n32OjdstMWg9a161vBa/S8jq2OfYFFuwByr2crlR6y/Yzp/NyVYKFAwsEQhsaWpdYC3j9XmxIBPAPZ5wyxwkJi1v+RKfHh/x5Cjrcjunw2O1OljjWnn2MaXt+fH4LT6WsNHiz5GNQMkFpJMIxnBB0Beas8NyVnuOLttDvFZ8LMdtz3e0VX7qx/ak7dnUcty3dBADy3ltS9+TreXX2KyR0f5a5sW68NVyfVlft2FP86kfzyhaWPdJadh2YaIs6wXv8S27Fq9Wn2Ox7Gheq12xj3mLLa3PY9pXqT+y1T/94zmJ/ak+2E4pltK4Z0vPoWSnZtzzVaM7V6b3Xa4oZ9PD8gAAHplJREFUXpAef25glr74Yn/ctuRrebiooLV6OTnEBpqTPeQxjh9toWgjdt0Hfx90j75jRcHEPOeaP/WuBj9MPVvsU9rcZ32vLQDI6Xn2ABwvLs/fFH6ND5YJcxqfyab41jq8HuxTy3GfdZiv2911oC+x9fhx9Svjj0DBBUCS7CNwDpLb+/Bd66NbF7rAen10v9auyJXmXBrXvlrltT76nh2PD71TTOPWqzRJvsPIgnHf0m1dVEt+ThJ6MXHc3Lbk98mzYrHWhGPicUufZQ+93XKtZa5antdizly13d6WDRQIg7Y4Xipg7XMtu9qP1cc6IAb0LdkpPNidojtXxwLYccYzdz4r6adAwaJ1iM2gdpCbcG7ITUQnoO6LLi4iKOyhDwp+C52jy36m2MFca3RFFteA/Uq7Rl/rHGp/33PJrGk8o2CxIkj8w3PrBFg+bcdDKfMRy74pkhV+vYUbxgsfb0JuKbrvNWr1p9evNG9tH31Q6Os++HukoaIgENDaAHKJ1Gyr8mND+CxdFMiV5gI7Vrxiw7NjyZd8LT0+N4Y5+rwulp1anrcmlr4nCz6uJfpTKc+tt5FuvTzDHIBhpHsB6fE9m1P4VXFUAs7zz/OYcrE8ux5f5pTzw3P2bIDv2crZyPmGXdAWWegsQdkvt5ewXWkj3XphQUHZyD4DnON/zThr42Kw8RrWtlvmoGV1v9anJWfN15Jbkjd37ZaMhWxFoFgLLEFbfDIQqgkd6lm+dqFZjvXFDy+cHuM4amNlneNq83y9GKbMNafj+dkH/1DjKs2d4maghIM1DZpbqtF4B5J4KC85l3FOFG0P+sIPP8TV5gN2gr/6Dxo5NraBdmkccktQvTa6X+ODbzSW/BSblp0pPMu3xfNs52RzY569DL8/zNOb54zw8DGkyFgJg+AijckNnrbv8bWc1+c4uM3yLp/mzXHo5JIxzRP7zGN99r1k24uj1cecWDHnOTZa4xX5Of5adB1Z/zCPBZkyqTk68IvkfuXG7d2tN99Wv7tu/+abd3f8gy7zpC38lMJmHMM4bIDCFvetNnig0GO7aGNMZNEGZR63oWvZhy7LWLxb/VqwXeFBNuXLdQhj8Mn64AWfcR1TfriWbP/6rTvJTdjKH0lgTmLkiSW7FI/8xa0XjNPgUDWQtCLTBdzfiVkW+kxZj/mdHbqb6zHuv/vBx7vtf6d7Bb77ve8XgcI5sY+2AqIBlMoErgnWAooEYPG1PYDwvQ++c7qzZJvd7g8VUFSSHgKIxkDRCct9ngASmcdr2iU9Pb5VlNOPJF1ROM+QUzovwC/RmptyycbFqzcjULxArArAstLGr8Lh6O4QdPnQnx7c7rz9/k4W0vrJnQg/jEtf2uAzhYwe133Y0HzW5zbkPQo70PHkhI8xyIJiDBR8oeBpqsfQh67Io81jmg+ZnH1PRuugz/4+/PjeKC+m5NKKOuknLHAERA/UfcoVExy6QqHHvFxbyzMQWU/LYYzvGloXOiwDPaEYZ17H789jaAdqP/1iXddP/8WAjo91vbbYhB6oJwt+rRzkS9Rbp5LevsZz882NWfEZc40VRSt0F8c4r4gRNtQahPZT0+fks/xZvBq7ItOqy7HAh8WbYrvTMdYcfjyKOQhF25Ot5XtzEn2MLecrvOdayp41x5m2U6AAADA6LIi6eBi3AirxYLNbcGWXdbUP3U9lxwnPflh2ahv+QWGH/egxyMyha9i04tmXH8t3C++Y4kyB4gWMZKgJMoLN3pbBx2AzBxZnDLqw5dGaeKELWdjGPDBu0RoZS28uL8aa/+IAcp6/0nhOz9O1+Gusk+VH4vX43lw039H3XzhqA16/dhEgh0T07E3lw36tvrMgo0Mlxys62k+tndq4WuRGsTg3Fm0zmZOho+1q/do+/HTrNvOr7lqfkMN1sa4ZZCwKPTVWBxRHeZRUyjjtZfPVBXpYWKufi2Gkp97V4MLDBmj0U/duB/I1VMdUo2PJIHaMoS9UzwMymtbKsZ7owBf4U+xAt5UutX7ar56D7ou84dveeumLoBfMMTZcONt5emFFxpLzbGPCViwYq6G8CJ5/badezn+Kpm1O6dfG4dm21s7iif4UX1N0vFhb+OwXbVBth68/xjxZjMt7lKOrtx55SBi8YNKGwZwRyJBBd4FZln1Bl8e7eIa/kphWI47H0gmxp3v3jmdsMeC7ROEHVMsL3xrjWMOc0ri0Ha9vrVewF9ZG+/HsLM334prjp3YutXJhnWY/VYtAsSbHF18C474ln+NhUTHBLnlp34rxnI2aMdi3ZHNjlnyJt1zM6c3A8qtj131LJ8ebei3Zr7S5D38l25YOdFvpkrYyvp2tFydwxR9Q4IXhtuW4NrnmLgD0QTkWjoHj5TbLL9XW9nVf/Ei8+C3ldy071tpavsJ8yjcDS9fiWesmcrXxWDZzvKNrtyJQLCecUGxI+FoefaFoQ0dPTNvlcW6L/iuvhc/sw6fb+nP7+Kk8PvdO5XKfi4dPxvEZOT4FB9V2wIef2E9jwufjTCGb2kw/N8eY1uM+2mIPbabgjz+FR4z4pwToRyp2oj6va4wT84AcfOs1gS3Io+/R67e+XXwwhFxamupcdOznt16ipJPeMgQZSXK0IacTP/Lz+3XY2b4efvA+ikSOtFDkC3QsAEAGFLIWVXnrA4WNsVPwYQjUcubxEnuFQ/YGlAcTKMgzL4c0n3NKj9X0C/58oGjjCESAEX52RQBwIK/tcB+yzJM2B70B5cEBCl93nRNWv1WebUAXFGNOTsYzighaya0NwWAnbxz0tTxAhQDEB9psK9gbg+8t+sze+kRbePjEmyn40AHF5908rvUgCwodi7Iut6ELaunyGMaZJ23wLSo8/LSs5rO+NwYb1rjm6Tiha/HBA9W2Pvz4k+TmqPPC6lu5asktxLMrCpLdS+iScwaDnhBssw3NQx9UZFtiYT34MXmFbR90l6YSi56P7ls+rTlAjsdqbEFvScox1Ni15C1eydYUnZJNjPe2baBACJST3bsILAO9Fsp2Jbjc5OErJ1PrG7Y8ee2jJO/ZEb62lZPVY3N0a2x59qfMF7ZEF+0w/+UeEes5rdyPW690QuMtUC4QTvKwIEE/tYm3yD2dcDeHPfgDzcc2ngvscKywwWPgTaWwhTjRn2rP0kMia9vgWzpr8XQMrX40sFh/tm16Nyh2G+2lFUUuKBtAGzQ4OMy7AmLkxc4lC+R50cL80zXoxieAWvSW+GEOHG+rXdGdpd/PHzaGmCauC/Rb57GmPOYGH6ofKwoELIo7ojUmPD1xOAFlPciC8phuQ8ayo2W9vqe7hG3P53HwMR/x7c0ZcfE42qCQ2Sed6lvr6X5uDi2y6R+X0HcNVao8p3yBXBmyBfnu7q18evpL8hsXaKgKiFvHkruJYGyqT+1L+kvasuyvwdNrl5tDbsyLDevsjbfyDXt1FaXVUUleL1xJ3ho3JjMktSWvedDnWLgNecihX0OnXGyxW9LD+ECHG037Nq9lXvBXM/eSTM7vsn7GZ9NSbJnx9IyiBXOBI6ksGVkMjGub0s+OUfXpZFVf61v+tU9cnBpZrct9yw5sgrK81YZcbg2gB3/o75MizhafNXOqtYe518RhydTydDx6Dn3fB4pWYIMyCT3eGpjoYzHYttXWviyZHC/npzVu8TMnHssfYs+NQWYpijVhn1PnJTZgB3SJOLWtqfEhlpE94yYMWUXHQAEIsJBKobi90cF4+rA/0IlPULT9Ln66cDzOsXGbZaStx/QF0uNan/stsvA9rEn9hSxeF47pkNqY6xIxta411tvyrWwtd0YRw8r45IvHiyd/zT5+zh0/+WZe+Hy77hNyfOqNT8DxyXjo86fmY3vQ1RQ2LL4ei5/Ap/ahG+JI5wkbYSzGCB2haEMWPFDY1X3mcxtyoBizqMgIH7Los6w1Bjn+zJ6vvZXAa/OcHE4rCt85uc3BsSFvUtDV4wO/oXpsH0U+GB9FIjc411rayEtQSzfnQ+up3PUrihJMqoMegxOh47H2JzI8yQ0oDwZQcM2RS+ivSRt8xYrCaONk94zVyPAkE/nhsWb6CI9jgO721+w3oCAXLJrklTrTeblr2cnxhn8KzM5yCnPGLBCIPfZtybx1N/1r9vicWz7V5jb6modPunmcZdAWym3W023IsU3IwI5FIQPKMrCFMd2HLPOZBz54TGHT4kGPKdo5eRljOWnzT+uiDxnun4S/Zn/u6vXxnyvqErjhHBESPq0ODCqNbN2HLPig4M+h2pb0AUg91uLH0/X4Jdtaj28gWlfL6nHu52RrfeTk2NfUtraP6zPVXoueXh8dS29rfEZxBIczioxDBlSMWZPj8ZbgIYtJWLYh0/lWJZfH0PZigQ+2o2VFphQD/EylsN/5ysyH453qC3rwif5UulRMpblPjW8BvXBG0QtWmrg1LskFPqgVICeh+M3JWvqap2PX47o/15+2J/01bFp+1uRhDnx9lvS3xLX24kHsGNd98C1aOd9xRYGxmgRkGQQnNG2nT73iWOSDB981tPPTuD207Lb4tmS9NYAvS2cYWyB+sZXzAV+tdA2bOoZ9+NA+a/sKQPGpV60BT04ZHrZqIm+NIcGwWJaM9gVZzff6LfI5WYm1Kr49J77EXBMX1ic3R8i0Um0T11Xs6DG2jbghA1rSYxvcZn3mL9SuA0pIlPSwjolKIBwkLxSCrE00yOco+8rJ5cZqbfAcc/ZkrMYmy3Bb6+uxku/a8ZJdHm+ZO/u3rj+Pt7anxgE/PKccD2OgSi8CRQ0kFQHKmsok9MJYExPbWk7bQr82jlo52J1KrflMtSV6ubgxJrRmvSA/L564BZ5jp5vbAmdOKwa9FlPmzTrc7uLOPDzp4ymfUXSQmAgnELcxXqI62JK8Htf6U2IQm2M78YylfZb63lqV9DA+Vx92NNVz1OPo18pBPketueSuUX4s3c3k/MqYngdi0fySHbIVK0qNEstYTq2ALDm2U9uGbU++1s9idsp3oaqqzPMpzaE0zrZq255Nj19r96TLqfnHilJKID1xZWi0VRB7sAkKG1oX/Baq70DSZz88bvnj8Ra/hya75Ny0Lb6GS8ybr49lT/u3ZMDzbHl86AnNyTgxhIrCimhzInGbHXZO6a+NiK7jqLu7emMeX+xfe+3N0Sfc+GQ7fMadfmLOn3ZzO9WJn7GLDD73Znlux/H0c3JLV/th3dgO/m0faTzQ0Xahq8fRR2zoW/rggbIOeKCeP0uHZaEvFP/EIOW9vbt+605z9dW5h7zM5RJkJtBYUSxlOBXagcB4/MnAAqDAs2xqHnSYz/rb18On/6NI+e5Lrn+XZ5ktLfKRc4XbGOf84fEZ7b6i9FVhcMRVgtpwVEpukYMt6IBqXUsOExXZ7evh0w8U+VAS+eFRK0882Vq+zsWMXr6iWIpewOI05xjJb9nM8TagnH6goKIgD5BjkS73CBs+NIUv4Rt57D/16hLf2mpRhTEMDiVUB5Lre3ZE587b7w+fv8udB59nC0VfU4wJn8fQZwp7kIMu8yHPPC3njcEubDBlGyyn+RgDHzbQB9V8rSdyLKv70GfKMroNObapeXoMNpjKX7PP5ceUsak3ZscXtl5tz6lhrDaYHBDEltjpgKm2bLX2EU+JFuPI7I9LtuM8pq1ljf19y5TWa0o84Vofzxpx1dCxF+Yat16eEfBhqCV5oaOD4n6NDMtbbdhArJABH31Ntbwe9/rWGlg81p/qi21YbbbrxeDxLXtL8TiupWweh50+hyJQOAi9sJi0ULQTedqOMX/ptpX4zLNjs2POxSY2YSuxb2xFLTve+lmyOR77zsnJmJb1rlXJTmkc61KUo7XK6WBM0zCndSqPvj6luSR/exjCCBh9puyA5XCRmMd63GYbzPfa2ib0Nd/TZz7iZB7auTHIaDpFR9vI9afMMWcPYyW7PL72HBFTidbGwbGzTY/PMla712s/o4gifpbhpXneAlkTt3gt8Xi+WmycVFncgKz4p6wr1pJ1wbN8CI9lIWPxMLZHmm69ckHlFhIBewsBXVDIC2Wfos99lvPaWp5j4LanD/7Yjr1l03LQb6GluKx1arE/V7bkvxR/yb/W5zXVY2yL5Zhf28a8JtiJQIGRGqd6MhMcjx4j52wgtpyMFbeO05JhHvwIj9uQqbUncdbKwjZo6xyhJ7RVF/LWXNmu1YZu65glv09eLu5MHBEoWogvdO1CShCsJzZzgWEMOqA6llxf68AmdMbj67+8gu9aqmOu1VtLrjWeZnk66M+dQ21utvpRc4pAEYfslNtwopMOfKEwXCPTyRuLBRtsN9gOye3Z9vXCUxNrLtqH7otNz58l28U58aPQGl3tc4l+d81nvjvKxdGy7t41zNnHGK4T2+A25GbQAJQWowhqitOcn1q7LJez58U3RYdtzdVnWzVtnm+NPMtIrF68Hp/10fZkPf6gZ9wMMSbU0xe+N5bTg23otgB10O1jVroRKDDOgfBFwrimcACqHLgTZtvsE3Y6XmahLX3haT7bq2ljfiyr58RjtW3LLnR5bAlfsJujlh+OI6dbOxauxzrvQmpjWEgubr0WMphs38SmLD5fAOsCwffcJIcdUMuejoXjgTzzYGspyv5h0+Mxf4iNtko8DltzafTTdpbLxTJ3PRHT3LlN0e9j9z+KLBn1Jo9JeeOwCzn0hWKxQTEmfdjjNsY1Zdvc1nKlvo7Dk0ds3niOX+sjZ+O0jy21RjoXGuzGiiJG5IJ3lD5J0cati9Lg0PxKNOejiymzBbPiKfFy/ljXAsCcuVr22F9r24rF4nl2w/XuH3hQpYJ8iy3ogJZ0c2uRGxP7JduIYUGKM4pdZmsSCkFHap8TMO4F7/lifo0Nlocvi1caK/mCfittsVsjW0qq1vjmyuuYdX+u/TX0rRgVb7z18haeFb3E8/nxQMd21pi0ZdObkyXLPJlPra4l560H+5A26+r10X2tW9u3YmG/JTs6jlpd1uN2N2+jipXiwLi2NfALj+ghJ9SzARkaTyuKnjwJJm/StVzntN+2hQDsCjUEQFsp+BCbaEOuhrIOt3O6VtJA3huzbEMWFDaEWrzAb79pWL7Z11pt9itt67pP9c22W2x46+rZaPXjyMeK4giYZwoJypIHTy8o+EEvDyJvwh6fbUPG4mGshuqLUbJnjYMHW6A1/j2ZnA295p6NGn7OT41+SQZrk5NjGW7ndFYci0CZ4sS7OFhoPV4zYei2xlNjGzYR11RfsMMUNplX2/Zin2Oz1vfScnPW1FsHiZHt5uSWmo/yEZ96wYFcHA4qBBm3C5BbgsKPBMVtzzYSR03CrXqenRY+fLIOYmVea5vnwO05dlp1IT/HP2yccjoGCk9YFrB1EQPQYuKzvdq29mklq7alk1fbGMtH8NfY1/pL9UtxLuWnxk5NLFpG9z0/cn30NfJkp/CXtq3mNQYKBKYmD/S9yepxy4/FY3tzFqVkm/1IW+Jlf7X6mCco27V4PM5t8Qf/LXpso9QOPujGkXkaVRODltF9jic3xnLH3I5AqQlYZCCHi8cT4IvKfLShAxvgM4UM80rtnD1PN6eTG3Pt0ZM8T6aG7wGxdl1KcuXxCBgd75R1ERusx21tf6m+t4Y19rE+ykY4zF+4cqN//Js+kbKUlIHkfCDyWAgtN/DVHboq+IokhH2xJ765X+NDy2Dumu/1a+Q9GV4ryDDP8+nxa+c++KIKUtKdE5cXr8cvxeLptfKxDhm9+1ev33rkoYtXbtzOCCVgqJVbekErJjM8588tMMZq44O8zDunw3LWGlm6Fs/S1Tz4mqqv7S3dr7lWnk/MTY97fC23Uv/+7dvv/chD5y/fOJJFnzLB0sXicc8+ZLAYoNakvTGx7dkXO7kxyw94U/Wi/ngr480BOqB6XcAXWmuDdbw224JPS3buWlg2l+B5cXlzSeZLxwkvlkuvvH7/9nvvPfzQyxdf/RwLwYE2yDL7aiMW9qcXJo1Tbx/Hicq2rLbYY7/chjx86lhkXPMgC90ShT7rgce6iAtyoCEGf94sx/ZKelp2zT5itOa97ziv3bz9yUPyvxfOXf654DxNMiwEgkbfopYMJgkafITKxfK44JZd8CAPW+hjnClkmLdkuybepfzJPPfprxR3Fw+daUryGM9dL8isSWtywopReNdvvfVMB5RnXzx6+Pzl14aziKXAk5DxkmOM80Vmu9xm2y1t8cH2S7pL+NQ+lrSZm8uifuifUfB8tH/Lp+bpPtvjdk4uN8Y2Wtp6Li26LHt07db9N++89+MdUOT/Xrx47VkWQFsmIU5rJhPk4v65FGxuHEBDHB7luNheF4vxtIzlxabue34Omb/EHJK1o4ph2faujSXbum6e7VY7Wr41Nsi/cuN2OJ8AKc+9fPRj5y7FqjJyZCSdltF9XnwZg3MtN7VfsueNe/xSHK16PP9W3VIsGPfsCn9K0nn2xF92bEJ+YA6ash+vrXVCfPbRwZKt4cn1e+Otdz4DjAz0xfPXnqkyoBaNE6JOPxw0eRFyeloulwAsy+2cfWtMdHN+LJ1W3hz7lu78+foPAKy5WTFALjcmMrlxnge3S3rwPZfC56s378hj4YcHgKDx3NkrP/LyxVfvyyQgzE4tXgi+bYETm/2dCLY1zdmHbE7G8sW8XJtvANzO6Sw9xn65XeOH1ycnL3L4iVzOTy7Bcz4OfUyv1eVX37h/++4H/x7YGNHnXrr8c2ePrseDfX8+4QXSRnU/tyg1svCFCwbKdiGT8IzyXysHO5Y8xpjm5Kx4WbfUrlkjy0aLXk42N2b5reXBbm7tam15cvDhjdfwL7/y+u7122+HJ10jhBDjmy8ePXruUgQLG8ckJSC0eRxtSRYZD3Kx4uiJ5GzAFmhny3kxqu1Gnbhv9WQgC9rFbYAO4yeV1qz1XJDz2tSuN+ss2fbma8UF3iUByVvvXLh9+/YPECT85jdfvPyobMMQOAyhDyp8LyDIeNSzKfK5MW2vRbbVtpa3fE2d/3geEdR6zOov5de2HW9u1vhJ4FnXyotbZK+8+sb91996+5lqkAA+33zx6JEXzl1788KVm/dxpxkqReaOyxcQejpAlpExLSfjmgc5i8/2WxYIejoe8HN0ih+xZ8U/xX8uNs+PpQPfLfOx5mDZtngtfiz9pXnyruTVW3c+eePOuz+L3J9En3vxyk+8dHT9mfOXX5MKg99wjrECx2JMXVDoa9seX8uV+kNyZADPNpbyyza9du2aIaZaec/fIfIxNx2bx9dy0i+sy32pIK/cfOuTW7fvfrq5iuSQJG/wX3j51R87e/m1nz13+fqjFy7fePTshWu//I0XLz1z5htn7z/9jbO7M984uwNFW/qahzGh+LEMjzOf29AD5THd5r62LWP4YUz3PT7sMoUuqNaFrPD5Bz70dF/bgS7k0IecR9k+2loXfNhGX8vpvicHOxwT2jwGe7DDY+BBBvrc53Yvf/+Z586/+fy5q5+RfD26euvRq9ff+PSN19/+5+aj3xwAlhj74pNPPfz5L3/ts48/cWa3/bY1OIAcuP/5L3/9mce+9NQjS+T34jYe+9LTjx7AIm1gfbBvWPe/8KWv/fLiyb20wQ0sW0U5zpvlF54481tL5/Rq9r7w5TPPHudibb4fVLA+/aYcA1ZL7KUNy95wS9YHNVmPb96PPfH0p5fO5dXtff6Jr9/bwHJ8SfMArv39E1VNgMDHn3j6yQfwYm0PEo7tQcLTbyL3ThR97MtnfmUDylZR9pUDn3/i6+UPGQ8RQdvTrw0k+wKJ+DmxQPn8l5/+3D4XavP1gAPzy2cuHmLBKMa0PSJ+wBN3/2eV8GeFipl5QAKfffKph7c7/AaUPefA/ce+9PXD/GTFw+YXn/j69inL/u+oD/wTty/81plnvZw8OP5/++2n/9qe7yQPfIJs6z1U75NRVR7/6lf/4uNPnLm9Xbjhwm0g3n9lfVNu1gdXQSSg3W73qb6SbCDZf2JsYByv+W05r0heLgYYSfA5v8ef+F8/+viXv/Yr2ycrWxU5wJ3EZyU/5+S36H72ySd/4KEDnNx2hxzfIbc1Od41+cwGlOO9ABsATsb6b0DZKuq2ZazIgQ0oFYu03fVPxl1/zeu0AWUDylZRKnJgA0rFIq15p9psn4xqtQFlA8pWUSpyYANKxSJtd/2Tcddf8zptQNmAslWUihzYgFKxSGveqTbbJ6NabUDZgLJVlIoc2IBSsUjbXf9k3PXXvE4bUDagbBWlIgc2oFQs0pp3qs32yahWG1A2oGwVpSIHNqBULNJ21z8Zd/01r9MGlA0oW0WpyIENKBWLtOadarN9MqrVBpQNKFtFqciBDSgVi7Td9U/GXX/N67QBZQPKVlEqcmADSsUirXmn2myfjGq1AWUDylZRKnJgA0rFIm13/ZNx11/zOm1A2YCyVZRCDtx//Ikzn3nosSfOfGb7bWuw5YCfA4//1td+fLE/zboZ2lbgNK/A/wfGeXPcGRtNMgAAAABJRU5ErkJggg==;fontSize=18;\" value=\"OpenSearch*&#xa;(Bitbucket &amp; Confluence)\" vertex=\"1\">\n          <mxGeometry height=\"90\" width=\"47.84\" x=\"388.15999999999997\" y=\"1600\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-15\" edge=\"1\" parent=\"1\" source=\"BTs9VdZK0QwFjo61O5EF-4\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=18;strokeColor=#FFFFFF;\" target=\"BTs9VdZK0QwFjo61O5EF-4\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"BTs9VdZK0QwFjo61O5EF-16\" parent=\"1\" style=\"rounded=1;whiteSpace=wrap;html=1;fontSize=18;strokeWidth=2;fillColor=none;gradientColor=#ffffff;dashed=1;\" value=\"\" vertex=\"1\">\n          <mxGeometry height=\"131\" width=\"378\" x=\"1152\" y=\"1529\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"wDGRsWGO3KaoXMvRnDRs-2\" parent=\"1\" style=\"text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;\" value=\"&lt;font style=&quot;font-size: 16px;&quot;&gt;* Optional if configure OpenSearch to be created as a sub-chart&lt;/font&gt;\" vertex=\"1\">\n          <mxGeometry height=\"30\" width=\"470\" x=\"70\" y=\"1870\" as=\"geometry\" />\n        </mxCell>\n      </root>\n    </mxGraphModel>\n  </diagram>\n</mxfile>\n"
  },
  {
    "path": "docs/docs/assets/images/ingress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<mxfile host=\"app.diagrams.net\" modified=\"2022-01-17T01:58:45.092Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.55 Safari/537.36\" etag=\"N5L5nUhQemftD2rxZTSJ\" version=\"15.2.7\" type=\"google\"><diagram name=\"Page-1\" id=\"aaaa8250-4180-3840-79b5-4cada1eebb92\">7V1bc+o4Ev41VM0+QFmSL/B4IMnsmc2cPTWZqrMzLyljBHhiLNY2CZlfP5ItGcsWxATfQswLWLLbdvfXF0mtZoBmm/3Pgb1d/0oW2BtAbbEfoJsBhMDSJvSLtbwmLUMEx0nLKnAX/KxDw4P7N+aNGm/duQscSidGhHiRu5UbHeL72ImkNjsIyIt82pJ48l239goXGh4c2yu2/nAX0TppHRvaof3f2F2txZ2BxnvmtvO0CsjO5/cbQLSMP0n3xha0+Pnh2l6Ql0wTuh2gWUBIlPza7GfYY8wVbEuuuzvSmz53gP2ozAW7W2en//b09Pv909y5Nf9cfXv+MbT0hMyz7e2weI/4aaNXwSH2ktsBmhZvyJ/hGQcR3qukZc8FkcMbUyhhssFR8ErP41cZVnIZBxGAOkoaXg4iAbrFObnOyMNEvNHmOFilxA+8oD84O85hjfE2a2LxY0YFUAa9rN0IP2xth/W+UH2hbeto4/HuJfEjjn9g0OMwCsgTnhGPBDE1pGmmOZulPQKOkF3rep440yc+pTFdBfbCpaLIEOD4Q9OFHa7TxyrK7TQU8tI8KjVTqILQfVCU2thUCg1dLrTp8vXrt0f0i+6g5Y/ggTh/PnwZWqggI7yg+s4PSRCtyYr4tnd7aJ0epKjRo8M594RsOQ//wlH0yoVn7yIiSxbv3eh/7PLRZGLw4z/iYxPxw5s9Jx8fvGYOvuPApS+PA96Wh8mZ4gvJLnDwCRYhfiLjSykp67okZaiPoDk5fMbwuCw50e/Epc+eUgRwAiSSBqA0LZlMZAcrHPErc6hIH/L92i2scka7zZESO/f2nPo8Sd625658+tuhImFymzKdcalP+cI7Nu5ikUALh+7f3Aoy4W7Z+8RvaEwHxo3KKlD74fqre7xk0h4CtQafBP8F9jjAnh25z7JvLC/ZYQ4LZLkM8aXyU7+r0Sv6G4oOQOcUHWh5mo0qPRgrXLrpRVwYEpzM/++I6BiGsZi+0BOAsd0fOumvFftmpiOhQ58rIZV0dNGioDMsioiB2rMoSAZQU/bFNMsHxhcq8uXhc0HPdF0fWYoQGimCMWBVEEGreahStxwPMzqQBq2aiKVDOZbOBsE02oVjy7iFqkA6jYNl5ZhqI02jiJ7F5pp+MX2Bs7gDxM0w1zpRtsYk8mdOjhC24qtpv4IIyLWxobN0bqzPdOC4ZVzY7FdsDD562s1x4FNHEo5cChT2msHX+MfNlixK4fE05EsPAARyMhBThvu1AWzSA+xTAIybtXHLeLOKg4Yeb1eBt64ADPQAu06ANYAoZZBpljBZSRzbdNBqGrnQXiwcZFgFdQWvkFEXs5BVe9CfyuNy/sm+MY3ts/E+UMX7sDb29fF+w9bLedy8H4op2kuHY6AIsYkCYeO6AKaXNmYd0E+gywqql2NeqrPVc68PLhpWT9dfvR+J+jEkngwumtVH+IH1sQMKid5mX6+Q3VFIeASKHVLIM9I52lPI4w5RGe+nLKyeXSVSPHoF7I4Cls9QaUsBjWaShi5IDTqedVS9FMQaHpAXloemanEKCt7Jum+k51YvLNUa35nLwVC1HDyjJwXE83BQdlmYcjKSBS/LiQtWIevyK8cqpMkZEfXrJe+doJEhQQIolpKUvqA2xVVN/VSBhf/O/6I+8afwXz0USkKhaBqaRUIFSSI9EqpAAjRaNgpWEQp6MUmwG2KSUn7bk5lYkm9LZHr9eTvVjYA6MAVRYsWjHwF1ZwT0rgXHZkdAoACgRhNzGXzaScwVdiGbmHtynSzJdj0lbm5b38zgLZ1keZloi7bho+VcUwkGrwk1Qxz+IW7EDg6k4qPX7FF3cVI207shnLS8CacCE3AMJ9rHxonVLZzoV2tPPjhOULdwokrzrWLbxld/FeAwfP94vMptGwypIZf+0TFkxSOWo+O6sVEYmKjS1mobxpmthhpAMgvGaatwsADc76Q2gBuUhsyAal/YyTWKrBm4bANZM2bAbDWs6DFx3u7hhjDRagjRYyLBRLfshFVMqzE6sbW7rLeuLMV6qI10E8mLr5zSe7dlVrrzUv36/c7uN0s4VK5wOSkf9pXK4EGi3E9DG7YVu3C7UaWhrCpfvn/6oMoQiPWoS8UqX1DfJuqJ1YYqX6h9ZcslpCVERDrbpdUSIJIJUmUrWxWlKGLtbVqJmalNd+satIMu1VrgtRV+j6GpDfLFFjItv/FRs1EKoSfVqcVqDKYqlqjfkACtRGKrHW6TAnFLd8/sR1bmiumWPArcTVwpriAc3n7jblb02T13zt4gdGxMv2++PYzC59Ugn5dnnm92ys/NwHwiu3monpStvFXTqt8RAakSH6tQd8pihluyi9jK6bXP1L0DDTmvAVFx6i71BlXP3R2ZNtIKAund/lGbqsO8qx6PDCND0nhfCIAK4cRpujWHAwIUGQMBOxrKn0Z1C963/kF3ia2BBfe6zYx66S3cbYgzA+GT4ktroUqZa5loKQmoUMYtq9yw7TBuPi7cgD4ZYay7eyHBUxhRLhP/0fFYEvxRB12/iU7zGCejiaEdPiUtNADWSEwGVT5LBktEVNTpeq5PXZsovSsmN7IpXgjesdsWNh1wR6j0jpLIhS7Hev+delYmPNo3J1FENgpljxg4iqA64QviY/5e7JZFLDNNw8HtM06sBRgUk7rsl1Af+ThiEHv0iL14nNue7TvxzXOJb5pm3d3d1en39bzftzRVFCimDLK4ssY1YQqpzEgVQeC3hOu0/37ax4BFLEB5mk4VA6qSAOtbvi1RCQL7iy+sfjcTiGeHoes0G89leGMoeCPaLhwxG7m9TywKs8pNxBRo5afyVbTqnpAtzuqgTkRxUtwwhGdM0QqoVjFFq42RXNRm2KXllpOL/H0GeFMZ4OGz06RzAFq+2ra6Bm8DCeNKAMIK9lspg4YHHDy7FJp9vFCABNBkSCBNPYuRDSSbnEJSBpK9UbpiowSNQyzTliVCsLdEbVsi1dClWdNTYl6kNz3XZHp09fpZs6anruWz3vSUNj26DpUzaI1anwrKUDAcxADIQeE7WWSKD8yDi4j1gCoCCkGzgJ66dk0o0aMsXdH7rg6Uj64MYmYuXDqy/NxWAfM+ePpkADz2j05tAbCv6HflACz7l2Kt/SdND8DPBcCuuWBTNXfaDyE+2BBCgAu0PKQQG7F7e3at9qw4pADdcqh9lfRPhkAEgWoirlnU9SPZK0ddPo7rBOr64esnQ13nvG2/AHE9owcdKv8GutFKTlZFgCoA4D+pUtNTHG8XRpeU2+8eKMDZ4qeMksQPoNhVkt1pUlE5ZnoYECaQtO9nZmt/JQuW9nv7Dw==</diagram></mxfile>"
  },
  {
    "path": "docs/docs/assets/stylesheets/extra.css",
    "content": ":root > * {\n\n    --md-primary-fg-color: #0052CC;\n    --md-primary-fg-color--light: #FFFFFF;\n    --md-primary-fg-color--dark: #172B4D;\n}\n\n[data-md-color-scheme=\"slate\"] {\n    --md-primary-fg-color: #172B4D;\n    --md-primary-fg-color--light: #ECB7B7;\n    --md-primary-fg-color--dark: #091E42;\n\n    --md-typeset-a-color: #4C9AFF\n}\n\na[target=\"_blank\"]::after, a.external::after {\n    content: url(\"../../icons/link_external.svg\");\n    margin: 0 2px 0 2px;\n    vertical-align: super;\n}\n\n.atl-bright-color {\n    color: #0065FF !important;\n}\n"
  },
  {
    "path": "docs/docs/containers/.pages",
    "content": "nav:\n    - Jira: JIRA.md\n    - Confluence: CONFLUENCE.md\n    - Bitbucket: BITBUCKET.md\n    - Bitbucket Mesh: BITBUCKET-MESH.md\n    - Bamboo Agent: BAMBOO-AGENT.md\n    - Bamboo: BAMBOO.md\n    - Crowd: CROWD.md\n    - ...\n"
  },
  {
    "path": "docs/docs/containers/BAMBOO-AGENT.md",
    "content": "# ![Atlassian Bamboo](https://wac-cdn.atlassian.com/dam/jcr:560a991e-c0e3-4014-bd7d-2e65d4e4c84a/bamboo-icon-gradient-blue.svg?cdnVersion=814){: style=\"height:35px;width:35px\"} Bamboo Agent\n\n## Overview\n\nA Bamboo Agent is a service that can run job builds. Each agent has a defined set of capabilities and can run builds\nonly for jobs whose requirements match the agent's capabilities. \n\n\nIf you are looking for **Bamboo Docker Image** it can be found [here](https://hub.docker.com/r/atlassian/bamboo/).\nTo learn more about Bamboo, see: <https://www.atlassian.com/software/bamboo>\n\nThis Docker container makes it easy to get a Bamboo Remote Agent up and running. It is intended to be used as a base to \nbuild from, and as such contains limited built-in capabilities:\n\n* JDK 11, JDK 17 (from v9.4.0), JDK 21 (from v10.1.0)\n* Git & Git LFS\n* Maven 3\n* Python 3\n\nUsing this image as a base, you can create a custom remote agent image with your\ndesired build tools installed. Note that Bamboo Agent Docker Image does not\ninclude a Bamboo server.\n\n**Use docker version >= 20.10.9.**\n\n## Quick Start\n\nFor the `BAMBOO_AGENT_HOME` directory that is used to store the repository data (amongst other things) we recommend mounting a host directory as a [data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes), or via a named volume.\n\nTo get started you can use a data volume, or named volumes. In this example we'll use named volumes.\n\nRun an Agent:\n```shell\ndocker volume create --name bambooAgentVolume\ndocker run -e BAMBOO_SERVER=http://bamboo.mycompany.com/agentServer/ -v bambooAgentVolume:/var/atlassian/application-data/bamboo-agent --name=\"bambooAgent\" --hostname=\"bambooAgent\" -d atlassian/bamboo-agent-base\n```\n!!! success \"The Bamboo remote agent is now available to be approved in your Bamboo administration.\"\n\n### Verbose container entrypoint logging\n\nDuring the startup process of the container, various operations and checks are performed to ensure that the application\nis configured correctly and ready to run. To help in troubleshooting and to provide transparency into this process, you\ncan enable verbose logging. The `VERBOSE_LOGS` environment variable enables detailed debug messages to the container's\nlog, offering insights into the actions performed by the entrypoint script.\n\n* `VERBOSE_LOGS` (default: false)\n\n  Set to `true` to enable detailed debug messages during the container initialization.\n\n## Configuration\n\n* `BAMBOO_SERVER` (required)\n\n   The URL of the Bamboo Server the remote agent should connect to, e.g. `http://bamboo.mycompany.com/agentServer/`\n\n* `SECURITY_TOKEN` (default: NONE)\n\n   If security token verification is enabled, this value specifies the token required to authenticate to the Bamboo server\n\n* `WRAPPER_JAVA_INITMEMORY` (default: 256)\n\n   The minimum heap size of the JVM. This value is in MB and should be specified as an integer\n\n* `WRAPPER_JAVA_MAXMEMORY` (default: 512)\n\n   The maximum heap size of the JVM. This value is in MB and should be specified as an integer\n\n* `IGNORE_SERVER_CERT_NAME` (default: false)\n\n   Ignore SSL certificate hostname if it's issued to a different host than the one under your Bamboo Base URL hostname\n\n* `ALLOW_EMPTY_ARTIFACTS` (default: false)\n\n   Allow empty directories to be published as artifacts\n\n* `BAMBOO_AGENT_PERMISSIVE_READINESS` (default: unset/false)\n\n   If set to 'true', the readiness probe will be more permissive and not expect\n   the agent to be fully configured, only that the startup wrapper is\n   running. This is primarily intended for use when deploying agents into\n   environments where the server may not yet be configured.\n\n* `BAMBOO_AGENT_CLASSPATH_DIR` (default: NONE)\n\n   If set, agent startup process will copy agent classpath from designated location instead of downloading it from the server.\n   This can speed up the process and reduce the load on the Bamboo server.\n\n### Dedicated agent specific configuration\n\n* `AGENT_EPHEMERAL_FOR_KEY` (default: NONE)\n\n  The value specifies the purpose for spawning the agent. It needs to be a valid ResultKey.\n\n* `KUBE_NUM_EXTRA_CONTAINERS` (default: 0) \n\n  The number of extra containers that run in parallel with the Bamboo Agent. We make sure these extra containers are run before the Agent kick in.\n\n* `EXTRA_CONTAINERS_REGISTRATION_DIRECTORY` (default: /pbc/kube)\n\n  The directory where extra containers should register their readiness by creating any file. The image waits for having `KUBE_NUM_EXTRA_CONTAINERS` number of files inside this directory (if the one exists) before processing further and running the actual agent.\n\n### Ephemeral agent specific configuration\n\n* `BAMBOO_EPHEMERAL_AGENT_DATA` (default: NONE)\n\n  The Bamboo Ephemeral Agents specific configuration. It was designed to pass multiple key-value properties separated by the `#`. Example: `BAMBOO_SERVER=http://localhost#SECURITY_TOKEN=123456789#bamboo.agent.ephemeral.for.key=PROJ-PLAN-JOB1-1`\n\n### Additional agent wrapper properties\n\n* `BAMBOO_WRAPPER_JAVA_ADDITIONAL_PROPERTIES` (default: NONE)\n\n  Adds `wrapper.java.additional.X` entries to the Agent's `conf/wrapper.conf`. It was designed to pass multiple key-value properties separated by the `#`. Example: `log4j2.configurationFile=/path/to/log4j2.properties#javax.net.ssl.keyStore=/var/atlassian/application-data/bamboo-agent/ssl/bamboo.secure.client.ks`\n\n## Extending base image\n\nThis Docker image contains only minimal setup to run a Bamboo agent which might not be sufficient to run your builds. If you need additional capabilities you can extend the image to suit your needs.\n\nExample of extending the agent base image by Maven and Git:\n```Dockerfile\nFROM atlassian/bamboo-agent-base:9.6.8\nUSER root\nRUN apt-get update && \\\n    apt-get install maven -y && \\\n    apt-get install git -y\n\nUSER ${BAMBOO_USER}\nRUN /bamboo-update-capability.sh \"system.builder.mvn3.Maven 3.3\" /usr/share/maven\nRUN /bamboo-update-capability.sh \"system.git.executable\" /usr/bin/git\n```\n\n## Building your own image\n\n* Clone the Atlassian repository at <https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base>\n* Modify or replace the [Jinja](https://jinja.palletsprojects.com/) templates\n  under `config`; _NOTE_: The files must have the `.j2` extensions. However you\n  don't have to use template variables if you don't wish.\n* Build the new image with e.g: `docker build --tag my-bamboo-image --platform linux/amd64,linux/arm64 --build-arg BAMBOO_VERSION=X.Y.Z .`\n* Optionally push to a registry, and deploy.\n\n## Issue tracker\n\n* You can view know issues [here](https://jira.atlassian.com/projects/BAM/issues/filter=allissues).\n* Please contact our support if you encounter any problems with this Dockerfile.\n\n## Supported JDK versions and base images\n\nBamboo Docker images are based on JDK 11, JDK 17 (from Bamboo 9.4), and JDK 21 (from Bamboo 10.1) and generated from the\n[official Eclipse Temurin OpenJDK Docker images](https://hub.docker.com/_/eclipse-temurin) and\n[Red Hat Universal Base Images](https://catalog.redhat.com/software/containers/ubi9/openjdk-17/61ee7c26ed74b2ffb22b07f6?architecture=amd64).\nStarting in Bamboo 9.4, UBI tags are available in 2 formats: `<version>-ubi9`, `<version>-ubi9-jdk17`, or `<version>-ubi9-jdk21>`\n\nThe Docker images follow the [Atlassian Support end-of-life\npolicy](https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html);\nimages for unsupported versions of the products remain available but will no longer\nreceive updates or fixes.\n\nHowever, Bamboo is an exception to this. Due to the need to support JDK 11 and\nKubernetes, we currently only generate new images for Bamboo 9.1 and up. Legacy\nbuilds for JDK 8 are still available in Docker Hub, and building custom images\nis available (see above).\n\nHistorically, we have also generated other versions of the images, including\nJDK 8, Alpine, and 'slim' versions of the JDK. These legacy images still exist in\nDocker Hub, however they should be considered deprecated, and do not receive\nupdates or fixes.\n\nIf for some reason you need a different version, see \"Building your own image\".\n\n## Migration to UBI\n\nIf you have been mounting any files to `${JAVA_HOME}` directory in `eclipse-temurin` based container, `JAVA_HOME` in UBI container is set to `/usr/lib/jvm/java-17` (JDK17) and `/usr/lib/jvm/java-21` (JDK21).\n\nAlso, if you have been mounting and running any custom scripts in the container, UBI-based images may lack some tools and utilities that are available out of the box in eclipse-temurin tags. If that's the case, see [Building your own image](#building-your-own-image).\n\n## Supported architectures\n\nCurrently, the Atlassian Docker images are built for the `linux/amd64` and `linux/arm64` target\nplatforms; we do not have other architectures on our roadmap at this\npoint. However, the Dockerfiles and support tooling have now had all\narchitecture-specific components removed, so if necessary it is possible to\nbuild images for any platform supported by Docker.\n\n### Building on the target architecture\n\nThe simplest method of getting a platform image is to build it on a target\nmachine; and specify either `linux/amd64` or `linux/arm64`. See [Building your own image](#building-your-own-image) above.\n\nNote: This method is known to work on Mac M1 and AWS ARM64 machines, but has not\nbeen extensively tested.\n\n## Support\n\nFor product support, go to <https://support.atlassian.com>\n\nYou can also visit the [Atlassian Data Center](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes)\nforum for discussion on running Atlassian Data Center products in containers.\n"
  },
  {
    "path": "docs/docs/containers/BAMBOO.md",
    "content": "# ![Atlassian Bamboo](https://wac-cdn.atlassian.com/dam/jcr:560a991e-c0e3-4014-bd7d-2e65d4e4c84a/bamboo-icon-gradient-blue.svg?cdnVersion=814){: style=\"height:35px;width:35px\"} Bamboo\n\n!!! warning \"Server image deprecation\"\n    This Docker image has been published as both `atlassian/bamboo` and `atlassian/bamboo-server` up until February 15, 2024.\n    Both names refer to the same image. However, post-February 15, 2024, the `atlassian/bamboo-server` version ceased \n    receiving updates, including both existing and new tags. If you have been using `atlassian/bamboo-server`, \n    switch to the `atlassian/bamboo` image to ensure access to the latest updates and new tags.\n\n\n## Overview\n\nBamboo is a continuous integration and deployment tool that ties automated builds, tests and releases together in a single workflow.\n\nLearn more about Bamboo: <https://www.atlassian.com/software/bamboo>\n\nThis Docker container makes it easy to get an instance of Bamboo up and running.\n\n**Use docker version >= 20.10.10**\n\n## Quick Start\n\nFor the `BAMBOO_HOME` directory that is used to store the repository data\n(amongst other things) we recommend mounting a host directory as a [data\nvolume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes),\nor via a named volume.\n\nAdditionally, if running Bamboo in Data Center mode it is required that a\nshared filesystem is mounted.\n\nTo get started you can use a data volume, or named volumes. In this example\nwe'll use named volumes.\n```shell\ndocker volume create --name bambooVolume\ndocker run -v bambooVolume:/var/atlassian/application-data/bamboo --name=\"bamboo\" -d -p 8085:8085 -p 54663:54663 atlassian/bamboo\n```\n!!! success \"Bamboo is now available on <http://localhost:8085>.\"\n\nPlease ensure your container has the necessary resources allocated to it. We\nrecommend 2GiB of memory allocated to accommodate the application server. See\n[System Requirements](https://confluence.atlassian.com/display/BAMBOO/Bamboo+Best+Practice+-+System+Requirements)\nfor further information.\n\n!!! tip \"If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):8085` instead.\"\n\n\n## Common settings\n\n### Verbose container entrypoint logging\n\nDuring the startup process of the container, various operations and checks are performed to ensure that the application\nis configured correctly and ready to run. To help in troubleshooting and to provide transparency into this process, you\ncan enable verbose logging. The `VERBOSE_LOGS` environment variable enables detailed debug messages to the container's\nlog, offering insights into the actions performed by the entrypoint script.\n\n* `VERBOSE_LOGS` (default: false)\n\n   Set to `true` to enable detailed debug messages during the container initialization.\n\n### Memory / Heap Size\n\nIf you need to override Bamboo's default memory allocation, you can control the minimum heap (Xms) and maximum heap (Xmx) via the below environment variables.\n\n* `JVM_MINIMUM_MEMORY` (default: 512m)\n\n   The minimum heap size of the JVM\n\n* `JVM_MAXIMUM_MEMORY` (default: 1024m)\n\n   The maximum heap size of the JVM\n\n### Tomcat and Reverse Proxy Settings\n\nIf Bamboo is run behind a reverse proxy server as [described\nhere](https://confluence.atlassian.com/kb/integrating-apache-http-server-reverse-proxy-with-bamboo-753894403.html),\nthen you need to specify extra options to make Bamboo aware of the setup. They\ncan be controlled via the below environment variables.\n\n* `ATL_PROXY_NAME` (default: NONE)\n\n   The reverse proxy's fully qualified hostname. `CATALINA_CONNECTOR_PROXYNAME`\n   is also supported for backwards compatibility.\n\n* `ATL_PROXY_PORT` (default: NONE)\n\n   The reverse proxy's port number via which Bamboo is\n   accessed. `CATALINA_CONNECTOR_PROXYPORT` is also supported for backwards\n   compatibility.\n\n* `ATL_TOMCAT_PORT` (default: 8085)\n\n   The port for Tomcat/Bamboo to listen on. Depending on your container\n   deployment method this port may need to be\n   [exposed and published][docker-expose].\n\n* `ATL_TOMCAT_PROTOCOL` (default: HTTP/1.1)\n\n   The protocol to be used by Tomcat. Bamboo provides additional customized protocols that will support encryption\n   along with `ATL_TOMCAT_BAMBOO_ENCRYPTION_KEY`. For more information, see [Encrypting passwords in server][encrypting-passwords-in-server].\n\n* `ATL_TOMCAT_SCHEME` (default: http)\n\n   The protocol via which the application is accessed. `CATALINA_CONNECTOR_SCHEME` is also\n   supported for backwards compatibility.\n\n* `ATL_TOMCAT_SECURE` (default: false)\n\n   Set 'true' if `ATL_TOMCAT_SCHEME` is 'https'. `CATALINA_CONNECTOR_SECURE` is\n   also supported for backwards compatibility.\n\n* `ATL_TOMCAT_CONTEXTPATH` (default: NONE)\n\n   The context path the application is served over. `CATALINA_CONTEXT_PATH` is\n   also supported for backwards compatibility.\n\nThe following Tomcat/Catalina options are also supported. For more information,\nsee <https://tomcat.apache.org/tomcat-9.0-doc/config/index.html>.\n\n* `ATL_TOMCAT_ACCEPTCOUNT` (default: 100)\n* `ATL_TOMCAT_CONNECTIONTIMEOUT` (default: 20000)\n* `ATL_TOMCAT_ENABLELOOKUPS` (default: false)\n* `ATL_TOMCAT_MAXHTTPHEADERSIZE` (default: 8192)\n* `ATL_TOMCAT_MAXTHREADS` (default: 150)\n* `ATL_TOMCAT_MGMT_PORT` (default: 8007)\n* `ATL_TOMCAT_MINSPARETHREADS` (default: 25)\n* `ATL_TOMCAT_URIENCODING` (default: UTF-8)\n* `ATL_TOMCAT_STUCKTHREADDETECTIONVALVE_THRESHOLD` (default: 60)\n\nThe standard HTTP connectors (NIO, NIO2 and APR/native) settings\n\n* `ATL_TOMCAT_ADDRESS`\n\n   For servers with more than one IP address, this attribute specifies which \n   address will be used for listening on the specified port.\n\n* `ATL_TOMCAT_SECRET` (default: null)\n\n   Only requests from workers with this secret keyword will be accepted. The\n   default value is null. This attribute must be specified with a non-null, \n   non-zero length value unless secretRequired is explicitly configured to be false. \n   If this attribute is configured with a non-null, non-zero length value then the workers\n   must provide a matching value else the request will be rejected irrespective of the\n   setting of secretRequired.\n\n* `ATL_TOMCAT_SECRET_REQUIRED` (default: false)\n\n   If this attribute is true, the AJP Connector will only start if the secret \n   attribute is configured with a non-null, non-zero length value. This attribute only \n   controls whether the secret attribute is required to be specified for the AJP Connector\n   to start. It does not control whether workers are required to provide the secret. The\n   default value is true. This attribute should only be set to false when the Connector \n   is used on a trusted network.\n\n* `ATL_TOMCAT_BAMBOO_ENCRYPTION_KEY`\n  \n   File which contains encryption key used for Bamboo-specific connectors.\n\n* `ATL_TOMCAT_SSL_ENABLED`\n\n   Set this attribute to `true` to enable SSL traffic on a connector.\n\n* `ATL_TOMCAT_SSL_PROTOCOL`\n\n   JSSE only.  The SSL protocol(s) to use (a single value may enable multiple protocols\n   - see the JVM documentation for details).\n  \n* `ATL_TOMCAT_SSL_CERTIFICATE_FILE`\n\n   Name of the file that contains the server certificate. The format is PEM-encoded. \n   Relative paths will be resolved against $CATALINA_BASE.\n\n* `ATL_TOMCAT_SSL_CERTIFICATE_KEY_FILE`\n\n   Name of the file that contains the server private key. The format is PEM-encoded. \n   The default value is the value of certificateFile and in this case both certificate\n   and private key have to be in this file (NOT RECOMMENDED). Relative paths will be \n   resolved against $CATALINA_BASE.\n\n* `ATL_TOMCAT_SSL_PASS`\n\n   The password used to access the private key associated with the server certificate \n   from the specified file.\n\n* `ATL_TOMCAT_KEYSTORE_FILE`\n\n   JSSE only. The pathname of the keystore file where you have stored the server certificate\n   and key to be loaded. By default, the pathname is the file .keystore in the operating \n   system home directory of the user that is running Tomcat.\n\n* `ATL_TOMCAT_KEYSTORE_PASS`\n\n   JSSE only. The password to use to access the keystore containing the server's private\n   key and certificate. If not specified, a default of _changeit_ will be used.\n\n* `ATL_TOMCAT_KEY_PASS`\n\n   The password used to access the private key associated with the server certificate \n   from the specified file.\n\n* `ATL_TOMCAT_KEY_ALIAS`\n\n   Specify the key alias to be loaded in case the provided keystore contains multiple \n   private key aliases.\n\n* `ATL_TOMCAT_CLIENT_AUTH`\n \n   Set to required if you want the SSL stack to require a valid certificate chain from\n   the client before accepting a connection. Set to optional if you want the SSL stack\n   to request a client Certificate, but not fail if one isn't presented. Set to optionalNoCA\n   if you want client certificates to be optional and you don't want Tomcat to check them \n   against the list of trusted CAs. If the TLS provider doesn't support this option (OpenSSL\n   does, JSSE does not) it is treated as if optional was specified. A none value (which is \n   the default) will not require a certificate chain unless the client requests a resource \n   protected by a security constraint that uses CLIENT-CERT authentication.\n\n* `ATL_TOMCAT_TRUSTSTORE_FILE`\n\n   JSSE only. The trust store file to use to validate client certificates. The default is\n   the value of the javax.net.ssl.trustStore system property. If neither this attribute nor\n   the default system property is set, no trust store will be configured. Relative paths will\n   be resolved against $CATALINA_BASE. A URL may also be used for this attribute.\n\n* `ATL_TOMCAT_TRUSTSTORE_PASS`\n\n   JSSE only. The password to access the trust store. The default is the value of the \n   javax.net.ssl.trustStorePassword system property. If that property is null, no trust\n   store password will be configured. If an invalid trust store password is specified, \n   a warning will be logged and an attempt will be made to access the trust store without\n   a password which will skip validation of the trust store contents.\n\n* `ATL_TOMCAT_COMPRESSION`\n\n   Enables HTTP compression. The acceptable values for the parameter are:\n\n* `off` or `0` - disabled compression\n* `on` - enabled compression\n* `force` - forces compression in all cases\n* `numerical integer value`,   e.g. `100` - which is equivalent to `on`, but specifies the \n   minimum amount of data before the output is compressed. If the content length is not known\n   and compression is set to `on` or more aggressive, the output will also be compressed.\n\n   If not specified, compression will remain disabled.\n\n* `ATL_TOMCAT_COMPRESSIBLEMIMETYPE`\n\n   A comma-separated list of MIME types for which HTTP compression may be used.\n   Only applicable if `ATL_TOMCAT_COMPRESSION` is set to `on` or `force`.\n   If not specified, this attribute defaults to \n   `text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml`.\n\n* `ATL_TOMCAT_COMPRESSIONMINSIZE`\n\n   The minimum amount of data before the output is compressed. Only applicable if \n   `ATL_TOMCAT_COMPRESSION` is set to `on` or `force`. If not specified, this attribute \n   defaults to `2048`.\n\n* `ATL_TOMCAT_REQUESTATTRIBUTESENABLED`\n\n   Checks for the existence of request attributes (typically set by the RemoteIpValve and similar) \n   that should be used to override the values returned by the request for remote address, \n   remote host, server port and protocol. This property is usually combined with `ATL_TOMCAT_TRUSTEDPROXIES`\n   and `ATL_TOMCAT_INTERNALPROXIES` to show IP address of the remote host instead of the load balancer's.\n   If not declared, the default value of `false` will be used.\n\n* `ATL_TOMCAT_TRUSTEDPROXIES`\n\n   A list of IP addresses separated by a pipe character e.g. `10.0.9.6|10.0.9.32`.  \n   Trusted proxies that appear in the `remoteIpHeader` will be trusted and *will appear* \n   in the `proxiesHeader` value. By adding a list of Trusted Proxies, Bamboo will remove the \n   load balancers' IP addresses from Bamboo's view of the incoming connection. This could be desired\n   in a clustered load balancer architecture where the load balancer address changes depending on \n   which node proxies the connection, requiring re-approval of Agents. \n   If not specified, no trusted proxies will be trusted.\n\n* `ATL_TOMCAT_INTERNALPROXIES`\n\n   A list of IP addresses separated by a pipe character e.g. `10.0.9.6|10.0.9.32`.  \n   Trusted proxies that appear in the `remoteIpHeader` will be trusted and *will not appear* \n   in the `proxiesHeader` value. By adding a list of Internal Proxies, Bamboo will remove the \n   load balancers' IP addresses from Bamboo's view of the incoming connection. This could be desired\n   in a clustered load balancer architecture where the load balancer address changes depending on \n   which node proxies the connection, requiring re-approval of Agents.\n   If not specified, no internal proxies will be trusted.\n\n### Access Log Settings\n\nYou can set the maximum number of days for access logs to be retained before being deleted. The default value of -1 means never delete old files.\n\n* `ATL_TOMCAT_ACCESS_LOGS_MAXDAYS` (default: -1)\n\n\n### JVM configuration\n\nIf you need to pass additional JVM arguments to Bamboo, such as specifying a\ncustom trust store, you can add them via the below environment variable\n\n* `JVM_SUPPORT_RECOMMENDED_ARGS`\n\n   Additional JVM arguments for Bamboo. \n\n??? example\n    `docker run -e JVM_SUPPORT_RECOMMENDED_ARGS=-Djavax.net.ssl.trustStore=/var/atlassian/application-data/bamboo/cacerts\n    -v bambooVolume:/var/atlassian/application-data/bamboo --name=\"bamboo\" -d -p 8085:8085 -p 54663:54663 atlassian/bamboo`\n\n### Bamboo-specific settings\n\n* `ATL_AUTOLOGIN_COOKIE_AGE` (default: 1209600; two weeks, in seconds)\n\n   The maximum time a user can remain logged-in with 'Remember Me'.\n\n* `BAMBOO_HOME`\n\n   The Bamboo home directory. This may be on an mounted volume; if so it\n   should be writable by the user `bamboo`. See note below about UID\n   mappings.\n\n* `ATL_BROKER_URI` (default: nio://0.0.0.0:54663)\n\n   The ActiveMQ Broker URI to listen on for in-bound remote agent communication.\n\n* `ATL_BROKER_CLIENT_URI`\n\n   The ActiveMQ Broker Client URI that remote agents will use to attempt to establish a connection to the ActiveMQ Broker on the Bamboo server.\n\n* `ATL_BAMBOO_SKIP_CONFIG` (defaults to `False`)\n\n   If `true` skip the generation of `bamboo.cfg.xml`. This is only really useful\n   for Bamboo versions >= 8.1, which added environment-based configuration (see\n   next section).\n\n#### Optional configuration pre-seeding\n\nOptionally, for new deployments, the setup flow can be skipped by provided the\nrequired values via the environment. NOTE: This only work with Bamboo versions >= 8.1.\n\n* `SECURITY_TOKEN`\n\n   The security token to use for server/agent authentication. Additional details\n   [are available here](https://confluence.atlassian.com/bamboo/agent-authentication-289277196.html#Agentauthentication-SecuritytokenverificationSecuritytokenverification)\n\n* `ATL_BAMBOO_DISABLE_AGENT_AUTH` (default: false)\n\n   Whether to disable agent authentication. Defaults to false.\n\n* `ATL_LICENSE`\n\n   The licence to supply. Licenses can be generated at <https://my.atlassian.com>.\n\n* `ATL_BASE_URL`\n\n   Bamboo instance Base URL.\n\n* `ATL_ADMIN_USERNAME`\n* `ATL_ADMIN_PASSWORD`\n* `ATL_ADMIN_FULLNAME`\n* `ATL_ADMIN_EMAIL`\n\nThe admin details and credentials.\n\n* `ATL_IMPORT_OPTION`\n   \n   Import data from backup file during setup. Default value is 'clean' which skip import step and create Bamboo home \n   from scratch. If value is 'import' then `ATL_IMPORT_PATH` should contain path to backup archive.\n\n* `ATL_IMPORT_PATH`\n\n   Full path to backup archive. \n   \n### Database configuration\n\nIt is optionally possible to configure the database from the environment,\nwhich will pre-fill it for the installation wizard. The password cannot be pre-filled.\n\nThe following variables are all must all be supplied if using this feature:\n\n* `ATL_JDBC_URL`\n\n   The database URL; this is database-specific.\n\n* `ATL_JDBC_USER`\n\n   The database user to connect as.\n\n* `ATL_JDBC_PASSWORD`\n\n   The database user password to connect with.\n\n* `ATL_DB_TYPE`\n\n   The type of database; valid supported values are:\n\n   * `h2` - for evaluation needs only\n   * `mssql`\n   * `mysql`\n   * `oracle`\n   * `postgresql`\n\n???+ note \"MySQL or Oracle JDBC drivers\" \n    Due to licensing restrictions Bamboo does not ship with a MySQL or Oracle JDBC drivers (since Bamboo 7.0). \n    To use these databases you will need to copy a suitable driver into the container and restart it. \n    For example, to copy the MySQL driver into a container named \"bamboo\", you would do the following:\n\n    `docker cp mysql-connector-java.x.y.z.jar bambooo:/opt/atlassian/bamboo/lib`\n\n    `docker restart bamboo` \n\n#### Optional database settings\n\nThe following variables are for the database connection pool, and are\noptional.\n\n* `ATL_DB_POOLMINSIZE` (default: 3)\n* `ATL_DB_POOLMAXSIZE` (default: 170)\n* `ATL_DB_TIMEOUT` (default: 120000)\n* `ATL_DB_CONNECTIONTIMEOUT` (default: 30000)\n* `ATL_DB_LEAKDETECTION` (default: 0 / disabled)\n\n### Container Configuration\n\n* `ATL_FORCE_CFG_UPDATE` (default: false)\n\n   The Docker [entrypoint][entrypoint.py] generates application configuration on\n   first start; not all of these files are regenerated on subsequent\n   starts. This is deliberate, to avoid race conditions or overwriting manual\n   changes during restarts and upgrades. However in deployments where\n   configuration is purely specified through the environment (e.g. Kubernetes)\n   this behaviour may be undesirable; this flag forces an update of all\n   generated files.\n   \n   In Bamboo the affected files are: `unattended-setup.properties`, `bamboo.cfg.xml`\n   \n   See [the entrypoint code][entrypoint.py] for the details of how configuration\n   files are generated.\n\n* `ATL_ALLOWLIST_SENSITIVE_ENV_VARS`\n\n   Define a comma separated list of environment variables containing keywords 'PASS', 'SECRET' or 'TOKEN' to be ignored by the unset function which is executed in the entrypoint. The function uses `^` regex. For example, if you set `ATL_ALLOWLIST_SENSITIVE_ENV_VARS=\"PATH_TO_SECRET_FILE\"`, all variables starting with `PATH_TO_SECRET_FILE` will not be unset.\n\n???+ warning \"Value exposure on host OS\"\n    When using this property, the values to sensitive environment variables will be available in clear text on the host\n    OS. As such, this data may be exposed to users or processes running on the host OS.\n\n* `SET_PERMISSIONS` (default: true)\n\n   Define whether to set home directory permissions on startup. Set to `false` to disable this behaviour.\n\n## File system permissions and user IDs\n\nBy default, the Bamboo application runs as the user `bamboo`, with a UID\nand GID of 2005. Bamboo this UID must have write access to the home directory\nfilesystem. If for some reason a different UID must be used, there are a number\nof options available:\n\n* The Docker image can be rebuilt with a different UID.\n* Under Linux, the UID can be remapped using\n  [user namespace remapping](https://docs.docker.com/engine/security/userns-remap/).\n\n## Upgrade\n\nTo upgrade to a more recent version of Bamboo you can simply stop the `bamboo` container and start a new one based on a more recent image:\n\n```shell\ndocker stop bamboo\ndocker rm bamboo\ndocker run ... (See above)\n```\n\nAs your data is stored in the data volume directory on the host it will still be available after the upgrade.\n\n!!! note \"Please make sure that you **don't** accidentally remove the `bamboo` container and its volumes using the `-v` option.\"\n\n## Backup\n\nFor evaluations you can use the built-in database that will store its files in the Bamboo home directory. In that case it is sufficient to create a backup archive of the docker volume.\n\nIf you're using an external database, you can configure Bamboo to make a backup automatically each night. This will back up the current state, including the database to the `bambooVolume` docker volume, which can then be archived. Alternatively you can backup the database separately, and continue to create a backup archive of the docker volume to back up the Bamboo Home directory.\n\nRead more about data recovery and backups: <https://confluence.atlassian.com/display/BAMBOO/Data+and+backups>\n\n## Shutdown\n\nDepending on your configuration Bamboo may take a short period to shutdown any\nactive operations to finish before termination. If sending a `docker stop` this\nshould be taken into account with the `--time` flag.\n\nAlternatively, the script `/shutdown-wait.sh` is provided, which will initiate a\nclean shutdown and wait for the process to complete. This is the recommended\nmethod for shutdown in environments which provide for orderly shutdown,\ne.g. Kubernetes via the `preStop` hook.\n\n## Versioning\n\nThe `latest` tag matches the most recent release of Atlassian Bamboo. Thus\n`atlassian/bamboo:latest` will use the newest version of Bamboo available.\n\nAlternatively you can use a specific major, major.minor, or major.minor.patch\nversion of Bamboo by using a version number tag:\n\n* `atlassian/bamboo:9`\n* `atlassian/bamboo:9.6`\n* `atlassian/bamboo:9.6.8`\n\nAll versions from 8.0+ are available. Legacy builds for older versions are\navailable but are no longer supported.\n\n## Supported JDK versions and base images\n\nBamboo Docker images are based on JDK 11, JDK 17 (from Bamboo 9.4), and JDK 21 (from Bamboo 10.1) and generated from the\n[official Eclipse Temurin OpenJDK Docker images](https://hub.docker.com/_/eclipse-temurin) and \n[Red Hat Universal Base Images](https://catalog.redhat.com/software/containers/ubi9/openjdk-17/61ee7c26ed74b2ffb22b07f6?architecture=amd64).\nStarting in Bamboo 9.4, UBI tags are available in 2 formats: `<version>-ubi9`, `<version>-ubi9-jdk17`, `<version>-ubi9-jdk21`\n\nThe Docker images follow the [Atlassian Support end-of-life\npolicy](https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html);\nimages for unsupported versions of the products remain available but will no longer\nreceive updates or fixes.\n\nHowever, Bamboo is an exception to this. Due to the need to support JDK 11 and\nKubernetes, we currently only generate new images for Bamboo 9.1 and up. Legacy\nbuilds for JDK 8 are still available in Docker Hub, and building custom images\nis available (see below).\n\nHistorically, we have also generated other versions of the images, including\nJDK 8, Alpine, and 'slim' versions of the JDK. These legacy images still exist in\nDocker Hub, however they should be considered deprecated, and do not receive\nupdates or fixes.\n\nIf for some reason you need a different version, see \"Building your own image\".\n\n## Building your own image\n\n* Clone the Atlassian repository at <https://bitbucket.org/atlassian-docker/docker-bamboo-server>\n* Modify or replace the [Jinja](https://jinja.palletsprojects.com/) templates\n  under `config`; _NOTE_: The files must have the `.j2` extensions. However, you\n  don't have to use template variables if you don't wish.\n* Build the new image with e.g: `docker build --tag my-bamboo-image --platform linux/amd64,linux/arm64 --build-arg BAMBOO_VERSION=X.Y.Z .`\n* Optionally push to a registry, and deploy.\n\n## Migration to UBI\n\nIf you have been mounting any files to `${JAVA_HOME}` directory in `eclipse-temurin` based container, `JAVA_HOME` in UBI container is set to `/usr/lib/jvm/java-17` (JDK17) and `/usr/lib/jvm/java-21` (JDK21).\n\nAlso, if you have been mounting and running any custom scripts in the container, UBI-based images may lack some tools and utilities that are available out of the box in eclipse-temurin tags. If that's the case, see [Building your own image](#building-your-own-image).\n\n## Supported architectures\n\nCurrently, the Atlassian Docker images are built for the `linux/amd64` and `linux/arm64` target\nplatforms; we do not have other architectures on our roadmap at this\npoint. However, the Dockerfiles and support tooling have now had all\narchitecture-specific components removed, so if necessary it is possible to\nbuild images for any platform supported by Docker.\n\n### Building on the target architecture\n\nThe simplest method of getting a platform image is to build it on a target\nmachine; and specify either `linux/amd64` or `linux/arm64`. See [Building your own image](#building-your-own-image) above.\n\nNote: This method is known to work on Mac M1 and AWS ARM64 machines, but has not\nbeen extensively tested.\n\n## Troubleshooting\n\nThese images include built-in scripts to assist in performing common JVM diagnostic tasks.\n\n### Thread dumps\n\n`/opt/atlassian/support/thread-dumps.sh` can be run via `docker exec` to easily trigger the collection of thread\ndumps from the containerized application. For example:\n\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh\n```\n\nBy default this script will collect 10 thread dumps at 5 second intervals. This can\nbe overridden by passing a custom value for the count and interval, by using `-c` / `--count`\nand `-i` / `--interval` respectively. For example, to collect 20 thread dumps at 3 second intervals:\n\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh --count 20 --interval 3\n```\n\nThread dumps will be written to `$APP_HOME/thread_dumps/<date>`.\n\n???+ note \"Disable capturing output from top run\"\n    By default this script will also capture output from top run in 'Thread-mode'. \n    This can be disabled by passing `-n` / `--no-top`\n\n### Heap dump\n\n`/opt/atlassian/support/heap-dump.sh` can be run via `docker exec` to easily trigger the collection of a heap\ndump from the containerized application. For example:\n\n```shell\ndocker exec my_container /opt/atlassian/support/heap-dump.sh\n```\n\nA heap dump will be written to `$APP_HOME/heap.bin`. If a file already exists at this\nlocation, use `-f` / `--force` to overwrite the existing heap dump file.\n\n### Manual diagnostics\n\nThe `jcmd` utility is also included in these images and can be used by starting a `bash` shell\nin the running container:\n\n```shell\ndocker exec -it my_container /bin/bash\n```\n\n## Support\n\nFor product support, go to <https://support.atlassian.com>\n\nYou can also visit the [Atlassian Data Center](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes)\nforum for discussion on running Atlassian Data Center products in containers.\n\n## Changelog\n\nFor a detailed list of changes to the Docker image configuration see [the Git\ncommit history](https://bitbucket.org/atlassian-docker/docker-bamboo-server/commits/).\n\n## License\n\nCopyright © 2020 Atlassian Corporation Pty Ltd.\nLicensed under the Apache License, Version 2.0.\n\n[docker-expose]: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/\n[entrypoint.py]: https://bitbucket.org/atlassian-docker/docker-bamboo-server/src/master/entrypoint.py\n[encrypting-passwords-in-server]: https://confluence.atlassian.com/display/BAMBOO/Encrypting+passwords+in+server.xml\n"
  },
  {
    "path": "docs/docs/containers/BITBUCKET-MESH.md",
    "content": "# ![Atlassian Bitbucket Mesh](https://wac-cdn.atlassian.com/dam/jcr:bf39fc40-3871-491f-98e3-fb2293f57a00/bitbucket-icon-gradient-blue.svg?cdnVersion=696){: style=\"height:35px;width:35px\"} Bitbucket Mesh\n\n## Overview\n\nBitbucket Data Center is an on-premises source code management solution for Git\nthat's secure, fast, and enterprise grade. Create and manage repositories, set\nup fine-grained permissions, and collaborate on code - all with the flexibility\nof your servers.\n\nBitbucket Mesh is an optional scalability extension for Bitbucket. For more\ninformation see <https://confluence.atlassian.com/bitbucketserver/bitbucket-mesh-1128304351.html>.\n\nThis Docker image is published as `atlassian/bitbucket-mesh`.\n\nThis Docker container makes it easy to get Mesh nodes for a Bitbucket Data\nCenter up and running. It will only work in conjunction with a Bitbucket Data\nCenter server.\n\nFor full documentation on running Bitbucket Data Center with Mesh nodes, see [the\nBitbucket documentation](https://confluence.atlassian.com/bitbucketserver/bitbucket-mesh-1128304351.html).\n\n_* If running this image in a production environment, we strongly recommend you\nrun this image using a specific version tag instead of latest. This is because\nthe image referenced by the latest tag changes often and we cannot guarantee\nthat it will be backwards compatible. *_\n\n**Use docker version >= 20.10.10**\n\n## Quick Start\n\nFor the `MESH_HOME` directory that is used to store the repository data (amongst\nother things) we recommend mounting a host directory as a\n[data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes),\nor via a named volume.\n\nVolume permissions are managed by entry scripts. To get started you can use a\ndata volume, or named volumes. In this example we'll use named volumes.\n```shell\ndocker volume create --name bitbucketMeshVolume\ndocker run -v bitbucketMeshVolume:/var/atlassian/application-data/mesh --name=\"bitbucket-mesh\" -d -p 7777:7777 atlassian/bitbucket-mesh\n```\n\nNote that this command can substitute folder paths with named volumes.\n\nPlease ensure your container has the necessary resources allocated to it.\nWe recommend 2GiB of memory allocated to accommodate both the application server\nand the git processes.\nSee [Supported Platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms) for further information.\n\n\n## Common settings\n\n### Verbose container entrypoint logging\n\nDuring the startup process of the container, various operations and checks are performed to ensure that the application\nis configured correctly and ready to run. To help in troubleshooting and to provide transparency into this process, you\ncan enable verbose logging. The `VERBOSE_LOGS` environment variable enables detailed debug messages to the container's \nlog, offering insights into the actions performed by the entrypoint script.\n\n* `VERBOSE_LOGS` (default: false)\n\n  Set to `true` to enable detailed debug messages during the container initialization.\n\n### Mesh Node Configuration\n\n* `MESH_HOME`\n\n  The home directory used by the Mesh node. This should have full read/write\n  permissions and be persistent – your Bitbucket Mesh data will be stored here.\n\n* `GRPC_SERVER_PORT` (default: 7777)\n\n  The port used by the Mesh node to communicate with the server.\n\n### Mesh Node JVM Configuration\n\nIf you need to override the Mesh node's default memory configuration or pass\nadditional JVM arguments, use the environment variables below\n\n* `JVM_MINIMUM_MEMORY` (default: 512m)\n\n  The minimum heap size of the JVM\n\n* `JVM_MAXIMUM_MEMORY` (default: 1024m)\n\n  The maximum heap size of the JVM\n\n* `JVM_SUPPORT_RECOMMENDED_ARGS` (default: NONE)\n\n  Additional JVM arguments for the Mesh node , such as a custom Java Trust Store\n\n### JMX Monitoring\n\nJMX monitoring can be enabled with `JMX_ENABLED=true`. Information\non additional settings and available metrics is available in the\n[Bitbucket JMX documentation](https://confluence.atlassian.com/bitbucketserver/enabling-jmx-counters-for-performance-monitoring-776640189.html).\n\n## Other settings\n\nAs well as the above settings, all settings that are available in the\n[mesh.properties file](https://confluence.atlassian.com/bitbucketserver/mesh-configuration-properties-1128304362.html)\ncan also be provided via Docker environment variables. For a full explanation of converting Bitbucket properties into environment\nvariables see\n[the relevant Spring Boot documentation](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding).\n\nTo translate a property name into an environment variable:\n\n* dot `.` becomes underscore `_`\n* dash `-` becomes underscore `_`\n* Example: `this.new-property` becomes `THIS_NEW_PROPERTY`\n\n## Container Configuration\n\n* `SET_PERMISSIONS` (default: true)\n\n  Define whether to set home directory permissions on startup. Set to `false` to disable\n  this behaviour.\n\n## Home directory and user IDs\n\nBy default the Bitbucket application runs as the user `bitbucket`, with a UID\nand GID of 2003. If for some reason a different UID must be used, there are a\nnumber of options available:\n\n* The Docker image can be rebuilt with a different UID.\n* Under Linux, the UID can be remapped using\n  [user namespace remapping](https://docs.docker.com/engine/security/userns-remap/).\n\n## Shutdown\n\nThe Mesh node allows a configurable grace period for active operations to finish\nbefore termination; by default this is 30s. If sending a `docker stop` this\nshould be taken into account with the `--time` flag.\n\nAlternatively, the script `/shutdown-wait.sh` is provided, which will initiate a\nclean shutdown and wait for the process to complete. This is the recommended\nmethod for shutdown in environments which provide for orderly shutdown,\ne.g. Kubernetes via the `preStop` hook.\n\n## Versioning\n\nYou should ensure you are running the appropriate Mesh version for your\nBitbucket Data Center server. A support matrix is available here:\n[Bitbucket Mesh compatibility matrix](https://confluence.atlassian.com/bitbucketserver/bitbucket-mesh-compatibility-matrix-1127254859.html).\n\n## Supported JDK versions and base images\n\nThe Bitbucket Mesh Docker images support the following JDK versions:\n\n* **JDK 11**: Supported for Mesh versions 2.0.1 to 3.0.0\n* **JDK 17**: Supported for Mesh versions 2.4 to 3.4.5\n* **JDK 21**: Supported for Mesh versions 3.4.5 and above (required for Mesh 4.x)\n\nImages are generated from the [official Eclipse Temurin OpenJDK Docker images](https://hub.docker.com/_/eclipse-temurin).\n\nStarting from 2.4, [UBI based](https://catalog.redhat.com/software/containers/ubi9/openjdk-17/61ee7c26ed74b2ffb22b07f6?architecture=amd64) tags are published as well.\nUBI tags are available in the following formats:\n* For JDK 17: `<version>-ubi9` and `<version>-ubi9-jdk17`\n* For JDK 21: `<version>-ubi9` and `<version>-ubi9-jdk21` (from version 3.4.5)\n\nThe Docker images follow the [Atlassian Support end-of-life\npolicy](https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html);\nimages for unsupported versions of the products remain available but will no longer\nreceive updates or fixes.\n\nIf for some reason you need a different version, see \"Building your own image\"\n\n## Migration to UBI\n\nIf you have been mounting any files to `${JAVA_HOME}` directory in `eclipse-temurin` based container, `JAVA_HOME` in UBI JDK17 container is set to `/usr/lib/jvm/java-17`.\n\nAlso, if you have been mounting and running any custom scripts in the container, UBI-based images may lack some tools and utilities that are available out of the box in eclipse-temurin tags. If that's the case, see \"Building your own image\".\n\n## Building your own image\n\n* Clone the Atlassian repository at https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-mesh/\n* Modify or replace the [Jinja](https://jinja.palletsprojects.com/) templates\n  under `config`; _NOTE_: The files must have the `.j2` extensions. However, you\n  don't have to use template variables if you don't wish.\n* Build the new image with e.g: `docker build --tag my-bitbucket-mesh-image --build-arg MESH_VERSION=1.x.x .`\n* Optionally push to a registry, and deploy.\n\n## Supported architectures\n\nCurrently, Bitbucket Mesh container images are built for the `linux/amd64` and `linux/arm64` target platforms.\nThe Dockerfiles and support tooling have now had all\narchitecture-specific components removed, so if necessary it is possible to\nbuild images for any platform supported by OCI-compliant container runtimes.\n\n## Building on the target architecture\n\nThe simplest method of getting a platform image is to build it on a target\nmachine; see \"Building your own image\" above.\n\nNote: This method is known to work on Mac M1 and AWS ARM64 machines, but has not\nbe extensively tested.\n\n## Troubleshooting\n\nThese images include built-in scripts to assist in performing common JVM diagnostic tasks.\n\n### Thread dumps\n\n`/opt/atlassian/support/thread-dumps.sh` can be run via `docker exec` to easily trigger the collection of thread\ndumps from the containerized application. For example:\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh\n```\n\nBy default, this script will collect 10 thread dumps at 5 second intervals. This can\nbe overridden by passing a custom value for the count and interval, by using `-c` / `--count`\nand `-i` / `--interval` respectively. For example, to collect 20 thread dumps at 3 second intervals:\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh --count 20 --interval 3\n```\n\nThread dumps will be written to `$APP_HOME/thread_dumps/<date>`.\n\n???+ note \"Disable capturing output from top run\"\n    By default this script will also capture output from top run in 'Thread-mode'. This can\n    be disabled by passing `-n` / `--no-top`\n\n### Heap dump\n\n`/opt/atlassian/support/heap-dump.sh` can be run via `docker exec` to easily trigger the collection of a heap\ndump from the containerized application. For example:\n```shell\ndocker exec my_container /opt/atlassian/support/heap-dump.sh\n```\n\nA heap dump will be written to `$APP_HOME/heap.bin`. If a file already exists at this\nlocation, use `-f` / `--force` to overwrite the existing heap dump file.\n\n## Manual diagnostics\n\nThe `jcmd` utility is also included in these images and can be used by starting a `bash` shell\nin the running container:\n```shell\ndocker exec -it my_container /bin/bash\n```\n\n## Support\n\nFor product support, go to [support.atlassian.com](https://support.atlassian.com/)\n\nYou can also visit the [Atlassian Data Center](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes)\nforum for discussion on running Atlassian Data Center products in containers.\n\n# Changelog\n\nFor a detailed list of changes to the Docker image configuration see [the Git\ncommit history](https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-mesh/commits/).\n\n# License\n\nCopyright © 2022 Atlassian Corporation Pty Ltd.\nLicensed under the Apache License, Version 2.0.\n"
  },
  {
    "path": "docs/docs/containers/BITBUCKET.md",
    "content": "# ![Atlassian Bitbucket Server](https://wac-cdn.atlassian.com/dam/jcr:bf39fc40-3871-491f-98e3-fb2293f57a00/bitbucket-icon-gradient-blue.svg?cdnVersion=696){: style=\"height:35px;width:35px\"} Bitbucket\n\n!!! warning \"Server image deprecation\"\n    This Docker image has been published as both `atlassian/bitbucket` and `atlassian/bitbucket-server` up until February 15, 2024.\n    Both names refer to the same image. However, post-February 15, 2024, the `atlassian/bitbucket-server` version ceased \n    receiving updates, including both existing and new tags. If you have been using `atlassian/bitbucket-server`, \n    switch to the `atlassian/bitbucket` image to ensure access to the latest updates and new tags.\n\n\n## Overview\n\nBitbucket Server is an on-premises source code management solution for Git\nthat's secure, fast, and enterprise grade. Create and manage repositories, set\nup fine-grained permissions, and collaborate on code - all with the flexibility\nof your servers.\n\nLearn more about Bitbucket Server: <https://www.atlassian.com/software/bitbucket/server>\n\nThis Docker container makes it easy to get an instance of Bitbucket up and\nrunning.\n\n???+ note \"Embedded OpenSearch\"\n    Only Bitbucket versions < 10 include an embedded search server.\n    For backwards-compatibility, by default the image will start both Bitbucket and an embedded OpenSearch. \n    However, this is not a recommended configuration, especially in a clustered environment, and has known issues with\n    shutdown. Instead, we recommend running a separate OpenSearch instance (possibly in another Docker container); \n    see below for instructions on connecting to an external OpenSearch cluster.\n\n_* If running this image in a production environment, we strongly recommend you\nrun this image using a specific version tag instead of latest. This is because\nthe image referenced by the latest tag changes often and we cannot guarantee\nthat it will be backwards compatible. *_\n\n**Use docker version >= 20.10.10**\n\n## Quick Start\n\nFor the `BITBUCKET_HOME` directory that is used to store the repository data\n(amongst other things) we recommend mounting a host directory as a\n[data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes),\nor via a named volume.\n\nAdditionally, if running Bitbucket in Data Center mode it is required that a shared filesystem is mounted.\n\nVolume permission is managed by entry scripts. To get started you can use a data\nvolume, or named volumes. In this example we'll use named volumes.\n```shell\ndocker volume create --name bitbucketVolume\ndocker run -v bitbucketVolume:/var/atlassian/application-data/bitbucket --name=\"bitbucket\" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket\n```\nNote that this command can substitute folder paths with named volumes. Start Atlassian Bitbucket Server:\n```shell\ndocker run -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name=\"bitbucket\" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket\n```\n!!! success \"Bitbucket is now available on <http://localhost:7990>.\"\n\nPlease ensure your container has the necessary resources allocated to it.\nWe recommend 2GiB of memory allocated to accommodate both the application server\nand the git processes.\nSee [Supported Platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms) for further information.\n\n???+ tip \"If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):7990` instead.\"\n\n## Common settings\n\n### Verbose container entrypoint logging\n\nDuring the startup process of the container, various operations and checks are performed to ensure that the application\nis configured correctly and ready to run. To help in troubleshooting and to provide transparency into this process, you\ncan enable verbose logging. The `VERBOSE_LOGS` environment variable enables detailed debug messages to the container's\nlog, offering insights into the actions performed by the entrypoint script.\n\n* `VERBOSE_LOGS` (default: false)\n\n  Set to `true` to enable detailed debug messages during the container initialization.\n\n### Reverse Proxy Settings\n\nIf Bitbucket is run behind a reverse proxy server as\n[described here](https://confluence.atlassian.com/bitbucketserver/proxying-and-securing-bitbucket-server-776640099.html),\nthen you need to specify extra options to make Bitbucket aware of the\nsetup. They can be controlled via the below environment variables.\n\n* `SERVER_PROXY_NAME` (default: NONE)\n\n   The reverse proxy's fully qualified hostname.\n\n* `SERVER_PROXY_PORT` (default: NONE)\n\n   The reverse proxy's port number via which bitbucket is accessed.\n\n* `SERVER_SCHEME` (default: http)\n\n   The protocol via which bitbucket is accessed. \n   \n   In certain cloud environments (specifically Kubernetes, Heroku and Cloud Foundry), this setting\n   will be superseded by the value of the `X-Forwarded-Proto` request header if sent by a ingress or load balancer. \n   See `SERVER_FORWARD_HEADERS_STRATEGY` below to alter this behaviour.\n\n* `SERVER_SECURE` (default: false)\n\n   Set 'true' if SERVER\\_SCHEME is 'https'. \n\n* `SERVER_FORWARD_HEADERS_STRATEGY` (default: NATIVE in the specified cloud environments, NONE otherwise)\n\n   Can be explicitly set to a value of `NONE` if deploying to a cloud environment (specifically Kubernetes, Heroku and Cloud Foundry) and the preference is for `SERVER_SCHEME` \n   to be used over the value of the `X-Forwarded-Proto` request header. A value of NONE will cause X-Forwarded-* headers to no longer take priority when determining the \n   origin of a request, which means the system will return to the default expected state.\n\n### JVM Configuration (Bitbucket Server 5.0 + only)\n\nIf you need to override Bitbucket Server's default memory configuration or pass\nadditional JVM arguments, use the environment variables below\n\n* `JVM_MINIMUM_MEMORY` (default: 512m)\n\n   The minimum heap size of the JVM\n\n* `JVM_MAXIMUM_MEMORY` (default: 1024m)\n\n   The maximum heap size of the JVM\n\n* `JVM_SUPPORT_RECOMMENDED_ARGS` (default: NONE)\n\n   Additional JVM arguments for Bitbucket Server, such as a custom Java Trust Store\n\n### Application Mode Settings (Bitbucket Server 5.0 + only)\n\nThis docker image can be run as a\n[Smart Mirror](https://confluence.atlassian.com/bitbucketserver/smart-mirroring-776640046.html)\nor as part of a\n[Data Center](https://confluence.atlassian.com/enterprise/bitbucket-data-center-668468332.html)\ncluster.  You can specify the following properties to start Bitbucket as a\nmirror or as a Data Center node:\n\n* `SEARCH_ENABLED` (default: true)\n  \n  Note: This property is not applicable for Bitbucket 10.0.0 onwards, as embedded search was removed in Bitbucket 10.<br>\n  Set 'false' to prevent OpenSearch (previously Elasticsearch) from starting in the\n  container. This should be used if OpenSearch is running remotely, e.g. for if Bitbucket\n  is running in a Data Center cluster. You may also use `ELASTICSEARCH_ENABLED` to\n  set this property, however this is deprecated in favor of `SEARCH_ENABLED`.\n\n* `APPLICATION_MODE` (default: default)\n\n   The mode Bitbucket will run in. This can be set to 'mirror' to start\n   Bitbucket as a Smart Mirror. This will also disable OpenSearch even if\n   `SEARCH_ENABLED` has not been set to 'false'.\n\n### Database Configuration\n\nTo configure the database automatically on first run, you can provide the\nfollowing settings:\n\n* `JDBC_DRIVER`\n* `JDBC_URL`\n* `JDBC_USER`\n* `JDBC_PASSWORD`\n\nNote: Due to licensing restrictions Bitbucket does not ship with a MySQL or\nOracle JDBC drivers. To use these databases you will need to copy a suitable\ndriver into the container and restart it. For example, to copy the MySQL driver\ninto a container named \"bitbucket\", you would do the following:\n\n```shell\ndocker cp mysql-connector-java.x.y.z.jar bitbucket:/var/atlassian/application-data/bitbucket/lib\ndocker restart bitbucket\n```\n\nFor more information see [Connecting Bitbucket Server to an external database](https://confluence.atlassian.com/bitbucketserver/connecting-bitbucket-server-to-an-external-database-776640378.html).\n\n#### JDBC password encryption\n\nStarting from Bitbucket `8.13` the `JDBC` password can now be managed via [AWS Secrets Manager](https://confluence.atlassian.com/bitbucketserver/configuring-bitbucket-with-aws-secrets-manager-1279066293.html). For example, a Bitbucket node with a PostgreSQL database and `JDBC` password management via AWS Secrets Manager might look like:\n\n```shell\ndocker run \\\n    -e JDBC_DRIVER=org.postgresql.Driver \\\n    -e JDBC_USER=atlbitbucket \\\n    -e JDBC_PASSWORD=\"{\\\"region\\\":\\\"us-east-1\\\",\\\"secretId\\\":\\\"mysecret\\\",\\\"secretPointer\\\":\\\"/password\\\"}\" \\\n    -e JDBC_PASSWORD_DECRYPTER_CLASSNAME=\"com.atlassian.secrets.store.aws.AwsSecretsManagerStore\" \\\n    -e JDBC_URL=jdbc:postgresql://my.database.host:5432/bitbucket \\\n    -v /data/bitbucket-shared:/var/atlassian/application-data/bitbucket/shared \\\n    --name=\"bitbucket\" \\\n    -d -p 7990:7990 -p 7999:7999 \\\n    atlassian/bitbucket\n```\n\nOf note here are the two properties; `JDBC_PASSWORD` and `JDBC_PASSWORD_DECRYPTER_CLASSNAME` and their corresponding values, where the Secrets Manager coordinates and decryption class name are supplied respectively. \n\n## Other settings\n\nAs well as the above settings, all settings that are available in the\n[bitbucket.properties file](https://confluence.atlassian.com/bitbucketserver/bitbucket-server-config-properties-776640155.html)\ncan also be provided via Docker environment variables. For a full explanation of converting Bitbucket properties into environment\nvariables see\n[the relevant Spring Boot documentation](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding).\n\nTo translate a property name into an environment variable:\n\n* dot `.` becomes underscore `_`\n* dash `-` becomes underscore `_`\n* Example: `this.new-property` becomes `THIS_NEW_PROPERTY`\n\nFor example, a full command-line for a Bitbucket node with a PostgreSQL\ndatabase, and an external OpenSearch instance might look like:\n\n```shell\ndocker network create --driver bridge --subnet=172.18.0.0/16 myBitbucketNetwork\ndocker run --network=myBitbucketNetwork --ip=172.18.1.1 \\\n    -e SEARCH_ENABLED=false \\\n    -e JDBC_DRIVER=org.postgresql.Driver \\\n    -e JDBC_USER=atlbitbucket \\\n    -e JDBC_PASSWORD=MYPASSWORDSECRET \\\n    -e JDBC_URL=jdbc:postgresql://my.database.host:5432/bitbucket \\\n    -e PLUGIN_SEARCH_CONFIG_BASEURL=http://my.opensearch.host \\\n    -v /data/bitbucket-shared:/var/atlassian/application-data/bitbucket/shared \\\n    --name=\"bitbucket\" \\\n    -d -p 7990:7990 -p 7999:7999 \\\n    atlassian/bitbucket\n```\n\n### Cluster settings\n\nIf running a clustered Bitbucket DC instance, the cluster settings are specified\nwith `HAZELCAST_*` environment variables. The main ones to be aware of are:\n\n* `HAZELCAST_PORT` (`hazelcast.port`)\n* `HAZELCAST_GROUP_NAME` (`hazelcast.group.name`)\n* `HAZELCAST_GROUP_PASSWORD` (`hazelcast.group.password`)\n\nEach clustering type (e.g. AWS/Azure/Multicast/TCP) has its own settings. For\nmore information on clustering Bitbucket, and other properties see\n[Clustering with Bitbucket Data Center](https://confluence.atlassian.com/bitbucketserver/clustering-with-bitbucket-data-center-776640164.html)\nand [Clustering with Bitbucket Data Center](https://confluence.atlassian.com/bitbucketserver/bitbucket-server-config-properties-776640155.html).\n\n???+ note \"Out-of-scope network configuration\"\n    The underlying network should be configured to support the clustering type you are using. How to do this depends on\n    the container management technology, and is beyond the scope of this documentation.\n\n### JMX Monitoring\n\nJMX monitoring can be enabled with `JMX_ENABLED=true`. Information\non additional settings and available metrics is available in the\n[Bitbucket JMX documentation](https://confluence.atlassian.com/bitbucketserver/enabling-jmx-counters-for-performance-monitoring-776640189.html).\n\n## Container Configuration\n\n* `SET_PERMISSIONS` (default: true)\n\n   Define whether to set home directory permissions on startup. Set to `false` to disable\n   this behaviour.\n\n## Shared directory and user IDs\n\nBy default the Bitbucket application runs as the user `bitbucket`, with a UID\nand GID of 2003. Consequently this UID must have write access to the shared\nfilesystem. If for some reason a different UID must be used, there are a number\nof options available:\n\n* The Docker image can be rebuilt with a different UID.\n* Under Linux, the UID can be remapped using\n  [user namespace remapping](https://docs.docker.com/engine/security/userns-remap/).\n\n## Upgrade\n\nTo upgrade to a more recent version of Bitbucket Server you can simply stop the `bitbucket`\ncontainer and start a new one based on a more recent image:\n\n```shell\ndocker stop bitbucket\ndocker rm bitbucket\ndocker pull atlassian/bitbucket:<desired_version>\ndocker run ... (See above)\n```\n\nAs your data is stored in the data volume directory on the host it will still\nbe available after the upgrade.\n\n!!! note \"Please make sure that you **don't** accidentally remove the `bitbucket` container and its volumes using the `-v` option.\"\n\n## Backup\n\nFor evaluations you can use the built-in database that will store its files in\nthe Bitbucket Server home directory. In that case it is sufficient to create a\nbackup archive of the directory on the host that is used as a volume\n(`/data/bitbucket` in the example above).\n\nThe [Bitbucket Server Backup Client](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups)\nis currently not supported in the Docker setup. You can however use the\n[Bitbucket Server DIY Backup](https://confluence.atlassian.com/display/BitbucketServer/Using+Bitbucket+Server+DIY+Backup)\napproach in case you decided to use an external database.\n\nRead more about data recovery and backups:\n[https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups](https://confluence.atlassian.com/display/BitbucketServer/Data+recovery+and+backups)\n\n## Shutdown\n\nBitbucket allows a configurable grace period for active operations to finish\nbefore termination; by default this is 30s. If sending a `docker stop` this\nshould be taken into account with the `--time` flag.\n\nAlternatively, the script `/shutdown-wait.sh` is provided, which will initiate a\nclean shutdown and wait for the process to complete. This is the recommended\nmethod for shutdown in environments which provide for orderly shutdown,\ne.g. Kubernetes via the `preStop` hook.\n\n## Versioning\n\nThe `latest` tag matches the most recent version of this repository. Thus using\n`atlassian/bitbucket:latest` or `atlassian/bitbucket` will ensure you are\nrunning the most up to date version of this image.\n\nAlternatively, you can use a specific minor version of Bitbucket Server by\nusing a version number tag: `atlassian/bitbucket:6`. This will\ninstall the latest `6.x.x` version that is available.\n\n## Supported JDK versions and base images\n\nAll the Atlassian Docker images are now JDK11 and JDK17 (starting from 8.8 version), and generated from the\n[official Eclipse Temurin OpenJDK Docker images](https://hub.docker.com/_/eclipse-temurin).\n\nStarting from 8.18 [UBI based](https://catalog.redhat.com/software/containers/ubi9/openjdk-17/61ee7c26ed74b2ffb22b07f6?architecture=amd64) tags are published as well.\nUBI tags are available in 2 formats: `<version>-ubi9` and `<version>-ubi9-jdk17`.\n\nThe Docker images follow the [Atlassian Support end-of-life\npolicy](https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html);\nimages for unsupported versions of the products remain available but will no longer\nreceive updates or fixes.\n\nHistorically, we have also generated other versions of the images, including\nJDK8, Alpine, and 'slim' versions of the JDK. These legacy images still exist in\nDocker Hub, however they should be considered deprecated, and do not receive\nupdates or fixes.\n\nIf for some reason you need a different version, see \"Building your own image\"\n\n## Migration to UBI\n\nIf you have been mounting any files to `${JAVA_HOME}` directory in `eclipse-temurin` based container, JAVA_HOME in UBI JDK17 container is set to `/usr/lib/jvm/java-17`.\n\nAlso, if you have been mounting and running any custom scripts in the container, UBI-based images may lack some tools and utilities that are available out of the box in `eclipse-temurin` tags. If that's the case, see [Building your own image](#building-your-own-image).\n\n## Building your own image\n\n* Clone the Atlassian repository at https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n* Modify or replace the [Jinja](https://jinja.palletsprojects.com/) templates\n  under `config`; _NOTE_: The files must have the `.j2` extensions. However, you\n  don't have to use template variables if you don't wish.\n* Build the new image with e.g: `docker build --tag my-bitbucket-image --build-arg BITBUCKET_VERSION=8.x.x .`\n* Optionally push to a registry, and deploy.\n\n## Supported architectures\n\nCurrently, Bitbucket container images are built for the `linux/amd64` and `linux/arm64` target platforms.\nThe Dockerfiles and support tooling have now had all\narchitecture-specific components removed, so if necessary it is possible to\nbuild images for any platform supported by OCI-compliant container runtimes.\n\n## Building on the target architecture\n\nThe simplest method of getting a platform image is to build it on a target\nmachine; see \"Building your own image\" above.\n\nNote: This method is known to work on Mac M1 and AWS ARM64 machines, but has not\nbeen extensively tested.\n\n## Troubleshooting\n\nThese images include built-in scripts to assist in performing common JVM diagnostic tasks.\n\n### Thread dumps\n\n`/opt/atlassian/support/thread-dumps.sh` can be run via `docker exec` to easily trigger the collection of thread\ndumps from the containerized application. For example:\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh\n```\n\nBy default, this script will collect 10 thread dumps at 5 second intervals. This can\nbe overridden by passing a custom value for the count and interval, by using `-c` / `--count`\nand `-i` / `--interval` respectively. For example, to collect 20 thread dumps at 3 second intervals:\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh --count 20 --interval 3\n```\n\nThread dumps will be written to `$APP_HOME/thread_dumps/<date>`.\n\n???+ note \"Disable capturing output from top run\"\n    By default this script will also capture output from top run in 'Thread-mode'. This can\n    be disabled by passing `-n` / `--no-top`\n\n### Heap dump\n\n`/opt/atlassian/support/heap-dump.sh` can be run via `docker exec` to easily trigger the collection of a heap\ndump from the containerized application. For example:\n```shell\ndocker exec my_container /opt/atlassian/support/heap-dump.sh\n```\n\nA heap dump will be written to `$APP_HOME/heap.bin`. If a file already exists at this\nlocation, use `-f` / `--force` to overwrite the existing heap dump file.\n\n### Manual diagnostics\n\nThe `jcmd` utility is also included in these images and can be used by starting a `bash` shell\nin the running container:\n```shell\ndocker exec -it my_container /bin/bash\n```\n\n## Support\n\nFor product support, go to [support.atlassian.com](https://support.atlassian.com/)\n\nYou can also visit the [Atlassian Data Center](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes)\nforum for discussion on running Atlassian Data Center products in containers.\n\n## Changelog\n\nFor a detailed list of changes to the Docker image configuration see [the Git\ncommit history](https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/commits/).\n\n## License\n\nCopyright © 2019 Atlassian Corporation Pty Ltd.\nLicensed under the Apache License, Version 2.0.\n"
  },
  {
    "path": "docs/docs/containers/CONFLUENCE.md",
    "content": "# ![Atlassian Confluence Server](https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696){: style=\"height:35px;width:35px\"} Confluence\n\n!!! warning \"Server image deprecation\"\n    This Docker image has been published as both `atlassian/confluence` and `atlassian/confluence-server` up until \n    February 15, 2024. Both names refer to the same image. However, post-February 15, 2024, the \n    `atlassian/confluence-server` version ceased receiving updates, including both existing and new tags. If you have \n    been using `atlassian/confluence-server`, switch to the `atlassian/confluence` image to ensure access to the \n    latest updates and new tags.\n\n## Overview\n\nConfluence Server is where you create, organise and discuss work with your team. Capture the knowledge that's too often\nlost in email inboxes and shared network drives in Confluence - where it's easy to find, use, and update. \nGive every team, project, or department its own space to create the things they need, whether it's meeting notes, \nproduct requirements, file lists, or project plans, you can get more done in Confluence.\n\nThis Docker container makes it easy to get an instance of Confluence up and running.\n\nLearn more about Confluence Server: <https://www.atlassian.com/software/confluence>\n\nYou can find the repository with the Dockerfile at <https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server>\n\nDockerHub repository: <https://hub.docker.com/r/atlassian/confluence>\n\n**Use docker version >= 20.10.10**\n\n## Quick Start\n\nFor the directory in the environmental variable `CONFLUENCE_HOME` that is used\nto store Confluence data (amongst other things) we recommend mounting a host\ndirectory as a [data volume][1]:\n\nAdditionally, if running Confluence in Data Center mode it is required that a\nshared filesystem is mounted. The mountpoint (inside the container) can be\nconfigured with `CONFLUENCE_SHARED_HOME`.\n\nStart Atlassian Confluence Server:\n```shell\ndocker run -v /data/your-confluence-home:/var/atlassian/application-data/confluence --name=\"confluence\" -d -p 8090:8090 -p 8091:8091 atlassian/confluence\n```\n!!! success \"Confluence is now available on <http://localhost:8090>.\"\n\nPlease ensure your container has the necessary resources allocated to it.  We\nrecommend 2GiB of memory allocated to accommodate the application server.  See\n[Supported Platforms][3] for further information.\n\n???+ tip \"If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):8090` instead.\"\n\n## Configuring Confluence\n\nThis Docker image is intended to be configured from its environment; the\nprovided information is used to generate the application configuration files\nfrom templates. This allows containers to be repeatably created and destroyed\non-the-fly, as required in advanced cluster configurations. Most aspects of the\ndeployment can be configured in this manner; the necessary environment variables\nare documented below. However, if your particular deployment scenario is not\ncovered by these settings, it is possible to override the provided templates\nwith your own; see the section [Advanced Configuration](#advanced-configuration) below.\n\n### Verbose container entrypoint logging\n\nDuring the startup process of the container, various operations and checks are performed to ensure that the application\nis configured correctly and ready to run. To help in troubleshooting and to provide transparency into this process, you\ncan enable verbose logging. The `VERBOSE_LOGS` environment variable enables detailed debug messages to the container's\nlog, offering insights into the actions performed by the entrypoint script.\n\n* `VERBOSE_LOGS` (default: false)\n\n  Set to `true` to enable detailed debug messages during the container initialization.\n\n### Memory / Heap Size\n\nIf you need to override Confluence Server's default memory allocation, you can\ncontrol the minimum heap (Xms) and maximum heap (Xmx) via the below environment\nvariables.\n\n* `JVM_MINIMUM_MEMORY` (default: 1024m)\n\n   The minimum heap size of the JVM\n\n* `JVM_MAXIMUM_MEMORY` (default: 1024m)\n\n   The maximum heap size of the JVM\n\n* `JVM_RESERVED_CODE_CACHE_SIZE` (default: 256m)\n\n    The reserved code cache size of the JVM\n\n### Tomcat and Reverse Proxy Settings\n\nIf Confluence is run behind a reverse proxy server (e.g. a load-balancer or\nnginx server), then you need to specify extra options to make Confluence aware\nof the setup. They can be controlled via the below environment variables.\n\n* `ATL_PROXY_NAME` (default: NONE)\n\n   The reverse proxy's fully qualified hostname. `CATALINA_CONNECTOR_PROXYNAME`\n   is also supported for backwards compatability.\n\n* `ATL_PROXY_PORT` (default: NONE)\n\n   The reverse proxy's port number via which Confluence is\n   accessed. `CATALINA_CONNECTOR_PROXYPORT` is also supported for backwards\n   compatability.\n\n* `ATL_TOMCAT_PORT` (default: 8090)\n\n   The port for Tomcat/Confluence to listen on. Depending on your container\n   deployment method this port may need to be\n   [exposed and published][docker-expose].\n\n* `ATL_TOMCAT_SCHEME` (default: http)\n\n   The protocol via which Confluence is accessed. `CATALINA_CONNECTOR_SCHEME` is also\n   supported for backwards compatability.\n\n* `ATL_TOMCAT_SECURE` (default: false)\n\n   Set 'true' if `ATL_TOMCAT_SCHEME` is 'https'. `CATALINA_CONNECTOR_SECURE` is\n   also supported for backwards compatability.\n\n* `ATL_TOMCAT_CONTEXTPATH` (default: NONE)\n\n   The context path the application is served over. `CATALINA_CONTEXT_PATH` is\n   also supported for backwards compatability.\n\n* `ATL_TOMCAT_ACCESS_LOG` (default: false [version < 7.11.0] and true [version >=7.11.0])\n\n   Whether to enable Tomcat access logging; set to `true` to enable. *NOTE*:\n   These logs are written to the Container internal volume by default (under\n   `/opt/atlassian/confluence/logs/`); these are rotated but not removed, and\n   will grow indefinitely. If you enable this functionality it is recommended\n   that you map the directory to a volume and perform log ingestion/cleanup with\n   external tools.\n\n* `ATL_TOMCAT_REQUESTATTRIBUTESENABLED`\n\n  Checks for the existence of request attributes (typically set by the RemoteIpValve and similar)\n  that should be used to override the values returned by the request for remote address,\n  remote host, server port and protocol. This property is usually combined with `ATL_TOMCAT_TRUSTEDPROXIES`\n  and `ATL_TOMCAT_INTERNALPROXIES` to show IP address of the remote host instead of the load balancer's.\n  If not declared, the default value of `false` will be used.\n\n* `ATL_TOMCAT_TRUSTEDPROXIES`\n\n  A list of IP addresses separated by a pipe character e.g. `10.0.9.6|10.0.9.32`.  \n  Trusted proxies that appear in the `remoteIpHeader` will be trusted and *will appear*\n  in the `proxiesHeader` value. By adding a list of Trusted Proxies, Confluence will remove the\n  load balancers' IP addresses from Confluence's view of the incoming connection. This could be desired\n  in a clustered load balancer architecture where the load balancer address changes depending on\n  which node proxies the connection.\n  If not specified, no trusted proxies will be trusted.\n\n* `ATL_TOMCAT_INTERNALPROXIES`\n\n  A list of IP addresses separated by a pipe character e.g. `10.0.9.6|10.0.9.32`.  \n  Trusted proxies that appear in the `remoteIpHeader` will be trusted and *will not appear*\n  in the `proxiesHeader` value. By adding a list of Internal Proxies, Confluence will remove the\n  load balancers' IP addresses from Confluence's view of the incoming connection. This could be desired\n  in a clustered load balancer architecture where the load balancer address changes depending on\n  which node proxies the connection. If not specified, no internal proxies will be trusted.\n\n\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_PORT` - If unset, no additional connector is defined in server.xml. No default.\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_CONNECTION_TIMEOUT` (default: 20000)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_MAX_THREADS` (default: 50)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_MIN_SPARE_THREADS` (default: 10)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_ENABLE_LOOKUPS` (default: false)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_ACCEPT_COUNT` (default: 10)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_URI_ENCODING` (default: UTF-8)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_SECURE` (no default, if undefined secure is not set in the connector)\n\nThe following Tomcat/Catalina options are also supported. For more information,\nsee <https://tomcat.apache.org/tomcat-7.0-doc/config/index.html>. \n\n* `ATL_TOMCAT_MGMT_PORT` (default: 8000)\n* `ATL_TOMCAT_MAXTHREADS` (default: 48)\n* `ATL_TOMCAT_MINSPARETHREADS` (default: 10)\n* `ATL_TOMCAT_CONNECTIONTIMEOUT` (default: 20000)\n* `ATL_TOMCAT_ENABLELOOKUPS` (default: false)\n* `ATL_TOMCAT_PROTOCOL` (default: org.apache.coyote.http11.Http11NioProtocol)\n* `ATL_TOMCAT_REDIRECTPORT` (default: 8443)\n* `ATL_TOMCAT_ACCEPTCOUNT` (default: 10)\n* `ATL_TOMCAT_DEBUG` (default: 0)\n* `ATL_TOMCAT_URIENCODING` (default: UTF-8)\n* `ATL_TOMCAT_MAXHTTPHEADERSIZE` (default: 8192)\n* `ATL_TOMCAT_STUCKTHREADDETECTIONVALVE_THRESHOLD` (default: 60)\n\n### Access Log Settings\n\nYou can set the maximum number of days for access logs to be retained before being deleted. The default value of -1 means never delete old files.\n\n* `ATL_TOMCAT_ACCESS_LOGS_MAXDAYS` (default: -1)\n* `ATL_TOMCAT_ACCESS_LOG_PATTERN` (default: `%h %{X-AUSERNAME}o %t &quot;%r&quot; %s %b %D %U %I &quot;%{User-Agent}i&quot;`)\n\n### JVM configuration\n\nIf you need to pass additional JVM arguments to Confluence such as specifying a\ncustom trust store, you can add them via the below environment variable\n\n* `JVM_SUPPORT_RECOMMENDED_ARGS`\n\n   Additional JVM arguments for Confluence.\n\n??? example\n    `docker run -e JVM_SUPPORT_RECOMMENDED_ARGS=-Djavax.net.ssl.trustStore=/var/atlassian/application-data/confluence/cacerts -v confluenceVolume:/var/atlassian/application-data/confluence --name=\"confluence\" -d -p 8090:8090 -p 8091:8091 atlassian/confluence`\n\nFor additional settings that can be supplied, see: [Recognized System Properties](https://confluence.atlassian.com/doc/recognized-system-properties-190430.html)\n\n### Confluence-specific settings\n\n* `ATL_AUTOLOGIN_COOKIE_AGE` (default: 1209600; two weeks, in seconds)\n\n   The maximum time a user can remain logged-in with 'Remember Me'.\n\n* `CONFLUENCE_HOME`\n\n   The confluence home directory. This may be on an mounted volume; if so it\n   should be writable by the user `confluence`. See note below about UID\n   mappings.\n\n* `ATL_LUCENE_INDEX_DIR`\n\n  The directory where [Lucene](https://lucene.apache.org/) search indexes should\n  be stored. Defaults to `index` under the Confluence home directory.\n\n* `ATL_LICENSE_KEY` (from Confluence 7.9 onwards)\n\n  The Confluence license string. Providing this will remove the need to supply it through the web startup screen.\n\n* **use with caution** `CONFLUENCE_LOG_STDOUT` `[true, false]`  (from Confluence 7.9 onwards)\n\n  Prior to Confluence version 7.9.0, the log files are always stored in the `logs` folder in Confluence home. From version\n  7.9.0, the logs can be printed directly to the `stdout` and don't use the file at all. This makes it possible to fetch the log messages\n  via `docker logs <CONTAINER_ID>`. In this setup we recommend using some log aggregation tooling (e.g. AWS Cloudwatch or ELK stack).\n\n  **Beware, if enabled, the support ZIP produced by the Troubleshooting and Support plugin doesn't contain the application logs.**\n\n* `ATL_SEARCH_PLATFORM`\n    \n    The search platform to use. Set to `opensearch` if you want to use OpenSearch as the search platform. See: https://confluence.atlassian.com/doc/configuring-opensearch-for-confluence-1387594125.html\n\n* `ATL_OPENSEARCH_HTTP_URL`\n\n    HTTP(S) URL of the OpenSearch cluster, or multiple URLs separated by commas.\n\n* `ATL_OPENSEARCH_USERNAME`\n\n    Username for the OpenSearch cluster.\n\n* `ATL_OPENSEARCH_PASSWORD`\n\n  Password for the OpenSearch cluster.\n\n* `ATL_CONFLUENCE_SESSION_TIMEOUT`\n\n  The default Tomcat session timeout (in minutes) for all newly created sessions which is set in web.xml. Defaults to 30.\n\n* `ATL_CONFLUENCE_CFG_ADDITIONAL_PROPERTIES`\n\n    Additional properties to be added to `confluence.cfg.xml`. The properties should be in the format `key=value` and separated by a comma. For example, `ATL_CONFLUENCE_CFG_ADDITIONAL_PROPERTIES=confluence.cluster.node.name=node1,confluence.cluster.node.server=server1`.\n\n### Database configuration\n\nIt is optionally possible to configure the database from the environment,\navoiding the need to do so through the web startup screen.\n\nThe following variables are all must all be supplied if using this feature:\n\n* `ATL_JDBC_URL`\n\n   The database URL; this is database-specific. It is allowed to use `&` in the URL which will be automatically converted to `&amp;`.\n\n* `ATL_JDBC_USER`\n\n   The database user to connect as.\n\n* `ATL_JDBC_PASSWORD`\n\n   The password for the database user.\n\n* `ATL_DB_TYPE`\n\n   The type of database; valid supported values are:\n\n   * `mssql`\n   * `mysql`\n   * `oracle12c` (Confluence 7.3.0 or earlier only)\n   * `oracle` (Confluence 7.3.1 or later only. Compatible with Oracle 12c and Oracle 19c)\n   * `postgresql`\n\n???+ note \"MySQL or Oracle JDBC drivers\"\n    Due to licensing restrictions Confluence does not ship with a MySQL or Oracle JDBC drivers. \n    To use these databases you will need to copy a suitable driver into the container and restart it. \n    For example, to copy the MySQL driver into a container named \"confluence\", you would do the following:\n\n    `docker cp mysql-connector-java.x.y.z.jar confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib`\n\n    `docker restart confluence`\n\nFor more information see the [Database JDBC Drivers](https://confluence.atlassian.com/doc/database-jdbc-drivers-171742.html)\npage.\n\n#### Optional database settings\n\n* `ATL_JDBC_SECRET_CLASS`\n\n[Encryption class](https://confluence.atlassian.com/doc/encrypt-database-password-1115674739.html) for the database password.\nDepending on the secret class, the value of `ATL_JDBC_PASSWORD` will differ. Defaults to plaintext. \n\n!!! warning \"JDBC encryption can only be used with Confluence instances that have already been set up.\"\n\nStarting from 8.6 [AWS SecretsManager](https://confluence.atlassian.com/doc/configuring-confluence-with-aws-secrets-manager-1299911239.html) is supported.\n\nFor non-clustered Confluence, manually edit `jdbc.password.decrypter.classname` and `hibernate.connection.password` properties as instructed by  step 5 of official [documentation](https://confluence.atlassian.com/doc/configuring-confluence-with-aws-secrets-manager-1299911239.html), then restart container. \n\nFor clustered Confluence, set this property while making sure environment variables in [cluster configuration](#cluster-configuration) are kept intact as well. \nExample:\n```shell\ndocker run -v /data/your-confluence-home:/var/atlassian/application-data/confluence \\\n--name=\"confluence\" -d -p 8090:8090 -p 8091:8091 \\\n-e ATL_JDBC_SECRET_CLASS='com.atlassian.secrets.store.aws.AwsSecretsManagerStore' \\\n-e ATL_JDBC_PASSWORD='{\"region\": \"us-east-1\", \"secretId\": \"mysecret\", \"secretPointer\": \"/password\"}' \\\n-e ATL_CLUSTER_RELATED_VARIABLES='variable-value' \\\natlassian/confluence\n```\n\nThe following variables are for the database connection pool, and are\noptional.\n\n* `ATL_DB_POOLMINSIZE` (default: 20)\n* `ATL_DB_POOLMAXSIZE` (default: 100)\n* `ATL_DB_TIMEOUT` (default: 30)\n* `ATL_DB_IDLETESTPERIOD` (default: 100)\n* `ATL_DB_MAXSTATEMENTS` (default: 0)\n* `ATL_DB_VALIDATE` (default: false)\n* `ATL_DB_ACQUIREINCREMENT` (default: 1)\n* `ATL_DB_VALIDATIONQUERY` (default: \"select 1\")\n* `ATL_DB_PROVIDER_CLASS` (default: `com.atlassian.confluence.impl.hibernate.DelegatingHikariConnectionProvider`)\n* `ATL_DB_CONNECTION_AUTOCOMMIT` (default false)\n* `ATL_DB_CONNECTION_ISOLATION` (default 2)\n* `ATL_DB_DATASOURCE_HIKARI_REGISTER_MBEANS` (default true)\n\n\n### Data Center configuration\n\nThis docker image can be run as part of a [Data Center][4] cluster. You can\nspecify the following properties to start Confluence as a Data Center node,\ninstead of manually configuring a cluster. See [Installing Confluence Data\nCenter][5] for more information.\n\n#### Cluster configuration\n\nConfluence Data Center allows clustering via various methods. For more\ninformation on the setting for each type see [this page][6].\n\n**NOTE:** The underlying network should be set-up to support the Confluence\nclustering type you are using. How to do this depends on the container\nmanagement technology, and is beyond the scope of this documentation.\n\n##### Common cluster settings\n\n* `ATL_CLUSTER_TYPE`\n\n   The cluster type. Setting this effectively enables clustering. Valid values\n   are `aws`, `multicast`, and `tcp_ip`.\n\n* `ATL_CLUSTER_NAME`\n\n   The cluster name; this should be common across all nodes.\n\n* `ATL_PRODUCT_HOME_SHARED`\n\n   The location of the shared home directory for all Confluence nodes. **Note**:\n   This must be real shared filesystem that is mounted inside the\n   container. Additionally, see the note about UIDs.\n\n* `ATL_CLUSTER_TTL`\n\n   The time-to-live for cluster packets. Primarily of use in multicast clusters.\n\n* `ATL_CLUSTER_INTERFACE`\n   \n   The network interface Confluence will use to communicate between nodes. Auto-detected by default.\n   [Override interface](https://confluence.atlassian.com/doc/data-center-troubleshooting-203618.html#DataCenterTroubleshooting-Changemulticastinterface) if Confluence has selected the wrong one.\n  \n\n##### AWS cluster settings\n\n   The following should be populated from the AWS environment.\n\n* `ATL_HAZELCAST_NETWORK_AWS_IAM_ROLE`\n* `ATL_HAZELCAST_NETWORK_AWS_IAM_REGION`\n* `ATL_HAZELCAST_NETWORK_AWS_HOST_HEADER`\n* `ATL_HAZELCAST_NETWORK_AWS_SECURITY_GROUP`\n* `ATL_HAZELCAST_NETWORK_AWS_TAG_KEY`\n* `ATL_HAZELCAST_NETWORK_AWS_TAG_VALUE`\n\n##### TCP cluster settings\n\n* `ATL_CLUSTER_PEERS`\n\n   A comma-separated list of peer IPs.\n\n##### Multicast cluster settings\n\n* `ATL_CLUSTER_ADDRESS`\n\n   The multicast address the cluster will communicate on.\n\n### Container Configuration\n\n* `ATL_FORCE_CFG_UPDATE` (default: false)\n\n   The Docker [entrypoint][13] generates application configuration on\n   first start; not all of these files are regenerated on subsequent\n   starts. This is deliberate, to avoid race conditions or overwriting manual\n   changes during restarts and upgrades. However in deployments where\n   configuration is purely specified through the environment (e.g. Kubernetes)\n   this behaviour may be undesirable; this flag forces an update of all\n   generated files.\n\n   In Confluence the affected files are: `confluence.cfg.xml`\n\n   See [the entrypoint code][13] for the details of how configuration\n   files are generated.\n\n* `SET_PERMISSIONS` (default: true)\n\n   Define whether to set home directory permissions on startup. Set to `false` to disable\n   this behaviour.\n\n* `ATL_UNSET_SENSITIVE_ENV_VARS` (default: true)\n\n   Define whether to unset environment variables containing keywords 'PASS', 'SECRET' or 'TOKEN'.\n   The unset function is executed in the entrypoint. Set to `false` if you want to allow passing\n   sensitive environment variables to Confluence container.\n\n???+ warning \"Value exposure on host OS\"\n    When using this property, the values to sensitive environment variables will be available in clear text on the \n    host OS. As such, this data may be exposed to users or processes running on the host OS.\n\n* `ATL_ALLOWLIST_SENSITIVE_ENV_VARS`\n\n   Define a comma separated list of environment variables containing keywords 'PASS', 'SECRET' or 'TOKEN' to be ignored by the unset function which is executed in the entrypoint. The function uses `^` regex. For example, if you set `ATL_ALLOWLIST_SENSITIVE_ENV_VARS=\"PATH_TO_SECRET_FILE\"`, all variables starting with `PATH_TO_SECRET_FILE` will not be unset.\n\n???+ warning \"Value exposure on host OS\"\n    When using this property, the values to sensitive environment variables will be available in clear text on the \n    host OS. As such, this data may be exposed to users or processes running on the host OS.\n\n### Advanced Configuration\n\nAs mentioned at the top of this section, the settings from the environment are\nused to populate the application configuration on the container startup. However,\nin some cases you may wish to customise the settings in ways that are not\nsupported by the environment variables above. In this case, it is possible to\nmodify the base templates to add your own configuration. There are three main\nways of doing this; modify our repository to your own image, build a new image\nfrom the existing one, or provide new templates at startup. We will briefly\noutline these methods here, but in practice how you do this will depend on your\nneeds.\n\n##### Building your own image\n\n* Clone the Atlassian repository at <https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/>\n* Modify or replace the [Jinja](https://jinja.palletsprojects.com/) templates\n  under `config`; _NOTE_: The files must have the `.j2` extensions. However you\n  don't have to use template variables if you don't wish.\n* Build the new image with e.g: `docker build --tag my-confluence-image --build-arg CONFLUENCE_VERSION=6.x.x .`\n* Optionally push to a registry, and deploy.\n\n##### Build a new image from the existing one\n\n* Create a new `Dockerfile`, which starts with the line e.g: `FROM atlassian/confluence:latest`.\n* Use a `COPY` line to overwrite the provided templates.\n* Build, push and deploy the new image as above.\n\n##### Overwrite the templates at runtime\n\nThere are two main ways of doing this:\n\n* If your container is going to be long-lived, you can create it, modify the\n  installed templates under `/opt/atlassian/etc/`, and then run it.\n* Alternatively, you can create a volume containing your alternative templates,\n  and mount it over the provided templates at runtime\n  with `--volume my-config:/opt/atlassian/etc/`.\n\n## Shared directory and user IDs\n\nBy default the Confuence application runs as the user `confluence`, with a UID\nand GID of 2002. Consequently this UID must have write access to the shared\nfilesystem. If for some reason a different UID must be used, there are a number\nof options available:\n\n* The Docker image can be rebuilt with a different UID.\n* Under Linux, the UID can be remapped using\n  [user namespace remapping][7].\n\nTo preserve strict permissions for certain configuration files, this container starts as\n`root` to perform bootstrapping before running Confluence under a non-privileged user\naccount. If you wish to start the container as a non-root user, please note that Tomcat\nconfiguration, and the bootstrapping of seraph-config.xml (SSO) &\nconfluence-init.properties (overriding `$CONFLUENCE_HOME`) will be skipped and a warning\nwill be logged. You may still apply custom configuration in this situation by mounting a\ncustom file directly, e.g. by mounting your own server.xml file directly to\n`/opt/atlassian/confluence/conf/server.xml`\n\nDatabase and Clustering bootstrapping will work as expected when starting this container\nas a non-root user.\n\n## Upgrade\n\nTo upgrade to a more recent version of Confluence Server you can simply stop the\n`Confluence` container and start a new one based on a more recent image:\n```shell\ndocker stop confluence\ndocker rm confluence\ndocker run ... (see above)\n```\nAs your data is stored in the data volume directory on the host, it will still\nbe available after the upgrade.\n\n!!! note \"Please make sure that you **don't** accidentally remove the `confluence` container and its volumes using the `-v` option.\"\n\n## Backup\n\nFor evaluating Confluence you can use the built-in database that will store its\nfiles in the Confluence Server home directory. In that case it is sufficient to\ncreate a backup archive of the directory on the host that is used as a volume\n(`/data/your-confluence-home` in the example above).\n\nConfluence's [automatic backup][8] is currently supported in the Docker\nsetup. You can also use the [Production Backup Strategy][9] approach if you're\nusing an external database.\n\nRead more about data recovery and backups: [Site Backup and Restore][10]\n\n## Shutdown\n\nConfluence allows a grace period of 20s for active operations to finish before\ntermination. If sending a `docker stop` this should be taken into account with\nthe `--time` flag.\n\nAlternatively, the script `/shutdown-wait.sh` is provided, which will initiate a\nclean shutdown and wait for the process to complete. This is the recommended\nmethod for shutdown in environments which provide for orderly shutdown,\ne.g. Kubernetes via the `preStop` hook.\n\n## Versioning\n\nThe `latest` tag matches the most recent official release of Atlassian Confluence Server.\nSo `atlassian/confluence:latest` will use the newest stable version of\nConfluence Server available.\n\nAlternatively, you can use a specific minor version of Confluence Server by\nusing a version number tag: `atlassian/confluence:7.13`. This will\ninstall the latest `7.13.x` version that is available.\n\nWe also publish docker images for our [EAP releases](https://www.atlassian.com/software/confluence/download-eap) (not\nsupported for use in production). The tag for EAP releases is the EAP version.\nFor example to get the `7.8.0-beta1` EAP release, use `atlassian/confluence:7.8.0-beta1`.\n\nFor example, `atlassian/confluence:7.13-ubuntu-jdk11` will\ninstall the latest 7.13.x version with Eclipse Temurin OpenJDK 11.\n\n## Supported JDK versions and base images\n\nAtlassian Docker images are generated from the\n[official Eclipse Temurin OpenJDK Docker images](https://hub.docker.com/_/eclipse-temurin).\n\nStarting from 8.5.6 [UBI based](https://catalog.redhat.com/software/containers/ubi9/openjdk-17/61ee7c26ed74b2ffb22b07f6?architecture=amd64) tags are published as well.\nTags are available in 2 formats: `<version>-ubi9` and `<version>-ubi9-jdk17`.\n\nThe build pipeline pushes both JDK11 and JDK17 tags for Confluence versions ranging from 7.19 to 8.9.\nStarting from 9.0 only JDK17 tags are published. UBI based tags are JDK17 only.\n\nThe Docker images follow the [Atlassian Support end-of-life\npolicy](https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html);\nimages for unsupported versions of the products remain available but will no longer\nreceive updates or fixes.\n\nHistorically, we have also generated other versions of the images, including\nJDK8, Alpine, and 'slim' versions of the JDK. These legacy images still exist in\nDocker Hub, however they should be considered deprecated, and do not receive\nupdates or fixes.\n\nIf for some reason you need a different version, see \"Building your own image\"\nabove.\n\n## Migration to UBI\n\nIf you have been mounting any files to `${JAVA_HOME}` directory in `eclipse-temurin` based container, `JAVA_HOME` in UBI JDK17 container is set to `/usr/lib/jvm/java-17`.\n\nAlso, if you have been mounting and running any custom scripts in the container, UBI-based images may lack some tools and utilities that are available out of the box in eclipse-temurin tags. If that's the case, see [Building your own image](#building-your-own-image).\n\n\n## Supported architectures\n\nCurrently, Confluence container images are built for the `linux/amd64` and `linux/arm64` target platforms.\nThe Dockerfiles and support tooling have now had all\narchitecture-specific components removed, so if necessary it is possible to\nbuild images for any platform supported by OCI-compliant container runtimes.\n\n### Building on the target architecture\n\nNote: This method is known to work on Mac M1 and AWS ARM64 machines, but has not\nbeen extensively tested.\n\nThe simplest method of getting a platform image is to build it on a target\nmachine. The following assumes you have git and Docker installed. You will also\nneed to know which version of Confluence you want to build; substitute\n`CONFLUENCE_VERSION=x.x.x` with your required version:\n\n```shell\ngit clone --recurse-submodule https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server.git\ncd docker-atlassian-confluence-server\ndocker build --tag my-image --build-arg CONFLUENCE_VERSION=x.x.x .\n```\nThis image can be pushed up to your own Docker Hub or private repository.\n\n## Troubleshooting\n\nThese images include built-in scripts to assist in performing common JVM diagnostic tasks.\n\n### Thread dumps\n\n`/opt/atlassian/support/thread-dumps.sh` can be run via `docker exec` to easily trigger the collection of thread\ndumps from the containerized application. For example:\n\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh\n```\n\nBy default, this script will collect 10 thread dumps at 5 second intervals. This can\nbe overridden by passing a custom value for the count and interval, by using `-c` / `--count`\nand `-i` / `--interval` respectively. For example, to collect 20 thread dumps at 3 second intervals:\n\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh --count 20 --interval 3\n```\n\nThread dumps will be written to `$APP_HOME/thread_dumps/<date>`.\n\n???+ note \"Disable capturing output from top run\"\n    By default this script will also capture output from top run in 'Thread-mode'. This can\n    be disabled by passing `-n` / `--no-top`\n\n### Heap dump\n\n`/opt/atlassian/support/heap-dump.sh` can be run via `docker exec` to easily trigger the collection of a heap\ndump from the containerized application. For example:\n\n```shell\ndocker exec my_container /opt/atlassian/support/heap-dump.sh\n```\n\nA heap dump will be written to `$APP_HOME/heap.bin`. If a file already exists at this\nlocation, use `-f` / `--force` to overwrite the existing heap dump file.\n\n### Manual diagnostics\n\nThe `jcmd` utility is also included in these images and can be used by starting a `bash` shell\nin the running container:\n\n```shell\ndocker exec -it my_container /bin/bash\n```\n\n## Support\n\nFor product support, go to\n[support.atlassian.com](https://support.atlassian.com/confluence-server/).\n\nYou can also visit the [Atlassian Data Center](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes)\nforum for discussion on running Atlassian Data Center products in containers.\n\n## Contribution\n\nSee the [contributing guideline][14] if you are contributing from outside Atlassian.\n\n## Changelog\n\nFor a detailed list of changes to the Docker image configuration see [the Git\ncommit history](https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/commits/).\n\n## License\n\nCopyright © 2020 Atlassian Corporation Pty Ltd.\nLicensed under the Apache License, Version 2.0.\n\n[1]: https://docs.docker.com/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume\n[3]: https://confluence.atlassian.com/display/DOC/Supported+platforms\n[4]: https://confluence.atlassian.com/doc/confluence-data-center-technical-overview-790795847.html\n[5]: https://confluence.atlassian.com/doc/installing-confluence-data-center-203603.html\n[6]: https://confluence.atlassian.com/doc/change-node-discovery-from-multicast-to-tcp-ip-or-aws-792297728.html#ChangeNodeDiscoveryfromMulticasttoTCP/IPorAWS-TochangefromTCP/IPtomulticast\n[7]: https://docs.docker.com/engine/security/userns-remap/\n[8]: https://confluence.atlassian.com/display/DOC/Configuring+Backups\n[9]: https://confluence.atlassian.com/display/DOC/Production+Backup+Strategy\n[10]: https://confluence.atlassian.com/display/DOC/Site+Backup+and+Restore\n[12]: https://confluence.atlassian.com/doc/confluence-6-13-release-notes-959288785.html\n[13]: https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/src/master/entrypoint.py\n[14]: https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/src/master/CONTRIBUTING.md\n"
  },
  {
    "path": "docs/docs/containers/CROWD.md",
    "content": "# ![Atlassian Crowd](https://wac-cdn.atlassian.com/dam/jcr:d2a1da52-ae52-4b06-9ab1-da8647a89653/crowd-icon-gradient-blue.svg?cdnVersion=696){: style=\"height:35px;width:35px\"} Crowd\n\n## Overview\n\nCrowd provides single sign-on and user identity that's easy to use.\n\nLearn more about Crowd: [https://www.atlassian.com/software/crowd][1]\n\nThis Docker container makes it easy to get an instance of Crowd up and running.\n\n**Use docker version >= 20.10.10**\n\n## Quick Start\n\nFor the `CROWD_HOME` directory that is used to store application data (amongst other things) we recommend mounting a host directory as a [data volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes), or via a named volume.\n\nTo get started you can use a data volume, or named volumes. In this example we'll use named volumes.\n```shell\ndocker volume create --name crowdVolume\ndocker run -v crowdVolume:/var/atlassian/application-data/crowd --name=\"crowd\" -d -p 8095:8095 atlassian/crowd\n```\n!!! success \"Crowd is now available on [http://localhost:8095](http://localhost:8095).\"\n\nPlease ensure your container has the necessary resources allocated to it. See [Supported Platforms][2] for further information.\n\n???+ tip \"If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):8095` instead.\"\n\n## Common settings\n\n### Verbose container entrypoint logging\n\nDuring the startup process of the container, various operations and checks are performed to ensure that the application\nis configured correctly and ready to run. To help in troubleshooting and to provide transparency into this process, you\ncan enable verbose logging. The `VERBOSE_LOGS` environment variable enables detailed debug messages to the container's\nlog, offering insights into the actions performed by the entrypoint script.\n\n* `VERBOSE_LOGS` (default: false)\n\n  Set to `true` to enable detailed debug messages during the container initialization.\n\n### Memory / Heap Size\n\nIf you need to override Crowd's default memory allocation, you can control the minimum heap (Xms) and maximum heap (Xmx) via the below environment variables.\n\n* `JVM_MINIMUM_MEMORY` (default: 384m)\n\n   The minimum heap size of the JVM\n\n* `JVM_MAXIMUM_MEMORY` (default: 768m)\n\n   The maximum heap size of the JVM\n\n### Reverse Proxy Settings\n\nIf Crowd is run behind a reverse proxy server as [described here][3], then you need to specify extra options to make Crowd aware of the setup. They can be controlled via the below environment variables.\n\n* `ATL_TOMCAT_CONTEXTPATH` (default: /crowd)\n\n  The context path the application is served over.\n\n* `ATL_PROXY_NAME` (default: NONE)\n\n   The reverse proxy's fully qualified hostname. `CATALINA_CONNECTOR_PROXYNAME`\n   is also supported for backwards compatability.\n\n* `ATL_PROXY_PORT` (default: NONE)\n\n   The reverse proxy's port number via which Crowd is\n   accessed. `CATALINA_CONNECTOR_PROXYPORT` is also supported for backwards\n   compatability.\n\n* `ATL_TOMCAT_PORT` (default: 8095)\n\n   The port for Tomcat/Crowd to listen on. Depending on your container\n   deployment method this port may need to be\n   [exposed and published][docker-expose].\n\n* `ATL_TOMCAT_SCHEME` (default: http)\n\n   The protocol via which Crowd is accessed. `CATALINA_CONNECTOR_SCHEME` is also\n   supported for backwards compatability.\n\n* `ATL_TOMCAT_SECURE` (default: false)\n\n   Set 'true' if `ATL_TOMCAT_SCHEME` is 'https'. `CATALINA_CONNECTOR_SECURE` is\n   also supported for backwards compatability.\n\nThe following Tomcat/Catalina options are also supported. For more information,\nsee https://tomcat.apache.org/tomcat-8.5-doc/config/index.html.\n\n* `ATL_TOMCAT_MGMT_PORT` (default: 8000)\n* `ATL_TOMCAT_MAXTHREADS` (default: 100)\n* `ATL_TOMCAT_MINSPARETHREADS` (default: 10)\n* `ATL_TOMCAT_CONNECTIONTIMEOUT` (default: 20000)\n* `ATL_TOMCAT_ENABLELOOKUPS` (default: false)\n* `ATL_TOMCAT_PROTOCOL` (default: HTTP/1.1)\n* `ATL_TOMCAT_ACCEPTCOUNT` (default: 10)\n* `ATL_TOMCAT_MAXHTTPHEADERSIZE` (default: 8192)\n\n### Access Log Settings\n\nYou can set the maximum number of days for access logs to be retained before being deleted. The default value of -1 means never delete old files.\n\n* `ATL_TOMCAT_ACCESS_LOGS_MAXDAYS` (default: -1)\n\n### JVM Configuration\n\nIf you need to pass additional JVM arguments to Crowd, such as specifying a custom trust store, you can add them via the below environment variable\n\n* `JVM_SUPPORT_RECOMMENDED_ARGS`\n\n   Additional JVM arguments for Crowd\n\n??? example \n    `docker run -e JVM_SUPPORT_RECOMMENDED_ARGS=-Djavax.net.ssl.trustStore=/var/atlassian/application-data/crowd/cacerts -v crowdVolume:/var/atlassian/application-data/crowd --name=\"crowd\" -d -p 8095:8095 atlassian/crowd` \n\n### Data Center configuration\n\nThis docker image can be run as part of a [Data Center][4] cluster. You can\nspecify the following properties to start Crowd as a Data Center node,\ninstead of manually configuring a cluster. See [Installing Crowd Data\nCenter][5] for more information.\n\n### Container Configuration\n\n* `SET_PERMISSIONS` (default: true)\n\n   Define whether to set home directory permissions on startup. Set to `false` to disable\n   this behaviour.\n\n### Advanced Configuration\n\nAs mentioned at the top of this section, the settings from the environment are\nused to populate the application configuration on the container startup. However,\nin some cases you may wish to customise the settings in ways that are not\nsupported by the environment variables above. In this case, it is possible to\nmodify the base templates to add your own configuration. There are three main\nways of doing this; modify our repository to your own image, build a new image\nfrom the existing one, or provide new templates at startup. We will briefly\noutline these methods here, but in practice how you do this will depend on your\nneeds.\n\n##### Building your own image\n\n* Clone the Atlassian repository at https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n* Modify or replace the [Jinja](https://jinja.palletsprojects.com/) templates\n  under `config`; _NOTE_: The files must have the `.j2` extensions. However you\n  don't have to use template variables if you don't wish.\n* Build the new image with e.g: `docker build --tag my-crowd-image --build-arg CROWD_VERSION=3.x.x .`\n* Optionally push to a registry, and deploy.\n\n##### Build a new image from the existing one\n\n* Create a new `Dockerfile`, which starts with the Atlassian Crowd base image e.g: `FROM atlassian/crowd:latest`.\n* Use a `COPY` line to overwrite the provided templates.\n* Build, push and deploy the new image as above.\n\n##### Overwrite the templates at runtime\n\nThere are two main ways of doing this:\n\n* If your container is going to be long-lived, you can create it, modify the\n  installed templates under `/opt/atlassian/etc/`, and then run it.\n* Alternatively, you can create a volume containing your alternative templates,\n  and mount it over the provided templates at runtime\n  with `--volume my-config:/opt/atlassian/etc/`.\n\n## Shared directory and user IDs\n\nBy default the Crowd application runs as the user `crowd`, with a UID\nand GID of 2004. Consequently this UID must have write access to the shared\nfilesystem. If for some reason a different UID must be used, there are a number\nof options available:\n\n* The Docker image can be rebuilt with a different UID.\n* Under Linux, the UID can be remapped using\n  [user namespace remapping][7].\n\nTo preserve strict permissions for certain configuration files, this container starts as\n`root` to perform bootstrapping before running Crowd under a non-privileged user\naccount. If you wish to start the container as a non-root user, please note that Tomcat\nconfiguration will be skipped and a warning will be logged. You may still apply custom\nconfiguration in this situation by mounting configuration files directly, e.g.\nby mounting your own server.xml file directly to\n`/opt/atlassian/crowd/apache-tomcat/conf/server.xml`\n\n## Upgrade\n\nTo upgrade to a more recent version of Crowd you can simply stop the `crowd` container and start a new one based on a more recent image:\n\n```shell\ndocker stop crowd\ndocker rm crowd\ndocker run ... (See above)\n```\n\nAs your data is stored in the data volume directory on the host it will still  be available after the upgrade.\n\n!!! note \"Please make sure that you **don't** accidentally remove the `crowd` container and its volumes using the `-v` option.\"\n\n## Backup\n\nFor evaluations you can use the built-in database that will store its files in the Crowd home directory. In that case it is sufficient to create a backup archive of the docker volume.\n\nIf you're using an external database, you can configure Crowd to make a backup automatically each night. This will back up the current state, including the database to the `crowdVolume` docker volume, which can then be archived. Alternatively you can backup the database separately, and continue to create a backup archive of the docker volume to back up the Crowd Home directory.\n\nRead more about data recovery and backups: [Backing Up and Restoring Data][6]\n\n## Versioning\n\nThe `latest` tag matches the most recent release of Atlassian Crowd. Thus `atlassian/crowd:latest` will use the newest version of Crowd available.\n\nAlternatively you can use a specific major, major.minor, or major.minor.patch version of Crowd by using a version number tag:\n\n* `atlassian/crowd:3`\n* `atlassian/crowd:3.2`\n* `atlassian/crowd:3.2.3`\n\nAll versions from 3.0+ are available\n\n## Supported JDK versions and base images\n\nAll Atlassian Crowd Docker images are now JDK11 only, and generated from the\n[official Eclipse Temurin OpenJDK Docker images](https://hub.docker.com/_/eclipse-temurin).\n\nStarting from 5.2.3 [UBI based](https://catalog.redhat.com/software/containers/ubi9/openjdk-11-runtime/61ee7d1c33f211c45407a91c) tags are published as well.\nUBI tags are available in 2 formats: `<version>-ubi9` and `<version>-ubi9-jdk11`.\n\nThe Docker images follow the [Atlassian Support end-of-life\npolicy](https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html);\nimages for unsupported versions of the products remain available but will no longer\nreceive updates or fixes.\n\nHistorically, we have also generated other versions of the images, including\nJDK8, Alpine, and 'slim' versions of the JDK. These legacy images still exist in\nDocker Hub, however they should be considered deprecated, and do not receive\nupdates or fixes.\n\nIf for some reason you need a different version, see \"Building your own image\"\nabove.\n\n## Migration to UBI\n\nIf you have been mounting any files to `${JAVA_HOME}` directory in `eclipse-temurin` based container, `JAVA_HOME` in UBI JDK11 container is set to `/usr/lib/jvm/java-11`.\n\nAlso, if you have been mounting and running any custom scripts in the container, UBI-based images may lack some tools and utilities that are available out of the box in `eclipse-temurin` tags. If that's the case, see [Building your own image](#building-your-own-image).\n\n\n## Supported architectures\n\nCurrently, Crowd container images are built for the `linux/amd64` and `linux/arm64` target platforms.\nThe Dockerfiles and support tooling have now had all\narchitecture-specific components removed, so if necessary it is possible to\nbuild images for any platform supported by OCI-compliant container runtimes.\n\n### Building on the target architecture\n\nNote: This method is known to work on Mac M1 and AWS ARM64 machines, but has not\nbeen extensively tested.\n\nThe simplest method of getting a platform image is to build it on a target\nmachine. The following assumes you have git and Docker installed. You will also\nneed to know which version of Crowd you want to build; substitute\n`CROWD_VERSION=x.x.x` with your required version:\n\n```shell\ngit clone --recurse-submodule https://bitbucket.org/atlassian-docker/docker-atlassian-crowd.git\ncd docker-atlassian-crowd\ndocker build --tag my-image --build-arg CROWD_VERSION=x.x.x .\n```\nThis image can be pushed up to your own Docker Hub or private repository.\n\n## Troubleshooting\n\nThese images include built-in scripts to assist in performing common JVM diagnostic tasks.\n\n### Thread dumps\n\n`/opt/atlassian/support/thread-dumps.sh` can be run via `docker exec` to easily trigger the collection of thread\ndumps from the containerized application. For example:\n\n```shell\ndocker exec my_crowd /opt/atlassian/support/thread-dumps.sh\n```\n\nBy default this script will collect 10 thread dumps at 5 second intervals. This can\nbe overridden by passing a custom value for the count and interval, by using `-c` / `--count`\nand `-i` / `--interval` respectively. For example, to collect 20 thread dumps at 3 second intervals:\n\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh --count 20 --interval 3\n```\n\nThread dumps will be written to `$APP_HOME/thread_dumps/<date>`.\n\n???+ note \"Disable capturing output from top run\"\n    By default this script will also capture output from top run in 'Thread-mode'. This can\n    be disabled by passing `-n` / `--no-top`\n\n### Heap dump\n\n`/opt/atlassian/support/heap-dump.sh` can be run via `docker exec` to easily trigger the collection of a heap\ndump from the containerized application. For example:\n\n```shell\ndocker exec my_container /opt/atlassian/support/heap-dump.sh\n```\n\nA heap dump will be written to `$APP_HOME/heap.bin`. If a file already exists at this\nlocation, use `-f` / `--force` to overwrite the existing heap dump file.\n\n### Manual diagnostics\n\nThe `jcmd` utility is also included in these images and can be used by starting a `bash` shell\nin the running container:\n\n```shell\ndocker exec -it my_container /bin/bash\n```\n\n## Support\n\nFor product support, go to:\n\n* https://support.atlassian.com/crowd/\n\nYou can also visit the [Atlassian Data Center](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes)\nforum for discussion on running Atlassian Data Center products in containers.\n\n## Changelog\n\nFor a detailed list of changes to the Docker image configuration see [the Git\ncommit history](https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/commits/).\n\n## License\n\nCopyright © 2019 Atlassian Corporation Pty Ltd.\nLicensed under the Apache License, Version 2.0.\n\n[1]: https://www.atlassian.com/software/crowd\n[2]: https://confluence.atlassian.com/crowd/supported-platforms-191851.html\n[3]: https://confluence.atlassian.com/crowd031/integrating-crowd-with-apache-949753124.html\n[4]: https://confluence.atlassian.com/crowd/crowd-data-center-935372453.html\n[5]: https://confluence.atlassian.com/crowd/installing-crowd-data-center-935369773.html\n[6]: https://confluence.atlassian.com/crowd/backing-up-and-restoring-data-36470797.html\n[7]: https://docs.docker.com/engine/security/userns-remap/\n"
  },
  {
    "path": "docs/docs/containers/JIRA.md",
    "content": "# ![Atlassian Jira Software](https://wac-cdn.atlassian.com/dam/jcr:826c97dc-1f5c-4955-bfcc-ea17d6b0c095/jira%20software-icon-gradient-blue.svg?cdnVersion=492){: style=\"height:35px;width:35px\"}![Atlassian Jira Service Management](https://wac-cdn.atlassian.com/dam/jcr:8e0905be-0ee7-4652-ba3a-4e3db1143969/jira%20service%20desk-icon-gradient-blue.svg?cdnVersion=492){: style=\"height:35px;width:35px\"}![Atlassian Jira Core](https://wac-cdn.atlassian.com/dam/jcr:f89f1ce5-60f1-47c2-b9f5-657de4940d31/jira%20core-icon-gradient-blue.svg?cdnVersion=492){: style=\"height:35px;width:35px\"} Jira\n\n## Overview\n\nJira Software Data Center helps the world’s best agile teams plan, track, and release great software at scale.\n\n* Check out [atlassian/jira-software](http://hub.docker.com/r/atlassian/jira-software/) on Docker Hub\n* Learn more about Jira Software: [https://www.atlassian.com/software/jira](https://www.atlassian.com/software/jira)\n\nJira Service Management Data Center is an enterprise ITSM solution that offers high availability, meeting your security and compliance needs so no request goes unresolved.\n\n* Check out [atlassian/jira-servicemanagement](http://hub.docker.com/r/atlassian/jira-servicemanagement/) on Docker Hub\n* Learn more about Jira Service Management: [https://www.atlassian.com/software/jira/service-management](https://www.atlassian.com/software/jira/service-management)\n\nJira Core is a project and task management solution built for business teams.\n\n* Check out [atlassian/jira-core](http://hub.docker.com/r/atlassian/jira-core/) on Docker Hub\n* Learn more about Jira Core: [https://www.atlassian.com/software/jira/core](https://www.atlassian.com/software/jira/core)\n\nThis Docker container makes it easy to get an instance of Jira Software, Service Management or Core up and running.\n\nNote: Jira Software will be referenced in the examples provided.\n\n**Use docker version >= 20.10.10**\n\n## Quick Start\n\nFor the `JIRA_HOME` directory that is used to store application data (amongst\nother things) we recommend mounting a host directory as a [data\nvolume](https://docs.docker.com/engine/tutorials/dockervolumes/#/data-volumes),\nor via a named volume.\n\nAdditionally, if running Jira in Data Center mode it is required that a shared\nfilesystem is mounted. The mount point (inside the container) can be configured\nwith `JIRA_SHARED_HOME`.\n\nTo get started you can use a data volume, or named volumes. In this example\nwe'll use named volumes.\n\n```shell\ndocker volume create --name jiraVolume\ndocker run -v jiraVolume:/var/atlassian/application-data/jira --name=\"jira\" -d -p 8080:8080 atlassian/jira-software\n```\n\n!!! success \"Jira is now available on [http://localhost:8080](http://localhost:8080).\"\n\nPlease ensure your container has the necessary resources allocated to it. We\nrecommend 2GiB of memory allocated to accommodate the application server. See\n[System Requirements](https://confluence.atlassian.com/adminjiraserver071/jira-applications-installation-requirements-802592164.html)\nfor further information.\n\n???+ tip \"If you are using `docker-machine` on Mac OS X, please use `open http://$(docker-machine ip default):8080` instead.\"\n\n## Configuring Jira\n\nThis Docker image is intended to be configured from its environment; the\nprovided information is used to generate the application configuration files\nfrom templates. This allows containers to be repeatably created and destroyed\non-the-fly, as required in advanced cluster configurations. Most aspects of the\ndeployment can be configured in this manner; the necessary environment variables\nare documented below. However, if your particular deployment scenario is not\ncovered by these settings, it is possible to override the provided templates\nwith your own; see the section [Advanced Configuration](#advanced-configuration) below.\n\n### Verbose container entrypoint logging\n\nDuring the startup process of the container, various operations and checks are performed to ensure that the application\nis configured correctly and ready to run. To help in troubleshooting and to provide transparency into this process, you\ncan enable verbose logging. The `VERBOSE_LOGS` environment variable enables detailed debug messages to the container's\nlog, offering insights into the actions performed by the entrypoint script.\n\n* `VERBOSE_LOGS` (default: false)\n\n  Set to `true` to enable detailed debug messages during the container initialization.\n\n### Memory / Heap Size\n\nIf you need to override Jira's default memory allocation, you can control the minimum heap (Xms) and maximum heap (Xmx) via the below environment variables.\n\n* `JVM_MINIMUM_MEMORY` (default: 384m)\n\n   The minimum heap size of the JVM\n\n* `JVM_MAXIMUM_MEMORY` (default: 768m)\n\n   The maximum heap size of the JVM\n\n* `JVM_RESERVED_CODE_CACHE_SIZE` (default: 512m)\n\n    The reserved code cache size of the JVM\n\n### Reverse Proxy Settings\n\nIf Jira is run behind a reverse proxy server (e.g. a load-balancer or nginx server) as\n[described here](https://confluence.atlassian.com/adminjiraserver072/integrating-jira-with-apache-using-ssl-828788158.html),\nthen you need to specify extra options to make Jira aware of the setup. They can\nbe controlled via the below environment variables.\n\n* `ATL_PROXY_NAME` (default: NONE)\n\n   The reverse proxy's fully qualified hostname. `CATALINA_CONNECTOR_PROXYNAME`\n   is also supported for backwards compatability.\n\n* `ATL_PROXY_PORT` (default: NONE)\n\n   The reverse proxy's port number via which Jira is\n   accessed. `CATALINA_CONNECTOR_PROXYPORT` is also supported for backwards\n   compatability.\n\n* `ATL_TOMCAT_PORT` (default: 8080)\n\n   The port for Tomcat/Jira to listen on. Depending on your container\n   deployment method this port may need to be\n   [exposed and published][docker-expose].\n\n* `ATL_TOMCAT_SCHEME` (default: http)\n\n   The protocol via which Jira is accessed. `CATALINA_CONNECTOR_SCHEME` is also\n   supported for backwards compatability.\n\n* `ATL_TOMCAT_SECURE` (default: false)\n\n   Set 'true' if `ATL_TOMCAT_SCHEME` is 'https'. `CATALINA_CONNECTOR_SECURE` is\n   also supported for backwards compatability.\n\n* `ATL_TOMCAT_CONTEXTPATH` (default: NONE)\n\n   The context path the application is served over. `CATALINA_CONTEXT_PATH` is\n   also supported for backwards compatability.\n\n* `ATL_TOMCAT_REQUESTATTRIBUTESENABLED`\n\n  Checks for the existence of request attributes (typically set by the RemoteIpValve and similar)\n  that should be used to override the values returned by the request for remote address,\n  remote host, server port and protocol. This property is usually combined with `ATL_TOMCAT_TRUSTEDPROXIES`\n  and `ATL_TOMCAT_INTERNALPROXIES` to show IP address of the remote host instead of the load balancer's.\n  If not declared, the default value of `false` will be used.\n\n* `ATL_TOMCAT_TRUSTEDPROXIES`\n\n  A list of IP addresses separated by a pipe character e.g. `10.0.9.6|10.0.9.32`.  \n  Trusted proxies that appear in the `remoteIpHeader` will be trusted and *will appear*\n  in the `proxiesHeader` value. By adding a list of Trusted Proxies, Confluence will remove the\n  load balancers' IP addresses from Confluence's view of the incoming connection. This could be desired\n  in a clustered load balancer architecture where the load balancer address changes depending on\n  which node proxies the connection.\n  If not specified, no trusted proxies will be trusted.\n\n* `ATL_TOMCAT_INTERNALPROXIES`\n\n  A list of IP addresses separated by a pipe character e.g. `10.0.9.6|10.0.9.32`.  \n  Trusted proxies that appear in the `remoteIpHeader` will be trusted and *will not appear*\n  in the `proxiesHeader` value. By adding a list of Internal Proxies, Confluence will remove the\n  load balancers' IP addresses from Confluence's view of the incoming connection. This could be desired\n  in a clustered load balancer architecture where the load balancer address changes depending on\n  which node proxies the connection.\n  If not specified, no internal proxies will be trusted.\n\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_PORT` - If unset, no additional connector is defined in server.xml. No default.\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_CONNECTION_TIMEOUT` (default: 20000)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_MAX_THREADS` (default: 50)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_MIN_SPARE_THREADS` (default: 10)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_ENABLE_LOOKUPS` (default: false)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_ACCEPT_COUNT` (default: 10)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_URI_ENCODING` (default: UTF-8)\n* `ATL_TOMCAT_ADDITIONAL_CONNECTOR_SECURE` (no default, if undefined secure is not set in the connector)\n\nThe following Tomcat/Catalina options are also supported. For more information,\nsee https://tomcat.apache.org/tomcat-7.0-doc/config/index.html.\n\n* `ATL_TOMCAT_MGMT_PORT` (default: 8005)\n* `ATL_TOMCAT_MAXTHREADS` (default: 100)\n* `ATL_TOMCAT_MINSPARETHREADS` (default: 10)\n* `ATL_TOMCAT_CONNECTIONTIMEOUT` (default: 20000)\n* `ATL_TOMCAT_ENABLELOOKUPS` (default: false)\n* `ATL_TOMCAT_PROTOCOL` (default: HTTP/1.1)\n* `ATL_TOMCAT_ACCEPTCOUNT` (default: 10)\n* `ATL_TOMCAT_MAXHTTPHEADERSIZE` (default: 8192)\n* `ATL_TOMCAT_STUCKTHREADDETECTIONVALVE_THRESHOLD` (default: 120)\n\n### Access Log Settings\n\nYou can set the maximum number of days for access logs to be retained before being deleted. The default value of -1 means never delete old files.\n\n* `ATL_TOMCAT_ACCESS_LOGS_MAXDAYS` (default: -1)\n* `ATL_TOMCAT_ACCESS_LOG_PATTERN` (default: `%a %{jira.request.id}r %{jira.request.username}r %t &quot;%m %U%q %H&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; &quot;%{jira.request.assession.id}r&quot;`)\n\n### JVM configuration\n\nIf you need to pass additional JVM arguments to Jira, such as specifying a custom trust store, you can add them via the below environment variable\n\n* `JVM_SUPPORT_RECOMMENDED_ARGS`\n\n   Additional JVM arguments for Jira\n\n??? example \n    `docker run -e JVM_SUPPORT_RECOMMENDED_ARGS=-Djavax.net.ssl.trustStore=/var/atlassian/application-data/jira/cacerts -v jiraVolume:/var/atlassian/application-data/jira --name=\"jira\" -d -p 8080:8080 atlassian/jira-software`\n\n### Jira-specific settings\n\n* `ATL_AUTOLOGIN_COOKIE_AGE` (default: 1209600; two weeks, in seconds)\n\n   The maximum time a user can remain logged-in with 'Remember Me'.\n\n### S3 Avatars storage configuration\nStarting with Jira 9.9, you can configure Jira to store avatar files in Amazon S3. For requirements and additional \ninformation, please refer to \n[Configuring Amazon S3 Object Storage](https://confluence.atlassian.com/pages/viewpage.action?spaceKey=JSERVERM&title=.Configuring+Amazon+S3+object+storage+vJira_admin_9.9).\n\n* `ATL_S3AVATARS_BUCKET_NAME`\n\n  Bucket name to store avatars.\n\n* `ATL_S3AVATARS_REGION`\n\n  AWS region where the S3 bucket is located.\n\n* `ATL_S3AVATARS_ENDPOINT_OVERRIDE`\n\n  Override the default AWS API endpoint with a custom one (optional).\n\n### OpenSearch configuration\n\nStarting with Jira 11.2, you can configure Jira to use OpenSearch as the search platform.\nFor the full list of available OpenSearch properties and requirements, see\n[Configuring OpenSearch for Jira](https://confluence.atlassian.com/adminjiraserver/configuring-opensearch-for-jira-1620511851.html).\n\nOpenSearch properties are injected into `jira-config.properties` using\n`ADDITIONAL_JIRA_CONFIG_*` environment variables (see\n[Custom `jira-config.properties`](#custom-jira-configproperties) for details on\nthe mechanism).\n\nThe minimum required properties are:\n\n* `search.platform`\n\n  The search platform to use. Set to `opensearch` to enable OpenSearch.\n\n* `opensearch.http.url`\n\n  HTTP(S) URL of the OpenSearch cluster, or multiple URLs separated by commas.\n\n* `opensearch.username`\n\n  Username for the OpenSearch cluster.\n\n* `opensearch.password`\n\n  Password for the OpenSearch cluster.\n\nThe `__EXPAND_ENV` suffix lets you keep the password in a separate environment\nvariable rather than embedding it directly in the property line. In the example\nbelow `MY_OPENSEARCH_PASSWORD` is passed inline for brevity:\n\n```bash\ndocker run \\\n  -e MY_OPENSEARCH_PASSWORD=my-secret \\\n  -e ADDITIONAL_JIRA_CONFIG_01=\"search.platform=opensearch\" \\\n  -e ADDITIONAL_JIRA_CONFIG_02=\"opensearch.http.url=http://opensearch-host:9200\" \\\n  -e ADDITIONAL_JIRA_CONFIG_03=\"opensearch.username=admin\" \\\n  -e ADDITIONAL_JIRA_CONFIG_04__EXPAND_ENV=\"opensearch.password={MY_OPENSEARCH_PASSWORD}\" \\\n  atlassian/jira-software:latest\n```\n\n!!! warning \"Sensitive values on the command line\"\n    Passing secrets via `-e` exposes them in shell history, process listings,\n    and `docker inspect` output. In production, use `--env-file` with a\n    permission-protected file or an external secrets manager to supply\n    `MY_OPENSEARCH_PASSWORD`.\n\n### S3 Attachments storage configuration\nStarting with Jira 9.9, you can configure Jira to [store attachment files in Amazon S3](https://confluence.atlassian.com/adminjiraserver/storing-attachments-in-amazon-s3-1282250191.html). For requirements and additional\ninformation, please refer to [Configuring Amazon S3 Object Storage](https://confluence.atlassian.com/pages/viewpage.action?spaceKey=JSERVERM&title=.Configuring+Amazon+S3+object+storage+vJira_admin_9.9).\n\n* `ATL_S3ATTACHMENTS_BUCKET_NAME`\n\n  Bucket name to store avatars.\n\n* `ATL_S3ATTACHMENTS_REGION`\n\n  AWS region where the S3 bucket is located.\n\n* `ATL_S3ATTACHMENTS_ENDPOINT_OVERRIDE`\n\n  Override the default AWS API endpoint with a custom one (optional).\n\nAvatars and attachments can be stored in the same bucket. If bucket names are identical, `ATL_S3AVATARS_*` env vars are used to generate a common filestore configuration.\n\n### S3 Backups storage configuration\n\nStarting with 9.16, you can configure Jira to [store backups in Amazon S3](https://confluence.atlassian.com/adminjiraserver/storing-backups-in-amazon-s3-1402409182.html).\n\n* `ATL_S3BACKUPS_BUCKET_NAME`\n\n  Bucket name to store avatars.\n\n* `ATL_S3BACKUPS_REGION`\n\n  AWS region where the S3 bucket is located.\n\n* `ATL_S3BACKUPS_ENDPOINT_OVERRIDE`\n\n  Override the default AWS API endpoint with a custom one (optional).\n\n\n### Database configuration\n\nIt is optionally possible to configure the database from the environment,\navoiding the need to do so through the web startup screen.\n\nThe following variables are all must all be supplied if using this feature:\n\n* `ATL_JDBC_URL`\n\n   The database URL; this is database-specific.\n\n* `ATL_JDBC_USER`\n\n   The database user to connect as.\n\n* `ATL_JDBC_PASSWORD`\n\n   The password for the database user.\n\n* `ATL_DB_DRIVER`\n\n   The JDBC driver class; supported drivers are:\n\n   * `com.microsoft.sqlserver.jdbc.SQLServerDriver`\n   * `com.mysql.jdbc.Driver`\n   * `oracle.jdbc.OracleDriver`\n   * `org.postgresql.Driver`\n\n   The driver must match the DB type (see next entry).\n\n* `ATL_DB_TYPE`\n\n   The type of database; valid supported values are:\n\n   * `mssql`\n   * `mysql`\n   * `mysql57`\n   * `mysql8`\n   * `oracle10g`\n   * `postgres72`\n\n???+ note \"MySQL supportability\"\n    `mysql` is only supported for versions prior to 8.13, and `mysql57` and `mysql8` are only supported after. \n    See [the 8.13.x upgrade instructions](https://confluence.atlassian.com/jirasoftware/jira-software-8-13-x-upgrade-notes-1018783378.html)\n    for details.\n\nThe following variables may be optionally supplied when configuring the\ndatabase from the environment:\n\n* `ATL_DB_SCHEMA_NAME`\n\n   The schema name of the database. Depending on the value of `ATL_DB_TYPE`,\n   the following default values are used if no schema name is specified:\n\n   * `mssql`: `dbo`\n   * `mysql`: NONE\n   * `mysql57`: NONE\n   * `mysql8`: NONE\n   * `oracle10g`: NONE\n   * `postgres72`: `public`\n\n???+ note \"MySQL or Oracle JDBC drivers\"\n    Due to licensing restrictions Jira does not ship with MySQL or Oracle JDBC drivers. \n    To use these databases you will need to copy a suitable driver into the container and restart it. \n    For example, to copy the MySQL driver into a container named \"jira\", you would do the following:\n\n    `docker cp mysql-connector-java.x.y.z.jar jira:/opt/atlassian/jira/lib`\n\n    `docker restart jira`\n\nFor more information see the page\n[Startup check: JIRA database driver missing](https://confluence.atlassian.com/jirakb/startup-check-jira-database-driver-missing-873872169.html).\n\n#### Optional database settings\n\n* `ATL_JDBC_SECRET_CLASS`\n\n  [Encryption class](https://confluence.atlassian.com/adminjiraserver/encrypting-database-password-974378811.html) for the database password. Depending on the secret class, the value of `ATL_JDBC_PASSWORD` will differ. Defaults to plaintext.\n\n  Starting from 9.11 [AWS SecretsManager](https://confluence.atlassian.com/adminjiraserver/configuring-aws-secrets-manager-1282250155.html) is supported.\n\n**IMPORTANT:** to start using password encryption for Jira instances that have already been set up, make sure `ATL_FORCE_CFG_UPDATE` is set to true\nwhich will force the image entrypoint to regenerate `dbconfig.xml` with the new properties. Other database environment variables must be also set in the container:\n\n```shell\ndocker run -v jiraVolume:/var/atlassian/application-data/jira --name='jira' -d -p 8080:8080 \\\n  -e ATL_JDBC_URL=jdbc:postgresql://172.17.0.1:5432/jira \\\n  -e ATL_JDBC_USER='jira' -e ATL_DB_DRIVER='org.postgresql.Driver' \\\n  -e ATL_DB_TYPE='postgres72' \\\n  -e ATL_JDBC_SECRET_CLASS='com.atlassian.secrets.store.aws.AwsSecretsManagerStore' \\\n  -e ATL_JDBC_PASSWORD='{\"region\": \"us-east-1\", \"secretId\": \"mysecret\", \"secretPointer\": \"/password\"}' \\\n  -e ATL_FORCE_CFG_UPDATE='true' atlassian/jira-software\n```\n\nThe following variables are for the Tomcat JDBC connection pool, and are\noptional. For more information on these see: https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html\n\n* `ATL_DB_MAXIDLE` (default: 20)\n* `ATL_DB_MAXWAITMILLIS` (default: 30000)\n* `ATL_DB_MINEVICTABLEIDLETIMEMILLIS` (default: 5000)\n* `ATL_DB_MINIDLE` (default: 10)\n* `ATL_DB_POOLMAXSIZE` (default: 100)\n* `ATL_DB_POOLMINSIZE` (default: 20)\n* `ATL_DB_REMOVEABANDONED` (default: true)\n* `ATL_DB_REMOVEABANDONEDTIMEOUT` (default: 300)\n* `ATL_DB_TESTONBORROW` (default: false)\n* `ATL_DB_TESTWHILEIDLE` (default: true)\n* `ATL_DB_TIMEBETWEENEVICTIONRUNSMILLIS` (default: 30000)\n* `ATL_DB_VALIDATIONQUERY` (default: select 1)\n\nThe following settings only apply when using the Postgres driver:\n\n* `ATL_DB_KEEPALIVE` (default: true)\n* `ATL_DB_SOCKETTIMEOUT` (default: 240)\n\nThe following settings only apply when using the MySQL driver:\n\n* `ATL_DB_VALIDATIONQUERYTIMEOUT` (default: 3)\n\n### Data Center configuration\n\nThis docker image can be run as part of a\n[Data Center](https://confluence.atlassian.com/enterprise/jira-data-center-472219731.html)\ncluster. You can specify the following properties to start Jira as a Data Center\nnode, instead of manually configuring a cluster.properties file, See\n[Installing Jira Data Center](https://confluence.atlassian.com/adminjiraserver071/installing-jira-data-center-802592197.html)\nfor more information on each property and its possible configuration.\n\n#### Cluster configuration\n\n*Jira Software and Jira Service Management only*\n\n* `CLUSTERED` (default: false)\n\n   Set 'true' to enable clustering configuration to be used. This will create a\n   `cluster.properties` file inside the container's `$JIRA_HOME` directory.\n\n* `JIRA_NODE_ID` (default: jira_node_<container-id>)\n\n   The unique ID for the node. By default, this includes a randomly generated ID\n   unique to each container, but can be overridden with a custom value.\n\n* `JIRA_SHARED_HOME` (default: $JIRA_HOME/shared)\n\n   The location of the shared home directory for all Jira nodes. **Note**: This\n   must be real shared filesystem that is mounted inside the\n   container. Additionally, see the note about UIDs.\n\n* `EHCACHE_PEER_DISCOVERY` (default: default)\n\n   Describes how nodes find each other.\n\n* `EHCACHE_LISTENER_HOSTNAME` (default: NONE)\n\n   The hostname of the current node for cache communication. Jira Data Center\n   will resolve this this internally if the parameter isn't set.\n\n* `EHCACHE_LISTENER_PORT` (default: 40001)\n\n   The port the node is going to be listening to. Depending on your container\n   deployment method this port may need to be [exposed and published][docker-expose].\n\n* `EHCACHE_OBJECT_PORT` (default: dynamic)\n\n   The port number on which the remote objects bound in the registry receive\n   calls. This defaults to a free port if not specified. This port may need to\n   be [exposed and published][docker-expose].\n\n* `EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS` (default: 2000)\n\n   The default timeout for the Ehcache listener.\n\n* `EHCACHE_MULTICAST_ADDRESS` (default: NONE)\n\n   A valid multicast group address. Required when EHCACHE_PEER_DISCOVERY is set\n   to 'automatic' instead of 'default'.\n\n* `EHCACHE_MULTICAST_PORT` (default: NONE)\n\n   The dedicated port for the multicast heartbeat traffic. Required when\n   EHCACHE_PEER_DISCOVERY is set to 'automatic' instead of 'default'.  Depending\n   on your container deployment method this port may need to be\n   [exposed and published][docker-expose].\n\n* `EHCACHE_MULTICAST_TIMETOLIVE` (default: NONE)\n\n   A value between 0 and 255 which determines how far the packets will\n   propagate. Required when EHCACHE_PEER_DISCOVERY is set to 'automatic' instead\n   of 'default'.\n\n* `EHCACHE_MULTICAST_HOSTNAME` (default: NONE)\n\n   The hostname or IP of the interface to be used for sending and receiving\n   multicast packets. Required when EHCACHE_PEER_DISCOVERY is set to 'automatic'\n   instead of 'default'.\n\n#### Shared directory and user IDs\n\nBy default, the Jira application runs as the user `jira`, with a UID and GID\nof 2001. Consequently, this UID must have write access to the shared\nfilesystem. If for some reason a different UID must be used, there are a number\nof options available:\n\n* The Docker image can be rebuilt with a different UID.\n* Under Linux, the UID can be remapped using\n  [user namespace remapping](https://docs.docker.com/engine/security/userns-remap/).\n\nTo preserve strict permissions for certain configuration files, this container starts as\n`root` to perform bootstrapping before running Jira under a non-privileged user account.\nIf you wish to start the container as a non-root user, please note that Tomcat\nconfiguration will be skipped and a warning will be logged. You may still apply custom\nconfiguration in this situation by mounting a custom server.xml file directly to\n`/opt/atlassian/jira/conf/server.xml`\n\nDatabase and Clustering bootstrapping will work as expected when starting this container\nas a non-root user.\n\n### Container configuration\n\n* `ATL_FORCE_CFG_UPDATE` (default: false)\n\n   The Docker [entrypoint][entrypoint.py] generates application configuration on\n   first start; not all of these files are regenerated on subsequent\n   starts. This is deliberate, to avoid race conditions or overwriting manual\n   changes during restarts and upgrades. However in deployments where\n   configuration is purely specified through the environment (e.g. Kubernetes)\n   this behaviour may be undesirable; this flag forces an update of all\n   generated files.\n\n   In Jira the affected files are: `dbconfig.xml`\n\n   See [the entrypoint code][entrypoint.py] for the details of how configuration\n   files are generated.\n\n*  `ATL_ALLOWLIST_SENSITIVE_ENV_VARS`\n\n   Define a comma separated list of environment variables containing keywords 'PASS', 'SECRET' or 'TOKEN' to be ignored by the unset function which is executed in the entrypoint. The function uses `^` regex. For example, if you set `ATL_ALLOWLIST_SENSITIVE_ENV_VARS=\"PATH_TO_SECRET_FILE\"`, all variables starting with `PATH_TO_SECRET_FILE` will not be unset.\n\n???+ warning \"Value exposure on host OS\"\n    When using this property, the values to sensitive environment variables will be available in clear text on the \n    host OS. As such, this data may be exposed to users or processes running on the host OS.\n\n* `SET_PERMISSIONS` (default: true)\n\n   Define whether to set home directory permissions on startup. Set to `false` to disable\n   this behaviour.\n\n* `ATL_UNSET_SENSITIVE_ENV_VARS` (default: true)\n\n  Define whether to unset environment variables containing keywords 'PASS', 'SECRET' or 'TOKEN'.\n  The unset function is executed in the entrypoint. Set to `false` if you want to allow passing\n  sensitive environment variables to Jira container.\n\n???+ warning \"Value exposure on host OS\"\n    When using this property, the values to sensitive environment variables will be available in clear text on the \n    host OS. As such, this data may be exposed to users or processes running on the host OS.\n\n* `ATL_JIRA_CLEAR_PLUGIN_CACHE`\n  \n  When set to true, plugin cache at `${JIRA_HOME}/plugins/.bundled-plugins` and `${JIRA_HOME}/plugins/.osgi-plugins`\n  will be deleted before Jira starts. Once set, make sure to unset this environment variable if you don't want Jira plugin cache to be flushed\n  every time the container starts.\n  \n  See: [How to clear Jira's plugin cache](https://confluence.atlassian.com/jirakb/how-to-clear-jira-s-plugin-cache-1157468195.html).\n\n* `ATL_JIRA_SESSION_TIMEOUT`\n\n  The default Tomcat session timeout (in minutes) for all newly created sessions which is set in web.xml. Defaults to 30.\n\n### Custom `jira-config.properties`\n\nAdditional properties can be injected into `jira-config.properties` using\nenvironment variables prefixed with `ADDITIONAL_JIRA_CONFIG_`.\n\nEach variable's value must be a complete property line in `key=value` format.\nEnvironment variable names are sorted for consistent file generation; order has\nno effect on runtime behavior.\n\n```bash\ndocker run \\\n  -e ADDITIONAL_JIRA_CONFIG_01=\"jira.websudo.is.disabled=true\" \\\n  -e ADDITIONAL_JIRA_CONFIG_02=\"jira.lf.top.bgcolour=#003366\" \\\n  atlassian/jira-software:latest\n```\n\n#### How properties are written\n\nThe properties are written to a clearly marked auto-generated section at the end\nof the file. Any manually added content outside this section is preserved across\ncontainer restarts.\n\n#### Injecting secrets via `__EXPAND_ENV`\n\nFor values that reference secrets stored in separate environment variables\n(common in Kubernetes where secrets are mounted as env vars), use the\n`__EXPAND_ENV` suffix. Placeholders in `{VAR_NAME}` format are replaced with\nthe corresponding environment variable value at startup:\n\n```bash\ndocker run \\\n  -e MY_OPENSEARCH_PASSWORD=my-secret \\\n  -e ADDITIONAL_JIRA_CONFIG_01=\"search.platform=opensearch\" \\\n  -e ADDITIONAL_JIRA_CONFIG_02__EXPAND_ENV=\"opensearch.password={MY_OPENSEARCH_PASSWORD}\" \\\n  atlassian/jira-software:latest\n```\n\nThis generates the following in `jira-config.properties`:\n\n```properties\n# ---- AUTO GENERATED ADDITIONAL PROPERTIES FROM DOCKER IMAGE ---\n# DO NOT MODIFY this section - it is auto-generated during container startup\n# from ADDITIONAL_JIRA_CONFIG_* environment variables\nsearch.platform=opensearch\nopensearch.password=my-secret\n# ---- END OF AUTO GENERATED ADDITIONAL PROPERTIES ---\n```\n\nIf a referenced environment variable is not set, the placeholder is left\nunchanged and a warning is logged.\n\n#### Limitations and requirements\n\n* **Local home directory only**: `jira-config.properties` is written to\n  `$JIRA_HOME` which must be the node-local home directory (not shared storage).\n  Using `ADDITIONAL_JIRA_CONFIG_*` when `jira-config.properties` is stored on a\n  shared filesystem (e.g. NFS, EFS) may cause unexpected outcomes due to update\n  races across different container instances during rolling deployments.\n\n* **Read-only mounts not supported**: If `jira-config.properties` is mounted as\n  a read-only file (e.g. via a Kubernetes ConfigMap volume mount), the\n  `ADDITIONAL_JIRA_CONFIG_*` variables will have no effect. A warning is logged\n  in this case. Manage the file content entirely through the mount instead — do\n  not combine both approaches.\n\n* **Auto-generated section**: The generated properties are placed inside clearly\n  marked comment boundaries at the end of the file. Manual edits outside these\n  markers are preserved. Do not edit content within the markers — it will be\n  overwritten on the next container startup.\n\n| Aspect                  | Detail                                                      |\n|-------------------------|-------------------------------------------------------------|\n| Env var prefix          | `ADDITIONAL_JIRA_CONFIG_`                                   |\n| Secret expansion suffix | `__EXPAND_ENV` (double underscore)                          |\n| Target file             | `$JIRA_HOME/jira-config.properties`                         |\n| Ordering                | Sorted for reproducibility; order has no effect on behavior |\n| Existing content        | Preserved (only auto-generated section is replaced)         |\n| No matching env vars    | File is not created; stale section is removed if present    |\n\n### Advanced Configuration\n\nAs mentioned at the top of this section, the settings from the environment are\nused to populate the application configuration on the container startup. However,\nin some cases you may wish to customise the settings in ways that are not\nsupported by the environment variables above. In this case, it is possible to\nmodify the base templates to add your own configuration. There are three main\nways of doing this; modify our repository to your own image, build a new image\nfrom the existing one, or provide new templates at startup. We will briefly\noutline these methods here, but in practice how you do this will depend on your\nneeds.\n\n##### Building your own image\n\n* Clone the Atlassian repository at https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n* Modify or replace the [Jinja](https://jinja.palletsprojects.com/) templates\n  under `config`; _NOTE_: The files must have the `.j2` extensions. However you\n  don't have to use template variables if you don't wish.\n* Build the new image with e.g: `docker build --tag my-jira-8-image --build-arg JIRA_VERSION=8.x.x .`\n* Optionally push to a registry, and deploy.\n\n##### Build a new image from the existing one\n\n* Create a new `Dockerfile`, which starts with the line e.g: `FROM\n  atlassian/jira-software:latest`.\n* Use a `COPY` line to overwrite the provided templates.\n* Build, push and deploy the new image as above.\n\n##### Overwrite the templates at runtime\n\nThere are two main ways of doing this:\n\n* If your container is going to be long-lived, you can create it, modify the\n  installed templates under `/opt/atlassian/etc/`, and then run it.\n* Alternatively, you can create a volume containing your alternative templates,\n  and mount it over the provided templates at runtime\n  with `--volume my-config:/opt/atlassian/etc/`.\n\n## Logging\n\nBy default the Jira logs are written inside the container, under\n`${JIRA_HOME}/logs/`. If you wish to expose this outside the container (e.g. to\nbe aggregated by logging system) this directory can be a data volume or bind\nmount. Additionally, Tomcat-specific logs are written to\n`/opt/atlassian/jira/logs/`.\n\n## Upgrades\n\nTo upgrade to a more recent version of Jira you can simply stop the `jira` container and start a new one based on a more recent image:\n\n```shell\ndocker stop jira\ndocker rm jira\ndocker run ... (See above)\n```\n\nAs your data is stored in the data volume directory on the host it will still  be available after the upgrade.\n\n!!! note \"Please make sure that you **don't** accidentally remove the `jira` container and its volumes using the `-v` option.\"\n\n## Backup\n\nFor evaluations you can use the built-in database that will store its files in the Jira home directory. In that case it is sufficient to create a backup archive of the docker volume.\n\nIf you're using an external database, you can configure Jira to make a backup automatically each night. This will back up the current state, including the database to the `jiraVolume` docker volume, which can then be archived. Alternatively you can backup the database separately, and continue to create a backup archive of the docker volume to back up the Jira Home directory.\n\nRead more about data recovery and backups: [https://confluence.atlassian.com/adminjiraserver071/backing-up-data-802592964.html](https://confluence.atlassian.com/adminjiraserver071/backing-up-data-802592964.html)\n\n## Shutdown\n\nDepending on your configuration Jira may take a short period to shutdown any\nactive operations to finish before termination. If sending a `docker stop` this\nshould be taken into account with the `--time` flag.\n\nAlternatively, the script `/shutdown-wait.sh` is provided, which will initiate a\nclean shutdown and wait for the process to complete. This is the recommended\nmethod for shutdown in environments which provide for orderly shutdown,\ne.g. Kubernetes via the `preStop` hook.\n\n## Versioning\n\nThe `latest` tag matches the most recent release of Atlassian Jira Software, Jira Core or Jira Service Management. Thus `atlassian/jira-software:latest` will use the newest version of Jira available.\n\nAlternatively you can use a specific major, major.minor, or major.minor.patch version of Jira by using a version number tag:\n\n* `atlassian/jira-software:8`\n* `atlassian/jira-software:8.14`\n* `atlassian/jira-software:8.14.0`\n\n* `atlassian/jira-servicemanagement:4`\n* `atlassian/jira-servicemanagement:4.14`\n* `atlassian/jira-servicemanagement:4.14.0`\n\n* `atlassian/jira-core:8`\n* `atlassian/jira-core:8.14`\n* `atlassian/jira-core:8.14.0`\n\nAll Jira versions from 7.13+ (Software/Core) / 3.16+ (Service Management) are available.\n\n???+ warning \"`atlassian/jira-servicedesk` deprecation\"\n    All Jira Service Management 4.x versions are also available as `atlassian/jira-servicedesk`. \n    This namespace has been deprecated and versions from 5+ onwards will only be available as `atlassian/jira-servicemanagement`.\n\n## Supported JDK versions and base images\n\nAtlassian Docker images are generated from either\n[official Eclipse Temurin OpenJDK Docker images](https://hub.docker.com/_/eclipse-temurin) or [Red Hat Universal Base Images](https://catalog.redhat.com/software/containers/ubi9/openjdk-17/61ee7c26ed74b2ffb22b07f6?architecture=amd64). \n\nUBI based images are only published from Jira 9.5 onwards and JDK17 only. Tags are available in 2 formats: `<version>-ubi9` and `<version>-ubi9-jdk17`.\n\nThe Docker images follow the [Atlassian Support end-of-life\npolicy](https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html);\nimages for unsupported versions of the products remain available but will no longer\nreceive updates or fixes.\n\nHistorically, we have also generated other versions of the images, including\nJDK8, Alpine, and 'slim' versions of the JDK. These legacy images still exist in\nDocker Hub, however they should be considered deprecated, and do not receive\nupdates or fixes.\n\nIf for some reason you need a different version, see [Building your own image](#building-your-own-image) above.\n\n## Migration to UBI\n\nIf you have been mounting any files to `${JAVA_HOME}` directory in `eclipse-temurin` based container, `JAVA_HOME` in UBI JDK17 container is set to `/usr/lib/jvm/java-17`.\n\nAlso, if you have been mounting and running any custom scripts in the container, UBI-based images may lack some tools and utilities that are available out of the box in eclipse-temurin tags. If that's the case, see [Building your own image](#building-your-own-image).\n\n## Supported architectures\n\nCurrently, Jira and JSM container images are built for the `linux/amd64` and `linux/arm64` target platforms.\nThe Dockerfiles and support tooling have now had all\narchitecture-specific components removed, so if necessary it is possible to\nbuild images for any platform supported by OCI-compliant container runtimes.\n\n### Building on the target architecture\n\nNote: This method is known to work on Mac M1 and AWS ARM64 machines, but has not\nbeen extensively tested.\n\nThe simplest method of getting a platform image is to build it on a target\nmachine. The following assumes you have git and Docker installed. You will also\nneed to know which version of Jira you want to build; substitute\n`JIRA_VERSION=x.x.x` with your required version:\n\n```shell\ngit clone --recurse-submodule https://bitbucket.org/atlassian-docker/docker-atlassian-jira.git\ncd docker-atlassian-jira\ndocker build --tag my-image --build-arg JIRA_VERSION=x.x.x .\n```\nThis image can be pushed up to your own Docker Hub or private repository.\n\n## Troubleshooting\n\nThese images include built-in scripts to assist in performing common JVM diagnostic tasks.\n\n### Thread dumps\n\n`/opt/atlassian/support/thread-dumps.sh` can be run via `docker exec` to easily trigger the collection of thread\ndumps from the containerized application. For example:\n\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh\n```\n\nBy default, this script will collect 10 thread dumps at 5 second intervals. This can\nbe overridden by passing a custom value for the count and interval, by using `-c` / `--count`\nand `-i` / `--interval` respectively. For example, to collect 20 thread dumps at 3 second intervals:\n\n```shell\ndocker exec my_container /opt/atlassian/support/thread-dumps.sh --count 20 --interval 3\n```\n\nThread dumps will be written to `$APP_HOME/thread_dumps/<date>`.\n\n???+ note \"Disable capturing output from top run\"\n    By default this script will also capture output from top run in 'Thread-mode'. This can\n    be disabled by passing `-n` / `--no-top`\n\n### Heap dump\n\n`/opt/atlassian/support/heap-dump.sh` can be run via `docker exec` to easily trigger the collection of a heap\ndump from the containerized application. For example:\n\n```shell\ndocker exec my_container /opt/atlassian/support/heap-dump.sh\n```\n\nA heap dump will be written to `$APP_HOME/heap.bin`. If a file already exists at this\nlocation, use `-f` / `--force` to overwrite the existing heap dump file.\n\n### Manual diagnostics\n\nThe `jcmd` utility is also included in these images and can be used by starting a `bash` shell\nin the running container:\n\n```shell\ndocker exec -it my_container /bin/bash\n```\n\n## Support\n\nFor product support, go to:\n\n* https://support.atlassian.com/jira-software-server/\n* https://support.atlassian.com/jira-service-management-server/\n* https://support.atlassian.com/jira-core-server/\n\nYou can also visit the [Atlassian Data Center](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes)\nforum for discussion on running Atlassian Data Center products in containers.\n\n## Development and testing\n\nSee [Development][DEVELOPMENT.md] for details on setting up a development\nenvironment and running tests.\n\n## Changelog\n\nFor a detailed list of changes to the Docker image configuration see [the Git\ncommit history](https://bitbucket.org/atlassian-docker/docker-atlassian-jira/commits/).\n\n## License\n\nCopyright © 2020 Atlassian Corporation Pty Ltd.\nLicensed under the Apache License, Version 2.0.\n\n[docker-expose]: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/\n[entrypoint.py]: https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/entrypoint.py\n[DEVELOPMENT.md]: https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/DEVELOPMENT.md\n"
  },
  {
    "path": "docs/docs/examples/.pages",
    "content": "collapse_single_pages: true\nnav:\n    - EXAMPLES.md\n    - Kubernetes cluster: cluster\n    - database\n    - ingress\n    - storage\n    - bamboo\n    - bitbucket\n    - confluence\n    - jira\n    - logging\n    - ...\n"
  },
  {
    "path": "docs/docs/examples/EXAMPLES.md",
    "content": "# Available examples \n\n!!!warning \"Support disclaimer\"\n    Use the examples we provide as reference only, we don’t offer official support for them. \n\n## Pre-requisites\n\n### :material-kubernetes: Kubernetes clusters \nSee examples of provisioning Kubernetes clusters on cloud-based providers:\n   \n  * [Amazon EKS](cluster/EKS_SETUP.md) \n  * [Google GKE](cluster/GKE_SETUP.md)\n  * [Azure AKS](cluster/AKS_SETUP.md)\n\n### :material-directions-fork: Ingress\n* See an example of [provisioning an NGINX Ingress controller](ingress/INGRESS_NGINX.md)\n\n### :material-database: Database\n* See an example of [creating an Amazon RDS database instance](database/AMAZON_RDS.md)\n\n### :material-folder-network: Storage\n=== \"AWS EBS\"\n\n    * See an example of [local storage utilizing AWS EBS-backed volumes](storage/aws/LOCAL_STORAGE.md)\n\n=== \"AWS EFS\"\n\n    * See an example of [shared storage utilizing AWS EFS-backed filesystem](storage/aws/SHARED_STORAGE.md)\n\n=== \"NFS\"\n\n    * See an example of [standing up an NFS server for Bitbucket](storage/nfs/NFS.md)\n\n## Bamboo\n\n### :material-lan-pending: Remote agents\n* See an example of deploying a [remote agent for Bamboo](bamboo/REMOTE_AGENTS.md)\n\n## Bitbucket\n\n### :material-file-search-outline: Elasticsearch\n* See an example of [standing up an Elasticsearch instance for Bitbucket](bitbucket/BITBUCKET_ELASTICSEARCH.md)\n\n### :material-mirror-variant: Smart Mirrors\n* See an example of [Bitbucket Smart Mirrors](bitbucket/BITBUCKET_MIRRORS.md)\n\n### :material-remote-desktop: SSH\n* See an example of [SSH service in Bitbucket on Kubernetes](bitbucket/BITBUCKET_SSH.md)\n\n### :material-remote-desktop: Mesh\n* See an example of [Bitbucket Mesh on Kubernetes](bitbucket/BITBUCKET_MESH.md)\n\n## Other\n\n### :material-file-document-edit: Logging\n* See an example of [how to deploy an EFK stack to Kubernetes](logging/efk/EFK.md)\n\n### :simple-prometheus: Prometheus Monitoring\n* See an example of [how to monitor DC products with Prometheus](../userguide/monitoring/PROMETHEUS.md)\n\n### :material-checkbox-multiple-marked-outline: Customization\n* See an example of [External libraries and plugins](external_libraries/EXTERNAL_LIBS.md)\n"
  },
  {
    "path": "docs/docs/examples/bamboo/.pages",
    "content": "collapse_single_pages: false\nnav:\n    - REMOTE_AGENTS.md\n    - AGENT_CAPABILITIES.md\n    - ..."
  },
  {
    "path": "docs/docs/examples/bamboo/AGENT_CAPABILITIES.md",
    "content": "# Agent capabilities\n\nA capability is a feature of an agent. A capability can be defined on an agent for:\n\n* an executable (e.g. Maven)\n* a JDK\n* a Version Control System client application (e.g. Git)\n\nYou can learn more about remote agents capabilities on the [official documentation page](https://confluence.atlassian.com/bamboo/configuring-capabilities-289277148.html){.external}.\n\n## Custom capabilities\n\n!!!info \"Default capabilities\"\n\n    By default the Bamboo agent Helm chart will deploy the [bamboo-agent-base](https://hub.docker.com/r/atlassian/bamboo-agent-base){.external} Docker image. This image provides the following capabilities out of the box:\n        \n    * JDK 11\n    * Git & Git LFS\n    * Maven 3\n    * Python 3\n\nIf additional capabilities are required, the [Bamboo agent base Docker image](https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base/src/master/){.external} can be extended with those capabilities. \n\nThis custom image can be used, by first updating the Bamboo agent `values.yaml` with the image `tag` of the custom Docker image i.e.\n\n```yaml\nimage:\n  repository: hoolicorp/bamboo-agent-base\n  pullPolicy: IfNotPresent\n  tag: \"ruby-agent\"\n```\n\nThe custom agent can then be deployed via Helm:\n\n```shell\nhelm install ruby-agent atlassian-data-center/bamboo-agent -f ruby-agent.yaml\n```"
  },
  {
    "path": "docs/docs/examples/bamboo/REMOTE_AGENTS.md",
    "content": "# Remote agents\n\nRemote agents can be provisioned to a Kubernetes cluster to run jobs delegated to them via a Bamboo server. An agent can run a job if its capabilities match the requirements of a job. Each job inherits the requirements from individual tasks that it contains.\n\nYou can learn more details about remote agents on the [official documentation page](https://confluence.atlassian.com/bamboo/agents-and-capabilities-289277114.html).\n\n## Requirements\n\n!!!warning \"Bamboo server prerequisites\"\n\n    * The Bamboo server instance must use a valid Bamboo Data Center instance license and be fully configured\n    * The Bamboo server instance must have `security token verification` **enabled**\n    * The Bamboo server instance must have `remote agent authentication` **disabled**\n\n## Deployment\n\nSteps required for deploying a remote agent\n\n1. Configure Bamboo server for remote agent support\n2. Deploy agent\n\n### 1. Configure Bamboo server\n\nThere are 2 approaches for doing this:\n\n* Automatically when deploying Bamboo server\n* Manually via Bamboo server agent settings\n\n#### Automatically\n\nWhen initially deploying Bamboo server its `values.yaml` can be configured to:\n\n* disable `remote agent authentication`\n* define a custom `security token` \n\nThis will allow remote agents that are configured with the same security token to automatically join the cluster. \n\nFirst, create a secret to store a custom security token with which remote agent(s) should authenticate to the Bamboo server. \n\n!!!info \"Security token format\"\n    \n    The security token should be set to a 40-character hexadecimal string. The following command can be used to generate a string in this format:\n    ```\n    xxd -l 20 -p /dev/urandom\n    ```\n\nAdd the generated string (security token) to a K8s secret\n\n   ``` shell\n   kubectl create secret generic security-token --from-literal=security-token=<security token>\n   ```\n\nUpdate the Bamboo `values.yaml` with this secret and disable agent authentication:\n\n```yaml\nbamboo:\n  securityToken:\n    secretName: \"security-token\"\n    secretKey: security-token\n  disableAgentAuth: true\n```\n\n!!!warning \"Disabling remote agent authentication\"\n\n    when setting the property `disableAgentAuth` to `true` this will have the effect of automatically allowing agents with the correct security token to communicate with the Bamboo server. This property is useful for testing, and when deployments requiring many agents are needed. This property can also be left in its default state of `false` in which case each agent will need to be approved manually via the `Agents` settings tab of the Bamboo server instance. Additional details on agent authentication can be found [here](https://confluence.atlassian.com/bamboo/agent-authentication-289277196.html)  \n    \n\n#### Manually\n\n* When logged into the Bamboo server instance, and from the `Agents` settings tab, **enable** `security token verification`, and **disable** `remote agent authentication`\n   ![security_token_verification](../../assets/images/bamboo_agents/enable-disable.png){ width=\"900\" }\n   \n* Navigate to the remote agent's installation page by selecting the `Install remote agent` button from the `Agents` settings tab\n   ![install_remote_agent](../../assets/images/bamboo_agents/install-remote-agent.png){ width=\"900\" }\n\n* Create a K8s secret using the `security token` rendered on the `Installing a remote agent` page\n   ![security_token](../../assets/images/bamboo_agents/security-token.png){ width=\"900\" }\n      \n   create secret using token...\n   \n   ``` shell\n   kubectl create secret generic security-token --from-literal=security-token=<security token>\n   ```\n\n### 2. Deploy agent \n\n* Update the bamboo agent `values.yaml` to utilize the security token secret and point to the bamboo server instance\n\n```yaml\nreplicaCount: 3\nagent:\n  securityToken:\n    secretName: \"security-token\"\n    secretKey: security-token\n  server: \"bamboo.bamboo.svc.cluster.local\"\n```\n\n!!!info \"Values\"\n\n      * As long as your cluster has the physical resources the `replicaCount` can be set to any value from `1` .. `1 + n` \n      * `agent.server` should be configured with the K8s DNS record for the Bamboo server service. The value should be of the form: `<service_name>.<namespace>.svc.cluster.local`\n\n* Install the agent\n\n```shell\nhelm install bamboo-agent atlassian-data-center/bamboo-agent -f values.yaml\n```\n\n!!!tip \"Custom agents\"\n\n        By default the Bamboo agent Helm chart will deploy the [bamboo-agent-base](https://hub.docker.com/r/atlassian/bamboo-agent-base){.external} Docker image. This image provides the following capabilities out of the box:\n        \n        * JDK 11\n        * Git & Git LFS\n        * Maven 3\n        * Python 3\n\n        For details on defining and deploying agents with custom/additional capabilities view the [agent capabilities guide](AGENT_CAPABILITIES.md)\n\n## Scaling the agent count\n\nThe number of active agents can be easily increased or decreased: \n\n``` shell\nhelm upgrade --set replicaCount=<desired number of agents> \\\n             --reuse-values \\\n             <name of the release>\n             atlassian-data-center/bamboo-agent\n```\n\n## Troubleshooting\n\nYou can find the most common errors relating to agent configuration in the [official Bamboo agent documentation](https://confluence.atlassian.com/bamboo/bamboo-remote-agent-installation-guide-289276832.html){.external}.\n"
  },
  {
    "path": "docs/docs/examples/bitbucket/.pages",
    "content": "nav:\n    - OpenSearch    : BITBUCKET_OPENSEARCH.md\n    - Elasticsearch (Deprecated) : BITBUCKET_ELASTICSEARCH.md\n    - Smart Mirrors : BITBUCKET_MIRRORS.md\n    - SSH : BITBUCKET_SSH.md\n    - Mesh : BITBUCKET_MESH.md\n    - ...\n"
  },
  {
    "path": "docs/docs/examples/bitbucket/BITBUCKET_AWS_OPENSEARCH.md",
    "content": "# Configure AWS OpenSearch with Bitbucket\n\n## Configuration Example\n\n```yaml\nbitbucket:\n  # Disable default OpenSearch deployment\n  opensearch:\n    enabled: false\n\n  # Configure AWS OpenSearch connection\n  additionalEnvironmentVariables:\n    - name: SEARCH_ENABLED\n      value: \"true\"\n    - name: PLUGIN_SEARCH_CONFIG_BASEURL\n      value: \"https://your-opensearch-endpoint.region.es.amazonaws.com\"\n    - name: PLUGIN_SEARCH_CONFIG_USERNAME\n      valueFrom:\n        secretKeyRef:\n          name: aws-opensearch-credentials\n          key: username\n    - name: PLUGIN_SEARCH_CONFIG_PASSWORD\n      valueFrom:\n        secretKeyRef:\n          name: aws-opensearch-credentials\n          key: password\n```\n\n## Create AWS OpenSearch Credentials Secret\n\n```shell\nkubectl create secret generic aws-opensearch-credentials \\\n  --from-literal=username=your-username \\\n  --from-literal=password=your-password \\\n  -n your-namespace\n``` "
  },
  {
    "path": "docs/docs/examples/bitbucket/BITBUCKET_ELASTICSEARCH.md",
    "content": "!!!warning \"Elasticsearch deprecation notice\"\n    Elasticsearch has been deprecated as a search platform for Bitbucket. Use [OpenSearch](../BITBUCKET_OPENSEARCH) instead.\n\n# Bitbucket Elasticsearch recommendations\nWhile Bitbucket has its own internal Elasticsearch instance, we highly recommend you use an external Elasticsearch installation, either within the Kubernetes cluster or, if available, an instance managed by your hosting provider.\n\n## Installing and configuring Elasticsearch in your Kubernetes cluster\n### Installing Elasticsearch into your Kubernetes cluster\nChoose a version of Elasticsearch that is supported by the [version of Bitbucket you are installing](https://confluence.atlassian.com/bitbucketserver/supported-platforms-776640981.html#Supportedplatforms-additional-toolsAdditionaltools){.external}. For Bitbucket 7.14 the latest supported Elasticsearch version is 7.9.3, so we will target that.\n\nThere are official [Helm charts for Elasticsearch 7.9.3](https://artifacthub.io/packages/helm/elastic/elasticsearch/7.9.3){.external}. Following the documentation there add the Elasticsearch Helm charts repository:\n\n```bash\nhelm repo add elastic https://helm.elastic.co\n```\nthen install it:\n```bash\nhelm install elasticsearch --namespace <namespace> --set imageTag=\"7.9.3\" elastic/elasticsearch\n```\n!!! info \"Prerequisites of Elasticsearch Helm chart\"\n    Running the above commands will install Elasticsearch with the default configuration, which is 3 worker nodes. \n    However, it may not always work out of the box if failed to fulfill prerequisites for the default installation. \n    Some example prerequisites include:\n\n    * CPU/memory requests: 1000m/2Gi (for each worker node)\n    * Preconfigured storage volumes (30Gi for each worker node)\n    \n    For more details refer to [Elasticsearch values.yaml file](https://github.com/elastic/helm-charts/blob/7.9/elasticsearch/values.yaml){.external}.\n\n### Configuring your Bitbucket deployment\n\nTo enable the installed Elasticsearch service you need to configure the service URL under `bitbucket:` stanza in the `values.yaml` file.\nCheck the Kubernetes official documentation on how to get [DNS record for a service](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services){.external}.\n```yaml\nbitbucket:\n  elasticSearch:\n    baseUrl: http://elasticsearch-master.<namespace>.svc.cluster.local:9200\n```\nThis will also have the effect of disabling Bitbucket’s internal Elasticsearch instance.\n\n!!! info \"Elasticsearch security\"\n    If you have Elasticsearch cluster with [security enabled](https://github.com/elastic/helm-charts/tree/master/elasticsearch#how-to-deploy-clusters-with-security-authentication-and-tls-enabled){.external}, i.e. having credential details stored in a Kubernetes secret and passed into `extraEnvs` as this [example](https://github.com/elastic/helm-charts/blob/master/elasticsearch/examples/security/values.yaml#L23){.external} does, you can then use the same secret and configure that in the bitbucket `values.yaml` file:       \n    ```yaml\n    bitbucket:\n      elasticSearch:    \n         credentials:\n            secretName: <my-elasticsearch-secret>\n            usernameSecretKey: username\n            passwordSecretKey: password\n    ```\n    Read about [Kubernetes secrets](https://kubernetes.io/docs/concepts/configuration/secret/){.external}.\n\n\n## Configuring Amazon Elasticsearch Service with Bitbucket on Kubernetes\n\n### Creating an Amazon Elasticsearch Service domain with a master user\n\nThe Elasticsearch instance (“domain”) can be created via the AWS CLI or the web console; for this example we will use the web console and a master user:\n\n1. In the EKS console navigate to **Your Cluster → Networking** and note the VPC ID.\n2. In the Elasticsearch console create a new domain:\n   1. Select a production deployment.\n   2. Select Elasticsearch version 7.9.\n3. In the next screen configure the AZs and nodes as appropriate for your expected workload.\n4. On the **Access and security** page:\n   1. Select the same VPC as the EKS cluster, as noted in step 1.\n   2. Select appropriate subnets for each AZ; private subnets are fine.\n   3. Select appropriate security groups that will grant node/pod access.\n   4. Tick **Fine–grained access control**:\n     * Select **Create master user** and add a username and a strong password.\n5. Configure tags, etc. as appropriate for your organisation.\n\nOnce the Elasticsearch domain has finished creating, make a note of the **VPC Endpoint**, which will be an HTTPS URL.\n\n### Configuring your Bitbucket deployment\n\nTo use the managed Elasticsearch service, first create a Kubernetes secret using the username and password from step 4 above. Then configure the service URL under `bitbucket:` in the `values.yaml` file, substituting the values below from the above steps where appropriate:\n```yaml\nbitbucket:\n  elasticSearch:\n    baseUrl: <VPC Endpoint>\n    credentials:\n      secretName: <my-elasticsearch-secret>\n      usernameSecretKey: username\n      passwordSecretKey: password\n```\n!!! info \"\"\n    Read about [Kubernetes secrets](https://kubernetes.io/docs/concepts/configuration/secret/){.external}.\n\n## Testing your Elasticsearch connection\nTo test if Elasticsearch is properly set up, go to **Administration > System - Server settings**. The Elasticsearch URL should be pre-populated already in the search section. Click the **Test** button to see if it connects successfully.\n![bitbucket-elasticsearch](../../assets/images/bitbucket-elasticsearch.png)\n"
  },
  {
    "path": "docs/docs/examples/bitbucket/BITBUCKET_MESH.md",
    "content": "# Bitbucket Mesh\n\nBitbucket Mesh is a distributed, replicated, and horizontally scalable Git repository storage system, which increases performance and improves the resilience of Bitbucket.\n\n![bitbucket_mesh](../../assets/images/bitbucket_with_mesh.png)\n\nYou can learn more details about Bitbucket Mesh on the [official documentation page](https://confluence.atlassian.com/bitbucketserver/bitbucket-mesh-1128304351.html){.external}.\n\n!!!tip \"Recommendations for Mesh deployments\"\n\n    **Bitbucket version**\n\n    By default, the Helm charts target the latest Bitbucket LTS version. However,\n    Mesh is only supported from version 8.0. You will need to select an 8.x\n    version of Bitbucket to deploy Mesh. Learn more details below.\n\n    **Mesh agent version**\n\n    Bitbucket Mesh agents are versioned independently from Bitbucket. You should\n    select the appropriate version for the deployed version of Bitbucket. See\n    the [Mesh download page](https://www.atlassian.com/software/bitbucket/download-mesh-archives){.external}\n    for available versions.\n\n    **Number of Mesh nodes**\n\n    In order for high-availability to be possible, we recommend having a minimum\n    of three Mesh nodes. There is no maximum on the number of nodes.\n\n    **Mesh node co-location**\n\n    We don't currently support deploying Mesh nodes into multiple\n    availability zones. Just like the shared file system based deployments, the\n    Mesh nodes (that is, the repository storage) and the application nodes must\n    be co-located.\n\n    **Other Mesh deployment requirements**\n\n    For more details on the requirements and limitations of Mesh deployments, check the\n    [the Bitbucket Mesh FAQ](https://confluence.atlassian.com/enterprise/bitbucket-data-center-faq-776663707.html#BitbucketDataCenterFAQ-Mesh){.external}.\n\n\n### Configuring your Bitbucket and Mesh deployment\n\nFor backwards compatibility, the Helm charts default to Mesh being disabled. To\nenable it, you will need to configure the service under `bitbucket:` stanza in\nthe `values.yaml` file, substituting the values below from the above steps where\nappropriate:\n\n```yaml\nimage:\n  tag: <an 8.x.x version of Bitbucket>\n\nbitbucket:\n  mesh:\n    enabled: true\n    image:\n      version: <Mesh agent version>\n```\n\n### Adding the Mesh nodes to Bitbucket\n\nTo enable the deployed Mesh nodes you need to add them to the Bitbucket Data\nCenter instance in the administration area. To do so, you'll need the\nservice URL of each node; these are usually of the form `bitbucket-mesh-<num>`. Check the Kubernetes\nofficial documentation to learn how to get a [DNS record for a service](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services){.external}.\n\nTo connect the Mesh node:\n\n1. In your Bitbucket Data Center instance, navigate to **Administration** > **Git** > **Bitbucket Mesh**.\n1. Enter the URL of the Mesh node in the Node URL field (e.g. `http://bitbucket-mesh-1:7777`).\n1. (Optional) Enter a name for the Mesh node in the Node name field.\n1. Select **Add Mesh node**.\n\n[Learn more details about Mesh configuration](https://confluence.atlassian.com/bitbucketserver/set-up-and-configure-mesh-nodes-1128304356.html#SetupandconfigureMeshnodes-ConnectingtheMeshnodetoBitbucket).\n\n### Migrating existing repositories to Mesh\n\n[Learn how to migrate repositories to Mesh](https://confluence.atlassian.com/bitbucketserver/migrate-repositories-to-bitbucket-mesh-1128304358.html).\n"
  },
  {
    "path": "docs/docs/examples/bitbucket/BITBUCKET_MIRRORS.md",
    "content": "# Smart Mirroring\n\nSmart Mirroring can greatly improve Git clone speeds for distributed teams working with large repositories. Large repositories that take hours to clone from a Bitbucket instance over the Internet from the other side of the world can take minutes when cloned from a local mirror on a fast network.\n\n![smart mirrors](../../assets/images/bitbucket_mirrors/smart_mirrors_diagram.png)\n\nYou can learn more details about smart mirroring on the [official documentation page](https://confluence.atlassian.com/bitbucketserver/smart-mirroring-776640046.html).\n\n!!!tip \"Upstream/Primary instance\"\n    **Primary instance** is sometimes called **upstream** instance.\n\n\n## Requirements\n\n!!!warning \"Primary instance prerequisites\"\n    \n    **Your primary Bitbucket instance must be a fully licensed Bitbucket Data Center instance**\n    \n    You do not have to run your Bitbucket Data Center instance as a multi-node cluster to use smart mirroring, but you must have an up-to-date Data Center license.\n\n    **The primary instance and all mirror(s) must have HTTPS with a valid (i.e., signed by a Certificate Authority anchored to the root and not expired) SSL certificate**\n    \n    This is a strict requirement of smart mirroring on both the primary instance and all mirror(s), and cannot be bypassed. The mirror setup wizard will not proceed if either the mirror or the primary instance does not have a valid SSL certificate.\n\n    **The primary Bitbucket instance must have SSH enabled**\n    \n    Mirrors keep their repositories synchronized with the primary instance over SSH and cannot use HTTP or HTTPS for this. See Enable SSH access to Git repositories for instructions on enabling SSH access on your primary instance.\n\n\n## Installation\n\n### Overview\n\n1. Install the **primary** as usual with Bitbucket Helm chart.\n      * You need to make sure the instance complies with all the above listed requirements.\n2. Install the **mirror** with second Bitbucket Helm chart.\n      * There is a set of properties that need to be configured to make the mirror work.\n3. Approve the **mirror** in the **primary** instance.\n\n### Steps\n\n#### Mirror Farm installation in Kubernetes\n\n!!!info Ingress configuration\n  \n    Example is using [nginx-ingress controller](../ingress/INGRESS_NGINX.md). If you are using a different ingress controller, you will need to modify the example.\n\n1. Install the **primary** as usual with Bitbucket Helm chart.\n      * You need to make sure the instance complies with all the above listed requirements.\n      * Verify that you are able to clone from the primary via SSH protocol.\n      * Verify that primary instance is accessible over HTTPS with a valid SSL certificate.\n2. Create a new file `values-mirror.yaml` with the following content:\n``` yaml\nbitbucket:\n  mode: mirror\n  displayName: Bitbucket Mirror\n  clustering:\n    enabled: true\n  applicationMode: \"mirror\"\n  mirror:\n    upstreamUrl: <https url of the primary> # for example https://bitbucket-upstream.example.com\n\n# nginx specific configuration\ningress:\n  create: true\n  host: bitbucket-mirror.example.com\n  annotations:\n    cert-manager.io/issuer: \"letsencrypt-prod\" # Default issuer\n  tlsSecretName: <secret with TLS private key> # E.g. tls-certificate-mirror\n\n# enables persistence for mirror data\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n```\n3. Edit the file to change the placeholder values.\n      * `bitbucket.mirror.upstreamUrl`\n      * `ingress.host`\n      * `ingress.tlsSecretName`\n4. Install the mirror\n    ``` shell\n      helm install bitbucket-mirror atlassian-data-center/bitbucket -f values-mirror.yaml\n    ```\n\n#### Mirror farm authorization\n\nThese steps are described in detail in [official documentation](https://confluence.atlassian.com/bitbucketserver/set-up-and-configure-a-mirror-farm-978205589.html#Setupandconfigureamirrorfarm-4.Approvethemirrorfarmrequest).\n\n1. Visit the mirror URL (it might take a couple of minutes to come up)\n2. Click on *Go to the primary server* in the mirror UI. The link will take you to the administration section of the primary instance.<br />\n   ![mirror_setup](../../assets/images/bitbucket_mirrors/mirror_authorize.png){ width=\"400\" }\n3. Click *Authorize* next to the mirror<br />\n    ![click_authorize](../../assets/images/bitbucket_mirrors/upstream_authorize.png)\n4. Select which projects should be synchronized<br />\n    ![select_projects](../../assets/images/bitbucket_mirrors/select_projects_to_mirror.png)\n5. Wait for the projects to be synchronized<br />\n    ![project_synchronized](../../assets/images/bitbucket_mirrors/mirror_synchronized.png)\n6. Verify that the synchronized projects can be cloned from the mirror<br />\n    ![clone_from_mirror](../../assets/images/bitbucket_mirrors/clone_from_mirror.png){ width=\"400\"}\n\n## Scaling the mirror farm\n\nAs the mirror is deployed with all the fulfilled requirements for the Bitbucket Mirror Farm, you are able to scale the mirrors easily. To increase or decrease the size of the mirror farm:\n\n``` shell\nhelm upgrade --set replicaCount=<desired number of mirror nodes> \\\n             --reuse-values \\\n             <name of the release>\n             atlassian-data-center/bitbucket\n```\n\n## Adding or removing additional mirror farms\n\nIt is possible to connect multiple mirror farms to a single primary instance. This can be useful to improve local performance for geographically distributed teams.\n\n*To add a new mirror farm*, follow the same steps that were necessary to connect the first mirror farm. This means installing another helm release and authenticating it in the administrator user interface.\n\n*To remove a mirror farm*:\n\n1. Navigate to *Mirrors* administration section on the **primary**\n2. Select the mirror from the list\n3. Click *Delete* button\n4. Uninstall the deleted mirror helm release from the cluster\n\n## Troubleshooting\n\nYou can find the most common errors in mirror configuration described in the [official Bitbucket documentation](https://confluence.atlassian.com/bitbucketserverkb/troubleshooting-smart-mirroring-838407670.html)."
  },
  {
    "path": "docs/docs/examples/bitbucket/BITBUCKET_OPENSEARCH.md",
    "content": "!!!info \"Helm chart version\"\n    OpenSearch sub-chart is supported in Bitbucket Helm chart version 1.20 onwards.\n\n## Deploy OpenSearch Helm chart with Bitbucket\n\n!!!warning \"Support disclaimer\"\n    Atlassian does not officially support OpenSearch Helm chart that can be installed with the Bitbucket Helm release. Should you encounter any issues with the deployment, maintenance and upgrades, reach out to the [vendor](https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch){.external}.\n    Moreover, if you intend to deploy OpenSearch to a critical Kubernetes environment, make sure you follow all the best practices, i.e. deploy a multi node cluster, use taints and tolerations, affinity rules, sufficient resources requests, have DR and backup strategies etc.\n\nTo deploy OpenSearch Helm chart and automatically configure Bitbucket to use it as a search platform, set the following in your Helm values file:\n\n```yaml\nopensearch:\n  install: true\n```\nThis will:\n\n* auto-generate the initial OpenSearch admin password and create a Kubernetes secret with `OPENSEARCH_INITIAL_ADMIN_PASSWORD` key\n* deploy [OpenSearch Helm chart](https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch){.external} to the target namespace with the default settings: single node, no SSL, 1Gi memory/1 vCPU resources requests, 10Gi storage request\n* set `PLUGIN_SEARCH_CONFIG_BASEURL` to `http://opensearch-cluster-master:9200` unless overridden in `opensearch.baseUrl`\n* set `PLUGIN_SEARCH_CONFIG_USERNAME` to `admin` (this is the initial admin user created when the OpenSearch cluster starts for the very first time)\n* set `PLUGIN_SEARCH_CONFIG_PASSWORD` to a randomly generated password saved to `opensearch-initial-password` secret\n\n## Create dedicated OpenSearch user\n\nWhen the Helm chart is installed with the default values, OpenSearch admin user is created with an auto-generated password, and Bitbucket is configured to use these credentials to connect to OpenSearch. If you want to have a more fine-grained control over internal users, you may pre-create a secret with a list of users, their credentials and roles. See [internal_users.yml](https://opensearch.org/docs/latest/security/configuration/yaml/#internal_usersyml){.external} for more details.\n\n### Hash passwords\n\nPasswords in `internal_users.yml` must be hashed. You can use `hash.sh` script bundled with Bitbucket to hash your passwords, for example:\n\n```shell\ndocker run atlassian/bitbucket:latest /bin/bash -c \"chmod +x /opt/atlassian/bitbucket/opensearch/plugins/opensearch-security/tools/hash.sh && /opt/atlassian/bitbucket/opensearch/plugins/opensearch-security/tools/hash.sh -p mySecureAdminPassword123\"\n\n$2y$12$bcUjaXcfutyYwkjp6r/RdePrywC3BmQLKvN77XuuR0PJs0qjBooSv\n```\nIf Bitbucket is already up and running in your Kubernetes cluster, you can run exec into the Bitbucket container to hash a password:\n\n```shell\nkubectl exec -ti bitbucket-0 -n atlassian -- /bin/bash -c  \"chmod +x /opt/atlassian/bitbucket/opensearch/plugins/opensearch-security/tools/hash.sh && /opt/atlassian/bitbucket/opensearch/plugins/opensearch-security/tools/hash.sh -p mySecureBitbucketPassword123\"\n\n$2y$12$x910YF09tcfhNs009vOzWOMy9fswhpsuV5/AiiPwbY4rp5BXKv2tv\n```\n\n### Create internal_users.yml file\n\nThis is the minimal `internal_users.yml` file with an admin and a dedicated bitbucket user. See [internal_users.yml](https://opensearch.org/docs/latest/security/configuration/yaml/#internal_usersyml){.external} to get more details about users, roles and role mappings in OpenSearch.\n\n```yaml\n_meta:\n  type: \"internalusers\"\n  config_version: 2\n\nadmin:\n  hash: \"$2y$12$bcUjaXcfutyYwkjp6r/RdePrywC3BmQLKvN77XuuR0PJs0qjBooSi\"\n  reserved: true\n  backend_roles:\n  - \"admin\"\n  description: \"Demo admin user\"\n\nbitbucket:\n  hash: \"$2y$12$x910YF09tcfhNs009vOzWOMy9fswhpsuV5/AiiPwbY4rp5BXKv2tu\"\n  reserved: true\n  backend_roles:\n    - \"admin\"\n  description: \"Bitbucket admin user\"\n```\n\n### Create Kubernetes secret\n\nCreate a Kubernetes secret with 3 keys in its data:\n\n!!!warning \"internal_users.yml\"\n    Make sure there are no typos in `internal_users.yml` filename, otherwise OpenSearch pods can't be created due to a missing key in the secret.\n\n```shell\nkubectl create secret generic opensearch-internal-users \\\n      --from-literal=username=bitbucket \\\n      --from-literal=password=\"mySecureBitbucketPassword123\" \\\n      --from-file=internal_users.yml=/path/to/internal_users.yml \\\n      -n atlassian\n```\n\n### Update Helm values\n\nNow that the secret has been created, update your Helm values to point OpenSearch and Bitbucket to `opensearch-internal-users` secret:\n\n```yaml\nopensearch:\n  install: true\n  credentials:\n    secretName: opensearch-internal-users\n    usernameSecretKey: username\n    passwordSecretKey: password\n  securityConfig:\n    internalUsersSecret: opensearch-internal-users\n```\n\nIf necessary, you can create 2 separate secrets - one for the `internal_users.yml` only, and one with the actual non-hashed OpenSearch credentials that Bitbucket will use.\n\n## Override OpenSearch Helm chart values\n\nYou can configure your OpenSearch cluster and the deployment options by overriding any values that the [Helm chart](https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch/values.yaml){.external} exposes. OpenSearch values must be nested under `opensearch` stanza in your Helm values file, for example:\n\n```yaml\nopensearch:\n  singleNode: false\n  replicas: 5\n  config:\n    opensearch.yml: |\n      cluster.name: custom-cluster\n```\n\n## Enable SSL with Custom Certificates \n\nBy default, OpenSearch starts with the SSL http plugin disabled, meaning the cluster is accessible via HTTP at http://opensearch-cluster-master:9200. The OpenSearch service is not exposed through a LoadBalancer or Ingress unless the default configurations are explicitly overridden. Bitbucket communicates with the OpenSearch cluster using the service name within the internal Kubernetes network. This setup uses the Kubernetes DNS to resolve the service name to the appropriate cluster IP address.\n\nTo enable SSL in OpenSearch and start the service on a secure port, you need to:\n* Enable SSL HTTPS in Helm values.\n* Create Kubernetes secrets with `ca`, `certificate` and `key`, and pass them to OpenSearch.\n* Add `ca.crt` to Java trust store in Bitbucket containers if the custom certificate is not signed by a public authority.\n\nBelow is an **example** (not the recommended way) of how to generate a CA certificate, a server certificate, and a corresponding private key for securing communications with OpenSearch:\n\n```shell\nopenssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj \"/C=US/ST=CA/L=LA/O=MyCompany Name/CN=opensearch-cluster-master\" -keyout ca.key -out ca.crt\nopenssl req -new -newkey rsa:2048 -nodes -keyout opensearch-cluster-master.key -subj \"/C=US/ST=CA/L=LA/O=MyCompany Name/CN=opensearch-cluster-master\" -out opensearch-cluster-master.csr\nopenssl x509 -req -days 365 -in opensearch-cluster-master.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out opensearch-cluster-master.crt\n```\n\nIt is important to generate the certificate for `opensearch-cluster-master` CN because this is the actual OpenSearch service/host name in the target namespace.\n\nOnce done, create 3 Kubernetes secrets:\n\n```shell\nkubectl create secret generic opensearch-ssl-ca -n atlassian --from-file=root-ca.pem=ca.crt\nkubectl create secret generic opensearch-ssl-key -n atlassian --from-file=esnode-key.pem=opensearch-cluster-master.key\nkubectl create secret generic opensearch-ssl-cert -n atlassian --from-file=esnode.pem=opensearch-cluster-master.crt\n```\n\nEnable ssl http plugin, override the default ca, certificate and key, as well as provide additional volume mounts in Bitbucket Helm values file:\n\n```yaml\nopensearch:\n  extraEnvs:\n    - name: plugins.security.ssl.http.enabled\n      value: \"true\"\n    - name: plugins.security.ssl.transport.pemkey_filepath\n      value: \"esnode-key.pem\"\n    - name: plugins.security.ssl.transport.pemcert_filepath\n      value: \"esnode.pem\"\n    - name: plugins.security.ssl.transport.pemtrustedcas_filepath\n      value: \"root-ca.pem\"\n  secretMounts:\n  - name: opensearch-ssl-cert\n    secretName: opensearch-ssl-cert\n    path: /usr/share/opensearch/config/esnode.pem\n    subPath: esnode.pem\n  - name: opensearch-ssl-key\n    secretName: opensearch-ssl-key\n    path: /usr/share/opensearch/config/esnode-key.pem\n    subPath: esnode-key.pem\n  - name: opensearch-ssl-ca\n    secretName: opensearch-ssl-ca\n    path: /usr/share/opensearch/config/root-ca.pem\n    subPath: root-ca.pem\n```\nWhen using a self-signed certificate or a certificate not issued/signed by a recognized public certificate authority (CA), it is essential to add the CA certificate to the Java trust store in all Bitbucket containers:\n\n```yaml\nbitbucket:\n  additionalCertificates:\n    secretName: opensearch-ssl-ca\n```\n\nAdditionally, you need to update the protocol specified in the baseUrl to HTTPS:\n\n```yaml\nbitbucket:\n  additionalCertificates:\n    secretName: opensearch-ssl-ca\nopensearch:\n  baseUrl: https://opensearch-cluster-master:9200\n```\n\n## Enable Ingress\n\nTo communicate with the OpenSearch cluster through a fully qualified domain name rather than via Kubernetes internal DNS name, you can enable an Ingress in the OpenSearch Helm chart. Below is an example of how to configure Ingress and update base URL in the Helm values file:\n\n\n```yaml\nopensearch:\n  baseUrl: https://myopensearch.com\n  ingress:\n    install: true\n```\nImportant considerations:\n\n* Ensure that the `baseUrl` is set to use HTTPS protocol, which encrypts the data exchanged with the OpenSearch cluster\n* Ensure that the Ingress hostname can be resolved from within the Kubernetes cluster network\n* If the certificate is not signed by a public authority, you will need to add the certificate to Java trust store in Bitbucket containers by defining a secret name in `bitbucket.additionalCertificates.secretName`\n\n## Use AWS OpenSearch Service\n\nIf you're using AWS OpenSearch Service (managed service) instead of deploying your own OpenSearch cluster, configure Bitbucket to connect to your existing AWS OpenSearch domain using environment variables.\n\n### Prerequisites\n\n* Create an AWS OpenSearch Service domain\n* Configure domain access policy to allow your EKS cluster\n* Have the domain endpoint URL and credentials ready\n\n### Configuration\n\n```yaml\nbitbucket:\n  clustering:\n    enabled: true\n  # Do not enable the opensearch helm chart\n  opensearch:\n    enabled: false\n  \n  additionalEnvironmentVariables:\n    - name: SEARCH_ENABLED\n      value: \"false\"\n    - name: PLUGIN_SEARCH_CONFIG_BASEURL\n      value: \"https://search-your-domain-abc123.us-east-1.es.amazonaws.com\"\n    - name: PLUGIN_SEARCH_CONFIG_USERNAME\n      valueFrom:\n        secretKeyRef:\n          name: aws-opensearch-credentials\n          key: username\n    - name: PLUGIN_SEARCH_CONFIG_PASSWORD\n      valueFrom:\n        secretKeyRef:\n          name: aws-opensearch-credentials\n          key: password\n```\n\n### Create AWS OpenSearch Credentials Secret\n\n```shell\nkubectl create secret generic aws-opensearch-credentials \\\n  --from-literal=username=your-master-username \\\n  --from-literal=password=your-master-password \\\n  -n your-namespace\n```\n\n### Using IAM Authentication\n\nFor domains using IAM authentication, configure IAM roles and omit username/password:\n\n```yaml\nbitbucket:\n  clustering:\n    enabled: true\n  opensearch:\n    enabled: false\n  \n  additionalEnvironmentVariables:\n    - name: SEARCH_ENABLED\n      value: \"false\"\n    - name: PLUGIN_SEARCH_CONFIG_BASEURL\n      value: \"https://search-your-domain-abc123.us-east-1.es.amazonaws.com\"\n    # No username/password needed - uses IAM role\n```\n\n## Troubleshooting\n\n### Authentication\n\nIf you run into auth issues (401 response from OpenSearch), check the following:\n\n* exec into the Bitbucket container and run:\n  ```shell\n  curl -v -u ${PLUGIN_SEARCH_CONFIG_USERNAME}:${PLUGIN_SEARCH_CONFIG_PASSWORD} http://opensearch-cluster-master:9200/_cat/indices?v\n  ```\n  If you get 401, then the user or password passed to the Bitbucket container does not match user or password defined in the `internal_users.yml`\n\n* you can find out where the actual values of `PLUGIN_SEARCH_CONFIG_USERNAME` and `PLUGIN_SEARCH_CONFIG_PASSWORD` environment variables come from by running:\n\n    ```shell\n    kubectl get pod bitbucket-0 -n atlassian -o jsonpath=\"{.spec.containers[0].env[?(@.name=='PLUGIN_SEARCH_CONFIG_USERNAME')]}\"\n    kubectl get pod bitbucket-0 -n atlassian -o jsonpath=\"{.spec.containers[0].env[?(@.name=='PLUGIN_SEARCH_CONFIG_PASSWORD')]}\"\n    ```\n* Make sure that hashed password of the bitbucket user in the `internal_users.yml` file corresponds to the plain text password stored in the Kubernetes secret.\n\n### Networking\n\nThe default `opensearch-cluster-master` hostname must be resolved to a Kubernetes service cluster IP, and the request is then forwarded directly to the pod endpoint.\nIf you see connection refused/timeout errors, make sure all OpenSearch pods are in a Ready state and the corresponding endpoints have been created:\n\n```shell\nkubectl describe pod -n atlassian -l=app.kubernetes.io/component=opensearch-cluster-master\n```\n\n```shell\nkubectl get endpoints -n atlassian\n\nNAME                                 ENDPOINTS                                         AGE\nbitbucket                            10.0.2.31:7999,10.0.2.31:7990,10.0.2.31:5701      113m\nopensearch-cluster-master            10.0.1.170:9200,10.0.1.170:9300                   113m\nopensearch-cluster-master-headless   10.0.1.170:9600,10.0.1.170:9200,10.0.1.170:9300   113m\n```"
  },
  {
    "path": "docs/docs/examples/bitbucket/BITBUCKET_SESSION_AFFINITY.md",
    "content": "# Configure Session Stickiness with NGINX Ingress\n\n## Default Configuration\n\n```yaml\ningress:\n  create: true\n  nginx: true  # Enables session stickiness automatically\n  host: bitbucket.example.com\n\nbitbucket:\n  clustering:\n    enabled: true\n```\n\n## Custom Configuration\n\n```yaml\ningress:\n  create: true\n  nginx: true\n  host: bitbucket.example.com\n  annotations:\n    \"nginx.ingress.kubernetes.io/session-cookie-name\": \"BITBUCKET-SESSION\"\n    \"nginx.ingress.kubernetes.io/session-cookie-max-age\": \"28800\"  # 8 hours\n```\n\n## Verifying Session Stickiness\n\nTest that session stickiness is working:\n\n```shell\n# Check ingress annotations\nkubectl describe ingress bitbucket -n atlassian\n\n# Test with curl (look for Set-Cookie header)\ncurl -I https://bitbucket.example.com/status\n```\n\n## Troubleshooting\n\nIf users are experiencing random logouts or Git operation failures:\n\n1. **Verify NGINX annotations are applied**:\n   ```shell\n   kubectl get ingress bitbucket -n atlassian -o yaml\n   ```\n\n2. **Check if requests hit the same pod**:\n   ```shell\n   kubectl logs -f -l app.kubernetes.io/name=bitbucket -n atlassian\n   ```\n\n3. **Ensure clustering is enabled**:\n   ```yaml\n   bitbucket:\n     clustering:\n       enabled: true\n   ```\n\n!!!tip \"Production recommendation\"\n    Set `session-cookie-max-age` to match your typical user session duration (e.g., 8 hours = 28800 seconds) to balance user experience with security. "
  },
  {
    "path": "docs/docs/examples/bitbucket/BITBUCKET_SSH.md",
    "content": "# SSH service in Bitbucket on Kubernetes\n\nIn addition to providing a service on HTTP(S), Bitbucket also allows remote Git operations over SSH connections. By default, Kubernetes Ingress controllers only work for HTTP connections, but some ingress controllers also support TCP connections.\n\nDepending on the need of your deployment, SSH access can be provided through three mechanisms:\n\n1. Opening the TCP port through the ingress controller - This option should be used if the SSH service is required to be available on the same DNS name as the HTTP service.\n2. Creating a separate Kubernetes `LoadBalancer` service - This option is available if the ingress controller does not support TCP connections, or if you don’t need your deployment to have the SSH service available on the same DNS name as the HTTP service.\n3. Exposing Bitbucket service as `LoadBalancer` and setting the desired ssh port (defaults to `7999`)\n\n## NGINX Ingress controller config for SSH connections\nWe can follow the official documentation for the NGINX Ingress controller for this: [Exposing TCP and UDP services - NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/){.external}.\n\n!!!info \"Namespace co-location\"\n    These instructions should be performed in the same namespace in which the Ingress controller resides.\n\n### 1. Create ConfigMap\nCreate a new `ConfigMap`:\n``` shell\nkubectl create configmap tcp-services\n```\n\nIn our example we deployed Bitbucket using the Helm release name `bitbucket` in the namespace `ssh-test`, update the `ConfigMap` `tcp-services` accordingly:\n\n```yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: tcp-services\n  namespace: ingress-nginx\ndata:\n  7999: \"<bitbucket namespace>/<bitbucket helm release name>:ssh\"\n```\n\n### 2. Update Ingress deployment\nNext, we have to edit the `deployment` of the ingress controller and add the `--tcp-services-configmap` option:\n```shell\nkubectl edit deployment <name of ingress-nginx deployment>\n```\nAdd this line in the `args` of the container `spec`:\n```shell\n- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services\n```\nso it looks something like this:\n```yaml\n spec:\n   containers:\n   - args:\n     - /nginx-ingress-controller\n     - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller\n     - --election-id=ingress-controller-leader\n     - --ingress-class=nginx\n     - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller\n     - --validating-webhook=:8443\n     - --validating-webhook-certificate=/usr/local/certificates/cert\n     - --validating-webhook-key=/usr/local/certificates/key\n     - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services\n```\n\n### 3. Update the Ingress service\nUpdate the Ingress service to include an additional `port` definition for `ssh`\n```shell\nkubectl edit service <name of ingress-nginx service>\n```\nAdd this section in the `ports` of the container `spec`:\n```yaml\n- name: ssh\n  port: 7999\n  protocol: TCP\n```\nso it looks something like this:\n```yaml\nspec:\n  clusterIP: 10.100.19.60\n  externalTrafficPolicy: Cluster\n  ports:\n  - name: http\n    nodePort: 31381\n    port: 80\n    protocol: TCP\n    targetPort: http\n  - name: https\n    nodePort: 32612\n    port: 443\n    protocol: TCP\n    targetPort: https\n  - name: ssh\n    port: 7999\n    protocol: TCP\n```\nAfter the deployment has been upgraded, the `SSH` service should be available on port `7999`.\n\n## LoadBalancer service for SSH connections on AWS\nIn the values file for the helm chart, the extra SSH service can be enabled like this:\n```yaml\nbitbucket:\n  sshService:\n    enabled: true\n```\nOn a deployment using AWS, assuming you have [external-dns](https://github.com/kubernetes-sigs/external-dns){.external} configured, you can add these annotations to automatically set up the DNS name for the SSH service:\n```yaml\nbitbucket:\n  sshService:\n    enabled: true\n    annotations:\n      external-dns.alpha.kubernetes.io/hostname: bitbucket-ssh.example.com\n  additionalEnvironmentVariables:\n    - name: PLUGIN_SSH_BASEURL\n      value: ssh://bitbucket-ssh.example.com/\n```\n## Expose Bitbucket Service as a LoadBalancer\n\nThis method implies creation of one K8S service of a `LoadBalancer` type. A cloud provider (e.g. AWS) will create listeners for each port declared in the service. Here's an example of exposing Bitbucket service in EKS, using a Classic LoadBalancer and dynamically provisioning DNS entries with [external-dns](https://github.com/kubernetes-sigs/external-dns){.external}:\n\n```yaml\nbitbucket:\n  service:\n    port: 443\n    sshPort: 22\n    type: LoadBalancer\n    annotations:\n      external-dns.alpha.kubernetes.io/hostname: bitbucket.example.com\n      service.beta.kubernetes.io/aws-load-balancer-ssl-ports: \"443\"\n      service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-1:111111111111:certificate/8xy4ny81-0a4w-8caq-a524-1101cv3v4vwb\n  additionalEnvironmentVariables:\n    - name: PLUGIN_SSH_BASEURL\n      value: ssh://bitbucket.example.com\ningress:\n  host: bitbucket.example.com\n```\n\nThe above service annotations are specific to the Classic LoadBalancer, however, you can provide [NLB](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html){.external} specific [annotations](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/service/annotations/){.external} as well.\n\nThe default `bitbucket.service.sshPort` is set to `22` so that AWS can create a listener for this port, and as a result your ssh git URL will look like `ssh://bitbucket.example.com/project/repo`. \n\n!!!info \"Ingress host\"\n\n    Even though `ingress` is disabled, `ingress.host` needs to be set because it is used in a few conditions in the StatefulSet template.\n"
  },
  {
    "path": "docs/docs/examples/cluster/AKS_SETUP.md",
    "content": "# Preparing an AKS cluster\nThis example provides instructions for creating a Kubernetes cluster using [Azure AKS](https://azure.microsoft.com/en-au/services/kubernetes-service/){.external}.\n\n## Prerequisites\nWe recommend installing and configuring the [Azure Cloud Shell](https://docs.microsoft.com/en-au/azure/cloud-shell/quickstart){.external}, allowing for CLI interaction with the AKS cluster.\n\n## Manual creation\nFollow the [Azure Kubernetes Service Quickstart](https://docs.microsoft.com/en-au/azure/aks/kubernetes-walkthrough){.external} for details on creating an AKS cluster.\n\n---\n!!!tip \"Next step - Ingress controller\"\n\n    Having established a cluster, continue with provisioning the next piece of prerequisite infrastructure, the [Ingress controller](../../userguide/PREREQUISITES.md#provision-an-ingress-controller)."
  },
  {
    "path": "docs/docs/examples/cluster/CLOUD_PROVIDERS.md",
    "content": "# Provisioning Kubernetes clusters on cloud-based providers\n\nHere are installation and configuration instructions for cloud providers:\n\n* [Amazon EKS](EKS_SETUP.md) \n* [Google GKE](GKE_SETUP.md)\n* [Azure AKS](AKS_SETUP.md)\n"
  },
  {
    "path": "docs/docs/examples/cluster/EKS_SETUP.md",
    "content": "# Preparing an EKS cluster\nThis example provides instructions for creating a Kubernetes cluster using [Amazon EKS](https://aws.amazon.com/eks/){.external}.\n\n## Prerequisites\nWe recommend installing and configuring [eksctl](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html){.external}, allowing for CLI interaction with the EKS cluster.\n\n## Manual creation\nFollow the [Getting started with Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html){.external} for details on creating an EKS cluster. Or, using the `ClusterConfig` below as an example, deploy a K8s cluster with `eksctl` in ~20 minutes:\n\n```yaml\napiVersion: eksctl.io/v1alpha5\nkind: ClusterConfig\n\nmetadata:\n  name: atlassian-cluster\n  region: ap-southeast-2\n\nmanagedNodeGroups:\n  - name: appNodes\n    instanceType: m5.large\n    desiredCapacity: 2\n    ssh: # enable SSH using SSM\n      enableSsm: true\n```\n\n???question \"Cluster considerations\"\n    It's always a good idea to consider the following points before creating the cluster:\n\n    1. [Geographical region](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/){.external} - where will the cluster reside.\n    2. [EC2 instance type](https://aws.amazon.com/ec2/instance-types/){.external} - the instance type to be used for the nodes that make up the cluster.\n    3. Number of nodes - guidance on the resource dimensions that should be used for these nodes can be found in [Requests and limits](../../userguide/resource_management/REQUESTS_AND_LIMITS.md).\n\nAdding the config above to a file named `config.yaml` provision the cluster: \n\n```shell\neksctl create cluster -f config.yaml\n```\n\n---\n!!!tip \"Next step - Ingress controller\"\n    \n    Having established a cluster, continue with provisioning the next piece of prerequisite infrastructure, the [Ingress controller](../../userguide/PREREQUISITES.md#provision-an-ingress-controller).\n"
  },
  {
    "path": "docs/docs/examples/cluster/GKE_SETUP.md",
    "content": "# Preparing an GKE cluster\nThis example provides instructions for creating a Kubernetes cluster using [Google GKE](https://cloud.google.com/kubernetes-engine){.external}.\n\n## Prerequisites\nWe recommend installing and configuring [Google Cloud SDK](https://cloud.google.com/sdk/docs/install){.external}, allowing for CLI interaction with an GKE cluster.\n\n## Manual creation\nFollow the [How-to guides](https://cloud.google.com/kubernetes-engine/docs/how-to#creating-clusters){.external} for details on creating an GKE cluster. \n\n---\n!!!tip \"Next step - Ingress controller\"\n\n    Having established a cluster, continue with provisioning the next piece of prerequisite infrastructure, the [Ingress controller](../../userguide/PREREQUISITES.md#provision-an-ingress-controller)."
  },
  {
    "path": "docs/docs/examples/confluence/.pages",
    "content": "collapse_single_pages: false\nnav:\n    - CONFLUENCE_OPENSEARCH.md\n    - ...\n"
  },
  {
    "path": "docs/docs/examples/confluence/CONFLUENCE_OPENSEARCH.md",
    "content": "# Configuring OpenSearch for Confluence\n\n!!!info \"Confluence and Helm chart version\"\n    OpenSearch is supported in Confluence 8.9.0 and Helm chart 1.19 onwards.\n\nAs Confluence instances grow in size and scale, the default search engine, Lucene, may be slower to index and return search results. To address this, Confluence Data Center offers an alternative search engine as an opt-in feature — OpenSearch.\n\nFind more information on advantages of using OpenSearch in the [official documentation](https://confluence.atlassian.com/doc/configuring-opensearch-for-confluence-1387594125.html){.external}\n\n## Deploy OpenSearch Helm Chart with Confluence\n\n!!!warning \"Support disclaimer\"\n    Atlassian does not officially support OpenSearch Helm chart that can be installed with the Confluence Helm release. Should you encounter any issues with the deployment, maintenance and upgrades, reach out to the [vendor](https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch){.external}.\n    Moreover, if you intend to deploy OpenSearch to a critical Kubernetes environment, make sure you follow all the best practices, i.e. deploy a multi node cluster, use taints and tolerations, affinity rules, sufficient resources requests, have DR and backup strategies etc. \n\n## Deploy with the default settings\n\nTo deploy OpenSearch Helm chart and automatically configure Confluence to use it as a search platform, set the following in your Helm values file:\n\n```yaml\nopensearch:\n  enabled: true\n```\nThis will:\n\n* auto-generate the initial OpenSearch admin password and create a Kubernetes secret with `OPENSEARCH_INITIAL_ADMIN_PASSWORD` key\n* deploy [OpenSearch Helm chart](https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch){.external} to the target namespace with the default settings: single node, 1Gi memory/1 vCPU resources requests, 10Gi storage request\n* configure Confluence to use the deployed OpenSearch cluster by adding `-Dsearch.platform=opensearch -Dopensearch.http.url=http://opensearch-cluster-master:9200 -Dopensearch.username=admin -Dopensearch.password=yourPassword` to the [JVM ConfigMap](https://github.com/atlassian/data-center-helm-charts/blob/main/src/main/charts/confluence/templates/config-jvm.yaml){.external}\n\n## Override OpenSearch Helm chart values\n\nYou can configure your OpenSearch cluster and the deployment options by overriding any values that the [Helm chart](https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch/values.yaml){.external} exposes. OpenSearch values must be nested under `opensearch` stanza in your Helm values file, for example:\n\n```yaml\nopensearch:\n  singleNode: false\n  replicas: 5\n  config:\n    opensearch.yml: |\n      cluster.name: opensearch-cluster\n```\n"
  },
  {
    "path": "docs/docs/examples/database/AMAZON_RDS.md",
    "content": "# Creating an RDS database instance\nThis example provides instructions for creating an Amazon [RDS DB instance](https://aws.amazon.com/rds/){.external}.\n\n## Prerequisites\n* An `AWS account`, `IAM user`, `VPC` (or [default VPC](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html){.external}) and `security group` are required before an RDS DB instance can be created. See [Setting up for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SettingUp.html){.external} for further instructions.\n\n## Database creation\nThere are two steps for creating the database:\n\n1. [Initialize database server](#1-initialize-database-server)\n2. [Initialize database and user](#2-initialize-database-and-user)\n\n### 1. Initialize database server\nFor details on standing up an RDS DB server follow the guide: [Creating an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html){.external}.\n### 2. Initialize database and user\n!!!danger \"Don't forget to create the database and user!\"\n\n    This is a required step. For details on creating the application database and database user follow the appropriate guide below:\n\n=== \"Jira\"\n    [Create database for Jira](https://confluence.atlassian.com/adminjiraserver/connecting-jira-applications-to-a-database-938846850.html){.external}\n=== \"Confluence\"\n    [Create database for Confluence](https://confluence.atlassian.com/doc/database-configuration-159764.html#DatabaseConfiguration-Databasesetupsetup){.external}\n=== \"Bitbucket\"\n    [Create database for Bitbucket](https://confluence.atlassian.com/bitbucketserver/connect-bitbucket-to-an-external-database-776640378.html){.external}\n=== \"Bamboo\"\n    [Create database for Bamboo](https://confluence.atlassian.com/bamboo/connecting-bamboo-to-an-external-database-289276815.html){.external}\n=== \"Crowd\"\n    [Create database for Crowd](https://confluence.atlassian.com/crowd/connecting-crowd-to-a-database-4030904.html){.external}\n \n---\n!!!tip \"Next step - Shared storage\"\n    \n    Having created the database continue with provisioning the next piece of prerequisite infrastructure, [shared storage](../../userguide/PREREQUISITES.md#configure-a-shared-home-volume)."
  },
  {
    "path": "docs/docs/examples/database/CLOUD_PROVIDERS.md",
    "content": "# Provisioning databases on cloud-based providers\n\n!!!info \"Supported databases\"\n      \n    Your selected database engine type must be supported by the Data Center product you wish to install:\n\n    === \"Jira\"\n          \n        [Jira supported databases](https://confluence.atlassian.com/adminjiraserver/supported-platforms-938846830.html#Supportedplatforms-Databases){.external}\n\n    === \"Confluence\"\n          \n        [Confluence supported databases](https://confluence.atlassian.com/doc/supported-platforms-207488198.html#SupportedPlatforms-Databases){.external}\n\n    === \"Bitbucket\"\n          \n        [Bitbucket supported databases](https://confluence.atlassian.com/bitbucketserver/supported-platforms-776640981.html#Supportedplatforms-databasesDatabases){.external}\n\n    === \"Bamboo\"\n\n        [Supported databases](https://confluence.atlassian.com/bamboo/supported-platforms-289276764.html#Supportedplatforms-Databases){.external}\n\n    === \"Crowd\"\n          \n        [Crowd supported databases](https://confluence.atlassian.com/crowd/supported-platforms-191851.html#SupportedPlatforms-Databases){.external}\n\n\nDatabase deployment and configuration instructions for cloud providers can be found below:\n\n* [Amazon RDS](AMAZON_RDS.md)\n"
  },
  {
    "path": "docs/docs/examples/external_libraries/EXTERNAL_LIBS.md",
    "content": "# External libraries and plugins\n\n!!!warning \"`.jar` files only\"\n\n    Whether loading external libraries, drivers or plugins, the approaches outlined here can only be used with `.jar` files. Plugin `obr` files can be extracted (unzipped) to access the included `.jar`\n\nIn some situations, you may want to load 3rd party plugins, drivers or libraries so that they are available to the product \nbeing installed.\n\nAn example of when this may be needed are for those products that do not ship with the appropriate `MySQL` and `Oracle` \n`JDBC` drivers.\n\nThere are 3 strategies for doing this, you can either:\n\n*  [use the required prerequisite shared home volume](#shared-home-volume) \n*  [create a custom volume specifically for this purpose](#custom-volume) \n*  [provide a custom command for the `nfsPermissionFixer`](#custom-command)\n\nEach approach will be discussed below.\n\n!!!info \"Approach\"\n\n    Which approach is used is totally up to you. For convenience you may want to just use [shared-home](../../userguide/PREREQUISITES.md#configure-a-shared-home-volume), or if you'd like to \n    keep things clean you may decide to mount these 3rd party libraries in a volume of their own. This approach would be \n    particularly useful when these libraries need to be shared with other Pod's in your cluster.\n\n## Shared home volume\nThis approach consists of 3 high-level tasks:\n\n1. Create sub-dir in `shared-home` volume\n2. Copy libraries to sub-dir\n3. Update `additionalLibraries` stanza in `values.yaml`\n\n### 1. Create sub-dir\nAdd the Pod definition below to a file called `shared-home-browser.yaml` \n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: shared-home-browser\nspec:\n  containers:\n    - name: browser\n      image: debian:stable-slim\n      volumeMounts:\n        - mountPath: /shared-home\n          name: shared-home\n      command: [ \"bash\", \"-c\", \"--\" ]\n      args: [ \"while true; do sleep 30; done;\" ]\n  volumes:\n    - name: shared-home\n      persistentVolumeClaim:\n        claimName: <shared-home-pvc-name>\n```\nInitialise the Pod in the same namespace in which the `shared-home` PVC was created\n```bash\nkubectl apply -f shared-home-browser.yaml\n```\nOnce running execute the following command, it will create the sub-sir, `libraries`, under `/shared-home`\n```bash\nkubectl exec -it shared-home-browser -- bash -c \"mkdir -p /shared-home/libraries\"\n```\n\n### 2. Copy libraries to sub-dir\nNow copy the files you require to the sub-dir by using the `kubectl cp` command\n```bash\nkubectl cp my_library.jar shared-home-browser:/shared-home/libraries\n```\n\n### 3. Update `values.yaml`\nUpdate the stanza, `additionalLibraries`, in `values.yaml` accordingly:\n```yaml\njira:\n  additionalLibraries:\n    - volumeName: shared-home\n      subDirectory: libraries\n      fileName: my_library.jar\n```\nWith this config these files (`my_library.jar`) will be injected into the container directory `<product-installation-directory>/lib`. For more info on how these files are injected into the appropriate product container location, see Jira's helper [jira.additionalLibraries](https://github.com/atlassian/data-center-helm-charts/blob/main/src/main/charts/jira/templates/_helpers.tpl#L180).  \n\n## Custom volume\nThis approach is very similar to the [Shared home volume](#shared-home-volume) approach, only a custom volume is created and used as opposed `shared-home`. \n\n1. Create a new volume for storing 3rd party libraries\n2. Create sub-dir for the new volume\n3. Copy libraries to sub-dir\n4. Update `additionalLibraries` stanza in `values.yaml`\n5. Update `additionalVolumeMounts` stanza in `values.yaml`\n6. Update `additional` stanza in `values.yaml`\n\n!!!info \"Steps\"\n\n    Because many of the steps for this approach are similar to the steps used for [Shared home volume](#shared-home-volume) only those that differ will be discussed.\n\n### 1. Create new volume\nUsing the same approach taken for provisioning the [shared-home volume](../storage/aws/SHARED_STORAGE.md), create a new `EFS` with a corresponding `PV` and `PVC`.\n\n!!!warning \"ReadOnlyMany\"\n\n    Ensure that the PV and PVC are setup with `ReadOnlyMany` access\n\n### 2. Update `values.yaml`\nAssuming that the `PVC` representing the `EFS` is called `third-party-libraries`, update the `values.yaml` so that the `PVC` is added as an `additional` mount:\n```yaml\nvolumes:\n  additional:\n    - name: third-party-libraries\n      persistentVolumeClaim:\n        claimName: third-party-libraries\n```\nNow add this as an `additionalVolumeMounts`\n```yaml\nadditionalVolumeMounts:\n  - volumeName: third-party-libraries\n    mountPath: /libraries\n```\nFinally inject the desired libraries by defining them under `additionalLibraries`\n```yaml\nadditionalLibraries:\n  - volumeName: third-party-libraries\n    subDirectory: database_drivers\n    fileName: my_library.jar\n```\n\n## Custom command\nThis example is based on the GitHub issue discussed [here](https://github.com/atlassian/data-center-helm-charts/issues/239). The `nfsPermissionFixer` in the `values.yaml` is used for appropriately setting the permissions on the `shared-home` volume. The command it uses for this is already defined by default, however\nit can also be supplied with a custom `command` for adding 3rd party libraries to `shared-home`. The example below shows how this approach can be used for adding the `JDBC` `MySQL` driver:\n\n```yaml linenums=\"1\"\nnfsPermissionFixer:\n  command: |\n    if [[ ! -f /shared-home/drivers/mysql-driver.jar ]]; then\n      mkdir -p /shared-home/drivers\n      apk add dpkg\n      wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java_8.0.26-1debian10_all.deb\n      dpkg-deb -R mysql-connector-java_8.0.26-1debian10_all.deb /tmp/\n      cp /tmp/usr/share/java/mysql-connector-java-8.0.26.jar  /shared-home/drivers/mysql-driver.jar\n    fi\n    chgrp 2003 /shared-home; chmod g+w /shared-home\n```\n!!!warning \"shared-home permissions\"\n\n    If taking this approach ensure the last thing your custom command does is apply the relevant permissions to the `shared-home` mount, see line `10` in `yaml` \n    snippet above. \n\n    Each product chart has a `<product>.sharedHome.permissionFix.command` helper for doing this. look at Jira's helper [jira.sharedHome.permissionFix.command](https://github.com/atlassian/data-center-helm-charts/blob/main/src/main/charts/jira/templates/_helpers.tpl#L102) \n    for more details on how these permissions are applied by default.\n\nRemember to also update the `additionalLibraries` stanza accordingly:\n```yaml\nadditionalLibraries: \n  - volumeName: shared-home\n    subDirectory: drivers\n    fileName: mysql-driver.jar\n```"
  },
  {
    "path": "docs/docs/examples/ingress/CONTROLLERS.md",
    "content": "# Provisioning a traffic entry controller\n\nTo expose an Atlassian DC product outside your Kubernetes cluster, you must run **one** of the following:\n\n- an **Ingress controller** (to process Kubernetes `Ingress` resources), or\n- a **Gateway API controller** (to process Kubernetes Gateway API resources, such as `HTTPRoute`).\n\nThe Helm charts can render either:\n\n- a Kubernetes `Ingress` when `ingress.create: true`, or\n- a Kubernetes Gateway API `HTTPRoute` when `gateway.create: true`.\n\nThese options are **mutually exclusive** (you cannot enable both `ingress.create` and `gateway.create`).\n\n!!!note \"Sticky sessions are required\"\n    Atlassian DC products require **session stickiness** (\"sticky sessions\") for high availability. With NGINX Ingress this is handled via controller annotations. With Gateway API you must configure stickiness using your chosen Gateway implementation.\n\n## Example guides\n\n- [NGINX Ingress Controller (Ingress)](INGRESS_NGINX.md)\n- [Gateway API controller (Gateway API)](GATEWAY_API.md)\n"
  },
  {
    "path": "docs/docs/examples/ingress/DNS.md",
    "content": "# Create DNS record via AWS CLI\n\n!!!tip \"DNS record creation using Route53\"\n\n    The approach below shows how a DNS record can be created using AWS Route53 and the [AWS CLI for record sets](https://aws.amazon.com/premiumsupport/knowledge-center/alias-resource-record-set-route53-cli/){.external}\n\nFirst, identify the name of the auto provisioned [AWS Classic Load Balancer](https://aws.amazon.com/elasticloadbalancing/classic-load-balancer/){.external} that was created above for [Step 2. Install controller](#2-install-controller):\n```shell\nkubectl get service -n ingress | grep ingress-nginx | awk '{print $4}' | head -1\n```\nthe output of this command should be the name of the load balancer, take note of the name i.e.\n```shell\nb834z142d8118406795a34df35e10b17-38927090.eu-west-1.elb.amazonaws.com\n```\nNext, using the first part of the load balancer name, get the `HostedZoneId` for the load balancer\n```shell\naws elb describe-load-balancers --load-balancer-name b834z142d8118406795a34df35e10b17 --region <aws_region> | jq '.LoadBalancerDescriptions[] | .CanonicalHostedZoneNameID'\n```\nWith the `HostedZoneId` and the **full** name of the load balancer create the `JSON` \"change batch\" file below:\n\n```yaml\n{\n  \"Comment\": \"An alias resource record for Jira in K8s\",\n  \"Changes\": [\n    {\n      \"Action\": \"CREATE\",\n      \"ResourceRecordSet\": {\n        \"Name\": <DNS record name>,\n        \"Type\": \"A\",\n        \"AliasTarget\": {\n          \"HostedZoneId\": <Load balancer hosted zone ID>,\n          \"DNSName\": <Load balancer name>,\n          \"EvaluateTargetHealth\": true\n        }\n      }\n    }\n  ]\n}\n```\n\n!!!tip \"DNS record name\"\n\n    If for example, the DNS record name were set to `product.k8s.hoolicorp.com` then the host, `hoolicorp.com`, would be the pre-registerd [AWS Route53 hosted zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/route-53-concepts.html#route-53-concepts-hosted-zone){.external}.\n\nNext get the zone ID for the hosted zone:\n```shell\naws route53 list-hosted-zones-by-name | jq '.HostedZones[] | select(.Name == \"hoolicorp.com.\") | .Id'\n```\nFinally, using the hosted zone ID and the `JSON` change batch file created above, initialize the record:\n```shell\naws route53 change-resource-record-sets --hosted-zone-id <hosted zone ID> --change-batch file://change-batch.json\n```\nThis will return a response similar to the one below:\n```json\n{\n    \"ChangeInfo\": {\n        \"Id\": \"/change/C03268442VMV922ROD1M4\",\n        \"Status\": \"PENDING\",\n        \"SubmittedAt\": \"2021-08-30T01:42:23.478Z\",\n        \"Comment\": \"An alias resource record for Jira in K8s\"\n    }\n}\n```\nYou can get the current status of the record's initialization:\n```shell\naws route53  get-change --id /change/C03268442VMV922ROD1M4\n```\nOnce the `Status` has transitioned to `INSYNC` the record is ready for use...\n```json\n{\n    \"ChangeInfo\": {\n        \"Id\": \"/change/C03268442VMV922ROD1M4\",\n        \"Status\": \"INSYNC\",\n        \"SubmittedAt\": \"2021-08-30T01:42:23.478Z\",\n        \"Comment\": \"Creating Alias resource record sets in Route 53\"\n    }\n}\n```"
  },
  {
    "path": "docs/docs/examples/ingress/GATEWAY_API.md",
    "content": "# Gateway API controller (HTTPRoute)\n\nThe Atlassian DC Helm charts support exposing products via the **Kubernetes Gateway API** by rendering a `HTTPRoute` resource when `gateway.create: true`.\n\nTo use this, your cluster must have:\n\n- Gateway API CRDs installed\n- a Gateway API controller installed (for example, Envoy Gateway, Istio, etc.)\n- a `Gateway` resource that allows routes from your product namespace\n\n!!!note \"What the charts create\"\n    The charts create a **`HTTPRoute`** only. You must provision the **`GatewayClass`**, **`Gateway`**, and (optionally) **TLS certificates** in your cluster.\n\n## 1. Install a Gateway API controller\n\nFollow your chosen implementation's installation instructions:\n\n- Gateway API overview: <https://gateway-api.sigs.k8s.io/>\n- Implementations: <https://gateway-api.sigs.k8s.io/implementations/>\n\n## 2. Create a Gateway\n\nCreate a `Gateway` that will accept `HTTPRoute` attachments from the namespace where you install the Atlassian product.\n\nThe exact `gatewayClassName`, listener configuration, and TLS configuration depend on your chosen implementation.\n\n## 3. Configure the Helm chart\n\nDisable `ingress.create` and enable `gateway.create`. Provide a **parentRef** pointing to your `Gateway` and at least one **hostname**.\n\n```yaml\ningress:\n  create: false\n\ngateway:\n  create: true\n  hostnames:\n    - confluence.example.com\n  https: true\n  parentRefs:\n    - name: atlassian-gateway\n      namespace: gateway-system   # optional, defaults to release namespace\n      sectionName: https          # optional, target a specific Gateway listener\n```\n\n!!!info \"TLS termination\"\n    With Gateway API, TLS termination is configured on the `Gateway` listeners (not on the `HTTPRoute`). The `gateway.https` value controls the product's proxy/URL settings (e.g., generating HTTPS links), but it does not provision certificates by itself.\n\n## Gateway values reference\n\nThe `gateway` stanza is split into two groups:\n\n**Product configuration** (always active when `gateway.hostnames` is set):\n\n| Value | Description | Default |\n|-------|-------------|---------|\n| `gateway.create` | Create an `HTTPRoute` resource | `false` |\n| `gateway.hostnames` | Hostnames to route; first entry is used as the canonical hostname for base URL and proxy settings | `[]` |\n| `gateway.https` | Whether users access the application over HTTPS | `true` |\n| `gateway.externalPort` | Port users connect on; only set for non-standard ports | `443` (https) / `80` (http) |\n| `gateway.path` | Base path; falls back to `<product>.service.contextPath` when empty | (empty) |\n\n**HTTPRoute configuration** (only applies when `gateway.create: true`):\n\n| Value | Description | Default |\n|-------|-------------|---------|\n| `gateway.parentRefs` | List of [ParentReference](https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference){.external} objects (`name`, `namespace`, `sectionName`, etc.) | `[]` (required) |\n| `gateway.pathType` | Path matching type: `PathPrefix`, `Exact`, or `RegularExpression` | `PathPrefix` |\n| `gateway.annotations` | Annotations to add to the HTTPRoute | `{}` |\n| `gateway.labels` | Labels to add to the HTTPRoute | `{}` |\n| `gateway.filters` | [HTTPRouteFilter](https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter){.external} list (header modification, redirects, URL rewrites) | `[]` |\n| `gateway.timeouts.request` | Total request timeout | `60s` |\n| `gateway.timeouts.backendRequest` | Backend request timeout | `60s` |\n| `gateway.additionalRules` | Extra [HTTPRouteRule](https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule){.external} entries for advanced routing | `[]` |\n\n!!!note \"Using gateway config without creating an HTTPRoute\"\n    Setting `gateway.hostnames` activates gateway mode for the product's proxy and base-URL configuration **even when `gateway.create` is false**. This is useful when you have a pre-existing Gateway or external proxy/load balancer and only need the Helm chart to configure the product itself, without creating any Kubernetes routing resource.\n\n## 4. Timeouts\n\nThe `gateway.timeouts` block replaces the Ingress-style `proxyReadTimeout` / `proxySendTimeout` settings:\n\n```yaml\ngateway:\n  timeouts:\n    request: \"60s\"        # total request timeout\n    backendRequest: \"60s\" # backend request timeout\n```\n\n!!!warning \"No Gateway API equivalents\"\n    There is no standard Gateway API equivalent for `proxyConnectTimeout` or `maxBodySize`. If you need those, configure them through controller-specific policies (e.g. Envoy Gateway `BackendTrafficPolicy`).\n\n\n## Configure session affinity (sticky sessions)\n\nSession affinity is **required** for Atlassian DC products and is **not** part of the standard `HTTPRoute` API.\n\nSee [Session affinity with Gateway API](GATEWAY_API_SESSION_AFFINITY.md) for implementation-specific examples (cookie-based) and links for further reading.\n\n"
  },
  {
    "path": "docs/docs/examples/ingress/GATEWAY_API_SESSION_AFFINITY.md",
    "content": "# Session Affinity with Gateway API\n\nAtlassian DC products require **sticky sessions** so that a user is consistently routed to the same pod. With the NGINX Ingress controller this was handled automatically via annotations:\n\n```yaml\nnginx.ingress.kubernetes.io/affinity: \"cookie\"\nnginx.ingress.kubernetes.io/affinity-mode: \"persistent\"\n```\n\nWith Gateway API, session affinity is **not** part of the standard `HTTPRoute` spec and must be configured separately.\n\n## Cookie naming\n\nUse a **dedicated routing cookie** (for example `ATLROUTE_<PRODUCT>`) rather than the application's own `JSESSIONID`. This avoids conflicts with the application's session cookie and matches the approach used by NGINX Ingress.\n\n## Options at a glance\n\n| Approach | Cookie-based | Standard channel |\n|----------|:---:|:---:|\n| Implementation policy (Option 1) | Yes | N/A (separate CRD) |\n| Experimental `sessionPersistence` (Option 2) | Yes | No (experimental) |\n\n---\n\n## Implementation-specific policies (recommended)\n\nEach Gateway API implementation provides its own policy resource for session affinity. Create the appropriate resource in the **same namespace** as your Helm release.\n\n### Envoy Gateway\n\n```yaml\napiVersion: gateway.envoyproxy.io/v1alpha1\nkind: BackendTrafficPolicy\nmetadata:\n  name: <product>-session-affinity\n  namespace: <your-namespace>\nspec:\n  targetRefs:\n  - group: gateway.networking.k8s.io\n    kind: HTTPRoute\n    name: <release-name>-<product>\n  loadBalancer:\n    type: ConsistentHash\n    consistentHash:\n      type: Cookie\n      cookie:\n        name: ATLROUTE_<PRODUCT>\n        ttl: 10h\n```\n\n**Explore further:**\n\n- Envoy Gateway load balancing & session persistence: <https://gateway.envoyproxy.io/latest/tasks/traffic/load-balancing/>\n- Envoy Gateway `BackendTrafficPolicy` API: <https://gateway.envoyproxy.io/latest/api/extension_types/#backendtrafficpolicy>\n- Istio consistent-hash via `DestinationRule`: <https://istio.io/latest/docs/reference/config/networking/destination-rule/#LoadBalancerSettings-ConsistentHashLB>\n\n---\n\n## Experimental `sessionPersistence` on HTTPRoute\n\nThe Gateway API project has an **experimental** `sessionPersistence` field on HTTPRoute rules, tracked in **GEP-1619**. This field is **not** included in the standard-channel CRDs and will cause validation errors if those are installed.\n\n**Explore further:**\n\n- GEP-1619: <https://gateway-api.sigs.k8s.io/geps/gep-1619/>\n- `SessionPersistence` field reference: <https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.SessionPersistence>\n- Experimental CRDs install (pick a release): <https://github.com/kubernetes-sigs/gateway-api/releases>\n\n!!!warning \"Implementation support varies\"\n    Even with experimental CRDs installed, not all Gateway implementations support `sessionPersistence`. Check your implementation's conformance/support documentation.\n"
  },
  {
    "path": "docs/docs/examples/ingress/INGRESS_NGINX.md",
    "content": "# NGINX Ingress Controller - with TLS termination\n[NGINX ingress controller](https://kubernetes.github.io/ingress-nginx/){.external} with automatic TLS certificate management using [cert-manager](https://cert-manager.io/docs/){.external} and certificates from [Let's Encrypt](https://letsencrypt.org/){.external}.\n\n!!!warning \"Using these instructions\" \n\n    These instructions are for reference purposes, as such they should be used for development and testing purposes only! See the official instructions for [Deploying and configuring the controller](https://kubernetes.github.io/ingress-nginx/deploy/){.external}.\n\nThese instructions are composed of 3 high-level parts:\n\n1. Controller installation and configuration\n2. Certificate manager installation and configuration\n3. Ingress resource configuration\n\n## Controller installation and configuration\nWe recommend installing the controller using its official [Helm Charts](https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx){.external}. You can also use the instructions below.\n\n### 1. Add controller repository\nAdd the `ingress-nginx` Helm repository:\n```shell\nhelm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\n```\nUpdate the repository:\n```shell\nhelm repo update\n```\n\n### 2. Install controller\nCreate a new namespace for the Ingress controller:\n```shell\nkubectl create namespace ingress\n```\nInstall the controller using Helm:\n```shell\nhelm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress\n```\n\n!!!info \"\"\n    This will take couple of minutes.\n\nConfirm your ingress controller is installed:\n\n```\nkubectl get pods --namespace ingress\n```\n\n### 3. DNS setup\nManually provision a new DNS record via your cloud provider, [for instance AWS and Route53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-elb-load-balancer.html){.external}, or dynamically using [external-dns](https://github.com/kubernetes-sigs/external-dns){.external}. There are also instructions on [how this can be done using the AWS CLI](DNS.md).\n\nOnce created, associate the DNS record with the auto provisioned load balancer that was created in [Step 2. above](#2-install-controller). To do this first identify the name of the auto provisioned LB, this can be done by examining the deployed ingress services i.e.:\n```shell\nkubectl get service -n ingress | grep ingress-nginx\n```\nthe output of this command should look something like...\n```shell\ningress-nginx-controller             LoadBalancer   10.100.22.16    b834z142d8118406795a34df35e10b17-38927090.eu-west-1.elb.amazonaws.com   80:32615/TCP,443:31787/TCP   76m\ningress-nginx-controller-admission   ClusterIP      10.100.5.36     <none>                                                                  443/TCP                      76m\n```\nTake note of the `LoadBalancer` and using it as a value update the DNS record so that traffic is routed to it.\n\n!!!info \"\"\n    It can take a few minutes for the DNS to resolve these changes.\n\n## Certificate manager installation and configuration\nKubernetes certificate management is handled using [cert-manager](https://cert-manager.io/){.external}.\n\n### 1. Install cert-manager\nAdd the cert-manager repository\n```shell\nhelm repo add jetstack https://charts.jetstack.io\n```\n\nUpdate repositories\n```shell\nhelm repo update\n```\n\nInstall the cert-manager using Helm\n```shell\nhelm install \\\n  cert-manager jetstack/cert-manager \\\n  --namespace cert-manager \\\n  --create-namespace \\\n  --version v1.3.1 \\\n  --set installCRDs=true\n```\n\nConfirm the cert-manager is appropriately installed:\n```shell\nkubectl get pods --namespace cert-manager\n```\n\n### 2. Create certificate issuer\nUsing the `yaml` specification below create and apply the certificate `Issuer` resource:\n\n!!!info \"Namespace co-location\"\n    Ensure that the certificate issuer is installed in the same namespace that the Atlassian product will be deployed to.\n\n```yaml\napiVersion: cert-manager.io/v1\nkind: Issuer\nmetadata:\n  name: letsencrypt-prod\n  namespace: <product_deployment_namespace>\nspec:\n  acme:\n    # The ACME server URL\n    server: https://acme-v02.api.letsencrypt.org/directory\n    # Email address used for ACME registration\n    email: <user_email>\n    # Name of a secret used to store the ACME account private key\n    privateKeySecretRef:\n      name: letsencrypt-prod\n    # Enable the HTTP-01 challenge provider\n    solvers:\n      - http01:\n          ingress:\n            class: nginx\n```\nInstall the `Issuer` resource:\n```shell\nkubectl apply -f issuer.yaml\n```\n\n## Ingress resource configuration\nNow that the Ingress controller and certificate manager are setup the Ingress resource can be configured accordingly by updating the `values.yaml`.\n\n### 1. Ingress resource config\nFor TLS cert auto-provisioning and TLS termination update the `ingress` stanza within the products `values.yaml`:\n```yaml\ningress:\n  create: true\n  nginx: true\n  maxBodySize: 250m\n  host: <dns_record>\n  path: \"/\"\n  annotations:\n    cert-manager.io/issuer: \"letsencrypt-prod\" # Using https://letsencrypt.org/\n  https: true\n  tlsSecretName: tls-certificate\n```\n\n!!!info \"Configuring the `host` value\"\n\n    In this case the `<dns_record>` would correspond to the record name that was created in [3. DNS setup](#3-dns-setup) above\n\n## Bitbucket SSH configuration\n\n!!!warning \"Additional configuration\"\n    Bitbucket requires additional Ingress config to allow for `SSH` access. See [NGINX Ingress controller config for SSH connections](../bitbucket/BITBUCKET_SSH.md) for details.\n\n---\n!!!tip \"Next step - Database\"\n\n    Having created the Ingress controller continue with provisioning the next piece of prerequisite infrastructure, the [database](../../userguide/PREREQUISITES.md#provision-a-database)."
  },
  {
    "path": "docs/docs/examples/jira/.pages",
    "content": "collapse_single_pages: false\nnav:\n    - JIRA_OPENSEARCH.md\n    - ...\n"
  },
  {
    "path": "docs/docs/examples/jira/JIRA_OPENSEARCH.md",
    "content": "# Configuring OpenSearch for Jira\n\n!!!info \"Jira and Helm chart version\"\n    OpenSearch is supported in Jira 11.2 and Helm chart 2.0.10 onwards.\n\nAs Jira instances grow in size and scale, the default search engine, Lucene, may be slower to index and return search results. To address this, Jira Data Center offers an alternative search engine as an opt-in feature — OpenSearch.\n\n## Deploy OpenSearch Helm Chart with Jira\n\n!!!warning \"Support disclaimer\"\n    Atlassian does not officially support OpenSearch Helm chart that can be installed with the Jira Helm release. Should you encounter any issues with the deployment, maintenance and upgrades, reach out to the [vendor](https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch){.external}.\n    Moreover, if you intend to deploy OpenSearch to a critical Kubernetes environment, make sure you follow all the best practices, i.e. deploy a multi node cluster, use taints and tolerations, affinity rules, sufficient resources requests, have DR and backup strategies etc.\n\n## Deploy with the default settings\n\nTo deploy OpenSearch Helm chart and automatically configure Jira to use it as a search platform, set the following in your Helm values file:\n\n```yaml\nopensearch:\n  enabled: true\n```\nThis will:\n\n* auto-generate the initial OpenSearch admin password and create a Kubernetes secret with `OPENSEARCH_INITIAL_ADMIN_PASSWORD` key\n* deploy [OpenSearch Helm chart](https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch){.external} to the target namespace with the default settings: single node, 1Gi memory/1 vCPU resources requests, 10Gi storage request\n* configure Jira to use the deployed OpenSearch cluster by setting opensearch properties, which are written to `jira-config.properties` at startup. The following properties are configured: `search.platform=opensearch`, `opensearch.http.url=http://opensearch-cluster-master:9200`, `opensearch.username=admin`, and `opensearch.password`.\n\n## Override OpenSearch Helm chart values\n\nYou can configure your OpenSearch cluster and the deployment options by overriding any values that the [Helm chart](https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch/values.yaml){.external} exposes. OpenSearch values must be nested under `opensearch` stanza in your Helm values file, for example:\n\n```yaml\nopensearch:\n  singleNode: false\n  replicas: 5\n  config:\n    opensearch.yml: |\n      cluster.name: opensearch-cluster\n```\n\n## Use an existing OpenSearch secret\n\nIf you have a pre-created Kubernetes secret with the OpenSearch admin password, you can reference it instead of having the chart auto-generate one:\n\n```yaml\nopensearch:\n  enabled: true\n  credentials:\n    createSecret: false\n    existingSecretRef:\n      name: my-opensearch-secret\n```\n\nThe secret must contain a key named `OPENSEARCH_INITIAL_ADMIN_PASSWORD`.\n\n## Connect to an external OpenSearch instance\n\nIf you already have an OpenSearch cluster running outside of Kubernetes (or\nmanaged separately), you can configure Jira to use it without deploying the\nbundled OpenSearch Helm chart. OpenSearch properties are written to\n`jira-config.properties` at container startup via the\n`additionalConfigProperties` mechanism (see\n[Additional config properties](../../userguide/CONFIGURATION.md#additional-config-properties)).\n\nFirst, create a Kubernetes Secret containing the OpenSearch password:\n\n```bash\nkubectl create secret generic opensearch-credentials \\\n  --from-literal=password='<your-opensearch-password>'\n```\n\nThen reference it in your Helm values file. The `additionalEnvironmentVariables`\nentry injects the secret as an environment variable, and\n`additionalConfigPropertiesExpandEnv` expands it into the property value at\nstartup:\n\n```yaml\njira:\n  additionalEnvironmentVariables:\n    - name: MY_OPENSEARCH_PASSWORD\n      valueFrom:\n        secretKeyRef:\n          name: opensearch-credentials\n          key: password\n\n  additionalConfigProperties:\n    - \"search.platform=opensearch\"\n    - \"opensearch.http.url=http://opensearch-host:9200\"\n    - \"opensearch.username=admin\"\n\n  additionalConfigPropertiesExpandEnv:\n    - \"opensearch.password={MY_OPENSEARCH_PASSWORD}\"\n```\n\nFor the full list of available OpenSearch properties, see\n[Configuring OpenSearch for Jira](https://confluence.atlassian.com/adminjiraserver/configuring-opensearch-for-jira-1620511851.html){.external}.\n"
  },
  {
    "path": "docs/docs/examples/logging/efk/EFK.md",
    "content": "# Logging in a Kubernetes environment\n\n!!!warning Disclaimer\n    **This functionality is not officially supported.** This document explains how to enable aggregated logging in your Kubernetes cluster. There are many ways to do this and this document showcases only a few of the options.\n\n## EFK stack\n\nA common Kubernetes logging pattern is the combination of `Elasticsearch`, `Fluentd`, and `Kibana`, known as *EFK Stack*. \n\n[Fluentd](https://www.fluentd.org/){.external} is an open-source and multi-platform log processor that collects data/logs from different sources, aggregates, and forwards them to multiple destinations. It is fully compatible with Docker and Kubernetes environments. \n\n[Elasticsearch](https://www.elastic.co/){.external} is a distributed open search and analytics engine for all types of data. \n\n[Kibana](https://www.elastic.co/kibana/){.external} is an open-source front-end application that sits on top of Elasticsearch, providing search and data visualization capabilities for data indexed in Elasticsearch.\n\nThere are different methods to deploy an EFK stack. We provide two deployment methods, the first is deploying EFK locally on Kubernetes, and the second is using a managed Elasticsearch instance outside the Kubernetes cluster. \n\n## Local EFK stack\n\nThis solution deploys the EFK stack inside the Kubernetes cluster. By setting `fluentd.enabled` value to `true`, Helm installs Fluentd on each of application pods. This means that after deployment all the product pods run Fluentd, which collects all the log files and sends them to the Fluentd aggregator container. \n\nTo complete the EFK stack you need to install an Elasticsearch cluster and Kibana, and successfully forward the aggregated datalog to Elasticsearch using Fluentd, which is already installed. \n\nFollow these steps to install Elasticsearch\n\n### 1. Install Elasticsearch\n\nInstall Elasticsearch using the instructions [documented here](../../bitbucket/BITBUCKET_ELASTICSEARCH.md). Once installed make sure Elasticsearch cluster is working as expected by first port forwarding the service\n\n```shell\nkubectl port-forward svc/elasticsearch-master 9200\n```\n\nyou can then `curl` the endpoint for the current state\n\n```shell\n$ curl localhost:9200\n{\n  \"name\" : \"elasticsearch-master-0\",\n  \"cluster_name\" : \"elasticsearch\",\n  \"cluster_uuid\" : \"uNdYC-2nSdWVdzPCw9P7jQ\",\n  \"version\" : {\n       \"number\" : \"7.12.0\",\n       \"build_flavor\" : \"default\",\n       \"build_type\" : \"docker\",\n       \"build_hash\" : \"78722783c38caa25a70982b5b042074cde5d3b3a\",\n       \"build_date\" : \"2021-03-18T06:17:15.410153305Z\",\n       \"build_snapshot\" : false,\n       \"lucene_version\" : \"8.8.0\",\n       \"minimum_wire_compatibility_version\" : \"6.8.0\",\n       \"minimum_index_compatibility_version\" : \"6.0.0-beta1\"\n  },\n  \"tagline\" : \"You Know, for Search\"\n}\n```\n\n### 2. Enable Fluentd\n\nNow enable `Fluentd` and set the `hostname` for Elasticsearch in `values.yaml` as follows:\n\n```yaml\nfluentd:\n   enabled: true\n   elasticsearch:\n     hostname: elasticsearch-master\n```\nFluentd tries to parse and send the data to Elasticsearch, but since it's not installed the data is lost. At this point you have logged data in the installed Elasticsearch, and you should install Kibana to complete the EFK stack deployment:\n\n### 3. Install Kibana\nWith the same version that was used for installing [Elasticsearch](../../bitbucket/BITBUCKET_ELASTICSEARCH.md), use the `imageTag` property to install Kibana:\n\n```shell\nhelm install kibana --namespace <namespace> --set imageTag=\"7.9.3\" elastic/kibana\n```\n\nMake sure kibana is running by checking the deployment\n\n```shell\nkubectl get deployment\n```\nYou should see something like...\n```shell\nNAME                               READY   UP-TO-DATE   AVAILABLE   AGE\nhelm-operator                      1/1           1            1     23m\ningress-nginx-release-controller   1/1           1            1     22m\nkibana-kibana                      1/1           1            1     25m\n```\nThrough port-forwarding you can access Kibana via `http://localhost:5601`\n```shell\nkubectl port-forward deployment/kibana-kibana 5601\n```\n To visualise the logs you need to create an index pattern and then look at the the data in the discovery part. To create the index pattern go to `Management` → `Stack Management` and then select `Kibana` → `Index Patterns`. \n\n## Managed EFK stack\n\nIn this solution [Elasticsearch is deployed as a managed AWS service](https://aws.amazon.com/elasticsearch-service/){.external} and lives outside of the Kubernetes cluster. This approach uses [Fluentbit](https://fluentbit.io/){.external} instead of `Fluentd` for log processing.\n\n???+ info \"Fluentbit\"\n\n    `Fluentbit` is used to collect and aggregate log data inside the EKS cluster. It then sends this to an AWS Elasticsearch instance outside of the cluster.\n\n\nWhen a node inside an EKS cluster needs to call an AWS API, it needs to provide extended permissions. Amazon provides an image of `Fluentbit` that supports AWS service accounts,and using this you no longer need to follow the traditional way. All you need is to have an IAM role for the AWS service account on an EKS cluster. Using this service account, an AWS permission can be provided to the containers in any pod that use that service account. The result is that the pods on that node can call AWS APIs.\n\nYour first step is to configure IAM roles for Service Accounts (IRSA) for `Fluentbit`, to make sure you have an OIDC identity provider to use IAM roles for the service account in the cluster:\n\n```shell\neksctl utils associate-iam-oidc-provider \\\n     --cluster <cluster_name> \\\n     --approve \n```\nThen create an IAM policy to limit the permissions to connect to the Elasticsearch cluster. Before this, you need to set the following environment variables: \n\n| Environment variable  | Value                                                                              |                                                                       \n|-----------------------|------------------------------------------------------------------------------------|\n| KUBE_NAMESPACE        | The namespace for kubernetes cluster                                               |\n| ES_DOMAIN_NAME        | Elasticsearch domain name                                                          |        \n| ES_VERSION            | Elasticsearch version                                                              |\n| ES_USER               | Elasticsearch username                                                             | \n| ES_PASSWORD           | Elasticsearch password (eg. `export ES_PASSWORD=\"$(openssl rand -base64 8)_Ek1$\"`) |\n| ACCOUNT_ID            | AWS Account ID                                                                     |\n| AWS_REGION            | AWS region code                                                                    |\n\nNow create the file `fluent-bit-policy.json` to define the policy itself:\n\n```shell\ncat <<EoF > ~/environment/logging/fluent-bit-policy.json\n{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n         {\n             \"Action\": [\n                 \"es:ESHttp*\"\n             ],\n             \"Resource\": \"arn:aws:es:${AWS_REGION}:${ACCOUNT_ID}:domain/${ES_DOMAIN_NAME}\",\n             \"Effect\": \"Allow\"\n         }\n    ]\n}\nEoF\n```\nNext initialize the policy:\n```shell\naws iam create-policy  \\\n     --policy-name fluent-bit-policy \\\n     --policy-document file://~/environment/logging/fluent-bit-policy.json\n```\nCreate an IAM role for the service account:\n```shell\neksctl create iamserviceaccount \\\n     --name fluent-bit \\\n     --namespace dcd \\\n     --cluster dcd-ap-southeast-2 \\\n     --attach-policy-arn \"arn:aws:iam::${ACCOUNT_ID}:policy/fluent-bit-policy\" \\\n     --approve \\\n     --override-existing-serviceaccounts\n```\nConfirm that the service account with an Amazon Resource Name (ARN) of the IAM role is annotated:\n```shell\nkubectl describe serviceaccount fluent-bit\n```\nLook for output similar to:\n```yaml\nName: fluent-bit\nNamespace:  elastic\nLabels: <none>\nAnnotations: eks.amazonaws.com/role-arn: arn:aws:iam::000000000000:role/eksctl-your-cluster-name-addon-iamserviceac-Role1-0A0A0A0A0A0A0\nImage pull secrets: <none>\nMountable secrets:  fluent-bit-token-pgpss\nTokens:  fluent-bit-token-pgpss\nEvents:  <none>\n```\nNow define the Elasticsearch domain\n\n!!!info \"\"\n\n    This configuration will provision a public Elasticsearch cluster with Fine-Grained Access Control enabled and a built-in user database:\n\n```shell\ncat <<EOF> ~/environment/logging/elasticsearch_domain.json\n{\n    \"DomainName\": ${ES_DOMAIN_NAME},\n    \"ElasticsearchVersion\": ${ES_VERSION},\n    \"ElasticsearchClusterConfig\": {\n         \"InstanceType\": \"r5.large.elasticsearch\",\n         \"InstanceCount\": 1,\n             \"DedicatedMasterEnabled\": false,\n             \"ZoneAwarenessEnabled\": false,\n             \"WarmEnabled\": false\n         },\n    \"EBSOptions\": {\n         \"EBSEnabled\": true,\n         \"VolumeType\": \"gp2\",\n         \"VolumeSize\": 100\n    },\n    \"AccessPolicies\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"*\\\"},\\\"Action\\\":\\\"es:ESHttp*\\\",\\\"Resource\\\":\\\"arn:aws:es:${AWS_REGION}:${ACCOUNT_ID}:domain/${ES_DOMAIN_NAME}/*\\\"}]}\",\n    \"SnapshotOptions\": {},\n    \"CognitoOptions\": {\n         \"Enabled\": false\n    },\n    \"EncryptionAtRestOptions\": {\n         \"Enabled\": true\n    },\n    \"NodeToNodeEncryptionOptions\": {\n         \"Enabled\": true\n    },\n    \"DomainEndpointOptions\": {\n         \"EnforceHTTPS\": true,\n         \"TLSSecurityPolicy\": \"Policy-Min-TLS-1-0-2019-07\"\n    },\n    \"AdvancedSecurityOptions\": {\n         \"Enabled\": true,\n         \"InternalUserDatabaseEnabled\": true,\n         \"MasterUserOptions\": {\n             \"MasterUserName\": ${ES_USER},\n             \"MasterUserPassword\": ${ES_PASSWORD}\n         }\n    }\n}\nEOF\n```\nInitialize the Elasticsearch domain using the `elasticsearch_domain.json`\n\n```shell\naws es create-elasticsearch-domain \\\n   --cli-input-json   file://~/environment/logging/elasticsearch_domain.json\n```\n\n!!!info \"\"\n    \n    It takes a while for Elasticsearch clusters to change to an active state. Check the AWS Console to see the status of the cluster, and continue to the next step when the cluster is ready.\n\nAt this point you need to map roles to users in order to set fine-grained access control, because without this mapping all the requests to the cluster will result in permission errors. You should add the `Fluentbit` ARN as a backend role to the `all-access` role, which uses the Elasticsearch APIs. To find the `fluentbit` ARN run the following command and export the value of `ARN Role` into the `FLUENTBIT_ROLE` environment variable:\n```shell\neksctl get iamserviceaccount --cluster dcd-ap-southeast-2\n```\nThe output of this command should look similar to this:\n```shell\nNAMESPACE    NAME                ROLE ARN\nkube-system cluster-autoscaler   arn:aws:iam::887464544476:role/eksctl-dcd-ap-southeast-2-addon-iamserviceac-Role1-1RSRFV0BQVE3E\n```\nTake note of the `ROLE ARN` and export it as the environment variable `FLUENTBIT_ROLE`\n```shell\nexport FLUENTBIT_ROLE=arn:aws:iam::887464544476:role/eksctl-dcd-ap-southeast-2-addon-iamserviceac-Role1-1RSRFV0BQVE3E\n```\nRetrieve the Elasticsearch endpoint and update the internal database:\n```shell\nexport ES_ENDPOINT=$(aws es describe-elasticsearch-domain --domain-name ngh-search-domain --output text --query \"DomainStatus.Endpoint\")\n```\n\n```shell\ncurl -sS -u \"${ES_DOMAIN_USER}:${ES_DOMAIN_PASSWORD}\" \\\n   -X PATCH \\\n   https://${ES_ENDPOINT}/_opendistro/_security/api/rolesmapping/all_access?pretty \\\n   -H 'Content-Type: application/json' \\\n   -d'\n[\n   {\n     \"op\": \"add\", \"path\": \"/backend_roles\", \"value\": [\"'${FLUENTBIT_ROLE}'\"]\n   }\n]\n'\n```\nFinally, it is time to deploy the `Fluentbit` DaemonSet:\n```shell\nkubectl apply -f docs/docs/examples/logging/efk/managed_es/fluentbit.yaml\n```\nAfter a few minutes all pods should be up and in running status. you can open Kibana to visualise the logs. The endpoint for Kibana can be found in the Elasticsearch output tab in the AWS console, or you can run the following command:\n```shell\necho \"Kibana URL: https://${ES_ENDPOINT}/_plugin/kibana/\" \nKibana URL: https://search-domain-uehlb3kxledxykchwexee.ap-southeast-2.es.amazonaws.com/_plugin/kibana/\n```\n\nThe user and password for Kibana are the same as the master user credential that is set in Elasticsearch in the provisioning stage. Open Kibana in a browser and after login, create an index pattern and see the report in the `Discover` page. \n"
  },
  {
    "path": "docs/docs/examples/logging/efk/local_es/elasticsearch.yaml",
    "content": "---\nclusterName: \"elasticsearch\"\nnodeGroup: \"master\"\n\n# The service that non master groups will try to connect to when joining the cluster\n# This should be set to clusterName + \"-\" + nodeGroup for your master group\nmasterService: \"\"\n\n# Elasticsearch roles that will be applied to this nodeGroup\n# These will be set as environment variables. E.g. node.master=true\nroles:\n  master: \"true\"\n  ingest: \"true\"\n  data: \"true\"\n\nreplicas: 3\nminimumMasterNodes: 2\n\nesMajorVersion: \"\"\n\n# Allows you to add any config files in /usr/share/elasticsearch/config/\n# such as elasticsearch.yml and log4j2.properties\nesConfig: {}\n#  elasticsearch.yml: |\n#    key:\n#      nestedkey: value\n#  log4j2.properties: |\n#    key = value\n\n# Extra environment variables to append to this nodeGroup\n# This will be appended to the current 'env:' key. You can use any of the kubernetes env\n# syntax here\nextraEnvs: []\n#  - name: MY_ENVIRONMENT_VAR\n#    value: the_value_goes_here\n\n# A list of secrets and their paths to mount inside the pod\n# This is useful for mounting certificates for security and for mounting\n# the X-Pack license\nsecretMounts: []\n#  - name: elastic-certificates\n#    secretName: elastic-certificates\n#    path: /usr/share/elasticsearch/config/certs\n\nimage: \"docker.elastic.co/elasticsearch/elasticsearch\"\nimageTag: \"7.1.2\"\nimagePullPolicy: \"IfNotPresent\"\n\npodAnnotations: {}\n# iam.amazonaws.com/role: es-cluster\n\n# additionals labels\nlabels: {}\n\nesJavaOpts: \"-Xmx1g -Xms1g\"\n\nresources:\n  requests:\n    cpu: \"100m\"\n    memory: \"1000Mi\"\n  limits:\n    cpu: \"100m\"\n    memory: \"1000Mi\"\n\ninitResources: {}\n  # limits:\n  #   cpu: \"25m\"\n  #   # memory: \"128Mi\"\n  # requests:\n  #   cpu: \"25m\"\n#   memory: \"128Mi\"\n\nsidecarResources: {}\n  # limits:\n  #   cpu: \"25m\"\n  #   # memory: \"128Mi\"\n  # requests:\n  #   cpu: \"25m\"\n#   memory: \"128Mi\"\n\nnetworkHost: \"0.0.0.0\"\n\nvolumeClaimTemplate:\n  accessModes: [ \"ReadWriteOnce\" ]\n  resources:\n    requests:\n      storage: 10Gi\n\nrbac:\n  create: false\n  serviceAccountName: \"\"\n\npodSecurityPolicy:\n  create: false\n  name: \"\"\n  spec:\n    privileged: true\n    fsGroup:\n      rule: RunAsAny\n    runAsUser:\n      rule: RunAsAny\n    seLinux:\n      rule: RunAsAny\n    supplementalGroups:\n      rule: RunAsAny\n    volumes:\n      - secret\n      - configMap\n      - persistentVolumeClaim\n\npersistence:\n  enabled: true\n  annotations: {}\n\nextraVolumes: \"\"\n  # - name: extras\n#   emptyDir: {}\n\nextraVolumeMounts: \"\"\n  # - name: extras\n  #   mountPath: /usr/share/extras\n#   readOnly: true\n\nextraContainers: \"\"\n  # - name: do-something\n  #   image: busybox\n#   command: ['do', 'something']\n\nextraInitContainers: \"\"\n  # - name: do-something\n  #   image: busybox\n#   command: ['do', 'something']\n\n# This is the PriorityClass settings as defined in\n# https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\npriorityClassName: \"\"\n\n# By default this will make sure two pods don't end up on the same node\n# Changing this to a region would allow you to spread pods across regions\nantiAffinityTopologyKey: \"kubernetes.io/hostname\"\n\n# Hard means that by default pods will only be scheduled if there are enough nodes for them\n# and that they will never end up on the same node. Setting this to soft will do this \"best effort\"\n#antiAffinity: \"hard\"\nantiAffinity: \"soft\"\n\n\n# This is the node affinity settings as defined in\n# https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity-beta-feature\nnodeAffinity: {}\n\n# The default is to deploy all pods serially. By setting this to parallel all pods are started at\n# the same time when bootstrapping the cluster\npodManagementPolicy: \"Parallel\"\n\nprotocol: http\nhttpPort: 9200\ntransportPort: 9300\n\nservice:\n  labels: {}\n  labelsHeadless: {}\n  type: ClusterIP\n  nodePort: \"\"\n  annotations: {}\n  httpPortName: http\n  transportPortName: transport\n  loadBalancerSourceRanges: []\n\nupdateStrategy: RollingUpdate\n\n# This is the max unavailable setting for the pod disruption budget\n# The default value of 1 will make sure that kubernetes won't allow more than 1\n# of your pods to be unavailable during maintenance\nmaxUnavailable: 1\n\npodSecurityContext:\n  fsGroup: 1000\n  runAsUser: 1000\n\n# The following value is deprecated,\n# please use the above podSecurityContext.fsGroup instead\nfsGroup: \"\"\n\nsecurityContext:\n  capabilities:\n    drop:\n      - ALL\n  # readOnlyRootFilesystem: true\n  runAsNonRoot: true\n  runAsUser: 1000\n\n# How long to wait for elasticsearch to stop gracefully\nterminationGracePeriod: 120\n\nsysctlVmMaxMapCount: 262144\n\nreadinessProbe:\n  failureThreshold: 3\n  initialDelaySeconds: 60\n  periodSeconds: 30\n  successThreshold: 3\n  timeoutSeconds: 15\n\n# https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html#request-params wait_for_status\nclusterHealthCheckParams: \"wait_for_status=green&timeout=1s\"\n\n## Use an alternate scheduler.\n## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n##\nschedulerName: \"\"\n\nimagePullSecrets: []\nnodeSelector: {}\ntolerations: []\n\n# Enabling this will publically expose your Elasticsearch instance.\n# Only enable this if you have security enabled on your cluster\ningress:\n  enabled: false\n  annotations: {}\n    # kubernetes.io/ingress.class: nginx\n  # kubernetes.io/tls-acme: \"true\"\n  path: /\n  hosts:\n    - chart-example.local\n  tls: []\n  #  - secretName: chart-example-tls\n  #    hosts:\n  #      - chart-example.local\n\nnameOverride: \"\"\nfullnameOverride: \"\"\n\n# https://github.com/elastic/helm-charts/issues/63\nmasterTerminationFix: false\n\nlifecycle: {}\n  # preStop:\n  #   exec:\n  #     command: [\"/bin/sh\", \"-c\", \"echo Hello from the postStart handler > /usr/share/message\"]\n  # postStart:\n  #   exec:\n  #     command:\n  #       - bash\n  #       - -c\n  #       - |\n  #         #!/bin/bash\n  #         # Add a template to adjust number of shards/replicas\n  #         TEMPLATE_NAME=my_template\n  #         INDEX_PATTERN=\"logstash-*\"\n  #         SHARD_COUNT=8\n  #         REPLICA_COUNT=1\n  #         ES_URL=http://localhost:9200\n  #         while [[ \"$(curl -s -o /dev/null -w '%{http_code}\\n' $ES_URL)\" != \"200\" ]]; do sleep 1; done\n#         curl -XPUT \"$ES_URL/_template/$TEMPLATE_NAME\" -H 'Content-Type: application/json' -d'{\"index_patterns\":['\\\"\"$INDEX_PATTERN\"\\\"'],\"settings\":{\"number_of_shards\":'$SHARD_COUNT',\"number_of_replicas\":'$REPLICA_COUNT'}}'\n\nsysctlInitContainer:\n  enabled: true\n\nkeystore: []\n"
  },
  {
    "path": "docs/docs/examples/logging/efk/managed_es/fluentbit.yaml",
    "content": "---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: fluent-bit-read\nrules:\n- apiGroups: [\"\"]\n  resources:\n  - namespaces\n  - pods\n  verbs: [\"get\", \"list\", \"watch\"]\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: fluent-bit-read\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: fluent-bit-read\nsubjects:\n- kind: ServiceAccount\n  name: fluent-bit\n  namespace: ${KUBE_NAMESPACE}\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: fluent-bit-config\n  namespace: ${KUBE_NAMESPACE}\n  labels:\n    k8s-app: fluent-bit\ndata:\n  # Configuration files: server, input, filters and output\n  # ======================================================\n  fluent-bit.conf: |\n    [SERVICE]\n        Flush         1\n        Log_Level     info\n        Daemon        off\n        Parsers_File  parsers.conf\n        HTTP_Server   On\n        HTTP_Listen   0.0.0.0\n        HTTP_Port     2020\n\n    @INCLUDE input-kubernetes.conf\n    @INCLUDE filter-kubernetes.conf\n    @INCLUDE output-elasticsearch.conf\n\n  input-kubernetes.conf: |\n    [INPUT]\n        Name              tail\n        Tag               kube.*\n        Path              /var/log/containers/*.log\n        Parser            docker\n        DB                /var/log/flb_kube.db\n        Mem_Buf_Limit     50MB\n        Skip_Long_Lines   On\n        Refresh_Interval  10\n\n  filter-kubernetes.conf: |\n    [FILTER]\n        Name                kubernetes\n        Match               kube.*\n        Kube_URL            https://kubernetes.default.svc:443\n        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token\n        Kube_Tag_Prefix     kube.var.log.containers.\n        Merge_Log           On\n        Merge_Log_Key       log_processed\n        K8S-Logging.Parser  On\n        K8S-Logging.Exclude Off\n\n  output-elasticsearch.conf: |\n    [OUTPUT]\n        Name            es\n        Match           *\n        Host            ${ES_HOST}\n        Port            ${ES_PORT}\n        TLS             On\n        AWS_Auth        On\n        AWS_Region      ${AW_REGION}\n        Retry_Limit     6\n\n  parsers.conf: |\n    [PARSER]\n        Name   bitbucket_log\n        Format regex\n        Regex  ^(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}) (?<message>.*)$\n        Time_Key time\n        Time_Format %d/%b/%Y:%H:%M:%S %z\n\n    [PARSER]\n        Name   apache\n        Format regex\n        Regex  ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \\[(?<time>[^\\]]*)\\] \"(?<method>\\S+)(?: +(?<path>[^\\\"]*?)(?: +\\S*)?)?\" (?<code>[^ ]*) (?<size>[^ ]*)(?: \"(?<referer>[^\\\"]*)\" \"(?<agent>[^\\\"]*)\")?$\n        Time_Key time\n        Time_Format %d/%b/%Y:%H:%M:%S %z\n\n    [PARSER]\n        Name   apache2\n        Format regex\n        Regex  ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \\[(?<time>[^\\]]*)\\] \"(?<method>\\S+)(?: +(?<path>[^ ]*) +\\S*)?\" (?<code>[^ ]*) (?<size>[^ ]*)(?: \"(?<referer>[^\\\"]*)\" \"(?<agent>[^\\\"]*)\")?$\n        Time_Key time\n        Time_Format %d/%b/%Y:%H:%M:%S %z\n\n    [PARSER]\n        Name   apache_error\n        Format regex\n        Regex  ^\\[[^ ]* (?<time>[^\\]]*)\\] \\[(?<level>[^\\]]*)\\](?: \\[pid (?<pid>[^\\]]*)\\])?( \\[client (?<client>[^\\]]*)\\])? (?<message>.*)$\n\n    [PARSER]\n        Name   nginx\n        Format regex\n        Regex ^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \\[(?<time>[^\\]]*)\\] \"(?<method>\\S+)(?: +(?<path>[^\\\"]*?)(?: +\\S*)?)?\" (?<code>[^ ]*) (?<size>[^ ]*)(?: \"(?<referer>[^\\\"]*)\" \"(?<agent>[^\\\"]*)\")?$\n        Time_Key time\n        Time_Format %d/%b/%Y:%H:%M:%S %z\n\n    [PARSER]\n        Name   json\n        Format json\n        Time_Key time\n        Time_Format %d/%b/%Y:%H:%M:%S %z\n\n    [PARSER]\n        Name        docker\n        Format      json\n        Time_Key    time\n        Time_Format %Y-%m-%dT%H:%M:%S.%L\n        Time_Keep   On\n\n    [PARSER]\n        Name        syslog\n        Format      regex\n        Regex       ^\\<(?<pri>[0-9]+)\\>(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\\/\\.\\-]*)(?:\\[(?<pid>[0-9]+)\\])?(?:[^\\:]*\\:)? *(?<message>.*)$\n        Time_Key    time\n        Time_Format %b %d %H:%M:%S\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: fluent-bit\n  namespace: ${KUBE_NAMESPACE}\n  labels:\n    k8s-app: fluent-bit-logging\n    version: v1\n    kubernetes.io/cluster-service: \"true\"\n\nspec:\n  selector:\n    matchLabels:\n      k8s-app: fluent-bit-logging\n  template:\n    metadata:\n      labels:\n        k8s-app: fluent-bit-logging\n        version: v1\n        kubernetes.io/cluster-service: \"true\"\n      annotations:\n        prometheus.io/scrape: \"true\"\n        prometheus.io/port: \"2020\"\n        prometheus.io/path: /api/v1/metrics/prometheus\n    spec:\n      containers:\n      - name: fluent-bit\n        image: amazon/aws-for-fluent-bit:2.5.0\n        imagePullPolicy: Always\n        ports:\n          - containerPort: 2020\n        volumeMounts:\n        - name: varlog\n          mountPath: /var/log\n        - name: varlibdockercontainers\n          mountPath: /var/lib/docker/containers\n          readOnly: true\n        - name: fluent-bit-config\n          mountPath: /fluent-bit/etc/\n      terminationGracePeriodSeconds: 10\n      volumes:\n      - name: varlog\n        hostPath:\n          path: /var/log\n      - name: varlibdockercontainers\n        hostPath:\n          path: /var/lib/docker/containers\n      - name: fluent-bit-config\n        configMap:\n          name: fluent-bit-config\n      serviceAccountName: fluent-bit\n"
  },
  {
    "path": "docs/docs/examples/storage/.pages",
    "content": "collapse_single_pages: false\nnav:\n    - STORAGE.md\n    - AWS: aws\n    - NFS: nfs\n    - Additional Storage: additional storage\n    - ..."
  },
  {
    "path": "docs/docs/examples/storage/STORAGE.md",
    "content": "# Shared storage\nAtlassian's Data Center products require a shared storage solution to effectively operate in multi-node environment. The specifics of how this shared storage is created is site-dependent, we do however provide examples on how shared storage can be created below.\n\n!!!tip \"In case you are not using [Bitbucket Mesh](../bitbucket/BITBUCKET_MESH.md) nodes, Bitbucket requires a **dedicated NFS server** providing persistence for a shared home due to requirements for high IO throughput. See [NFS](nfs/NFS.md) example for details\"\n\n## AWS EFS\nJira, Confluence and Crowd can all be configured with an EFS-backed shared solution. For details on how this can be set up, see the [AWS EFS example](aws/SHARED_STORAGE.md). \n## NFS\nFor details on creating shared storage for Bitbucket, see the [NFS example](nfs/NFS.md).\n"
  },
  {
    "path": "docs/docs/examples/storage/additional storage/ADDTIONAL_STORAGE.md",
    "content": "# Additional Storage\nYou can use [volumeClaimTemplates](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#volume-claim-templates) to have additional storage. This is useful when your enviroment uses several types of storage. \n\nE.g. If you want to deploy Confluence on NFS, but you want to use BlockStorage (or everything else instead of NFS) for the lucene-index, you can create extra volumn for BlockStorage by defining `volumeClaimTemplates` in `values.yaml` then mount the volume in `additionalVolumeMounts`.\n```yaml\nconfluence:\n  additionalVolumeClaimTemplates:\n    - name: myadditionalvolumeclaim\n      storageClassName: gp2\n      resources:\n        requests:\n          storage: 1Gi\n  additionalVolumeMounts:\n    - mountPath: /var/atlassian/application-data/confluence/index\n      name: myadditionalvolumeclaim\n```"
  },
  {
    "path": "docs/docs/examples/storage/aws/LOCAL_STORAGE.md",
    "content": "# Local storage\nThis file provides examples on how a Kubernetes cluster and helm deployment can be configured to utilize AWS EBS backed volumes.\n\n## Dynamic provisioning\nDue to the ephemeral nature of Kubernetes pods we advise dynamic provisioning be used for creating and consuming EBS volume(s).\n\n### Prerequisites\nEnsure the [EBS](https://github.com/kubernetes-sigs/aws-ebs-csi-driver){.external} CSI driver is installed within the k8s cluster, you can confirm this by running:  \n\n```shell\nkubectl get csidriver\n```\nthe output of the above command should include the named driver `ebs.csi.aws.com` for example:\n```shell\nNAME              ATTACHREQUIRED   PODINFOONMOUNT   MODES        AGE\nebs.csi.aws.com   true             false            Persistent   5d1h\n```\nIf not present the EBS driver can be installed using the following instructions [here](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html){.external}.\n\n\n### Provisioning\n\n1. Create a Storage Class\n2. Update `values.yaml` to utilise Storage Class\n\n#### 1. Create Storage Class\n\n```yaml\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n  name: ebs-sc\nprovisioner: ebs.csi.aws.com\nvolumeBindingMode: WaitForFirstConsumer\n```\n\n#### 2. Update values.yaml\n\nUpdate the `localHome` `storageClassName` value within `values.yaml` to the name of the Storage Class created in step 1 above\n\n```yaml\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n      storageClassName: \"ebs-sc\"\n```\n\n---\n\n# Resources\nSome useful resources on provisioning local storage with the AWS CSI Driver\n\n- [EBS CSI driver - GitHub Repo](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)\n- [Official Amazon EBS CSI driver documentation](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)\n---\n\n!!!tip \"Product installation\" \n\n    Creating the local home volume is the final step in provisioning the [required infrastructure](../../../userguide/PREREQUISITES.md). You can now move onto the next step, [Installation](../../../userguide/INSTALLATION.md).\n\n"
  },
  {
    "path": "docs/docs/examples/storage/aws/SHARED_STORAGE.md",
    "content": "# Shared storage\nThis file provides examples on how a Kubernetes cluster and helm deployment can be configured to utilize an AWS EFS backed filesystem.\n\n## Static provisioning\nAn example detailing how an existing EFS filesystem can be created and consumed using static provisioning.\n\n## Prerequisites\n1. [EFS](https://github.com/kubernetes-sigs/aws-efs-csi-driver){.external} CSI driver is [installed](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html){.external} within the k8s cluster.\n2. A physical EFS filesystem has been [provisioned](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html#efs-create-filesystem){.external}\n\nAdditional details on static EFS provisioning can be found [here](https://github.com/kubernetes-sigs/aws-efs-csi-driver/tree/master/examples/kubernetes/static_provisioning){.external}\n\nYou can confirm that the EFS CSI driver has been installed by running:\n\n```shell\nkubectl get csidriver\n```\nthe output of the above command should include the named driver `efs.csi.aws.com` for example:\n```shell\nNAME              ATTACHREQUIRED   PODINFOONMOUNT   MODES        AGE\nefs.csi.aws.com   false            false            Persistent   5d3h\n```\n\n### Provisioning\n1. Create a Persistent Volume\n2. Create a Persistent Volume Claim\n3. Update `values.yaml` to utilise Persistent Volume Claim\n\n#### 1. Create Persistent Volume\nCreate a persistent volume for the pre-provisioned EFS filesystem by providing the `<efs-id>`. The EFS id can be identified using the CLI command below with the appropriate region\n\n```yaml\naws efs describe-file-systems --query \"FileSystems[*].FileSystemId\" --region ap-southeast-2\n```\n\n```yaml\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: my-shared-vol-pv\nspec:\n  capacity:\n    storage: 1Gi\n  volumeMode: Filesystem\n  accessModes:\n    - ReadWriteMany\n  storageClassName: efs-pv\n  persistentVolumeReclaimPolicy: Retain\n  mountOptions:\n    - rw\n    - lookupcache=pos\n    - noatime\n    - intr\n    - _netdev\n  csi:\n    driver: efs.csi.aws.com\n    volumeHandle: <efs-id>\n```\n\n#### 2. Create Persistent Volume Claim\n```yaml\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: my-shared-vol-pvc\nspec:\n  accessModes:\n    - ReadWriteMany\n  storageClassName: efs-pv\n  volumeMode: Filesystem\n  volumeName: my-shared-vol-pv\n  resources:\n    requests:\n      storage: 1Gi\n```\n\n#### 3. Update values.yaml\nUpdate the `sharedHome` `claimName` value within `values.yaml` to the name of the Persistent Volume Claim created in step 2 above\n\n```yaml\nvolumes:\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: \"my-shared-vol-pvc\"\n```\n\n# Resources\nSome useful resources on provisioning shared storage with the AWS CSI Driver:\n\n- [Amazon EFS CSI driver]( https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html){.external}\n- [Introducing Amazon EFS CSI dynamic provisioning](https://aws.amazon.com/blogs/containers/introducing-efs-csi-dynamic-provisioning/){.external}\n\n---\n!!!tip \"Next step - Local storage\"\n\n    Having created the shared home volume continue with provisioning the next piece of prerequisite infrastructure, [local storage](../../../userguide/PREREQUISITES.md#configure-local-home-volume).\n"
  },
  {
    "path": "docs/docs/examples/storage/aws/s3/CONFLUENCE.md",
    "content": "# AWS S3 Attachments Storage\n\nSince 8.1.0 Confluence supports storing attachments in AWS S3. To enable this feature, update the image `tag` to `8.1.0` and define bucket name and AWS region in `confluence.s3AttachmentsStorage`, for example:\n\n```yaml\ntag: 8.1.0\nconfluence:\n  s3AttachmentsStorage:\n    bucketName: <your-confluence-bucket-name>\n    bucketRegion: us-east-1\n```\n\n# AWS Authentication\n\nYou will find details on available authentication methods in [Credential Provider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html).\n\nMake sure `ATL_UNSET_SENSITIVE_ENV_VARS` is set to false if you choose to define `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` in `confluence.additionalEnvironmentVariables`:\n\n```yaml\nadditionalEnvironmentVariables:\n  - name: AWS_ACCESS_KEY_ID\n    valueFrom:\n      secretKeyRef:\n        name: aws-creds\n        key: AWS_ACCESS_KEY_ID\n  - name: AWS_SECRET_ACCESS_KEY\n    valueFrom:\n      secretKeyRef:\n        name: aws-creds\n        key: AWS_SECRET_ACCESS_KEY\n  - name: ATL_UNSET_SENSITIVE_ENV_VARS\n    value: \"false\"\n```\n\n## EKS IRSA\n\nIf Confluence is deployed to AWS EKS, it is strongly recommended to use [IAM roles for service accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).\n\nThe Confluence service account will be automatically annotated with a role `ARN` if it is defined, for example:\n\n```yaml\nserviceAccount:\n  eksIrsa:\n    roleArn: arn:aws:iam::37583956:role/confluence-s3-role\n```\n\nBelow is an example policy, providing appropriate S3 access to Confluence, that needs to be attached to the role:\n\n```json\n{\n    \"Statement\": [\n        {\n            \"Action\": [\n                \"s3:PutObject\",\n                \"s3:ListBucket\",\n                \"s3:GetObject\",\n                \"s3:DeleteObject\"\n            ],\n            \"Effect\": \"Allow\",\n            \"Resource\": [\n                \"arn:aws:s3:::<your-confluence-bucket-name>/*\",\n                \"arn:aws:s3:::<your-confluence-bucket-name>\"\n            ],\n            \"Sid\": \"\"\n        }\n    ],\n    \"Version\": \"2012-10-17\"\n}\n```\n"
  },
  {
    "path": "docs/docs/examples/storage/aws/s3/JIRA.md",
    "content": "# AWS S3 Avatars Storage\n\nSince 9.9.0 Jira supports storing avatars in AWS S3. To enable this feature, update the image `tag` to `9.9.0` and define bucket name and AWS region in `jira.s3Storage.avatars`, for example:\n\n```yaml\ntag: 9.9.0\njira:\n  s3Storage:\n    avatars:\n      bucketName: <your-jira-bucket-name>\n      bucketRegion: us-east-1\n```\n\n# AWS Authentication\n\nYou will find details on available authentication methods in [Credential Provider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html).\n\nMake sure `ATL_UNSET_SENSITIVE_ENV_VARS` is set to false if you choose to define `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` in `jira.additionalEnvironmentVariables`:\n\n```yaml\nadditionalEnvironmentVariables:\n  - name: AWS_ACCESS_KEY_ID\n    valueFrom:\n      secretKeyRef:\n        name: aws-creds\n        key: AWS_ACCESS_KEY_ID\n  - name: AWS_SECRET_ACCESS_KEY\n    valueFrom:\n      secretKeyRef:\n        name: aws-creds\n        key: AWS_SECRET_ACCESS_KEY\n  - name: ATL_UNSET_SENSITIVE_ENV_VARS\n    value: \"false\"\n```\n\n## EKS IRSA\n\nIf Jira is deployed to AWS EKS, it is strongly recommended to use [IAM roles for service accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).\n\nThe Jira service account will be automatically annotated with a role `ARN` if it is defined, for example:\n\n```yaml\nserviceAccount:\n  eksIrsa:\n    roleArn: arn:aws:iam::37583956:role/jira-s3-role\n```\n\nBelow is an example policy, providing appropriate S3 access to Jira, that needs to be attached to the role:\n\n```json\n{\n    \"Statement\": [\n        {\n            \"Action\": [\n                \"s3:PutObject\",\n                \"s3:ListBucket\",\n                \"s3:GetObject\",\n                \"s3:DeleteObject\"\n            ],\n            \"Effect\": \"Allow\",\n            \"Resource\": [\n                \"arn:aws:s3:::<your-jira-bucket-name>/*\",\n                \"arn:aws:s3:::<your-jira-bucket-name>\"\n            ],\n            \"Sid\": \"\"\n        }\n    ],\n    \"Version\": \"2012-10-17\"\n}\n```\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/NFS.md",
    "content": "# NFS server for Bitbucket\n!!!warning \"Disclaimer\"\n\n    **The NFS helm chart is not officially supported. It should not be used for production deployments!**\n    \n    The included NFS example is provided as is and should be used as reference a only. Before you proceed we highly recommend that you understand your specific deployment needs and tailor your solution to them.\n\n## Bitbucket Data Center and NFS\n\nWhen deploying Bitbucket, you have two options how to store git data. You can deploy [Bitbucket Mesh nodes](../bitbucket/BITBUCKET_MESH.md)\nor you can use shared home for your Bitbucket Data Center instance.\n\nDue to the high performance requirements on IO operations, it is critical that you adhere to the requirements in [Bitbucket Supported platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms).\n \n## NFS provisioning\nThe NFS server can be provisioned manually or by using the supplied Helm chart. Details for both approaches can be found below.\n\n!!!tip \"Pod affinity\"\n\n    To reduce the IO latency between the NFS server and Bitbucket Pod(s) it is  highly recommend to keep them in close proximity. To achieve this, you can use [standard Kubernetes affinity rules](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity){.external}. The `affinity` stanza within `values.yaml` can be updated to take advantage of this behaviour i.e.\n\n### Manual\nFor information on setting up Bitbucket Data Center's shared file server, see [Provision your shared file system](https://confluence.atlassian.com/bitbucketserver/install-bitbucket-data-center-872139817.html#InstallBitbucketDataCenter-nfs){.external}. \nThis section contains the requirements and recommendations for setting up NFS for Bitbucket Data Center.\n\n!!!tip \"NFS Server sizing\"\n\n    Ensure the NFS server's size is appropriate for the needs of the Bitbucket instance. See [capacity recommendations](https://confluence.atlassian.com/bitbucketserver/recommendations-for-running-bitbucket-in-aws-776640282.html){.external} for details.\n\n### Helm\n!!!warning \"Disclaimer\"\n\n    **This Helm chart is not officially supported! It should not be used for production deployments!**\n\n#### Installation\nCreate a namespace for the NFS\n```shell\nkubectl create namespace nfs\n```\nClone this repository and from the sub-directory, `data-center-helm-charts/docs/docs/examples/storage/nfs`, run the following command:\n```shell\nhelm install nfs-server nfs-server-example --namespace nfs\n```\n\n#### Uninstall\n```shell\nhelm uninstall nfs-server --namespace nfs\n```\n\n## Update `values.yaml`\nGet the IP address of the NFS service (`CLUSTER-IP`) by running the following command\n```shell\nkubectl get service --namespace nfs -o jsonpath='{.items[0].spec.clusterIP}'\n```\n!!!info \"NFS directory share\"\n\n    The NFS Helm chart creates and exposes the directory share `/srv/nfs`. This will be required when configuring `values.yaml` \nThe approach below shows how a `persistentVolume` and corresponding `peristentVolumeClaim` can be dynamically created for the provisioned NFS. Using the NFS IP and directory share, (see above) update the `values.yaml` appropriately:\n```yaml\nvolumes:\n  sharedHome:\n    persistentVolume:\n      create: true\n      nfs:\n        server: \"10.100.197.23\" # IP address of the NFS server \n        path: \"/srv/nfs\" # Directory share of NFS\n    persistentVolumeClaim:\n      create: true\n      storageClassName: \"\"\n```\nYou can of course manually provision your own `persistentVolume` and corresponding claim (as opposed to the dynamic approach described above) for the NFS server. In this case update the `values.yaml` to make use of them via the `customVolume` stanza, `sharedHome.persistentVolume.create` and `sharedHome.persistentVolumeClaim.create` should also both be set to `false`.\n```yaml\nsharedHome:\n  persistentVolume:\n    create: false\n  persistentVolumeClaim:\n    create: false\n  customVolume: \n    persistentVolumeClaim:\n      claimName: \"custom-nfs-server-claim\"\n```\n---\n!!!tip \"Next step - Local storage\"\n\n    Having created the shared home NFS continue with provisioning the next piece of prerequisite infrastructure, [local storage](../../../userguide/PREREQUISITES.md#configure-local-home-volume).\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/Chart.yaml",
    "content": "apiVersion: v2\nname: nfs-server-example\ndescription: A NFS server example using NFS Ganesha. Do not use in production.\n\ntype: application\nversion: 0.1.0\nappVersion: \"2.0\"\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/NOTES.txt",
    "content": "{{ .Chart.Name }} installed.\n\nDo not use in production, this is for testing purposes only.\n\n\nUninstalling this release will not clean up the PhysicalVolume that the StatefulSet creates, you\ncan do so by executing:\n\n    kubectl delete pvc -l app.kubernetes.io/instance={{ .Release.Name }}\n\nRun `helm test` to verify the server works correctly and to run a performance test.\n\nThe performance test can take a significant amount of time. Specify a custom `--timeout` value\nfor the `helm test` command to make sure it can finish running.\n\n    helm test {{ .Release.Name }} --timeout=30m\n\nCheck the test results with:\n\n    kubectl logs {{ include \"nfs-server.fullname\" . }}-perf-nfs -f\n\nSee this page for more information:\nhttps://confluence.atlassian.com/bitbucketserverkb/test-nfs-disk-access-speed-for-bitbucket-data-center-and-git-operations-1044804304.html\n\nTo clean up after the test, run:\n\n    kubectl delete pv,pvc,all -l app.kubernetes.io/instance={{ .Release.Name }},app.kubernetes.io/component=test\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/_helpers.tpl",
    "content": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"nfs-server.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\nIf release name contains chart name it will be used as a full name.\n*/}}\n{{- define \"nfs-server.fullname\" -}}\n{{- if .Values.fullnameOverride }}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- $name := default .Chart.Name .Values.nameOverride }}\n{{- if contains $name .Release.Name }}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"nfs-server.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCommon labels\n*/}}\n{{- define \"nfs-server.labels\" -}}\nhelm.sh/chart: {{ include \"nfs-server.chart\" . }}\n{{ include \"nfs-server.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{- end }}\n\n{{/*\nSelector labels\n*/}}\n{{- define \"nfs-server.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"nfs-server.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n\n{{/*\nCreate the name of the service account to use\n*/}}\n{{- define \"nfs-server.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.create }}\n{{- default (include \"nfs-server.fullname\" .) .Values.serviceAccount.name }}\n{{- else }}\n{{- default \"default\" .Values.serviceAccount.name }}\n{{- end }}\n{{- end }}\n\n{{/*\nCreate the name of the storage class to use\n*/}}\n{{- define \"nfs-server.storageClassName\" -}}\n{{- if .Values.storageClass.create }}\n{{- default (include \"nfs-server.fullname\" .) .Values.storageClass.name }}\n{{- else }}\n{{- .Values.storageClass.name }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"nfs-server.fullname\" . }}\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\nspec:\n  type: {{ .Values.service.type }}\n  {{- if and (contains \"ClusterIP\" .Values.service.type) (not (empty .Values.service.clusterIP)) }}\n  clusterIP: {{ .Values.service.clusterIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.service.nfsPort }}\n      targetPort: nfs\n      protocol: TCP\n      name: nfs\n    - port: {{ .Values.service.nfsPort }}\n      targetPort: nfs-udp\n      protocol: UDP\n      name: nfs-udp\n    - port: {{ .Values.service.mountdPort }}\n      targetPort: mountd\n      protocol: TCP\n      name: mountd\n    - port: {{ .Values.service.mountdPort }}\n      targetPort: mountd-udp\n      protocol: UDP\n      name: mountd-udp\n    - port: {{ .Values.service.rpcbindPort }}\n      targetPort: rpcbind\n      protocol: TCP\n      name: rpcbind\n    - port: {{ .Values.service.rpcbindPort }}\n      targetPort: rpcbind-udp\n      protocol: UDP\n      name: rpcbind-udp\n    - port: {{ .Values.service.statdPort }}\n      targetPort: statd\n      protocol: TCP\n      name: statd\n    - port: {{ .Values.service.statdPort }}\n      targetPort: statd-udp\n      protocol: UDP\n      name: statd-udp\n    - port: {{ .Values.service.statdOutgoingPort }}\n      targetPort: statd-out\n      protocol: TCP\n      name: statd-out\n    - port: {{ .Values.service.statdOutgoingPort }}\n      targetPort: statd-out-udp\n      protocol: UDP\n      name: statd-out-udp\n    - port: {{ .Values.service.lockdPort }}\n      targetPort: lockd\n      protocol: TCP\n      name: lockd\n    - port: {{ .Values.service.lockdPort }}\n      targetPort: lockd-udp\n      protocol: UDP\n      name: lockd-udp\n  selector:\n    {{- include \"nfs-server.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"nfs-server.serviceAccountName\" . }}\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/statefulset.yaml",
    "content": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"nfs-server.fullname\" . }}\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  serviceName: {{ include \"nfs-server.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"nfs-server.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      {{- with .Values.podAnnotations }}\n      annotations:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      labels:\n        {{- include \"nfs-server.selectorLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.imagePullSecrets }}\n      imagePullSecrets:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      serviceAccountName: {{ include \"nfs-server.serviceAccountName\" . }}\n      securityContext:\n        {{- toYaml .Values.podSecurityContext | nindent 8 }}\n      containers:\n        - name: {{ .Chart.Name }}\n          securityContext:\n            {{- toYaml .Values.securityContext | nindent 12 }}\n          image: \"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\"\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          env:\n            - name: MOUNTD_PORT\n              value: \"{{ .Values.service.mountdPort }}\"\n            - name: NFS_PORT\n              value: \"{{ .Values.service.nfsPort }}\"\n            - name: STATD_PORT\n              value: \"{{ .Values.service.statdPort }}\"\n            - name: STATD_PORT_OUT\n              value: \"{{ .Values.service.statdOutgoingPort }}\"\n            - name: LOCKD_PORT\n              value: \"{{ .Values.service.lockdPort }}\"\n            - name: EXPORT_PATH\n              value: \"{{ .Values.exportPath }}\"\n            {{- with .Values.podEnvironmentVariables }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n          ports:\n          - name: nfs\n            containerPort: {{ .Values.service.nfsPort }}\n            protocol: TCP\n          - name: nfs-udp\n            containerPort: {{ .Values.service.nfsPort }}\n            protocol: UDP\n          - name: mountd\n            containerPort: {{ .Values.service.mountdPort }}\n            protocol: TCP\n          - name: mountd-udp\n            containerPort: {{ .Values.service.mountdPort }}\n            protocol: UDP\n          - name: rpcbind\n            containerPort: 111\n            protocol: TCP\n          - name: rpcbind-udp\n            containerPort: 111\n            protocol: UDP\n          - name: statd\n            containerPort: {{ .Values.service.statdPort }}\n            protocol: TCP\n          - name: statd-udp\n            containerPort: {{ .Values.service.statdPort }}\n            protocol: UDP\n          - name: statd-out\n            containerPort: {{ .Values.service.statdOutgoingPort }}\n            protocol: TCP\n          - name: statd-out-udp\n            containerPort: {{ .Values.service.statdOutgoingPort }}\n            protocol: UDP\n          - name: lockd\n            containerPort: {{ .Values.service.lockdPort }}\n            protocol: TCP\n          - name: lockd-udp\n            containerPort: {{ .Values.service.lockdPort }}\n            protocol: UDP\n          livenessProbe:\n            exec:\n              command:\n                - /usr/local/bin/docker-entrypoint.sh\n                - healthcheck\n            initialDelaySeconds: 30\n            periodSeconds: 10\n          startupProbe:\n            exec:\n              command:\n                - /usr/local/bin/docker-entrypoint.sh\n                - healthcheck\n            failureThreshold: 30\n            periodSeconds: 1\n          resources:\n            {{- toYaml .Values.resources | nindent 12 }}\n          volumeMounts:\n            - name: data\n              mountPath: /srv/nfs\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n  volumeClaimTemplates:\n    - metadata:\n        name: data\n        {{- with .Values.persistence.annotations }}\n        annotations:\n          {{- toYaml . | indent 10 }}\n        {{- end }}\n      spec:\n        accessModes: [ \"ReadWriteOnce\" ]\n        storageClassName: {{ include \"nfs-server.storageClassName\" . }}\n        resources:\n          requests:\n            storage: {{ .Values.persistence.size | default \"1Gi\" }}"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/storageclass.yaml",
    "content": "{{- if .Values.storageClass.create -}}\napiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: {{ include \"nfs-server.storageClassName\" . }}\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\nprovisioner: {{ .Values.storageClass.provisioner }}\n{{- with .Values.storageClass.parameters }}\nparameters:\n  {{ toYaml . | nindent 2}}\n{{- end }}\n{{- end }}"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/tests/test-locking.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"nfs-server.fullname\" . }}-test-nfs\"\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\n    \"app.kubernetes.io/component\": \"test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-weight\": \"0\"\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\nspec:\n  containers:\n    - name: lock-test\n      image: busybox\n      command: ['sh']\n      args:\n        - \"-c\"\n        - |\n          set -euo pipefail\n          ls -l /nfs\n          echo \"Acquiring lock...\"\n          {\n            flock -x 3\n            echo \"Acquired lock.\"\n          } 3>>/nfs/test.txt\n          cat /nfs/test.txt\n          rm /nfs/test.txt\n      volumeMounts:\n        - mountPath: /nfs\n          name: data\n  volumes:\n    - name: data\n      persistentVolumeClaim:\n        claimName: \"{{ include \"nfs-server.fullname\" . }}-test-nfs\"\n  restartPolicy: Never\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/tests/test-performance.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"nfs-server.fullname\" . }}-perf-nfs\"\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\n    \"app.kubernetes.io/component\": \"test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-weight\": \"1\"\nspec:\n  containers:\n    - name: bonnie\n      image: polinux/bonnie\n      args:\n        - bonnie++\n        - -d\n        - /nfs\n        - -u\n        - root\n        - -r\n        - \"512\"\n        - -z\n        - \"1234\"\n        - -n\n        - \"100\"\n        - -s\n        - \"1g\"\n      volumeMounts:\n        - mountPath: /nfs\n          name: data\n  # Same zone but different node\n  affinity:\n    podAntiAffinity:\n      requiredDuringSchedulingIgnoredDuringExecution:\n        - labelSelector:\n            matchLabels:\n              {{- include \"nfs-server.selectorLabels\" . | nindent 14 }}\n          topologyKey: kubernetes.io/hostname\n    podAffinity:\n      requiredDuringSchedulingIgnoredDuringExecution:\n        - labelSelector:\n            matchLabels:\n              {{- include \"nfs-server.selectorLabels\" . | nindent 14 }}\n          topologyKey: topology.kubernetes.io/zone\n  volumes:\n    - name: data\n      persistentVolumeClaim:\n        claimName: \"{{ include \"nfs-server.fullname\" . }}-test-nfs\"\n  restartPolicy: Never\n"
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/templates/tests/test-pv.yaml",
    "content": "---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: \"{{ include \"nfs-server.fullname\" . }}-test-nfs\"\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\n    \"app.kubernetes.io/component\": \"test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-weight\": \"-5\"\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteOnce\n  persistentVolumeReclaimPolicy: Delete\n  mountOptions:\n    - nfsvers=3\n    - lookupcache=pos\n    - noatime\n    - intr\n    - rsize=32768\n    - wsize=32768\n    - _netdev\n  nfs:\n    {{- with (lookup \"v1\" \"Service\" .Release.Namespace (include \"nfs-server.fullname\" .)) }}\n    server: {{ .spec.clusterIP }}\n    {{- else }}\n    server: {{ .Values.test.nfsHostname | default .Values.service.clusterIP | default (printf \"%s.%s.svc.cluster.local\" (include \"nfs-server.fullname\" .) .Release.Namespace) }}\n    {{- end}}\n    path: /srv/nfs\n---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: \"{{ include \"nfs-server.fullname\" . }}-test-nfs\"\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\n    \"app.kubernetes.io/component\": \"test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-weight\": \"-5\"\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 1Gi\n  volumeName: \"{{ include \"nfs-server.fullname\" . }}-test-nfs\"\n  storageClassName: \"\""
  },
  {
    "path": "docs/docs/examples/storage/nfs/nfs-server-example/values.yaml",
    "content": "# Default values for nfs-server.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\n\nreplicaCount: 1\n\nimage:\n  # https://github.com/atlassian-forks/nfs-server-docker\n  repository: atlassian/nfs-server-test\n  pullPolicy: IfNotPresent\n  # Overrides the image tag whose default is the chart appVersion.\n  tag: \"\"\n\nimagePullSecrets: []\nnameOverride: \"\"\nfullnameOverride: \"\"\n\n# The path that should be exported by the NFS server\nexportPath: /srv/nfs\n\nserviceAccount:\n  # Specifies whether a service account should be created\n  create: true\n  # Annotations to add to the service account\n  annotations: {}\n  # The name of the service account to use.\n  # If not set and create is true, a name is generated using the fullname template\n  name: \"\"\n\npodAnnotations: {}\n\npodSecurityContext: {}\n\npodEnvironmentVariables: []\n\nsecurityContext:\n  capabilities:\n    add:\n      - DAC_READ_SEARCH\n      - SYS_RESOURCE\n\nservice:\n  # ClusterIP is required\n  type: ClusterIP\n  clusterIP:\n  nfsPort: 2049\n  mountdPort: 20048\n  rpcbindPort: 111\n  statdPort: 32765\n  statdOutgoingPort: 32766\n  lockdPort: 32767\n\nstorageClass:\n  create: false\n  # The name of the storage class to use.\n  # If not set and create is true, the default storage class will be used\n  name: \"\"\n  # If you are not on AWS, choose a different provisioner\n  # provisioner: \"kubernetes.io/aws-ebs\"\n  parameters:\n\npersistence:\n  annotations: {}\n  # On AWS gp2, larger EBS volumes have higher IOPS\n  size: 900Gi\n\nresources:\n  limits:\n    cpu: 0.25\n    memory: 256Mi\n  requests:\n    cpu: 0.25\n    memory: 256Mi\n\nnodeSelector: {}\n\ntolerations: []\n\naffinity: {}\n\ntest:\n  nfsHostname:\n"
  },
  {
    "path": "docs/docs/index.yaml",
    "content": "apiVersion: v1\nentries:\n  bamboo:\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1114)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.6\n    created: \"2026-05-06T12:34:50.760300484Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: fe8448d1ca3db45531c76fb6154a800004bc8dc44381422a40f9a9a4d4cedbf9\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.13/bamboo-2.0.13.tgz\n    version: 2.0.13\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.3\n    created: \"2026-04-09T06:07:09.926881707Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 9de5264d92c064a9e61fdb4c7b48116515b6f5eaf1f93985a77101f8ea2ff103\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.12/bamboo-2.0.12.tgz\n    version: 2.0.12\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.3\n    created: \"2026-04-07T19:46:27.329509305Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 779c6b369598fd4ef971a65c065b663aa378856f07333f4ed69e3e6956e4a97f\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.11/bamboo-2.0.11.tgz\n    version: 2.0.11\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"DEVPROD-3580: Add gateway api support (#1084)\"\n        - \"Update appVersions for DC apps (#1100)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.3\n    created: \"2026-04-03T12:19:08.891745684Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: d70f9bfc384b822642110dcccbbb9e37a8a07d482d97bfb7c8ad41d34a4588b8\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.10/bamboo-2.0.10.tgz\n    version: 2.0.10\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1074)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.1\n    created: \"2026-02-01T01:11:47.817163173Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: e3ef01fd6ddbe45cca7ce5986d79aceba133182ebf24ae36a55b68485b5e177a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.9/bamboo-2.0.9.tgz\n    version: 2.0.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1071)\"\n        - \"feat: Added scrape timeout configuration on servicemonitor (#1067)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.0\n    created: \"2025-12-29T04:49:25.954699436Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: e96e2d34e1de5c51be3cf0470504d897d860c977d1a7fefb73db4b95d5f65b2a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.8/bamboo-2.0.8.tgz\n    version: 2.0.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1058)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.8\n    created: \"2025-11-07T09:21:06.608910825Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 1e86158bb1ef085f375639fb0059f50f243f31374d3444fb53792ed848ff5d85\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.7/bamboo-2.0.7.tgz\n    version: 2.0.7\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1052)\"\n        - \"fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.7\n    created: \"2025-11-03T18:10:23.114382513Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: d92d52172b37cb0719953f17e0382caf2708362a058a65401521e74a2216bfea\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.6/bamboo-2.0.6.tgz\n    version: 2.0.6\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1049)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.5\n    created: \"2025-11-01T20:21:44.423842532Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 0fef713fb7270f51ddb7972a8d34b934a0740f9b86a98b43d33bc8d64e3f189f\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.5/bamboo-2.0.5.tgz\n    version: 2.0.5\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"fix: Update Bitnami image references due to deprecation notice (#1037)\"\n        - \"Update appVersions for DC apps (#1029)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.4\n    created: \"2025-08-27T08:06:51.139203477Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: fd058f90cea9eba240e09e5f40726f142bc2a2467b0e28438f8684b562496156\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.4/bamboo-2.0.4.tgz\n    version: 2.0.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1022)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.3\n    created: \"2025-08-01T04:22:42.423722889Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: b98d1f4d3210f9266282e5acc22a916cb8cd6b9bbedaf4dddff5e5f8058b50d4\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.3/bamboo-2.0.3.tgz\n    version: 2.0.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1014)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.2\n    created: \"2025-06-16T21:06:13.386246826Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 577b612d7bf5bb6ddd3247aa080c9fb8a76526cd85429eaf0e786cd4ed40f7c5\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.2/bamboo-2.0.2.tgz\n    version: 2.0.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1005)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.1\n    created: \"2025-05-15T03:13:37.547835207Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 02c251bc65f517484a5568b00557188159b49d4038a93d126d028f26a4c0d84a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.1/bamboo-2.0.1.tgz\n    version: 2.0.1\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-29T02:28:19.542999701Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: d6abab61555c883c3f2589e75eea039081507aa33115cf09b441c798c849cd0f\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-2.0.0/bamboo-2.0.0.tgz\n    version: 2.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make it possible to declare additional ingress paths (#991)\"\n        - \"Bring changelog in order (#990)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-22T03:40:53.390427344Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: ae7a8e2559dd819ef5faa0095cbadd12a2c9d3c08c9f2cfffdcabc3c8c9b7ee6\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.9/bamboo-1.22.9.tgz\n    version: 1.22.9\n  - annotations:\n      artifacthub.io/changes: '- \"Set fsGroupChangePolicy to OnRootMismatch in securityContext\n        by default (#986)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-17T00:33:09.445126198Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 8b62e826948fd1c5d0fbb15af5018fb35fe162ba887a0f929671e26c8d9753ac\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.8/bamboo-1.22.8.tgz\n    version: 1.22.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#977)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-01T08:33:29.637222382Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: fa19b51c982b5dd212c3518aeae429751353ec9c3a26ac3b0c992fb492cbb91a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.7/bamboo-1.22.7.tgz\n    version: 1.22.7\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#969)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.2\n    created: \"2025-03-19T10:58:51.105125768Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 03e547cb561fecb1d4c3c54c1d159b83cc3144fbfd643cd32942d36f9b497a99\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.6/bamboo-1.22.6.tgz\n    version: 1.22.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add tunnel config for Jira, hostNamespaces in all charts (#958)\"\n        - \"Allow setting subPath for local-home volumes (#947)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.1\n    created: \"2025-02-18T02:04:16.261925279Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 073b95054cc6d52ce8a42cc559f9861d43a2dd9444167a4729ffcae2288e04bb\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.5/bamboo-1.22.5.tgz\n    version: 1.22.5\n  - annotations:\n      artifacthub.io/changes: '- \"Round up fractional cpu values for ActiveProcessorsCount\n        (#944)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.0\n    created: \"2025-01-30T23:57:42.423933821Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: a433fef7cf90b1f8e6ec79bf9a0d636491b294c82bf43dba2f7adcf105d59439\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.4/bamboo-1.22.4.tgz\n    version: 1.22.4\n  - annotations:\n      artifacthub.io/changes: '- \"Set custom securityContext for import-certs init\n        container. Make affinity independent for Synchrony (#938)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.0\n    created: \"2025-01-13T08:43:15.341164893Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 3a8290e5689e8d9ea8e2bb95714f753b096481b554f977d3a22fa17480766f82\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.3/bamboo-1.22.3.tgz\n    version: 1.22.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#933)\"\n        - \"Make it possible to set nodePort in services (#931)\"\n        - \"Make access log attributes configurable (#932)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.1.1\n    created: \"2024-12-16T23:16:40.859612744Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 9bbc4a94555861f59b3eac27e6e6d87cb8167d35343e63667d69532b11e57e56\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.2/bamboo-1.22.2.tgz\n    version: 1.22.2\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#922)\"\n        - \"Make make stuckthreaddetectionvalve configurable (#921)\"\n        - \"Update Grafana dashboards for DC apps (#915)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.1.0\n    created: \"2024-12-03T20:13:30.547376723Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: a0aa41041b8494c0f99d27ee6dd643f0228ced279d9a2a962035b07280a6f404\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.1/bamboo-1.22.1.tgz\n    version: 1.22.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#905)\"\n        - \"Updated pod labels for all products (#901)\"\n        - \"Fix shutdown with jmx javaagent enabled (#899)\"\n        - \"Unset IDs for all the Grafana dashboards (#889)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.3\n    created: \"2024-11-15T03:00:27.29689239Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 0cb68e62f57e8c35cd7cf438b8a4d83a813fea20ff42621a9305570c5367bd13\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.22.0/bamboo-1.22.0.tgz\n    version: 1.22.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#881)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.1\n    created: \"2024-10-01T04:09:19.625204936Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 1a11958ef5a08b054c71ea98d4029d3b963e6f00fb2d0dc468e8eb32de2e15e9\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.21.4/bamboo-1.21.4.tgz\n    version: 1.21.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update common dependency version (#878)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.0\n    created: \"2024-09-10T03:33:52.333412788Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 1c5f0db4d4e94e8cda6b1e9abd8181e33dabdee948b7fac8ead956fffae445aa\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.21.3/bamboo-1.21.3.tgz\n    version: 1.21.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#869)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.0\n    created: \"2024-08-26T06:47:23.033124267Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 33b17adbc62455c9996005fb98d851795a1c0fe23597dab031be248d5e40a22d\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.21.2/bamboo-1.21.2.tgz\n    version: 1.21.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#865)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.5\n    created: \"2024-08-22T08:41:36.644802333Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 52d93d0918bb9e8be5c24ffcd371298faf09a84a83cc881e795be6b4b819c73e\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.21.1/bamboo-1.21.1.tgz\n    version: 1.21.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Added annotations to the StatefulSets (#857)\"\n        - \"Update appVersions for DC apps (#858)\"\n        - \"Make shared home pvc access mode configurable (#855)\"\n        - \"Allow referencing multiple secrets in additionalCertificates (#852)\"\n        - \"Make it possible to define resources for import-certs init container (#851)\"\n        - \"Move update strategy to root level (#849)\"\n        - \"Add helm value for custom jmx jar location when using other jmx init container images (#846)\"\n        - \"feat: add appProtocol for service meshes (#847)\"\n        - \"Make StatefulSet updateStrategy configurable (#845)\"\n        - \"Fix default for acceptCount (#832)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.4\n    created: \"2024-08-13T02:16:42.860076514Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 9457f0102049aded49c69325e31546d6b343e2989d3f475df502a1eaf471c437\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.21.0/bamboo-1.21.0.tgz\n    version: 1.21.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make it possible to override proxy settings (#822)\"\n        - \"Update appVersions for DC apps (#823)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.3\n    created: \"2024-07-07T21:51:05.885533471Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 60346e33d6a29cd5eb2f879a38f517eba95a35d71a730152eacffcd53b232e9e\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.20.1/bamboo-1.20.1.tgz\n    version: 1.20.1\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#798)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.2\n    created: \"2024-05-13T22:07:16.36163058Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: f1df68c7772bafb5d8ab3512b1717c67b108bfbc6740bbd29daf22f89241b20a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.20.0/bamboo-1.20.0.tgz\n    version: 1.20.0\n  - annotations:\n      artifacthub.io/changes: '- \"Make cacerts writable for user and group (#790)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.1\n    created: \"2024-04-22T06:38:05.682139884Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: dee1295371064329be2ee65261e313eeaeb8eae4816bea8c07c74cb967796aa5\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.19.0/bamboo-1.19.0.tgz\n    version: 1.19.0\n  - annotations:\n      artifacthub.io/changes: '- \"Get rid of server repo references (#777)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.0\n    created: \"2024-03-26T03:31:04.339865107Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 3751617567e7c17e2090f23b98634f0ab9f2ec06571b78500133186f48291a45\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.18.1/bamboo-1.18.1.tgz\n    version: 1.18.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add Openshift analytics (#763)\"\n        - \"Update appVersions for DC apps (#765)\"\n        - \"OpenShift Support (#752)\"\n        - \"Use testPods values for test images and container resources (#761)\"\n        - \"Relabel instance name on jmx service monitor (#757)\"\n        - \"Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.5.1\n    created: \"2024-02-27T22:52:07.245849848Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 45dc96c670b330ca06dd629fd3f89ef0c84e331c8b54371ca156bd06a922d0ee\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.18/bamboo-1.18.tgz\n    version: \"1.18\"\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"StatefulSet PVC auto deletion (#736)\"\n        - \"Update appVersions for DC apps (#738)\"\n        - \"Add optional postStart hook (#735)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.2\n    created: \"2023-12-18T05:54:09.815829184Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 212ddc6938c8e6117c5db3ff5f9aa86eee03d7b86575de69a555c52bdbf4a2b1\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.17.2/bamboo-1.17.2.tgz\n    version: 1.17.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make liveness probe configurable (#732)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.1\n    created: \"2023-12-11T00:31:04.303733389Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: a446c7f49742a46d72fa7021a8594d3b93602ea8bea8d92e29e3b88904a6d7ee\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.17.1/bamboo-1.17.1.tgz\n    version: 1.17.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make test pod metadata and spec configurable (#727)\"\n        - \"Optional analytics/support ConfigMap (#721)\"\n        - \"Fix ingress annotations comment (#720)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.1\n    created: \"2023-12-07T00:11:47.270314945Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 1e45f28822df6be594e972c8a44dd476e30a776c2ea4a4238a570e048b43c652\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.17.0/bamboo-1.17.0.tgz\n    version: 1.17.0\n  - annotations:\n      artifacthub.io/changes: '- \"JMX container resources (#707)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.0\n    created: \"2023-10-30T20:13:52.41614561Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 4c912f81bfd3343a0a8bf1f3c90955141c22409c4a182bfe93dcfa2a39f71121\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.16.6/bamboo-1.16.6.tgz\n    version: 1.16.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Fix custom jmx config (#699)\"\n        - \"Copy cacerts first, then import certs (#696)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.4\n    created: \"2023-10-24T05:49:59.606073181Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 9771d2fc8db973f949d8f1f68237b3839a9916297c87243f2449b7b692e328ec\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.16.5/bamboo-1.16.5.tgz\n    version: 1.16.5\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-10-11T21:45:46.695383544Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 80c40900bdd32537760016efb73b87c5d9f44bed161d338d73362e6f73ee372f\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.16.4/bamboo-1.16.4.tgz\n    version: 1.16.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-10-11T01:56:37.759483399Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: dcdc13ddfec8af9199bcbab991134f4fd9da45986757a350bd37b182d168ecce\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.16.3/bamboo-1.16.3.tgz\n    version: 1.16.3\n  - annotations:\n      artifacthub.io/changes: '- \"Add quote to podAnnotation templating (#678)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-10-08T21:12:05.187376584Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: c5ffee36c69e27cc9d129dbd14fc7d35ec877e5c5b75776aa31fca4c20309c9c\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.16.2/bamboo-1.16.2.tgz\n    version: 1.16.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-09-20T23:33:30.705188383Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: c40ecb859ef32678ffe8f684037b3c81e4a9e9170efb81cd9f7e2d3525969be7\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.16.1/bamboo-1.16.1.tgz\n    version: 1.16.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Allow templating of pod annotations (#662)\"\n        - \"Make securityContext configurable for jmx exporter init container (#670)\"\n        - \"Add user provided certificates to the default Java truststore (#663)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-09-18T06:13:48.626819027Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 5879e6937657d0039af642dc8d5feec4e7e605f3fe0035fb470827589ad7a365\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.16.0/bamboo-1.16.0.tgz\n    version: 1.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Decouple server and jmx annotations (#654)\"\n        - \"Disable startup probes by default (#653)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.2\n    created: \"2023-08-28T05:35:48.66396323Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: b0791d73bcc4551254887a42b7656d685cbd8437f8ac13a6afb93333558f6494\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.15.3/bamboo-1.15.3.tgz\n    version: 1.15.3\n  - annotations:\n      artifacthub.io/changes: '- \"Add defaultMode to additionalConfigMaps (#647)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.2\n    created: \"2023-08-22T05:27:06.768742707Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 0e24f64ef6dd342688ed09095c5a7fdcca0705fe20a4fda3b69105902cf9c6ba\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.15.2/bamboo-1.15.2.tgz\n    version: 1.15.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make startup probes optional (#646)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.2\n    created: \"2023-08-17T21:54:15.615520969Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: e55a5d6335cfe80916c4db6849fac1c0445cd72c5baa00e407bf061af02b701e\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.15.1/bamboo-1.15.1.tgz\n    version: 1.15.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\"\n        - \"Add annotations to Grafana dashboards ConfigMaps (#637)\"\n        - \"Add additional ConfigMaps to Helm Charts (#635)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.1\n    created: \"2023-08-07T23:31:32.363514943Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 5da3a317c9a9de6f775a5ebda06b9c260fca1e6f9e1d4725e1d89f2fc7deb120\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.15.0/bamboo-1.15.0.tgz\n    version: 1.15.0\n  - annotations:\n      artifacthub.io/changes: '- \"Disable liveness probes by default, make timeoutSeconds\n        configurable (#630)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.1\n    created: \"2023-07-26T00:47:38.484746009Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 99cb4606ebd282de4b2ec3df74fc5e842baa8c31c595919b6c9b8fe53ab9828c\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.14.1/bamboo-1.14.1.tgz\n    version: 1.14.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add liveness probes, make readinessProbes configurable (#626)\"\n        - \"make sharedHome.permissionFix.command helper to be per-product (#622)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.1\n    created: \"2023-07-25T09:31:54.61368957Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 2775b8580d3ca24c444c0af0316d07e7ee3383c0c6f349975f61d4ad987ed365\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.14.0/bamboo-1.14.0.tgz\n    version: 1.14.0\n  - annotations:\n      artifacthub.io/changes: '- \"Run jmx init container as root: get fix from common\n        chart ver 1.2.3 (#608)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.0\n    created: \"2023-06-28T03:38:01.918559745Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: fb1761af98cb9aa5b58715ab16fc00eef6bbb623f29900a234e7758271a2f3f6\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.13.1/bamboo-1.13.1.tgz\n    version: 1.13.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#599)\"\n        - \"Update Grafana dashboards for DC apps (#589)\"\n        - \"Bamboo dashboard (#588)\"\n        - \"Make sessionAffinity configurable in service spec (#582)\"\n        - \"Add optional ServiceMonitors to DC Helm Charts (#573)\"\n        - \"Enable JMS traffic via Service (#570)\"\n        - \"Expose JMX beans on http endpoint (#562)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.0\n    created: \"2023-06-13T03:59:46.944397447Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.2\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: f8202f853d775f04c698c25cf97fca4000af3755a3dec75a05c03cb9db648c83\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.13.0/bamboo-1.13.0.tgz\n    version: 1.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add priorityClassName to pod spec (#557)\"\n        - \"Add hostAliases for all DC products (#556)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-04-18T04:45:10.090629389Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 1b405e6c45992ab501ff787deaaf9cdf9e555e087cdd7aeb6ee6bc15f9212beb\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.12.0/bamboo-1.12.0.tgz\n    version: 1.12.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#531)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-03-22T04:40:28.132963693Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 9ec7da70bc6b0deb85e39215907e60393ff25ea6e6800e0f740645280204c999\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.11.0/bamboo-1.11.0.tgz\n    version: 1.11.0\n  - annotations:\n      artifacthub.io/changes: '- \"Add Bitbucket Mesh to Bitbucket Helm chart (#501)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-02-20T03:19:50.565498259Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 000acf1c9ed96d871bfacf68a931eada52b019a09bf60492f6c1a17f67103177\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.10.0/bamboo-1.10.0.tgz\n    version: 1.10.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Fix artifact hub annotation yaml\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-02-15T23:07:52.729688871Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 9186a4fedf44766fc407d6a78079cea6f3f603b6ea2c92f0fe357a94a9156114\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.9.1/bamboo-1.9.1.tgz\n    version: 1.9.1\n  - annotations:\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-02-15T05:21:09.213675281Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 734ee46dcdde2bea05c11a1c7084da5db5a1c95d1d123b8479910dec9d134612\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.9.0/bamboo-1.9.0.tgz\n    version: 1.9.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Fix artifacthub annotations\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.1\n    created: \"2022-12-11T23:57:41.096476Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: d5205496edd24e675721115b160ce753606740b16a5601dff03639be00a4bb60\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.8.1/bamboo-1.8.1.tgz\n    version: 1.8.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Stop supporting 1.19 and 1.20 k8s\n        - kind: changed\n          description: Update appVersion to the latest LTS\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.1\n    created: \"2022-12-08T23:43:17.903138Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: fc5fbb7cd36b7572d5ee0ee3eb9e6e8900be332c8e82c54409bd2efc72b41685\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.8.0/bamboo-1.8.0.tgz\n    version: 1.8.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Patch release to fix Artifacthub metadata\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.0\n    created: \"2022-10-26T04:39:57.50419584Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 8c3b83ac094fb647b24c54bef71495242591a9969a8d9d9385eedc24a9bc2599\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.7.1/bamboo-1.7.1.tgz\n    version: 1.7.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Pin Python version to 3.9.14\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/468\n        - kind: changed\n          description: Update Bitbucket ingress testing values\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/466\n        - kind: changed\n          description: Ingress Class Name is moved under spec field.\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/451\n        - kind: changed\n          description: Make ATL_FORCE_CFG_UPDATE configurable in values.yaml\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/454\n        - kind: changed\n          description: Add osquery related env vars for Terraform\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/462\n        - kind: changed\n          description: AWS cleanup and log colletion from k8s\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/461\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.0\n    created: \"2022-10-25T00:43:31.462052539Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 9a7a8d3abed77c5483ea751cb870ef560bf04b697d6fbca4a0373ba0cb8a4b05\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.7.0/bamboo-1.7.0.tgz\n    version: 1.7.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Bamboo updated to 9.0.0 version (#455)\"\n        - \"Ingress Class Name is moved under spec (#450)\"\n        - \"Improved documentation (#448)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.0\n    created: \"2022-10-12T01:34:46.957668576Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: abedec640a9ee7d87e63ab7be307bd5cecb784731725bc5fbcaf74066a1cb0c8\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.6.0/bamboo-1.6.0.tgz\n    version: 1.6.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Use the custom ports for Bamboo service\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/419\n        - kind: changed\n          description: Bamboo updated to 8.2.4 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/430\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.2.4\n    created: \"2022-07-15T04:27:46.229934855Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 4f9619876d955a1143b821746d6e3b9b2ed10707002933132155a967c6a92e23\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.5.0/bamboo-1.5.0.tgz\n    version: 1.5.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Make pod securityContext optional\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/389\n        - kind: added\n          description: Support for configuring ingress proxy settings via values.yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/402\n        - kind: changed\n          description: Bamboo DC updated to 8.2.3 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/412\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.2.3\n    created: \"2022-05-25T04:04:15.464866622Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: afbccdf150a53a87cd2075d8e36ddb1e28c2e53ea5cc8943875b757a4dddd71b\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.4.0/bamboo-1.4.0.tgz\n    version: 1.4.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: fixed\n          description:  ATL_BASE_URL should be appropriately set when ingress.path is supplied\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/391\n        - kind: changed\n          description: Bamboo DC updated to 8.1.3 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/396\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.1.3\n    created: \"2022-03-23T21:52:11.171460496Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: a6aa630d5b13190d77f3e10a03a905ede1b17993e29cba2c62866d3051440fa1\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.3.0/bamboo-1.3.0.tgz\n    version: 1.3.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Added new feature additionalVolumeClaimTemplates and provided example in documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/334\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/368\n        - kind: added\n          description: Added service account annotation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/363\n        - kind: changed\n          description: Updated Atlassian charts to use common definitions\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/303\n        - kind: changed\n          description: Improvements on documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/370\n        - kind: added\n          description: Added end-to-end test for Bamboo Helm chart using Terraform\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/375\n        - kind: changed\n          description: Bamboo DC updated to 8.1.2 version (LTS)\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/378\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.1.2-jdk11\n    created: \"2022-02-14T04:05:35.167117894Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 4e63b770794ecc52b54d74b1bfa49f33f7f596e9fb8ac35498d8c05059c57a71\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.2.0/bamboo-1.2.0.tgz\n    version: 1.2.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Support for defining podLabels\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/366\n        - kind: added\n          description: Support for defining loadBalancerIP\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/365\n        - kind: added\n          description: Support for defining podAnnotations\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/341\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.1.1\n    created: \"2022-01-10T23:28:15.0273826Z\"\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 49c0057d7718adb2a6161c8ca8e82e7cf0b6d6d8b375f3ff36c924b601922458\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-1.0.0/bamboo-1.0.0.tgz\n    version: 1.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Support for defining podLabels\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/366\n        - kind: added\n          description: Support for defining loadBalancerIP\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/365\n        - kind: added\n          description: Support for defining podAnnotations\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/341\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.1.1\n    created: \"2021-12-17T06:04:32.420213972Z\"\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 3f23abb3b6e13eada2aa4da8d591e58e69eb04383c02b2c4e4bb15b8061e82f7\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-0.0.2/bamboo-0.0.2.tgz\n    version: 0.0.2\n  - apiVersion: v2\n    appVersion: 8.0.4-jdk11\n    created: \"2021-11-04T03:20:37.254730601Z\"\n    description: A chart for installing Bamboo Data Center on Kubernetes\n    digest: 2657cecc6864e35a05ff964c374a0e43666537c46013b9f1d71fe15583cd3061\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Server\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-0.0.1/bamboo-0.0.1.tgz\n    version: 0.0.1\n  bamboo-agent:\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1114)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.6\n    created: \"2026-05-06T12:34:50.953323072Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: f11ce05faba5f2b72d0d6f0a7259fd8a3e5dfd540a71f4b69ca5a328d7a498f5\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.13/bamboo-agent-2.0.13.tgz\n    version: 2.0.13\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.3\n    created: \"2026-04-09T06:07:10.09852314Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 9b2b079d53f0f4822de8f7031f7c774ac401a04b0532b83f6a54cf5fb8cdff3c\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.12/bamboo-agent-2.0.12.tgz\n    version: 2.0.12\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.3\n    created: \"2026-04-07T19:46:27.491182504Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 728900574ded4ced33d33a424d801f75a18bb490216fa44dd1f420feebc15ae6\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.11/bamboo-agent-2.0.11.tgz\n    version: 2.0.11\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"DEVPROD-3580: Add gateway api support (#1084)\"\n        - \"Update appVersions for DC apps (#1100)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.3\n    created: \"2026-04-03T12:19:09.035071689Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 4cede3f2505037a83a55244816848bb19b56dd5eed8b1a6278fbd4bd1eb29e1f\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.10/bamboo-agent-2.0.10.tgz\n    version: 2.0.10\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1074)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.1\n    created: \"2026-02-01T01:11:47.949605438Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 4b2c9c4c957bc70643a78dc901b5173b97034742c9401e0f39c721ad449f6413\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.9/bamboo-agent-2.0.9.tgz\n    version: 2.0.9\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1070)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 12.1.0\n    created: \"2025-12-29T04:49:26.130631766Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 253d6e58a3eca675a91084dd30022461b14a445164d6b661d6237cc18650c918\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.8/bamboo-agent-2.0.8.tgz\n    version: 2.0.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1058)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.8\n    created: \"2025-11-07T09:21:06.814220661Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: ce60f63dd228f0eaa38086acf9df54afdce4daff655d4cd0fe431b4b5a19fe2d\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.7/bamboo-agent-2.0.7.tgz\n    version: 2.0.7\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1052)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.7\n    created: \"2025-11-03T18:10:23.384685339Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 4efaabc6a3c08841c1e5717fc879590bfa8a5f9a9c88323f3a611e3a86b70d4a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.6/bamboo-agent-2.0.6.tgz\n    version: 2.0.6\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1049)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.5\n    created: \"2025-11-01T20:21:44.620042014Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 329ebd4fb847205f3eef13112b9229a2a33c8ad7032265bbd2c9ef1abec37f81\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.5/bamboo-agent-2.0.5.tgz\n    version: 2.0.5\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1029)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.4\n    created: \"2025-08-27T08:06:51.309539597Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: bc68f02a46d3f0ab91c83ba608df11094409ba90cf9208753217417bcbaa534d\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.4/bamboo-agent-2.0.4.tgz\n    version: 2.0.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1022)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.3\n    created: \"2025-08-01T04:22:42.563758058Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 0c84af72900669302ca98f155e52500a80c0d630c5588b2e154a4085d3a03f13\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.3/bamboo-agent-2.0.3.tgz\n    version: 2.0.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1014)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.2\n    created: \"2025-06-16T21:06:13.512819349Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: ba082ea6202c56f59ebe09094d0d2513167f3828bc7fe989e8d0d5d77b846dc0\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.2/bamboo-agent-2.0.2.tgz\n    version: 2.0.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1005)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.0.1\n    created: \"2025-05-15T03:13:37.687836979Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: e722cd64093927f8ba296b758262ec086884924abe5b27dddf1a930377504b09\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.1/bamboo-agent-2.0.1.tgz\n    version: 2.0.1\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-29T02:28:19.631449495Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: d74df7cba0535d63a00ab1d903ebfec8d15e16cf77086a871cd5af38293af01a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-2.0.0/bamboo-agent-2.0.0.tgz\n    version: 2.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make it possible to declare additional ingress paths (#991)\"\n        - \"Bring changelog in order (#990)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-22T03:40:53.585203902Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 971ffcba9880e7e3181b081ce117ee392b67cb4f02b821340f84277169f25e74\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.9/bamboo-agent-1.22.9.tgz\n    version: 1.22.9\n  - annotations:\n      artifacthub.io/changes: '- \"Set fsGroupChangePolicy to OnRootMismatch in securityContext\n        by default (#986)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-17T00:33:09.560793412Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: e8789cc551e873bbd969ddd5684e1afdc2d84c9d0c51d952dc1a78f12bff096a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.8/bamboo-agent-1.22.8.tgz\n    version: 1.22.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#977)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.3\n    created: \"2025-04-01T08:33:29.739534911Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 73f83d7f136c67b91d630ec281ba5f682fc431bcdab724575482ee96f32302a8\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.7/bamboo-agent-1.22.7.tgz\n    version: 1.22.7\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#969)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.2\n    created: \"2025-03-19T10:58:51.22737493Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 6c2b17c3af8a1a4d4da56edf614ecbec3a6400a07ec9cd8eb61996b36555ac99\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.6/bamboo-agent-1.22.6.tgz\n    version: 1.22.6\n  - annotations:\n      artifacthub.io/changes: '- \"Add tunnel config for Jira, hostNamespaces in all\n        charts (#958)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.1\n    created: \"2025-02-18T02:04:16.369014794Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 89bac81d056e6838dc85ea356388ff35520b57e0e727357621056b894be38de0\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.5/bamboo-agent-1.22.5.tgz\n    version: 1.22.5\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.0\n    created: \"2025-01-30T23:57:42.531613992Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: b8bf3c7b326a2a3e3d69c8fe1a6734911abfb6cf107221fa8518c30eb5e887b3\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.4/bamboo-agent-1.22.4.tgz\n    version: 1.22.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#936)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.0\n    created: \"2025-01-13T08:43:15.489203124Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: f9e39aa8ab4829c4d676ec5f4589961a58d8296f94955245d11f0db390da0c90\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.3/bamboo-agent-1.22.3.tgz\n    version: 1.22.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#930)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.1.1\n    created: \"2024-12-16T23:16:41.076036127Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: bef900429f764e943185990974bced995536ae9be55bcc528516e3254133f651\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.2/bamboo-agent-1.22.2.tgz\n    version: 1.22.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#918)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.1.0\n    created: \"2024-12-03T20:13:30.708455444Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: c38c78df1c084021ea655fca871f33fb82c2068e61ec1e82ec15428412278be7\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.1/bamboo-agent-1.22.1.tgz\n    version: 1.22.1\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#905)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.3\n    created: \"2024-11-15T03:00:27.441228478Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 250931ee505cbc020fc6aaac3e65473b4161f768a78be68daf99225bc56eed19\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.22.0/bamboo-agent-1.22.0.tgz\n    version: 1.22.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#881)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.1\n    created: \"2024-10-01T04:09:19.730544432Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: bad63a17d875c9057b9e6ddf3a371ea15aba1dbaf81b89a727116a7f8215996b\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.21.4/bamboo-agent-1.21.4.tgz\n    version: 1.21.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update common dependency version (#878)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.0\n    created: \"2024-09-10T03:33:52.451509493Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: f3648c9764197360ee359eaccab094adfb5e5b4e0b597e1e2067b9d96e221c89\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.21.3/bamboo-agent-1.21.3.tgz\n    version: 1.21.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#869)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.0.0\n    created: \"2024-08-26T06:47:23.213150451Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 4db36bdb33fcff8b5c8842e7d6ef2d7618fc2c296d8ffb26a9ea64508ff0b385\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.21.2/bamboo-agent-1.21.2.tgz\n    version: 1.21.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#865)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.5\n    created: \"2024-08-22T08:41:36.786224443Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: c8b2e89c07023f0c7836f97c9f959000df00ae73e8c7ce93d56bf94a4f349196\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.21.1/bamboo-agent-1.21.1.tgz\n    version: 1.21.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#858)\"\n        - \"Make shared home pvc access mode configurable (#855)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.4\n    created: \"2024-08-13T02:16:43.000929965Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 6a4180b511df08f07a873fce0246ccbc2513f1beae5111028069b6734811cf94\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.21.0/bamboo-agent-1.21.0.tgz\n    version: 1.21.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#823)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.3\n    created: \"2024-07-07T21:51:06.16349741Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: b8fade050e819c0508dc1c77bbb31324b958ecc9f72f55455765ecb8e20110ff\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.20.1/bamboo-agent-1.20.1.tgz\n    version: 1.20.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#798)\"\n        - \"Make server protocol configurable (#794)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.2\n    created: \"2024-05-13T22:07:16.59407515Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: bea3d236d2bb05503402a264c5ee9b816288c3fbf48e7225a52c86a6c1758303\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.20.0/bamboo-agent-1.20.0.tgz\n    version: 1.20.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#787)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.1\n    created: \"2024-04-22T06:38:05.809836668Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: cb4254be4de078d50b4dcdbba4462eaa9b292296d4fe482e018809361437c1c1\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.19.0/bamboo-agent-1.19.0.tgz\n    version: 1.19.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#773)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.6.0\n    created: \"2024-03-26T03:31:04.520133649Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 1bf8ce2661cc1adb9267f72e708345a7e16c813e8e9c8ccef0b8f0324876897f\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.18.1/bamboo-agent-1.18.1.tgz\n    version: 1.18.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"OpenShift Support (#752)\"\n        - \"Update appVersions for DC apps (#762)\"\n        - \"Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.5.1\n    created: \"2024-02-27T22:52:07.367489426Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 0af111da2ce500e3014fe10527dfed0350a6f73c8bbcdc66b3931daea2a2c877\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.18/bamboo-agent-1.18.tgz\n    version: \"1.18\"\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"StatefulSet PVC auto deletion (#736)\"\n        - \"Update appVersions for DC apps (#738)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.2\n    created: \"2023-12-18T05:54:09.935557633Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 23e4f9b0d27758e536a8cb6c37e64d0541eaad1999d75ba9d812c66331d0d163\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.17.2/bamboo-agent-1.17.2.tgz\n    version: 1.17.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.1\n    created: \"2023-12-11T00:31:04.536874796Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 1b1cad626a49b32693613b5f240a2cc5c26ba43373e45d3f0d91e92f00d0990e\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.17.1/bamboo-agent-1.17.1.tgz\n    version: 1.17.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make test pod metadata and spec configurable (#727)\"\n        - \"Optional analytics/support ConfigMap (#721)\"\n        - \"BAM-25528: Unset pre-stop hook for bamboo-agent (#719)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.1\n    created: \"2023-12-07T00:11:47.472273095Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: c054dce820b8a86808e5b37188a4ba9db0ea3ea5281ead1a7c68b545a9c851c5\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.17.0/bamboo-agent-1.17.0.tgz\n    version: 1.17.0\n  - annotations:\n      artifacthub.io/changes: '- \"JMX container resources (#707)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.0\n    created: \"2023-10-30T20:13:52.59346306Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 345dd96fe30a22a4dd9c59467e3a078f9d5627c67ff1da71e2af71fdbe20d9f8\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.16.6/bamboo-agent-1.16.6.tgz\n    version: 1.16.6\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#697)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.4\n    created: \"2023-10-24T05:49:59.8669802Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: f2e51fbeb113a21b6831a8efe4917ec3cd03bef0d67cb82c3b00616b3d150b7b\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.16.5/bamboo-agent-1.16.5.tgz\n    version: 1.16.5\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-10-11T21:45:46.839780189Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 1310efcc40d7097a2a8168fd84763e86c1370586da25fee78859c484147f884a\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.16.4/bamboo-agent-1.16.4.tgz\n    version: 1.16.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-10-11T01:56:38.321345626Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 7b48ed26c26e5657060611fd36e1a4e93543ae1796303a7bef34ec896942bbb9\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.16.3/bamboo-agent-1.16.3.tgz\n    version: 1.16.3\n  - annotations:\n      artifacthub.io/changes: '- \"Add quote to podAnnotation templating (#678)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-10-08T21:12:05.312334192Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 48abd06afd8a3d837b0f5de5316730eecbfeca61e70fff0998c8311fc739a206\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.16.2/bamboo-agent-1.16.2.tgz\n    version: 1.16.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-09-20T23:33:30.844063129Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: d93810fbb949449d793bfe5f745b6978fe0d34f5dd50f5499de1aff053791604\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.16.1/bamboo-agent-1.16.1.tgz\n    version: 1.16.1\n  - annotations:\n      artifacthub.io/changes: '- \"Make securityContext configurable for jmx exporter\n        init container (#670)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.3\n    created: \"2023-09-18T06:13:48.755918708Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 5a58ee0b4ebf18bdffb967f3334f6c564531aa0687c08a72de4eb1d482345313\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.16.0/bamboo-agent-1.16.0.tgz\n    version: 1.16.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.2\n    created: \"2023-08-28T05:35:48.783848328Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: e75126c1b094a65af84268daf318852eebe51be732fb7e2dd227033336e89b56\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.15.3/bamboo-agent-1.15.3.tgz\n    version: 1.15.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.2\n    created: \"2023-08-22T05:27:06.955293139Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 2cf9b73f03a9788242f886a53d7f9bc0cb4c2e30cf004b8644f5af3b2abc8220\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.15.2/bamboo-agent-1.15.2.tgz\n    version: 1.15.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#643)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.2\n    created: \"2023-08-17T21:54:15.779931486Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 3903b9d1ba8c8e6ec501a54576041f18a58b6b1e55273a17b46af1699bfe4f9c\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.15.1/bamboo-agent-1.15.1.tgz\n    version: 1.15.1\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.1\n    created: \"2023-08-07T23:31:32.487477345Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 1617f7b37dafad52d612dcf647fae61c2e06eb712413e9d54d6d5847fea28c0d\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.15.0/bamboo-agent-1.15.0.tgz\n    version: 1.15.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.1\n    created: \"2023-07-26T00:47:38.675100718Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 597968603b33ace542d984b1a7431c3784b6f2d61c36b3f3a53959a7a89fd565\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.14.1/bamboo-agent-1.14.1.tgz\n    version: 1.14.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add liveness probes, make readinessProbes configurable (#626)\"\n        - \"Add additionalFiles to bamboo-agent Helm chart (#625)\"\n        - \"Add additionalVolumes and additionalVolumeMounts to bamboo-agent (#619)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.1\n    created: \"2023-07-25T09:31:54.825405081Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: aeca1edefc25a14dd320e213676bc56dac97fc76d2c970101fce1bb67179667c\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.14.0/bamboo-agent-1.14.0.tgz\n    version: 1.14.0\n  - annotations:\n      artifacthub.io/changes: '- \"Run jmx init container as root: get fix from common\n        chart ver 1.2.3 (#608)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.0\n    created: \"2023-06-28T03:38:02.061455151Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: a8606ca94e93965ed8f64dc53018de54c51d09f740e3aec205a439b79361ef66\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.13.1/bamboo-agent-1.13.1.tgz\n    version: 1.13.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#599)\"\n        - \"Bamboo dashboard (#588)\"\n        - \"Expose JMX beans on http endpoint (#562)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.3.0\n    created: \"2023-06-13T03:59:47.179057405Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.2\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: ee0cefc4f52ec64be8bcf0ac3939717957b783b497388fd6255819fbb2e638d7\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.13.0/bamboo-agent-1.13.0.tgz\n    version: 1.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add priorityClassName to pod spec (#557)\"\n        - \"Add hostAliases for all DC products (#556)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-04-18T04:45:10.268176295Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 31c163636862fdc78f70cbda09477bbd9085798cd70d4f7d04a4d979dc39daff\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.12.0/bamboo-agent-1.12.0.tgz\n    version: 1.12.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#531)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-03-22T04:40:28.33562372Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 89c356fd5951bada668f78e7bc3634ebb9c2b36627d0e5c53e58ca8f77132250\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.11.0/bamboo-agent-1.11.0.tgz\n    version: 1.11.0\n  - annotations:\n      artifacthub.io/changes: '- \"Add Bitbucket Mesh to Bitbucket Helm chart (#501)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-02-20T03:19:50.868119092Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 84aa46fdcbb0ac06ee78babc9186ddb394fb6953ae8f12b6c2dc9b059e4375b2\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.10.0/bamboo-agent-1.10.0.tgz\n    version: 1.10.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Fix artifact hub annotation yaml\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-02-15T23:07:53.036436043Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 9db2e2a78d8fe4227a230e5c4eda84fad4cf0065f00e80a3d80c60f86d07d68e\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.9.1/bamboo-agent-1.9.1.tgz\n    version: 1.9.1\n  - annotations:\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2023-02-15T05:21:09.527933838Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: c9681379639a166ef6a66c17a8a56b445e1cf7371cfb105da68af4c99d23befd\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.9.0/bamboo-agent-1.9.0.tgz\n    version: 1.9.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Fix artifacthub annotations\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.1\n    created: \"2022-12-11T23:57:41.442977Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 6877f92e25c5691ab82045dda8edbe5604865af2a3f5f600b9da09eab7320510\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.8.1/bamboo-agent-1.8.1.tgz\n    version: 1.8.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Stop supporting 1.19 and 1.20 k8s\n        - kind: changed\n          description: Update appVersion to the latest LTS\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.1\n    created: \"2022-12-08T23:43:18.408381Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 421c08eec9320fb3abdbe826603755d0d9e0e41128fd5fffb930c3b0cae03cd1\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.8.0/bamboo-agent-1.8.0.tgz\n    version: 1.8.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Patch release to fix Artifacthub metadata\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.0\n    created: \"2022-10-26T04:39:57.797588847Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: d38ef1cfef552a2761f4a74e0a1fca6d3e8379af143518f102b2c3777869886e\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.7.1/bamboo-agent-1.7.1.tgz\n    version: 1.7.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Pin Python version to 3.9.14\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/468\n        - kind: changed\n          description: Update Bitbucket ingress testing values\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/466\n        - kind: changed\n          description: Ingress Class Name is moved under spec field.\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/451\n        - kind: changed\n          description: Make ATL_FORCE_CFG_UPDATE configurable in values.yaml\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/454\n        - kind: changed\n          description: Add osquery related env vars for Terraform\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/462\n        - kind: changed\n          description: AWS cleanup and log colletion from k8s\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/461\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.0\n    created: \"2022-10-25T00:43:31.774117084Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: d69613d8fe110529a70d46b8258ba20a2ec6204d91324e18c014263bdfce09c6\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.7.0/bamboo-agent-1.7.0.tgz\n    version: 1.7.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Bamboo Agent updated to 9.0.0 version (#455)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.0.0\n    created: \"2022-10-12T01:34:47.275162004Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: d964cbdef8af1478270a02590ee7fd435314472b4e7bb77763e52546aa654810\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.6.0/bamboo-agent-1.6.0.tgz\n    version: 1.6.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Make pod securityContext optional\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/389\n        - kind: changed\n          description: Bamboo Agent updated to 8.2.4 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/430\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.2.4\n    created: \"2022-07-15T04:27:46.516199025Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 003db298d7c25cda145d8fd2fafc6c640e8f0d38c1252cb320f303f37dc9e799\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.5.0/bamboo-agent-1.5.0.tgz\n    version: 1.5.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Make pod securityContext optional\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/389\n        - kind: changed\n          description: Bamboo Agent updated to 8.2.3 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/412\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.2.3\n    created: \"2022-05-25T04:04:15.780042135Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 1312dbc5fb7c4a00fcd86d5d7b23b0b77a9f93567fc31da1f83748e1f2a15eac\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.4.0/bamboo-agent-1.4.0.tgz\n    version: 1.4.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Bamboo Agent updated to 8.1.3 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/396\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.1.3\n    created: \"2022-03-23T21:52:11.466120953Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: fe5d3fb7b050dd01efc19942218e96f37f7a6139a47cb9a02223047e0b002244\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.3.0/bamboo-agent-1.3.0.tgz\n    version: 1.3.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Added service account annotation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/363\n        - kind: changed\n          description: Updated Atlassian charts to use common definitions\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/303\n        - kind: changed\n          description: Improvements on documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/370\n        - kind: added\n          description: Added end-to-end test for Bamboo Helm chart using Terraform\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/375\n        - kind: changed\n          description: Bamboo Agent DC updated to 8.1.2 version (LTS)\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/378\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.1.2-jdk11\n    created: \"2022-02-14T04:05:35.468127149Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 3a0de03133b381e1d88da9c26250f9cfc276055e810bb6e953cabb1d50b00d89\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.2.0/bamboo-agent-1.2.0.tgz\n    version: 1.2.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Support for defining podLabels\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/366\n        - kind: added\n          description: Support for defining podAnnotations\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/341\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.1.1\n    created: \"2022-01-10T23:28:15.4216237Z\"\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: b74b0d053272196be3e09746a5586b74f3e3eee2a5bfeca2e65a8fd57d28e012\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-1.0.0/bamboo-agent-1.0.0.tgz\n    version: 1.0.0\n  - annotations:\n      artifacthub.io/changes: \"- kind: added\\n  description: Support for defining\n        podLabels\\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/366\n        \\       \\n- kind: added\\n  description: Support for defining podAnnotations\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/341\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.1.1\n    created: \"2021-12-17T06:04:32.74097796Z\"\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: 3c2f23e8181e8c3eadf5e1806ca3afdf48d9f9551504ccd6a0c68e06ce76fd6f\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-0.0.2/bamboo-agent-0.0.2.tgz\n    version: 0.0.2\n  - apiVersion: v2\n    appVersion: 8.0.4-jdk11\n    created: \"2021-11-04T03:20:37.590091095Z\"\n    description: A chart for installing Bamboo Data Center remote agents on Kubernetes\n    digest: e78e7b0c724a612b0a8b2740854d65ba77af55ced4fe88f43ebe1da7562d74e9\n    home: https://www.atlassian.com/software/bamboo\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\n    keywords:\n    - Bamboo\n    - Bamboo Agent\n    - Bamboo Data Center\n    - Bamboo DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bamboo-agent\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bamboo-agent-0.0.1/bamboo-agent-0.0.1.tgz\n    version: 0.0.1\n  bitbucket:\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1114)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.2\n    created: \"2026-05-06T12:34:51.171902749Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 61e62c5365fbb77d08829c455dd61d2f8cedd5d11f8aae6548f18b4fb04d1556\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.13/bitbucket-2.0.13.tgz\n    version: 2.0.13\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.1\n    created: \"2026-04-09T06:07:10.266923448Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: be4df737bb93aa9cef57d6d797f79100f57c8e2644528d216dad6cc87812fa10\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.12/bitbucket-2.0.12.tgz\n    version: 2.0.12\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.1\n    created: \"2026-04-07T19:46:27.687255274Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 20cc6e9e7a718c9d8809415d8f47daa8c10de8273d3de3333082a38d3f8377f9\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.11/bitbucket-2.0.11.tgz\n    version: 2.0.11\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"DEVPROD-3580: Add gateway api support (#1084)\"\n        - \"Update appVersions for DC apps (#1100)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.2.1\n    created: \"2026-04-03T12:19:09.172004092Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 553001ac2731d5af2756b9e3b8cb84fcffa52b92589fea5d54c2635c34a5e38f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.10/bitbucket-2.0.10.tgz\n    version: 2.0.10\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"fix nodeport svc (#1076)\"\n        - \"Update appVersions for DC apps (#1075)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.16\n    created: \"2026-02-01T01:11:48.120495584Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: ea31690ce11d7861827abc93f8f771ea08f6601e4f2ec22f55d2a7c23c0efda5\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.9/bitbucket-2.0.9.tgz\n    version: 2.0.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1071)\"\n        - \"feat: Added scrape timeout configuration on servicemonitor (#1067)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.15\n    created: \"2025-12-29T04:49:26.306440798Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 6a4a52300f4d1664d238e9fbbfd7126bb974a95085cbff001fc3a15d52857a65\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.8/bitbucket-2.0.8.tgz\n    version: 2.0.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.12\n    created: \"2025-11-07T09:21:07.076628748Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: a4657ac2fec22ae8e164f9ba20af641276cb911f7b3b44858379dbc48e833828\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.7/bitbucket-2.0.7.tgz\n    version: 2.0.7\n  - annotations:\n      artifacthub.io/changes: '- \"fix: Added default Kubernetes parameters to VolumeClaimTemplate\n        to prevent infinite DRIFT (#1030)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.12\n    created: \"2025-11-03T18:10:23.608155151Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 7805dcd5110f119c57bff3930c9657963570c02adcd930d580df868887d8d6fe\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.6/bitbucket-2.0.6.tgz\n    version: 2.0.6\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1049)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.12\n    created: \"2025-11-01T20:21:44.792784087Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: a18d1fe2fd6d6cb6a0dec69b30cbeed7fc3e4e693b85901bdae9f33905f474b7\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.5/bitbucket-2.0.5.tgz\n    version: 2.0.5\n  - annotations:\n      artifacthub.io/changes: '- \"fix: Update Bitnami image references due to deprecation\n        notice (#1037)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.8\n    created: \"2025-08-27T08:06:51.473588048Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: abcc6c4346ee4ab4e8d2a83ef20ec3ef02740495b825968aa3c75b6e6923740b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.4/bitbucket-2.0.4.tgz\n    version: 2.0.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1022)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.8\n    created: \"2025-08-01T04:22:42.707992701Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 3eb1fd371c18c328555e1f4f6328212d7f598dd4b5546565b3dcff896620edd4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.3/bitbucket-2.0.3.tgz\n    version: 2.0.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1015)\"\n        - \"Make linter happy (#1011)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.7\n    created: \"2025-06-16T21:06:13.660315615Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: fb5aa63b7800de1158b511611bcb855c2d7ce208312bac3793139e54aeb20d9f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.2/bitbucket-2.0.2.tgz\n    version: 2.0.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1006)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.6\n    created: \"2025-05-15T03:13:37.847037428Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 511fb34aad07803b0b50386d22802977afa0e4a35047f42ec3ef662e054a0fe6\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.1/bitbucket-2.0.1.tgz\n    version: 2.0.1\n  - annotations:\n      artifacthub.io/changes: '- \"Remove condition to support legacy securityContext\n        format (#1000)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.5\n    created: \"2025-04-29T02:28:19.742354807Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 77875c02752ac257da0a94dc883392642205075dbc8cae3214312da7125d2f6f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-2.0.0/bitbucket-2.0.0.tgz\n    version: 2.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make it possible to declare additional ingress paths (#991)\"\n        - \"Bring changelog in order (#990)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.5\n    created: \"2025-04-22T03:40:53.76973841Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 6687835d4530afafda828a08cb339a6c6108bc1e12d610836074100cdf1518fe\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.9/bitbucket-1.22.9.tgz\n    version: 1.22.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\"\n        - \"Update appVersions for DC apps (#983)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.5\n    created: \"2025-04-17T00:33:09.677133569Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: cd45b150fbc425437d85d068783b3cd4e59417ff6c6c740568dc67f521c71c4b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.8/bitbucket-1.22.8.tgz\n    version: 1.22.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update documentation related to Bitbucket shared\n        home requirements (#974)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.4\n    created: \"2025-04-01T08:33:29.878663859Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 18a11ec2a808590210ab792ab18c2efcbc3d1bf1e1610a5e91582db259020293\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.7/bitbucket-1.22.7.tgz\n    version: 1.22.7\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.3\n    created: \"2025-03-19T10:58:51.386818175Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 2bdd2ed1145a5cf45871b6d2f2d57aeb07c7cc65511f4dae9ba2f153d7a310c1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.6/bitbucket-1.22.6.tgz\n    version: 1.22.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#959)\"\n        - \"Add tunnel config for Jira, hostNamespaces in all charts (#958)\"\n        - \"Allow setting subPath for local-home volumes (#947)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.3\n    created: \"2025-02-18T02:04:16.48765166Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 1d58bff1245672dc3325176f1b178c2dffce825feccb83b7bde9980ee83caa22\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.5/bitbucket-1.22.5.tgz\n    version: 1.22.5\n  - annotations:\n      artifacthub.io/changes: '- \"Round up fractional cpu values for ActiveProcessorsCount\n        (#944)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.2\n    created: \"2025-01-30T23:57:42.621916794Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 5a3a79a63c70a1fcba0624f1a5ea1582369df6135dce92a74446caeabe8b52cf\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.4/bitbucket-1.22.4.tgz\n    version: 1.22.4\n  - annotations:\n      artifacthub.io/changes: '- \"Set custom securityContext for import-certs init\n        container. Make affinity independent for Synchrony (#938)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.1\n    created: \"2025-01-13T08:43:15.603219743Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 63de1f1840e1e1f9556d78c5b01d5023017a26819275b0b1304d409b170feceb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.3/bitbucket-1.22.3.tgz\n    version: 1.22.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#933)\"\n        - \"Make it possible to set nodePort in services (#931)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.1\n    created: \"2024-12-16T23:16:41.379081439Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 81ccd946d8c461ea7cc6003cca0a504401bc626ac5e75f6c4c1aa63a7a6d8ee0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.2/bitbucket-1.22.2.tgz\n    version: 1.22.2\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update Bitbucket and Confluence LTS versions (#924)\"\n        - \"Update Grafana dashboards for DC apps (#915)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.0\n    created: \"2024-12-03T20:13:30.876064301Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 5663ea7e96980767884f8204c09b90c0c62c81235fc9a3cf608e0d1b5d19a5fe\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.1/bitbucket-1.22.1.tgz\n    version: 1.22.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#905)\"\n        - \"Updated pod labels for all products (#901)\"\n        - \"Unset IDs for all the Grafana dashboards (#889)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.11\n    created: \"2024-11-15T03:00:27.556556823Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: e0d9765a6f1663ca1b443b4e6cc5b3b914ccbf51d1440fd26726dc428777e226\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.22.0/bitbucket-1.22.0.tgz\n    version: 1.22.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#881)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.9\n    created: \"2024-10-01T04:09:19.842986892Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: d88e7adac3e7957e118af42055814b8998b6c6f8eea5d44bd82e07d5155534dd\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.21.4/bitbucket-1.21.4.tgz\n    version: 1.21.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update common dependency version (#878)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.8\n    created: \"2024-09-10T03:33:52.566289635Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: e467a481b67334a2cd5c6b1b37ab75506e9f6ee2746664e4ee9618e786f11bcd\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.21.3/bitbucket-1.21.3.tgz\n    version: 1.21.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#869)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.7\n    created: \"2024-08-26T06:47:23.386166316Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: fabf41cc5ecf8287ded6e5288f3dbd69806614ac98aae959cc76165925a58ea6\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.21.2/bitbucket-1.21.2.tgz\n    version: 1.21.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#865)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.7\n    created: \"2024-08-22T08:41:36.958718788Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: d2078f5f140be2884eccab9e16a315ab98be945fb35136eaa964b88debc80495\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.21.1/bitbucket-1.21.1.tgz\n    version: 1.21.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Added annotations to the StatefulSets (#857)\"\n        - \"Update appVersions for DC apps (#858)\"\n        - \"Make shared home pvc access mode configurable (#855)\"\n        - \"Allow referencing multiple secrets in additionalCertificates (#852)\"\n        - \"Make it possible to define resources for import-certs init container (#851)\"\n        - \"Move update strategy to root level (#849)\"\n        - \"Add helm value for custom jmx jar location when using other jmx init container images (#846)\"\n        - \"feat: add appProtocol for service meshes (#847)\"\n        - \"Make StatefulSet updateStrategy configurable (#845)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.6\n    created: \"2024-08-13T02:16:43.156601357Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: eb0941f719ae1341bde0179c12b98a8f81f5e7fe4eec0863615d88b590367ce3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.21.0/bitbucket-1.21.0.tgz\n    version: 1.21.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#823)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.5\n    created: \"2024-07-07T21:51:06.344744987Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: e54fec2c00eed31b5ea1c0ddffbcacbe622b69f511197dadadc1277cd9ff3922\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.20.1/bitbucket-1.20.1.tgz\n    version: 1.20.1\n  - annotations:\n      artifacthub.io/changes: '- \"Optionally install OpenSearch helm chart with Bitbucket\n        (#804)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.3\n    created: \"2024-05-13T22:07:16.858720085Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.install\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 0bc764c505317aeb106f739e8a3578e10b1bc79c91cf16f56e19ce5f695e149c\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.20.0/bitbucket-1.20.0.tgz\n    version: 1.20.0\n  - annotations:\n      artifacthub.io/changes: '- \"Make cacerts writable for user and group (#790)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.1\n    created: \"2024-04-22T06:38:05.932418911Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 8c02d2e6f0a147d55c71f18f5b36ce66154d2b1ebacc4a8c64cd3f280be3b8dd\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.19.0/bitbucket-1.19.0.tgz\n    version: 1.19.0\n  - annotations:\n      artifacthub.io/changes: '- \"Get rid of server repo references (#777)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.19.0\n    created: \"2024-03-26T03:31:04.761599326Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 8007b3c6fc859149ba855ee0a0559bedaa218f2344020a9be30752c03660ebf4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.18.1/bitbucket-1.18.1.tgz\n    version: 1.18.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add Openshift analytics (#763)\"\n        - \"Update appVersions for DC apps (#765)\"\n        - \"OpenShift Support (#752)\"\n        - \"Use testPods values for test images and container resources (#761)\"\n        - \"Relabel instance name on jmx service monitor (#757)\"\n        - \"Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.10\n    created: \"2024-02-27T22:52:07.504719398Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 88761c10f6d9db31a4074f0206890b8e05f6d734981a7d524bdcd0b99dd8911a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.18/bitbucket-1.18.tgz\n    version: \"1.18\"\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"StatefulSet PVC auto deletion (#736)\"\n        - \"Update appVersions for DC apps (#738)\"\n        - \"Add optional postStart hook (#735)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.8\n    created: \"2023-12-18T05:54:10.091163477Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 320952d414fd96a37f892e7bcc64926c61d4d05514bf7ee68639030322b18440\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.17.2/bitbucket-1.17.2.tgz\n    version: 1.17.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make liveness probe configurable (#732)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.7\n    created: \"2023-12-11T00:31:04.773410767Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 99c9ba0a242a44d676c21521b6e926ffe09d4536bd49536d23f9e8178e3fe0bb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.17.1/bitbucket-1.17.1.tgz\n    version: 1.17.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make test pod metadata and spec configurable (#727)\"\n        - \"Optional analytics/support ConfigMap (#721)\"\n        - \"Fix ingress annotations comment (#720)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.7\n    created: \"2023-12-07T00:11:47.653317853Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: ea86ccb9ed12ffd1fb8bb139bc1c98cbff10a83fdea2b72947cccbe5d80c1e53\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.17.0/bitbucket-1.17.0.tgz\n    version: 1.17.0\n  - annotations:\n      artifacthub.io/changes: '- \"JMX container resources (#707)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.6\n    created: \"2023-10-30T20:13:52.741319919Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: b95f1fd46c49424d50b75784b194e4c3996d074633071993af16984bcc820103\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.16.6/bitbucket-1.16.6.tgz\n    version: 1.16.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Fix custom jmx config (#699)\"\n        - \"Fix jmx init container for Bitbucket mirror (#695)\"\n        - \"Copy cacerts first, then import certs (#696)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.6\n    created: \"2023-10-24T05:50:00.119722256Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 7c7e67118cc2f0d9e91a6a2379e5dae1eb38f937ad5cf481ab4c081c8a640bed\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.16.5/bitbucket-1.16.5.tgz\n    version: 1.16.5\n  - annotations:\n      artifacthub.io/changes: '- \"Fix hazelcast svc type (#689)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.5\n    created: \"2023-10-11T21:45:46.999253311Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: cdb46a18173745d03345b4fe2331b54b4f77301b642a1941c7f2a55a116f09b4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.16.4/bitbucket-1.16.4.tgz\n    version: 1.16.4\n  - annotations:\n      artifacthub.io/changes: '- \"Make it possible to create a dedicated hazelcast\n        svc (#686)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.5\n    created: \"2023-10-11T01:56:38.451984632Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: a2891223576d6aec610eda79a7d92934ea96f52497690c8d4c70ce37fd66e4c6\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.16.3/bitbucket-1.16.3.tgz\n    version: 1.16.3\n  - annotations:\n      artifacthub.io/changes: '- \"Add quote to podAnnotation templating (#678)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.5\n    created: \"2023-10-08T21:12:05.456252801Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: b3804eead09737b0a272cb3a485b7e483ac0f899852c14aaa42b60ddeee90239\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.16.2/bitbucket-1.16.2.tgz\n    version: 1.16.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make it possible to use one Bitbucket svc for http\n        and ssh without an ingress (#675)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.5\n    created: \"2023-09-20T23:33:31.000730872Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 39781034c0646b37ea9141a26dbc1f0ae934f3e91f60d1e97bc492268807a763\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.16.1/bitbucket-1.16.1.tgz\n    version: 1.16.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Allow templating of pod annotations (#662)\"\n        - \"Make securityContext configurable for jmx exporter init container (#670)\"\n        - \"Add user provided certificates to the default Java truststore (#663)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.5\n    created: \"2023-09-18T06:13:48.907357564Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: bdaf70e4dc3e2fbd370ad8bd210a6b173dc35e07dca21470def9fd41c092d2cb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.16.0/bitbucket-1.16.0.tgz\n    version: 1.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Decouple server and jmx annotations (#654)\"\n        - \"Disable startup probes by default (#653)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.4\n    created: \"2023-08-28T05:35:48.94525614Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: eca58b70e4ebc37b76ced10399aadf010f4d179656ef520f1050b9120853f28e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.15.3/bitbucket-1.15.3.tgz\n    version: 1.15.3\n  - annotations:\n      artifacthub.io/changes: '- \"Add defaultMode to additionalConfigMaps (#647)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.4\n    created: \"2023-08-22T05:27:07.139332059Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 085b436df02cdeb722985dd9024789ca2d32cf97c259a1a9539191294f5c1931\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.15.2/bitbucket-1.15.2.tgz\n    version: 1.15.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make startup probes optional (#646)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.4\n    created: \"2023-08-17T21:54:15.974157721Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: d8d0c71d6f2eec896a5ec03206a721027c063f399ceffe308f02e0cd2847f6b4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.15.1/bitbucket-1.15.1.tgz\n    version: 1.15.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\"\n        - \"Add annotations to Grafana dashboards ConfigMaps (#637)\"\n        - \"Add additional ConfigMaps to Helm Charts (#635)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.3\n    created: \"2023-08-07T23:31:32.635097351Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: ad848a5292d4335e65e822507007882c17a5fc93352b3accc9625727bff04d97\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.15.0/bitbucket-1.15.0.tgz\n    version: 1.15.0\n  - annotations:\n      artifacthub.io/changes: '- \"Disable liveness probes by default, make timeoutSeconds\n        configurable (#630)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.3\n    created: \"2023-07-26T00:47:38.875050502Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 5f90cf0c099c53fd1cee0399b449068e0f7d00d650572b544237fb97178cc397\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.14.1/bitbucket-1.14.1.tgz\n    version: 1.14.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add liveness probes, make readinessProbes configurable (#626)\"\n        - \"make sharedHome.permissionFix.command helper to be per-product (#622)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.3\n    created: \"2023-07-25T09:31:55.060803267Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 63b2efaa755b75686eba65c8a0637bca1cb5f7fd2495ad3dd922bdad985a22a0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.14.0/bitbucket-1.14.0.tgz\n    version: 1.14.0\n  - annotations:\n      artifacthub.io/changes: '- \"Run jmx init container as root: get fix from common\n        chart ver 1.2.3 (#608)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.2\n    created: \"2023-06-28T03:38:02.281006037Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 041c9c4a44446333169390cb8ad7097e9390341f06057f9a5b7f3f25eb488af7\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.13.1/bitbucket-1.13.1.tgz\n    version: 1.13.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#599)\"\n        - \"Bamboo dashboard (#588)\"\n        - \"Update Grafana dashboards for Bitbucket (#586)\"\n        - \"Add Bitbucket Mesh Grafana dashboards (#583)\"\n        - \"Add Bitbucket server dashboards to Helm chart (#585)\"\n        - \"Pass javaagent to mesh JVM (#584)\"\n        - \"Make sessionAffinity configurable in service spec (#582)\"\n        - \"Add optional ServiceMonitors to DC Helm Charts (#573)\"\n        - \"Expose JMX beans on http endpoint (#562)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.1\n    created: \"2023-06-13T03:59:47.429254353Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.2\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: cfa19322fbbd3926d7f0bfd426557a6b5da8ff126c3861ab08c48a9b52151872\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.13.0/bitbucket-1.13.0.tgz\n    version: 1.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add priorityClassName to pod spec (#557)\"\n        - \"Add hostAliases for all DC products (#556)\"\n        - \"Update appVersions for DC apps (#558)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.9.0\n    created: \"2023-04-18T04:45:10.451042173Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 92fb57f07692c43b5ea11ad5b1768cbe8199eb1fbd29cfa701fbf23adfb2c0ae\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.12.0/bitbucket-1.12.0.tgz\n    version: 1.12.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#531)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.10\n    created: \"2023-03-22T04:40:28.540572578Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: f5c1d9a1155eaabe141cdc674930aa40373b1d7be36a2a452b05b64785ff5049\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.11.0/bitbucket-1.11.0.tgz\n    version: 1.11.0\n  - annotations:\n      artifacthub.io/changes: '- \"Add Bitbucket Mesh to Bitbucket Helm chart (#501)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.10\n    created: \"2023-02-20T03:19:51.181924227Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: a322300c2153031ad63537f4e3801f17b06175270d9e038f098f2a7d16ac3f33\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.10.0/bitbucket-1.10.0.tgz\n    version: 1.10.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Fix artifact hub annotation yaml\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.10\n    created: \"2023-02-15T23:07:53.352608968Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: bb63cd5821fb56683387c9d551d1cd2da1324ec3bc55ac8958c2780967fce4be\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.9.1/bitbucket-1.9.1.tgz\n    version: 1.9.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update appVersion to the latest LTS\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.10\n    created: \"2023-02-15T05:21:09.840038828Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 9fbff4eae56e74528602d1787fc918be0148778cec3a61b64caea3f4e76e763c\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.9.0/bitbucket-1.9.0.tgz\n    version: 1.9.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Fix artifacthub annotations\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.7\n    created: \"2022-12-11T23:57:41.934061Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 97347465da266c86eaacecca08dbbec7ff9e289d99f76c27bd7d1f8f6b893a9a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.8.1/bitbucket-1.8.1.tgz\n    version: 1.8.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Stop supporting 1.19 and 1.20 k8s\n        - kind: changed\n          description: Create Role instead of ClusterRole for Hazelcast Kube client in Confluence and Bitbucket Helm charts\n        - kind: changed\n          description: Update appVersion to the latest LTS\n        - kind: changed\n          description: Remove deprecated Elasticsearch env var\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.7\n    created: \"2022-12-08T23:43:18.917145Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: c78a5823419dc5635bc948cb772fb1848a1a7d9521336058566222da9d727f93\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.8.0/bitbucket-1.8.0.tgz\n    version: 1.8.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Patch release to fix Artifacthub metadata\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.5\n    created: \"2022-10-26T04:39:58.094157689Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: d26ec952897df1b37edc5f55b559bd629e11412580da5804542f03c9ac14e834\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.7.1/bitbucket-1.7.1.tgz\n    version: 1.7.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Pin Python version to 3.9.14\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/468\n        - kind: changed\n          description: Update Bitbucket ingress testing values\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/466\n        - kind: changed\n          description: Ingress Class Name is moved under spec field.\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/451\n        - kind: changed\n          description: Make ATL_FORCE_CFG_UPDATE configurable in values.yaml\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/454\n        - kind: changed\n          description: Add osquery related env vars for Terraform\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/462\n        - kind: changed\n          description: AWS cleanup and log colletion from k8s\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/461\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.5\n    created: \"2022-10-25T00:43:32.094564356Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 0a700c6ca83d997be354fd20d13b9110b442160e9109d1ba4ec54dc7828ae115\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.7.0/bitbucket-1.7.0.tgz\n    version: 1.7.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Bitbucket updated to 7.21.5 version (#455)\"\n        - \"Ingress Class Name is moved under spec (#450)\"\n        - \"Improved documentation (#448)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.5\n    created: \"2022-10-12T01:34:47.589703469Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 61bb9ed472834b24d5319fc8e4ccba832107010bdeb215b2fea6a67fba2b771e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.6.0/bitbucket-1.6.0.tgz\n    version: 1.6.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Use the custom ports for Bitbucket service\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/419\n        - kind: changed\n          description: Bitbucket updated to 7.21.2 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/430\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.2\n    created: \"2022-07-15T04:27:46.816206011Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 2da887323828fdc0f7cbb7aa2000f9f8c5585e17c5f9794234a7974c59782085\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.5.0/bitbucket-1.5.0.tgz\n    version: 1.5.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Remove emptyDir from Bitbucket shared home volume options\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/386\n        - kind: added\n          description: Make pod securityContext optional\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/389\n        - kind: added\n          description: Support for configuring ingress proxy settings via values.yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/402\n        - kind: changed\n          description: Update Bitbucket version to 7.21.0\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/412\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.1\n    created: \"2022-05-25T04:04:16.125623817Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: b2758fb11d94d58899253ec44444d44d6d49b7ff820152bf765a518b07e7ab08\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.4.0/bitbucket-1.4.0.tgz\n    version: 1.4.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update Bitbucket version to 7.21.0\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/396\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.21.0\n    created: \"2022-03-23T21:52:11.765506826Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 20748ed95a2782e25ca839d1bae59234f916af6c5db05c8f381063faaf80f517\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.3.0/bitbucket-1.3.0.tgz\n    version: 1.3.0\n  - annotations:\n      artifacthub.io/changes: \"- kind: added\\n  description: Add new feature additionalPorts\n        (for jmx-monitoring) \\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/353\\n-\n        kind: changed\\n  description: Set ActiveProcessorCount automatically based\n        on Values.<product>.resources.container.requests.cpu\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/352\\n-\n        kind: added\\n  description: Added topologySpreadConstraints to products\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/351\\n-\n        kind: changed\\n  description: Define podAnnotations as template to allow overrides\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/341\\n-\n        kind: added\\n  description: Added new feature to define loadBalancerIP\\n  links:\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/365\\n-\n        kind: added\\n  description: Added new feature podLabels\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/364\\n-\n        kind: added\\n  description: Added new feature additionalVolumeClaimTemplates\n        and provided example in documentation\\n  links:\\n  - name: Github PR\\n    url:\n        https://github.com/atlassian/data-center-helm-charts/pull/334\\n  - name: Github\n        PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/368\\n-\n        kind: added\\n  description: Added service account annotation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/363\\n-\n        kind: changed\\n  description: Updated Atlassian charts to use common definitions\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/303\\n-\n        kind: changed\\n  description: Improvements on documentation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/370\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/357\\n-\n        kind: changed\\n  description: Bitbucket DC updated to 7.17.5 version (LTS)\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/378\\n-\n        kind: fixed\\n  description: Fix templating of PLUGIN_SSH_BASEURL with custom\n        port\\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/371\\n-\n        kind: fixed\\n  description: Use volumeName only if explicitly defined\\n  links:\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/372\\n\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.17.5-jdk11\n    created: \"2022-02-14T04:05:35.796883262Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 59a108530e7b10978d9e37b596a8ec40bee145862fd8246d4ad7922693d6a596\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.2.0/bitbucket-1.2.0.tgz\n    version: 1.2.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add support for custom schedulerName\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/301\n        - kind: added\n          description: Enable configuring ingress.class name\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/313\n        - kind: added\n          description: Add support for context path\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/314\n        - kind: changed\n          description: Make security context more flexible\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/321\n        - kind: added\n          description: Roll Statefulset Pods if ConfigMap changes\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/315\n        - kind: added\n          description: Add support for Bitbucket Mirrors\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/265\n        - kind: changed\n          description: Bitbucket DC updated to 7.17.1 version (LTS)\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/345\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.17.1-jdk11\n    created: \"2021-11-04T03:20:37.944149684Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: fa5a6ba34b749ee9690dda3988ed58fd3bb046147930451add4a23508d387712\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.1.0/bitbucket-1.1.0.tgz\n    version: 1.1.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Improvements to graceful shutdown\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/282\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/275\n            url: https://github.com/atlassian/data-center-helm-charts/pull/276\n            url: https://github.com/atlassian/data-center-helm-charts/pull/277\n            url: https://github.com/atlassian/data-center-helm-charts/pull/279\n            url: https://github.com/atlassian/data-center-helm-charts/pull/280\n            url: https://github.com/atlassian/data-center-helm-charts/pull/284\n            url: https://github.com/atlassian/data-center-helm-charts/pull/285\n            url: https://github.com/atlassian/data-center-helm-charts/pull/289\n            url: https://github.com/atlassian/data-center-helm-charts/pull/290\n            url: https://github.com/atlassian/data-center-helm-charts/pull/291\n            url: https://github.com/atlassian/data-center-helm-charts/pull/293\n            url: https://github.com/atlassian/data-center-helm-charts/pull/295\n    apiVersion: v2\n    appVersion: 7.15.1-jdk11\n    created: \"2021-09-07T01:03:16.7848423Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: e181e408c629e28728103d52873981c66f860cf13d4b9cb6073d78cbffab5b8a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-1.0.0/bitbucket-1.0.0.tgz\n    version: 1.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Enable NFS permission fixer by default\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/241\n        - kind: changed\n          description: Enable configuration for SET_PERMISSIONS docker image variable\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/261\n        - kind: added\n          description: Configurable grace periods\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/249\n        - kind: changed\n          description: Update the Bitbucket image name, as the '-server' suffix is now deprecated\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/259\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/236\n            url: https://github.com/atlassian/data-center-helm-charts/pull/243\n            url: https://github.com/atlassian/data-center-helm-charts/pull/245\n            url: https://github.com/atlassian/data-center-helm-charts/pull/252\n            url: https://github.com/atlassian/data-center-helm-charts/pull/253\n            url: https://github.com/atlassian/data-center-helm-charts/pull/256\n            url: https://github.com/atlassian/data-center-helm-charts/pull/258\n            url: https://github.com/atlassian/data-center-helm-charts/pull/260\n            url: https://github.com/atlassian/data-center-helm-charts/pull/263\n            url: https://github.com/atlassian/data-center-helm-charts/pull/268\n            url: https://github.com/atlassian/data-center-helm-charts/pull/270\n            url: https://github.com/atlassian/data-center-helm-charts/pull/272\n    apiVersion: v2\n    appVersion: 7.15.1-jdk11\n    created: \"2021-08-27T05:31:24.877001Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 302012f67d20f9db07e72daeb0b163d415bed45f922d8b13401751541e28334f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.16.0/bitbucket-0.16.0.tgz\n    version: 0.16.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Add support for providing a custom fluentd start command\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/218\n        - kind: changed\n          description: Make some deployment params configurable\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/226\n        - kind: changed\n          description: Renamed the 'master' branch to 'main'\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/232\n        - kind: changed\n          description: Update eks cluster yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/227\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/206\n            url: https://github.com/atlassian/data-center-helm-charts/pull/222\n            url: https://github.com/atlassian/data-center-helm-charts/pull/223\n            url: https://github.com/atlassian/data-center-helm-charts/pull/228\n            url: https://github.com/atlassian/data-center-helm-charts/pull/229\n            url: https://github.com/atlassian/data-center-helm-charts/pull/231\n            url: https://github.com/atlassian/data-center-helm-charts/pull/233\n            url: https://github.com/atlassian/data-center-helm-charts/pull/235\n    apiVersion: v2\n    appVersion: 7.15.1-jdk11\n    created: \"2021-08-17T01:45:26.5328453Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 953f36be69e7b720f56659d430f84abd3afdf6ef4e4dd4bf98e3da50b42006af\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.15.0/bitbucket-0.15.0.tgz\n    version: 0.15.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Update Bitbucket version to 7.14.1-jdk11\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/212\n    apiVersion: v2\n    appVersion: 7.14.1-jdk11\n    created: \"2021-07-23T07:52:09.7960143Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: c5eedd6c405ed7231cfa9ad5fc0ad5da8adf9c5f5322ba98c40d2cd5b5e40a52\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.14.0/bitbucket-0.14.0.tgz\n    version: 0.14.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Bitbucket NFS server chart\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/205\n        - kind: changed\n          description: Volume docs updates\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/188\n    apiVersion: v2\n    appVersion: 7.12.1-jdk11\n    created: \"2021-07-22T05:12:22.088028881Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 3f7d33567342c9aa704ce536769254db61aa01411e2b7832464b1a05ce66c06d\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.13.0/bitbucket-0.13.0.tgz\n    version: 0.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Defining the following values in the helpers template for each chart, to allow template overrides\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/173\n        - kind: fixed\n          description: Wording improvement for warning in NOTES when PV is not used\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/199\n        - kind: fixed\n          description: Improve readability of values.yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/182\n    apiVersion: v2\n    appVersion: 7.12.1-jdk11\n    created: \"2021-07-06T17:30:00.088909+10:00\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: cac6244cc0173294cdd06e98abe49c1cea005abd4a62112b0e628729457d6daf\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.12.0/bitbucket-0.12.0.tgz\n    version: 0.12.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add warning to NOTES when no persistent volumes are configured\n        - kind: added\n          description: Print service URL after helm installation\n        - kind: added\n          description: Add Bitbucket SSH service and custom annotations\n        - kind: added\n          description: Improved documentation\n    apiVersion: v2\n    appVersion: 7.12.1-jdk11\n    created: \"2021-06-17T02:07:46.25145972Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 24bfb99a7a8d0f72279f2814c8d239c6955f1ec5464de5c70762034ca09ce715\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.11.0/bitbucket-0.11.0.tgz\n    version: 0.11.0\n  - apiVersion: v2\n    appVersion: 7.12.1-jdk11\n    created: \"2021-06-01T10:24:24.875323466Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: 24bfad742a7d728b0628955fa833fabe1517f6bffb5448c37fc021efaba5dabf\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://wac-cdn.atlassian.com/dam/jcr:bf39fc40-3871-491f-98e3-fb2293f57a00/bitbucket-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.10.0/bitbucket-0.10.0.tgz\n    version: 0.10.0\n  - apiVersion: v2\n    appVersion: 7.12.1-jdk11\n    created: \"2021-05-25T06:48:58.1237891Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: b36b2938dffb57aa6532eb9a166b1687a769335ab8e850ca579de9d4e9f3b46a\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://wac-cdn.atlassian.com/dam/jcr:bf39fc40-3871-491f-98e3-fb2293f57a00/bitbucket-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.9.0/bitbucket-0.9.0.tgz\n    version: 0.9.0\n  - apiVersion: v2\n    appVersion: 7.12.1-jdk11\n    created: \"2021-05-20T04:12:35.9432569Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: a534eaaf0a2bfe62be6cbc06b1a49549d2e5703a414c35650dc2d227284da78d\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://wac-cdn.atlassian.com/dam/jcr:bf39fc40-3871-491f-98e3-fb2293f57a00/bitbucket-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Bitbucket DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.8.0/bitbucket-0.8.0.tgz\n    version: 0.8.0\n  - apiVersion: v2\n    appVersion: 7.12.1-jdk11\n    created: \"2021-05-07T03:33:45.7387084Z\"\n    description: A chart for installing Bitbucket Data Center on Kubernetes\n    digest: a4f92322bc95dc7d004a75caf163df449ad00f2b71d122621d8b58ddd5808d98\n    home: https://www.atlassian.com/software/bitbucket\n    icon: https://wac-cdn.atlassian.com/dam/jcr:bf39fc40-3871-491f-98e3-fb2293f57a00/bitbucket-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.7.0/bitbucket-0.7.0.tgz\n    version: 0.7.0\n  - apiVersion: v2\n    appVersion: 7.7.0-jdk11\n    created: \"2021-05-04T05:38:38.36913736Z\"\n    description: A chart for installing Bitbucket DC on Kubernetes\n    digest: d9114ac387352d7cdc59ba27c753d0aa503cab7116cf63dbf8257c3744063341\n    home: https://github.com/atlassian/data-center-helm-charts\n    keywords:\n    - Bitbucket\n    - Bitbucket Server\n    - Bitbucket Data Center\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: bitbucket\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/bitbucket-0.6.0/bitbucket-0.6.0.tgz\n    version: 0.6.0\n  common:\n  - apiVersion: v2\n    appVersion: 1.2.7\n    created: \"2024-09-10T03:21:40.202612941Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: 3a6f8f3384fa5db07850bf592885793c7493a059c7009b54167d31376aa77fe7\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.7/common-1.2.7.tgz\n    version: 1.2.7\n  - apiVersion: v2\n    appVersion: 1.2.6\n    created: \"2024-01-29T19:13:41.138504802Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: be478e6a3e0a5921ed85f5a801a4d6ffd3dfbcd44e47d7859a0b6245c5ea28df\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.6/common-1.2.6.tgz\n    version: 1.2.6\n  - apiVersion: v2\n    appVersion: 1.2.5\n    created: \"2023-10-30T19:44:03.878172571Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: f436d831652c31049b25347bd5a4c5ec7eb0ec697198c0a7d12c60d412c482fe\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.5/common-1.2.5.tgz\n    version: 1.2.5\n  - apiVersion: v2\n    appVersion: 1.2.4\n    created: \"2023-09-18T00:30:06.554790636Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: 60a5076eebad02500274d356773b5caee6b2ff8d15dc3c35bb103cf94250d18a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.4/common-1.2.4.tgz\n    version: 1.2.4\n  - apiVersion: v2\n    appVersion: 1.2.3\n    created: \"2023-06-28T02:23:46.965935055Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: 24511fd59ecf91c7d814992d5c77aa458d798d97a2688efde116efeea822f9ea\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.3/common-1.2.3.tgz\n    version: 1.2.3\n  - apiVersion: v2\n    appVersion: 1.2.2\n    created: \"2023-04-24T09:32:38.985447107Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: 023beb65b0d74db7874b1b0075963fffb75ee797946c820b7543b7588de6151b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.2/common-1.2.2.tgz\n    version: 1.2.2\n  - apiVersion: v2\n    appVersion: 1.2.1\n    created: \"2023-04-24T08:33:33.473214164Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: 4c74bca2b6575a497064afcc16ba77f78e2e1d8bb2c87526dc041eb02dba2caa\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.1/common-1.2.1.tgz\n    version: 1.2.1\n  - apiVersion: v2\n    appVersion: 1.2.0\n    created: \"2023-04-24T07:33:06.690815711Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: a952bbad62e85fb4ba5d3eb114f45ec55e04544528778ca46a34956e2fe1a835\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.2.0/common-1.2.0.tgz\n    version: 1.2.0\n  - apiVersion: v2\n    appVersion: 1.1.0\n    created: \"2023-04-18T04:45:10.627847582Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: d6273da747afa6572394077af7154d07380263a8afb4c09a647c18b0704502fe\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.1.0/common-1.1.0.tgz\n    version: 1.1.0\n  - apiVersion: v2\n    appVersion: 1.0.0\n    created: \"2021-12-17T06:25:44.697113414Z\"\n    description: A Library Helm Chart for grouping common logic between Atlassian\n      charts. This chart is not deployable by itself.\n    digest: ab3f5464697d37aa729af5c37b8ec0956f1565a1cf66a92838949e97efbfff6a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\n    keywords:\n    - common\n    - helper\n    - template\n    - function\n    - Atlassian\n    name: common\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: library\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/common-1.0.0/common-1.0.0.tgz\n    version: 1.0.0\n  confluence:\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1113)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 10.2.10\n    created: \"2026-05-06T12:34:51.509918162Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 3.5.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 6b88425f24474d1fab79d6b8944e29a92f833fbdadfa6daa244cde5cf561d3b3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.13/confluence-2.0.13.tgz\n    version: 2.0.13\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 10.2.8\n    created: \"2026-04-09T06:07:10.644901927Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 3.5.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 8a1505a4b4d64e84e6f6025e46b63f67ea53029995bc10ec5bb4de32d14e9f9a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.12/confluence-2.0.12.tgz\n    version: 2.0.12\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1107)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 10.2.8\n    created: \"2026-04-07T19:46:28.024470526Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 3.5.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f5fbd63635b48cdb18c7521e5dd2cc6bf64282fb21a7da1d6ef1ebd6c145c458\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.11/confluence-2.0.11.tgz\n    version: 2.0.11\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"DEVPROD-3580: Add gateway api support (#1084)\"\n        - \"DCDORA-2747 Use OpenSearch 3.5.0 for Confluence (#1092)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 10.2.7\n    created: \"2026-04-03T12:19:09.492069349Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 3.5.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f1cb96cdaac2b8a78e2ba52c8afae0ad5bbedfc6537e61ef5056287a79887753\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.10/confluence-2.0.10.tgz\n    version: 2.0.10\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 10.2.2\n    created: \"2026-02-01T01:11:48.406082946Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: eae099dd300d4a42c4c59ee65106170b48796909e756a919a1bf46a36e138ff0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.9/confluence-2.0.9.tgz\n    version: 2.0.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1071)\"\n        - \"feat: Added scrape timeout configuration on servicemonitor (#1067)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 10.2.2\n    created: \"2025-12-29T04:49:26.577385628Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f44dd3e183ff0c213d10a08b2cb26375a56997bb79c0d83c62e1d67f271b5469\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.8/confluence-2.0.8.tgz\n    version: 2.0.8\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1058)\"\n        - \"Synchrony: support additional env vars (#1057)\"\n        - \"fix: move ErrorReportValve to the correct line (#1055)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.10\n    created: \"2025-11-07T09:21:07.52765654Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 389a216252a90533b65904e99abddf24c4dc7798680281e69ba3090253499617\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.7/confluence-2.0.7.tgz\n    version: 2.0.7\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"fix: Add missing ErrorReportValve to default server.xml #1047 (#1047)\"\n        - \"fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.9\n    created: \"2025-11-03T18:10:24.08160124Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: baa57fede1d9f4d83c4a2235309720c26c6f3d3eccfe86382508e69ef9efe6ab\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.6/confluence-2.0.6.tgz\n    version: 2.0.6\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1049)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.9\n    created: \"2025-11-01T20:21:45.134944821Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 619c0b1b2b4a4517c45451b77864b335509d56a4a0efc1fd3f8b14d29a4db599\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.5/confluence-2.0.5.tgz\n    version: 2.0.5\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"fix: Update Bitnami image references due to deprecation notice (#1037)\"\n        - \"Update appVersions for DC apps (#1029)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.7\n    created: \"2025-08-27T08:06:51.798134637Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 53fe2a52ef622fa13a0c05d724f0f36ccd2bf6e95ab543e9bff8ac23e6e0074a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.4/confluence-2.0.4.tgz\n    version: 2.0.4\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Fix Confluence UID (#1024)\"\n        - \"Update appVersions for DC apps (#1021)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.6\n    created: \"2025-08-01T04:22:42.990742631Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: b71c5eaa89db22257dc6941303749fde15411acc6ca79b428afc4f1f41b1fe7e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.3/confluence-2.0.3.tgz\n    version: 2.0.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1014)\"\n        - \"Make linter happy (#1011)\"\n        - \"Quote int in session vars (#1009)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.5\n    created: \"2025-06-16T21:06:13.931769358Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: b24db34263cdaa34756eb48107fcd961f9a252033adec6fe30ffe34ebf1a23e3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.2/confluence-2.0.2.tgz\n    version: 2.0.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1004)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.4\n    created: \"2025-05-15T03:13:38.110730745Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 6bffc516e183401f7c01a131e41e3d2a77ea02d3249c1816b12c28be6587c126\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.1/confluence-2.0.1.tgz\n    version: 2.0.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Pass OpenSearch details as env vars (#999)\"\n        - \"Remove condition to support legacy securityContext format (#1000)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.3\n    created: \"2025-04-29T02:28:19.958402878Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 28ecec9f63a2e0bbbf4c980227d3edccd5ea7a2c90866c2dd71d35000af8b594\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-2.0.0/confluence-2.0.0.tgz\n    version: 2.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make session and autologin configurable for Jira and Confluence (#992)\"\n        - \"Make it possible to declare additional ingress paths (#991)\"\n        - \"Bring changelog in order (#990)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.3\n    created: \"2025-04-22T03:40:54.203096901Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 8b2877e10b00e2467aafc5a048fdd1226b478838735b0ec12a2974ef2848c807\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.9/confluence-1.22.9.tgz\n    version: 1.22.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\"\n        - \"Update appVersions for DC apps (#981)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.3\n    created: \"2025-04-17T00:33:09.940714196Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 9c76049701491a9efa6e7883d319627063c81baf45c6e9e29590bae473b94e6b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.8/confluence-1.22.8.tgz\n    version: 1.22.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.2\n    created: \"2025-04-01T08:33:30.191850829Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 2f2279656b2b49565968acede6da435a4a9ab394b9f448a1770b2635193dbd8f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.7/confluence-1.22.7.tgz\n    version: 1.22.7\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#969)\"\n        - \"Added synchrony.service.url option (#965)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.2\n    created: \"2025-03-19T10:58:51.609817048Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 71bf3a376decc3f2c7f4c6b3516b50cd91f4338f210390fb68b3ec40f56ea84d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.6/confluence-1.22.6.tgz\n    version: 1.22.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make access log pattern configurable for Jira and Confluence when running as non root (#961)\"\n        - \"Add tunnel config for Jira, hostNamespaces in all charts (#958)\"\n        - \"Make it possible to enable tunneliing (#954)\"\n        - \"Allow setting subPath for local-home volumes (#947)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.1\n    created: \"2025-02-18T02:04:16.732667798Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: b675777e54ad474ad07ef27f280ed0409629bb4b0c6d67bd15b0834d5c37d491\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.5/confluence-1.22.5.tgz\n    version: 1.22.5\n  - annotations:\n      artifacthub.io/changes: '- \"Round up fractional cpu values for ActiveProcessorsCount\n        (#944)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.0\n    created: \"2025-01-30T23:57:42.836337162Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 707bcad6798424718fd1c1b6de058ae718cee874ac5a893f77534b6e0d086dfa\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.4/confluence-1.22.4.tgz\n    version: 1.22.4\n  - annotations:\n      artifacthub.io/changes: '- \"Set custom securityContext for import-certs init\n        container. Make affinity independent for Synchrony (#938)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.0\n    created: \"2025-01-13T08:43:15.866748339Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 10bef34ef3706cb3b118341bdc1567398887f3e4599f5b88cc48c4c216c3e837\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.3/confluence-1.22.3.tgz\n    version: 1.22.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#933)\"\n        - \"Make it possible to set nodePort in services (#931)\"\n        - \"Make access log attributes configurable (#932)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 9.2.0\n    created: \"2024-12-16T23:16:41.784582078Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: afd24838b22a70a6829f65577e29743b3bab3999e611d2c5958af913175ca063\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.2/confluence-1.22.2.tgz\n    version: 1.22.2\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update Bitbucket and Confluence LTS versions (#924)\"\n        - \"Make make stuckthreaddetectionvalve configurable (#921)\"\n        - \"Update Grafana dashboards for DC apps (#915)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.18\n    created: \"2024-12-03T20:13:31.180538892Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: fb536329ace7b8fb5e08d71bb45836fdf083deb2972076e3c1b1e0f4bf12de5e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.1/confluence-1.22.1.tgz\n    version: 1.22.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#905)\"\n        - \"Updated pod labels for all products (#901)\"\n        - \"Fix shutdown with jmx javaagent enabled (#899)\"\n        - \"Unset IDs for all the Grafana dashboards (#889)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.17\n    created: \"2024-11-15T03:00:27.839132718Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: b70eb9bec7917b77f12166f02375d89327dfb4b0859dee2f2cac160f71817888\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.22.0/confluence-1.22.0.tgz\n    version: 1.22.0\n  - annotations:\n      artifacthub.io/changes: '- \"Create a dedicated Synchrony ingress (#883)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.15\n    created: \"2024-10-01T04:09:20.095335884Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: c3afb08a0778b3580944d7deb0d8d231da7b5721b5558b4daac346c347b7ec56\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.21.4/confluence-1.21.4.tgz\n    version: 1.21.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update common dependency version (#878)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.15\n    created: \"2024-09-10T03:33:52.789692709Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 13d57f2719870ed2a0d972f4ff1327638da88e64f30397360a3e05928188f737\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.21.3/confluence-1.21.3.tgz\n    version: 1.21.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#869)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.14\n    created: \"2024-08-26T06:47:23.798132143Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: aff59ed08ced0975dfb6521402c97031962ef8d07ca48fac47126126f25402a7\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.21.2/confluence-1.21.2.tgz\n    version: 1.21.2\n  - annotations:\n      artifacthub.io/changes: '- \"Sanitize jdbc url for Confluence and Synchrony (#866)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.14\n    created: \"2024-08-22T08:41:37.294999105Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: ba787c7d14e6f8c71184bbe629a56b8d92efc08fd282b89ba9a6b417ca12ab3a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.21.1/confluence-1.21.1.tgz\n    version: 1.21.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Added annotations to the StatefulSets (#857)\"\n        - \"Update appVersions for DC apps (#858)\"\n        - \"Make shared home pvc access mode configurable (#855)\"\n        - \"Allow referencing multiple secrets in additionalCertificates (#852)\"\n        - \"Make it possible to define resources for import-certs init container (#851)\"\n        - \"Move update strategy to root level (#849)\"\n        - \"Add helm value for custom jmx jar location when using other jmx init container images (#846)\"\n        - \"feat: add appProtocol for service meshes (#847)\"\n        - \"Make StatefulSet updateStrategy configurable (#845)\"\n        - \"Fix default for acceptCount (#832)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.14\n    created: \"2024-08-13T02:16:43.443010606Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: d7b7e67263d8d3c0c54af82ed1ee7da517ba1938f7d843349cb69ca74a49b2b1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.21.0/confluence-1.21.0.tgz\n    version: 1.21.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#825)\"\n        - \"Make it possible to override proxy settings (#822)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.12\n    created: \"2024-07-07T21:51:06.715370286Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f502837b11c78b3ff4f8d368ca8df898b3cc6219684a65d0c18c8b767d37aadc\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.20.1/confluence-1.20.1.tgz\n    version: 1.20.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#803)\"\n        - \"Set atlassian.logging.cloud.enabled system property to false if a custom FluentD config is used (#796)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.9\n    created: \"2024-05-13T22:07:17.140005662Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: e9b81d1cee173ba3db6d83fa16389feadb387db668954180c06d90aa7a467580\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.20.0/confluence-1.20.0.tgz\n    version: 1.20.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make cacerts writable for user and group (#790)\"\n        - \"Optionally deploy OpenSearch Helm Chart With Confluence (#788)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.8\n    created: \"2024-04-22T06:38:06.172758031Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 2.19.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: ffe3a473e03744c7c8bfa474b3cfac56749d81dce9a272a09bcc61a147e83806\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.19.0/confluence-1.19.0.tgz\n    version: 1.19.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Include shared home for synchrony when additional libs are defined (#779)\"\n        - \"Get rid of server repo references (#777)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.7\n    created: \"2024-03-26T03:31:05.111117569Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 56011bd4973838b6b9e7f447f46dd647e3a1f6440354dd59876b9c5850a885e9\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.18.1/confluence-1.18.1.tgz\n    version: 1.18.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add Openshift analytics (#763)\"\n        - \"Update appVersions for DC apps (#765)\"\n        - \"Removed unused Confluence shared home volume from Synchrony volume. (#764)\"\n        - \"OpenShift Support (#752)\"\n        - \"Use testPods values for test images and container resources (#761)\"\n        - \"Relabel instance name on jmx service monitor (#757)\"\n        - \"Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.6\n    created: \"2024-02-27T22:52:07.786040804Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 04429fafe006f2444b7418b2f89c5050ab0105735cb5feb9e9c8a7a63a714eaf\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.18/confluence-1.18.tgz\n    version: \"1.18\"\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"StatefulSet PVC auto deletion (#736)\"\n        - \"Add optional postStart hook (#735)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.4\n    created: \"2023-12-18T05:54:10.359886927Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 73a75ce535ba7a627221a92c33f7db92ee9fa478a0e92c4cc7c0c91028a65972\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.17.2/confluence-1.17.2.tgz\n    version: 1.17.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make liveness probe configurable (#732)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.4\n    created: \"2023-12-11T00:31:05.18677466Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 79eeae96a59a3486bfc60a0d362fae816665f09779b2f347251332154df27005\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.17.1/confluence-1.17.1.tgz\n    version: 1.17.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make test pod metadata and spec configurable (#727)\"\n        - \"Update default Confluence version (#729)\"\n        - \"Optional analytics/support ConfigMap (#721)\"\n        - \"Fix ingress annotations comment (#720)\"\n        - \"Apply securityContext only if it is explicitly enabled (#717)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.4\n    created: \"2023-12-07T00:11:48.053500798Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 248ae1f58cae44d21dce283def6f9bd9a238cb050f2a31c0c64b01249027c567\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.17.0/confluence-1.17.0.tgz\n    version: 1.17.0\n  - annotations:\n      artifacthub.io/changes: '- \"JMX container resources (#707)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.2\n    created: \"2023-10-30T20:13:53.040837334Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 8a9294a77344066c907f7060f39ada1fda0413f889a7671b9c23ed34e1750be9\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.16.6/confluence-1.16.6.tgz\n    version: 1.16.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Fix custom jmx config (#699)\"\n        - \"Copy cacerts first, then import certs (#696)\"\n        - \"Fix config-jvm template to avoid wrong new line (#694)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.2\n    created: \"2023-10-24T05:50:00.645465024Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 28bc901aaba8fad3d18f1f734c49f42356d3c8da0941f7abc0a6f428453f4891\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.16.5/confluence-1.16.5.tgz\n    version: 1.16.5\n  - annotations:\n      artifacthub.io/changes: '- \"Fix hazelcast svc type (#689)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.2\n    created: \"2023-10-11T21:45:47.336701093Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 82389db25c487b940c522bf6bed6a30fd45042066b919671dc21c7b26f9c021f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.16.4/confluence-1.16.4.tgz\n    version: 1.16.4\n  - annotations:\n      artifacthub.io/changes: '- \"Make it possible to create a dedicated hazelcast\n        svc (#686)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.2\n    created: \"2023-10-11T01:56:38.74105287Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: c720b8fbe3d2400381676400f333bf7ec5df16fd7e48e6a1147ecb16cecea25f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.16.3/confluence-1.16.3.tgz\n    version: 1.16.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#683)\"\n        - \"Add quote to podAnnotation templating (#678)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.2\n    created: \"2023-10-08T21:12:05.76565622Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 1c3f9083a5f25db62e9a28355962b8ea84f3eee32d67b04bc749e1d2e76331a1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.16.2/confluence-1.16.2.tgz\n    version: 1.16.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.1\n    created: \"2023-09-20T23:33:31.325377521Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 49299d50b1e7ce5c962d85addd7cdbeb9857700679c87a7e80daa440c7e2cd2d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.16.1/confluence-1.16.1.tgz\n    version: 1.16.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Allow templating of pod annotations (#662)\"\n        - \"Make securityContext configurable for jmx exporter init container (#670)\"\n        - \"Add user provided certificates to the default Java truststore (#663)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.1\n    created: \"2023-09-18T06:13:49.170544589Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: b677bdf7a1562f6d7a5834bbd1c2e9bd9e5d05944da45736b04264770e8fa5b4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.16.0/confluence-1.16.0.tgz\n    version: 1.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Decouple server and jmx annotations (#654)\"\n        - \"Update appVersions for DC apps (#655)\"\n        - \"Disable startup probes by default (#653)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.5.0\n    created: \"2023-08-28T05:35:49.216534667Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 94a6cbda338701baf56deb2698ae93d3122cd6e11c71c5b63040f90e98b07d77\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.15.3/confluence-1.15.3.tgz\n    version: 1.15.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Allow small cpu requests for Synchrony container (#650)\"\n        - \"Add defaultMode to additionalConfigMaps (#647)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.12\n    created: \"2023-08-22T05:27:07.466931286Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: cedfd70c3c49c3a728710c1729aa31c6a1b601df7d3e873850966a7c60059616\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.15.2/confluence-1.15.2.tgz\n    version: 1.15.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make startup probes optional (#646)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.12\n    created: \"2023-08-17T21:54:16.280899595Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: c8680514fa5442a8e9161899bfe8b75636c97fe5c066f1d7073d04a4516669e6\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.15.1/confluence-1.15.1.tgz\n    version: 1.15.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\"\n        - \"Add annotations to Grafana dashboards ConfigMaps (#637)\"\n        - \"Add additional ConfigMaps to Helm Charts (#635)\"\n        - \"Update appVersions for DC apps (#638)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.12\n    created: \"2023-08-07T23:31:32.894337709Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: e47cba084087994d0ab4f1ac0fab25a42ef4fb173a881c5697d96df554462a68\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.15.0/confluence-1.15.0.tgz\n    version: 1.15.0\n  - annotations:\n      artifacthub.io/changes: '- \"Disable liveness probes by default, make timeoutSeconds\n        configurable (#630)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.11\n    created: \"2023-07-26T00:47:39.24832874Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 82e2cfeb8f536b64717990b9327901785819e639401dc11f1b4b877b334e5465\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.14.1/confluence-1.14.1.tgz\n    version: 1.14.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add liveness probes, make readinessProbes configurable (#626)\"\n        - \"Support running Jira and Confluence containers as non root (incl running in OpenShift) (#623)\"\n        - \"make sharedHome.permissionFix.command helper to be per-product (#622)\"\n        - \"Unset default limits for Confluence (#616)\"\n        - \"Synchrony missing container limits (#615)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.11\n    created: \"2023-07-25T09:31:55.504969618Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: c67d9e02e7942f3b178efc793d15875467526c560b75ee52f42977ec211086e7\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.14.0/confluence-1.14.0.tgz\n    version: 1.14.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\"\n        - \"Swap ingress paths for priority based rules (#602)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.10\n    created: \"2023-06-28T03:38:02.607427979Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: b8cebe0c06e5f09fe09be9f00e2040ec72b56f407408aac491921a3ff3a3a2c1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.13.1/confluence-1.13.1.tgz\n    version: 1.13.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#599)\"\n        - \"Bamboo dashboard (#588)\"\n        - \"Make sessionAffinity configurable in service spec (#582)\"\n        - \"Cleanup dashboards\"\n        - \"Add Confluence Grafana dashboards (#575)\"\n        - \"Add optional ServiceMonitors to DC Helm Charts (#573)\"\n        - \"Expose JMX beans on http endpoint (#562)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.9\n    created: \"2023-06-13T03:59:47.891020835Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.2\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 59ef6467b7d688c7c591f68bbf73a8fa64ee1206968d2f49c1fc60df43f979a8\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.13.0/confluence-1.13.0.tgz\n    version: 1.13.0\n  - annotations:\n      artifacthub.io/changes: '- \"Add priorityClassName to pod spec (#557)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.7\n    created: \"2023-04-18T04:45:10.805097489Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f405c92af7791615ef1dffa897a321ac752af8f75c76ef8a7ba40dd1c49d3ae1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.12.0/confluence-1.12.0.tgz\n    version: 1.12.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#531)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.6\n    created: \"2023-03-22T04:40:28.943754303Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: a05e27989aa6979d54def02a0a905130f120b9fe58ef7acdf53b87b343bda154\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.11.0/confluence-1.11.0.tgz\n    version: 1.11.0\n  - annotations:\n      artifacthub.io/changes: '- \"Add Bitbucket Mesh to Bitbucket Helm chart (#501)\"'\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.5\n    created: \"2023-02-20T03:19:51.782534114Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 136c3314de1dd16c5d0184b11c3d96e5faf6204a41e99567644c16c7e64b77fe\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.10.0/confluence-1.10.0.tgz\n    version: 1.10.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: \"Replica count for Synchrony; defaultMode made configurable in volumes\"\n        - kind: added\n          description: \"With Confluence 8.1.0 attachment data can now be stored and managed via Amazon S3. This Helm chart change adds support for configuring Amazon S3 against Confluence running in K8s. For more details see the official release notes: https://confluence.atlassian.com/doc/confluence-8-1-release-notes-1206791873.html\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.5\n    created: \"2023-02-15T23:07:53.982318347Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 4a6d9a5985d66e81d7835d5f2bb257ad8122e87045420f67f77c215501abe197\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.9.1/confluence-1.9.1.tgz\n    version: 1.9.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: With Confluence 8.1.0 attachment data can now be stored and managed via Amazon S3. This Helm chart change adds support for configuring Amazon S3 against Confluence running in K8s. For more details see the official release notes: https://confluence.atlassian.com/doc/confluence-8-1-release-notes-1206791873.html\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.5\n    created: \"2023-02-15T05:21:10.530783486Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 3f02dfbbb89ffffd542af4a54a9f0647b02509b6470e517c2d89a659850f2542\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.9.0/confluence-1.9.0.tgz\n    version: 1.9.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Fix artifacthub annotations\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.4\n    created: \"2022-12-11T23:57:42.68368Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 85d18698500005353ff3fbd06ef86f89fe135ce05f48b3d444058fa3653b4e8b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.8.1/confluence-1.8.1.tgz\n    version: 1.8.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Stop supporting 1.19 and 1.20 k8s\n        - kind: changed\n          description: Update appVersion to the latest LTS\n        - kind: changed\n          description: Create Role instead of ClusterRole for Hazelcast Kube client in Confluence and Bitbucket Helm charts\n        - kind: added\n          description: Make synchrony pod and service annotations configurable\n        - kind: fixed\n          description: Make Hazelcast port configurable\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.4\n    created: \"2022-12-08T23:43:19.72154Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: a5fb300b01ce506c53184f9cb3dc8fd50519cc74c996d1b3d0b9914ad738e4e2\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.8.0/confluence-1.8.0.tgz\n    version: 1.8.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Patch release to fix Artifacthub metadata\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.2\n    created: \"2022-10-26T04:39:58.69472741Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 7958e3ac7fd83d8013cfbbcf698ea583848eeabff68fd652a809e9d9691778a0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.7.1/confluence-1.7.1.tgz\n    version: 1.7.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Pin Python version to 3.9.14\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/468\n        - kind: changed\n          description: Update Bitbucket ingress testing values\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/466\n        - kind: changed\n          description: Ingress Class Name is moved under spec field.\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/451\n        - kind: changed\n          description: Make ATL_FORCE_CFG_UPDATE configurable in values.yaml\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/454\n        - kind: changed\n          description: Add osquery related env vars for Terraform\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/462\n        - kind: changed\n          description: AWS cleanup and log colletion from k8s\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/461\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.2\n    created: \"2022-10-25T00:43:32.706352936Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 4516a1dd03c16e0701758f654506b04d5765e4148626a3e076399c18748bf692\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.7.0/confluence-1.7.0.tgz\n    version: 1.7.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Confluence updated to 7.19.2 version (#455)\"\n        - \"Ingress Class Name is moved under spec (#450)\"\n        - \"Improved documentation (#448)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.2\n    created: \"2022-10-12T01:34:48.62757586Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 4c407d21d8165278f7699ae0f55cc7a658d343ecc81c129bc7cc1dfb93e704dd\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.6.0/confluence-1.6.0.tgz\n    version: 1.6.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Fixed Confluence when Synchrony is enabled\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/443\n        - kind: changed\n         description: Confluence updated to 7.19.0 version\n         links:\n         - name: Github PR\n           url: https://github.com/atlassian/data-center-helm-charts/pull/445\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.19.0\n    created: \"2022-08-24T04:07:34.532647997Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 7a7c8e43ac4f4155780f5726711140ed3309c75b86fcf436ef9239ad26d96e9a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.5.1/confluence-1.5.1.tgz\n    version: 1.5.1\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Use the custom ports for Confluence service (#419)\"\n        - \"Use the custom ports for Synchrony service (#419)\"\n        - \"Fixed Synchrony ingress path (#429)\"\n        - \"Confluence updated to 7.13.8 version (#430)\"\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.13.8\n    created: \"2022-07-15T04:27:47.408519545Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 1f722756e34223ec83279d7f58b5b5a4a8f5a43ed7945a79905aeb0aae33f4f0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.5.0/confluence-1.5.0.tgz\n    version: 1.5.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update Confluence version to 7.13.7\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/417\n          - name: Confluence Security Advisory 2022-06-02\n            url: https://confluence.atlassian.com/doc/confluence-security-advisory-2022-06-02-1130377146.html\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.13.7\n    created: \"2022-06-09T17:25:22.25582+10:00\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 05370dd318525fb8c8959a76a15fc7afef45800b672faae80199c32d2d50957f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.4.1/confluence-1.4.1.tgz\n    version: 1.4.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Make pod securityContext optional\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/389\n        - kind: added\n          description: Support for configuring ingress proxy settings via values.yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/402\n        - kind: added\n          description: Add ATL_PROXY_NAME and ATL_PROXY_PORT to Confluence\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/407\n        - kind: fixed\n          description: Fixed additionalHosts\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/392\n        - kind: changed\n          description: Update Confluence version to 7.13.6\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/412\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.13.6\n    created: \"2022-05-25T04:04:16.739512277Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: a1300b42555ccce54fd3f026c71ac359cd01fecdae3cbc3dbbb66e075e9e6686\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.4.0/confluence-1.4.0.tgz\n    version: 1.4.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Add support for separate Synchrony volumes\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/390\n        - kind: changed\n          description: Update Confluence version to 7.21.0\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/396\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.13.5\n    created: \"2022-03-23T21:52:12.353137115Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 7988f5c89c4e0ed14f608867383327d226fe1f07f7b26b34267ee5dc6598a28e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.3.0/confluence-1.3.0.tgz\n    version: 1.3.0\n  - annotations:\n      artifacthub.io/changes: \"- kind: added\\n  description: Add new feature additionalPorts\n        (for jmx-monitoring) \\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/353\\n-\n        kind: changed\\n  description: Set ActiveProcessorCount automatically based\n        on Values.<product>.resources.container.requests.cpu\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/352\\n-\n        kind: added\\n  description: Added topologySpreadConstraints to products\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/351\\n-\n        kind: changed\\n  description: Define podAnnotations as template to allow overrides\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/341\\n-\n        kind: added\\n  description: Added new feature to define loadBalancerIP\\n  links:\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/365\\n-\n        kind: added\\n  description: Added new feature podLabels\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/364\\n-\n        kind: added\\n  description: Added new feature additionalVolumeClaimTemplates\n        and provided example in documentation\\n  links:\\n  - name: Github PR\\n    url:\n        https://github.com/atlassian/data-center-helm-charts/pull/334\\n  - name: Github\n        PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/368\\n-\n        kind: added\\n  description: Added service account annotation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/363\\n-\n        kind: changed\\n  description: Updated Atlassian charts to use common definitions\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/303\\n-\n        kind: changed\\n  description: Improvements on documentation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/370\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/357\\n-\n        kind: changed\\n  description: Confluence DC updated to 7.13.4 version (LTS)\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/378\\n\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.13.4-jdk11\n    created: \"2022-02-14T04:05:36.423292145Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f19015ee28c73370876f9180f5a20b73f9dfcb9ea1627cd360a30cda93d44fbb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.2.0/confluence-1.2.0.tgz\n    version: 1.2.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Decrease Confluence failover time\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/299\n        - kind: added\n          description: Add support for custom schedulerName\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/301\n        - kind: added\n          description: Enable configuring ingress.class name\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/313\n        - kind: changed\n          description: Make security context more flexible\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/321\n        - kind: added\n          description: Roll Statefulset Pods if ConfigMap changes\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/315\n        - kind: changed\n          description: Confluence DC updated to 7.13.2 version (LTS)\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/345\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 7.13.2-jdk11\n    created: \"2021-11-04T03:20:38.308253874Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 72df12d94656ad3f59be387d894edf2e33ba62101ac7ffba827dfb5db49d1126\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.1.0/confluence-1.1.0.tgz\n    version: 1.1.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Fix Synchrony ingress path\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/281\n        - kind: changed\n          description: Improvements to graceful shutdown\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/282\n        - kind: added\n          description: Fix Synchrony ingress path\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/283\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/275\n            url: https://github.com/atlassian/data-center-helm-charts/pull/276\n            url: https://github.com/atlassian/data-center-helm-charts/pull/277\n            url: https://github.com/atlassian/data-center-helm-charts/pull/279\n            url: https://github.com/atlassian/data-center-helm-charts/pull/280\n            url: https://github.com/atlassian/data-center-helm-charts/pull/284\n            url: https://github.com/atlassian/data-center-helm-charts/pull/285\n            url: https://github.com/atlassian/data-center-helm-charts/pull/289\n            url: https://github.com/atlassian/data-center-helm-charts/pull/290\n            url: https://github.com/atlassian/data-center-helm-charts/pull/291\n            url: https://github.com/atlassian/data-center-helm-charts/pull/293\n            url: https://github.com/atlassian/data-center-helm-charts/pull/295\n    apiVersion: v2\n    appVersion: 7.13.0-jdk11\n    created: \"2021-09-07T01:03:17.1697552Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 7d52e15e1f57e995dcc89f6d74a47c0cdae97609f2def5b9a0071352289b7c74\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-1.0.0/confluence-1.0.0.tgz\n    version: 1.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Enable NFS permission fixer by default\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/241\n        - kind: changed\n          description: Enable configuration for SET_PERMISSIONS docker image variable\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/261\n        - kind: added\n          description: Configurable grace periods\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/249\n        - kind: added\n          description: Improve Confluence shutdown procedure\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/250\n        - kind: changed\n          description: Set ContextPath as default for ingress path\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/263\n        - kind: changed\n          description: Update the Confluence image name, as the '-server' suffix is now deprecated\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/259\n        - kind: changed\n          description: Fix spacing of the jvm args for debug flag\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/266\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/236\n            url: https://github.com/atlassian/data-center-helm-charts/pull/243\n            url: https://github.com/atlassian/data-center-helm-charts/pull/245\n            url: https://github.com/atlassian/data-center-helm-charts/pull/252\n            url: https://github.com/atlassian/data-center-helm-charts/pull/253\n            url: https://github.com/atlassian/data-center-helm-charts/pull/256\n            url: https://github.com/atlassian/data-center-helm-charts/pull/258\n            url: https://github.com/atlassian/data-center-helm-charts/pull/260\n            url: https://github.com/atlassian/data-center-helm-charts/pull/263\n            url: https://github.com/atlassian/data-center-helm-charts/pull/268\n            url: https://github.com/atlassian/data-center-helm-charts/pull/270\n            url: https://github.com/atlassian/data-center-helm-charts/pull/272\n    apiVersion: v2\n    appVersion: 7.13.0-jdk11\n    created: \"2021-08-27T05:31:25.1938745Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 79ed15e3b9273137cb2cde189b1ab20544fa3ff7295ca7c38323d346063329a4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.16.0/confluence-0.16.0.tgz\n    version: 0.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add Service annotations\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/209\n        - kind: added\n          description: Add support for providing a custom fluentd start command\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/218\n        - kind: changed\n          description: Renamed the 'master' branch to 'main'\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/232\n        - kind: changed\n          description: Update eks cluster yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/227\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/206\n            url: https://github.com/atlassian/data-center-helm-charts/pull/222\n            url: https://github.com/atlassian/data-center-helm-charts/pull/223\n            url: https://github.com/atlassian/data-center-helm-charts/pull/228\n            url: https://github.com/atlassian/data-center-helm-charts/pull/229\n            url: https://github.com/atlassian/data-center-helm-charts/pull/231\n            url: https://github.com/atlassian/data-center-helm-charts/pull/233\n            url: https://github.com/atlassian/data-center-helm-charts/pull/235\n    apiVersion: v2\n    appVersion: 7.12.4-jdk11\n    created: \"2021-08-17T01:45:26.8245293Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 4d39db613d72a73f0e3458dca56af0f48e47f97f5e43b2124125a243698e78d6\n    home: https://www.atlassian.com/software/confluence\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.15.0/confluence-0.15.0.tgz\n    version: 0.15.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Update Confluence version to 7.12.3-jdk11\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/212\n    apiVersion: v2\n    appVersion: 7.12.3-jdk11\n    created: \"2021-07-23T07:52:10.198515Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 5d9c06d7b67b395c441f44c2eacf142de015a721483d1cc4cb26f7d947dedfcb\n    home: https://www.atlassian.com/software/confluence\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.14.0/confluence-0.14.0.tgz\n    version: 0.14.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: fixed\n          description: Fix Synchrony resource requests and limits\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/210\n        - kind: changed\n          description: Volume docs updates\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/188\n    apiVersion: v2\n    appVersion: 7.12.2-jdk11\n    created: \"2021-07-22T05:12:22.394261132Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 6e702d600d5318ad72020bdd27916bcf79d965b3023dbaa0a87b47287e60cc07\n    home: https://www.atlassian.com/software/confluence\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.13.0/confluence-0.13.0.tgz\n    version: 0.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: fixed\n          description: Increase the timeout for /bootstrap endpoints in the same way as for /setup to avoid the ingress timeout\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/194\n        - kind: added\n          description: Defining the following values in the helpers template for each chart, to allow template overrides\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/173\n        - kind: fixed\n          description: Wording improvement for warning in NOTES when PV is not used\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/199\n        - kind: fixed\n          description: Improve readability of values.yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/182\n    apiVersion: v2\n    appVersion: 7.12.2-jdk11\n    created: \"2021-07-06T17:30:00.379367+10:00\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 359c28ac77166c8d82c4ae83f4123f88ec44c5aee62355d797fd4e82c774ccf0\n    home: https://www.atlassian.com/software/confluence\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.12.0/confluence-0.12.0.tgz\n    version: 0.12.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Changed Confluence version to 7.12.2-jdk11\n        - kind: added\n          description: Add warning to NOTES when no persistent volumes are configured\n        - kind: added\n          description: Print service URL after helm installation\n        - kind: fixed\n          description: Mount additional libraries in DB connectivity pod\n        - kind: added\n          description: Add resources stanza for Synchrony and inject values into startup\n        - kind: added\n          description: Improved documentation\n    apiVersion: v2\n    appVersion: 7.12.2-jdk11\n    created: \"2021-06-17T02:07:46.373641725Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 83eb5c6b8693852aa394831f3ac9efe05395bd67a511c9a326b8b888a74ab03c\n    home: https://www.atlassian.com/software/confluence\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.11.0/confluence-0.11.0.tgz\n    version: 0.11.0\n  - apiVersion: v2\n    appVersion: 7.12.0-jdk11\n    created: \"2021-06-01T10:24:25.188524498Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 7a9829a2e7dabdfe2749656330b476b3c06c7c9f2d092147fcd0aa5085b4c96a\n    home: https://www.atlassian.com/software/confluence\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.10.0/confluence-0.10.0.tgz\n    version: 0.10.0\n  - apiVersion: v2\n    appVersion: 7.12.0-jdk11\n    created: \"2021-05-25T06:48:58.4735723Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f7e669adeaa77c9d42bc5a5170d143122831d3bae5e855c9f4cefe9307f0a962\n    home: https://www.atlassian.com/software/confluence\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.9.0/confluence-0.9.0.tgz\n    version: 0.9.0\n  - apiVersion: v2\n    appVersion: 7.12.0-jdk11\n    created: \"2021-05-20T04:12:36.2553211Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: 10c96d4ff03330dfa6b69a9a361a9071b26d86b6cb50349c075f4b97761aa500\n    home: https://www.atlassian.com/software/confluence\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Confluence DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.8.0/confluence-0.8.0.tgz\n    version: 0.8.0\n  - apiVersion: v2\n    appVersion: 7.12.0-jdk11\n    created: \"2021-05-07T03:33:46.1157954Z\"\n    description: A chart for installing Confluence Data Center on Kubernetes\n    digest: f667349b46f37f79cab57f32abf216e5add3cd002622b83cab2eb87f8f2c8a85\n    home: https://www.atlassian.com/software/confluence\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.7.0/confluence-0.7.0.tgz\n    version: 0.7.0\n  - apiVersion: v2\n    appVersion: 7.9.0-jdk11\n    created: \"2021-05-04T05:38:38.662020393Z\"\n    description: A chart for installing Confluence DC on Kubernetes\n    digest: 2506b7f29b9dda9a5c9f42911a9e3e655fac19d9dc9d0f2db4f083a7e3e30a96\n    home: https://github.com/atlassian/data-center-helm-charts\n    keywords:\n    - Confluence\n    - Confluence Server\n    - Confluence Data Center\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: confluence\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/confluence-0.6.0/confluence-0.6.0.tgz\n    version: 0.6.0\n  crowd:\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.5\n    created: \"2026-05-06T12:34:51.660819515Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 2be1078f41f0d29eca6288f3fabb05e053385c425daf0174806d0c9b08048e60\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.13/crowd-2.0.13.tgz\n    version: 2.0.13\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.5\n    created: \"2026-04-09T06:07:10.824648977Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 0517b1efbde0c1937812a589acbf2671831f6b7da0504a6ed5ce3931ef50f44c\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.12/crowd-2.0.12.tgz\n    version: 2.0.12\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.5\n    created: \"2026-04-07T19:46:28.167202047Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 76984198a94a081b35916741b97e6971ccf611f37b775b705a738f08257bbe93\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.11/crowd-2.0.11.tgz\n    version: 2.0.11\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"DEVPROD-3580: Add gateway api support (#1084)\"\n        - \"Update appVersions for DC apps (#1100)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.5\n    created: \"2026-04-03T12:19:09.662115474Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: a5952ffce176b6f25bd3c26ab654f4c02756e56f69204624e175562b7b447242\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.10/crowd-2.0.10.tgz\n    version: 2.0.10\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1079)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.4\n    created: \"2026-02-01T01:11:48.562845318Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 8f0660bc49d5cf90f3dc468c6d4a98ca61d9959df33ad7f017f0bd3cf529c33d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.9/crowd-2.0.9.tgz\n    version: 2.0.9\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1070)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.3\n    created: \"2025-12-29T04:49:26.726992741Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: dffb6bb5225c9cf257337042db683c374225762c7b701bc2a270f83ffb76f4a3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.8/crowd-2.0.8.tgz\n    version: 2.0.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.0\n    created: \"2025-11-07T09:21:07.768081565Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: d2462f7c42fadc83ce45997dbbd9c4763925c9c0725f87b12535f3d2e9fef329\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.7/crowd-2.0.7.tgz\n    version: 2.0.7\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"fix: Add missing ErrorReportValve to default server.xml #1047 (#1047)\"\n        - \"fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.0\n    created: \"2025-11-03T18:10:24.294816605Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 27153cd57f4a7db5d3458333b30597f64b1640edf4f183988073e1b223655016\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.6/crowd-2.0.6.tgz\n    version: 2.0.6\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1049)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 7.1.0\n    created: \"2025-11-01T20:21:45.304422525Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: ebd05ba522e6e2183e02db1acde2e495d2aaf836ed23046cee96bdb2991f57ed\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.5/crowd-2.0.5.tgz\n    version: 2.0.5\n  - annotations:\n      artifacthub.io/changes: '- \"fix: Update Bitnami image references due to deprecation\n        notice (#1037)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.3.1\n    created: \"2025-08-27T08:06:51.977502114Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: bd4306a38225fa68a05a3cb5a168ddab7ca2ca62ca6b6d6f3f35bcdb84cec8c1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.4/crowd-2.0.4.tgz\n    version: 2.0.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.3.1\n    created: \"2025-08-01T04:22:43.140385183Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: f44c2cc71dcadd175bf5e3110e5f6e32c266fa3e4170fd74e472380c49cca946\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.3/crowd-2.0.3.tgz\n    version: 2.0.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1012)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.3.1\n    created: \"2025-06-16T21:06:14.089332028Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 4c002460d34ad512d76e7ee7d03ddb85578f7074ee973fdf1fa9b08d7d4610cf\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.2/crowd-2.0.2.tgz\n    version: 2.0.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.3.0\n    created: \"2025-05-15T03:13:38.301226565Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 4dba7ddf49aa9b1e704d35d3428f76326a4982bdd8b2d10a63faa1bb970182a1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.1/crowd-2.0.1.tgz\n    version: 2.0.1\n  - annotations:\n      artifacthub.io/changes: '- \"Remove condition to support legacy securityContext\n        format (#1000)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.3.0\n    created: \"2025-04-29T02:28:20.049064784Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: c62d9282dc7b0b17eb069ae62a97e1425f766c8b38d64767b4411f09b8fdfc2a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-2.0.0/crowd-2.0.0.tgz\n    version: 2.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make it possible to declare additional ingress paths (#991)\"\n        - \"Bring changelog in order (#990)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.3.0\n    created: \"2025-04-22T03:40:54.446865578Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: f501c13e3ec793b18758f5757f56290f3ee0d0c32d318368a5691ef62e1305e3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.9/crowd-1.22.9.tgz\n    version: 1.22.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\"\n        - \"Update appVersions for DC apps (#983)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.3.0\n    created: \"2025-04-17T00:33:10.08053042Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 48cfeb6fbf58b9099222e9983400e17f993861f141ca2289debc553b3189d5eb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.8/crowd-1.22.8.tgz\n    version: 1.22.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.2.3\n    created: \"2025-04-01T08:33:30.299524923Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: a8c01e9c93bee2a686b8f4c0696045581d09e195517fe015595cc876386265e0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.7/crowd-1.22.7.tgz\n    version: 1.22.7\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#969)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.2.3\n    created: \"2025-03-19T10:58:51.718232451Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 6bbeea4a4fd2eb4b5f9c9decfc580eb6cdd6792aaf2f63719e636a493f8e85b4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.6/crowd-1.22.6.tgz\n    version: 1.22.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#959)\"\n        - \"Add tunnel config for Jira, hostNamespaces in all charts (#958)\"\n        - \"Allow setting subPath for local-home volumes (#947)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.2.2\n    created: \"2025-02-18T02:04:16.868718002Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: fb757865ef00d237b936c28162505711967ceb07d6de8b77905a47cf2cae01b3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.5/crowd-1.22.5.tgz\n    version: 1.22.5\n  - annotations:\n      artifacthub.io/changes: '- \"Round up fractional cpu values for ActiveProcessorsCount\n        (#944)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.2.0\n    created: \"2025-01-30T23:57:42.919732087Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 5cad54b52aaae1c9e8368f265a243767d4f744c72d87d4bb76ac2667385263da\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.4/crowd-1.22.4.tgz\n    version: 1.22.4\n  - annotations:\n      artifacthub.io/changes: '- \"Set custom securityContext for import-certs init\n        container. Make affinity independent for Synchrony (#938)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.2.0\n    created: \"2025-01-13T08:43:15.997847188Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: fb616ac05d1880662b6a0d2323dd0b0ea322cec9936af9a4c91c07322f709523\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.3/crowd-1.22.3.tgz\n    version: 1.22.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#933)\"\n        - \"Make it possible to set nodePort in services (#931)\"\n        - \"Make access log attributes configurable (#932)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.1.3\n    created: \"2024-12-16T23:16:41.982187903Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 4c6d853dfe76df821cccd887ad80c6c07665ae155f693a4a229d2c86f778adc5\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.2/crowd-1.22.2.tgz\n    version: 1.22.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Grafana dashboards for DC apps (#915)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.1.2\n    created: \"2024-12-03T20:13:31.343129445Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 6f6818889698641430f1b262a6cf22907d81c611a19e1181b658e2c298ef09f6\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.1/crowd-1.22.1.tgz\n    version: 1.22.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Updated pod labels for all products (#901)\"\n        - \"Fix shutdown with jmx javaagent enabled (#899)\"\n        - \"Unset IDs for all the Grafana dashboards (#889)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.1.1\n    created: \"2024-11-15T03:00:27.975444893Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 451dec0cc61cac8d4ee8d3b0a2747492f3fb27094fe07e7a62c0609e7a8d569f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.22.0/crowd-1.22.0.tgz\n    version: 1.22.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#884)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.1.0\n    created: \"2024-10-01T04:09:20.218353957Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: e1754ccf73cfdd6dbf012436d5e3f20de26dbc5fbc326d37f29238c0b873ebe4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.21.4/crowd-1.21.4.tgz\n    version: 1.21.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update common dependency version (#878)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.0.2\n    created: \"2024-09-10T03:33:52.893358077Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: adc4d7f2a2c93e3df55040a709fbe2ecde5552ed7308c596935599f973ff8a99\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.21.3/crowd-1.21.3.tgz\n    version: 1.21.3\n  - annotations:\n      artifacthub.io/changes: '- \"Fix crowd fluentd config (#870)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.0.1\n    created: \"2024-08-26T06:47:23.98761531Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: b1bca8904da90b3f0346efa294e54da236224abce0340661ca2cb3e66ba50d5c\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.21.2/crowd-1.21.2.tgz\n    version: 1.21.2\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#865)\"\n        - \"Make crowd context configurable (#864)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.0.1\n    created: \"2024-08-22T08:41:37.427762696Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 7cabf3ab7828cef90cd84d6fb83c335fdcfc59012c002d3f135a9ad8dca3df24\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.21.1/crowd-1.21.1.tgz\n    version: 1.21.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Added annotations to the StatefulSets (#857)\"\n        - \"Update appVersions for DC apps (#858)\"\n        - \"Make shared home pvc access mode configurable (#855)\"\n        - \"Allow referencing multiple secrets in additionalCertificates (#852)\"\n        - \"Make it possible to define resources for import-certs init container (#851)\"\n        - \"Move update strategy to root level (#849)\"\n        - \"Add helm value for custom jmx jar location when using other jmx init container images (#846)\"\n        - \"feat: add appProtocol for service meshes (#847)\"\n        - \"Make StatefulSet updateStrategy configurable (#845)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.0.0\n    created: \"2024-08-13T02:16:43.57162046Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: b0cd00d839171ef3e357b14a709e93457bde95064ccddb46db697b6a21715937\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.21.0/crowd-1.21.0.tgz\n    version: 1.21.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#825)\"\n        - \"Make it possible to override proxy settings (#822)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 6.0.0\n    created: \"2024-07-07T21:51:06.915857443Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 9738c2f96e825898295a56b3fc678fa166cd56d0563b4a2a8c7a4d087c8c36b1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.20.1/crowd-1.20.1.tgz\n    version: 1.20.1\n  - annotations:\n      artifacthub.io/changes: '- \"Set atlassian.logging.cloud.enabled system property\n        to false if a custom FluentD config is used (#796)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.3.0\n    created: \"2024-05-13T22:07:17.287692299Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: a00f67ccddb6bdb50ecadf9c0756a97e7e60e4ca40fc3c2613fccb9594b00cec\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.20.0/crowd-1.20.0.tgz\n    version: 1.20.0\n  - annotations:\n      artifacthub.io/changes: '- \"Make cacerts writable for user and group (#790)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.3.0\n    created: \"2024-04-22T06:38:06.261695663Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: ab1e72b2f2ea23bdd1b157536224a176c353f65fc1a3bfca6a0ef8e98557ef13\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.19.0/crowd-1.19.0.tgz\n    version: 1.19.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#769)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.3\n    created: \"2024-03-26T03:31:05.293280776Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: c5aaaaa7b4d0644acd05c7dd2b723db9de8fa5dd902fbf0d1c65f98c7d791916\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.18.1/crowd-1.18.1.tgz\n    version: 1.18.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add Openshift analytics (#763)\"\n        - \"Update appVersions for DC apps (#765)\"\n        - \"OpenShift Support (#752)\"\n        - \"Use testPods values for test images and container resources (#761)\"\n        - \"Relabel instance name on jmx service monitor (#757)\"\n        - \"Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.3\n    created: \"2024-02-27T22:52:07.973260174Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 82dff6d3a98d5682b650cd4c3adb861b4adf3408bbb2de1cdd6eaad229b2aab0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.18/crowd-1.18.tgz\n    version: \"1.18\"\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"StatefulSet PVC auto deletion (#736)\"\n        - \"Update appVersions for DC apps (#738)\"\n        - \"Add optional postStart hook (#735)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.2\n    created: \"2023-12-18T05:54:10.49362091Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 6d2811511482a7696a34cbda0fe0676504d4ab34dacd78642335b51837cf5306\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.17.2/crowd-1.17.2.tgz\n    version: 1.17.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make liveness probe configurable (#732)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.1\n    created: \"2023-12-11T00:31:05.709210505Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 7567264a5ca47a93d367893b8a6f86e83ed89a2b85b99281f1ae41bd3d5216bc\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.17.1/crowd-1.17.1.tgz\n    version: 1.17.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make test pod metadata and spec configurable (#727)\"\n        - \"Optional analytics/support ConfigMap (#721)\"\n        - \"Fix ingress annotations comment (#720)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.1\n    created: \"2023-12-07T00:11:48.257623185Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 05f53af42e86b13db6e04bf542c76923f9dc19ad798193a855d6b574a9fce192\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.17.0/crowd-1.17.0.tgz\n    version: 1.17.0\n  - annotations:\n      artifacthub.io/changes: '- \"JMX container resources (#707)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.0\n    created: \"2023-10-30T20:13:53.191304192Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 9c64bace9edb48461806c6abad509a10f191ba1ea6a8999f3d198b23d4665dc0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.16.6/crowd-1.16.6.tgz\n    version: 1.16.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Fix custom jmx config (#699)\"\n        - \"Copy cacerts first, then import certs (#696)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.0\n    created: \"2023-10-24T05:50:00.932577246Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: d2e7183e563fa60f3f2039c1b0f6529e4a96a62a769e88a57b2f067d0ff27964\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.16.5/crowd-1.16.5.tgz\n    version: 1.16.5\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.0\n    created: \"2023-10-11T21:45:47.474320214Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: f39af2c04ac961c038ffa75e1a8d546ede18c6ec84ce67afb4fee926ed9a809a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.16.4/crowd-1.16.4.tgz\n    version: 1.16.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.0\n    created: \"2023-10-11T01:56:38.880680514Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 9fabbff38afc06a6aa74042ed51679cb973536e695564cf3edf133443bb39dd3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.16.3/crowd-1.16.3.tgz\n    version: 1.16.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add quote to podAnnotation templating (#678)\"\n        - \"Update appVersions for DC apps (#679)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.2.0\n    created: \"2023-10-08T21:12:05.914192229Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: a5851dee075f1e487f43cbfe460c323dadbd20acb1b0901a88ad39170bac7f4c\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.16.2/crowd-1.16.2.tgz\n    version: 1.16.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.5\n    created: \"2023-09-20T23:33:31.480467989Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 9a4bd78675b80738f50c968653e7dc03dda34ce7a2fd08bce1480b5d2111b2eb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.16.1/crowd-1.16.1.tgz\n    version: 1.16.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Allow templating of pod annotations (#662)\"\n        - \"Make securityContext configurable for jmx exporter init container (#670)\"\n        - \"Add user provided certificates to the default Java truststore (#663)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.5\n    created: \"2023-09-18T06:13:49.308078574Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 474a64860d507561cdad8ee2e341872114c08b0918333f591ee24b318affb976\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.16.0/crowd-1.16.0.tgz\n    version: 1.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Decouple server and jmx annotations (#654)\"\n        - \"Disable startup probes by default (#653)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.4\n    created: \"2023-08-28T05:35:49.346405148Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: b4ea68ca3297692f3b25a360e7e1d97f9212a198bc068c4b58722fecdedb3f46\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.15.3/crowd-1.15.3.tgz\n    version: 1.15.3\n  - annotations:\n      artifacthub.io/changes: '- \"Add defaultMode to additionalConfigMaps (#647)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.4\n    created: \"2023-08-22T05:27:07.630564586Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 8965810c807f0787797a94094f41cf4a28214e1dd141e36847800b868224151e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.15.2/crowd-1.15.2.tgz\n    version: 1.15.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make startup probes optional (#646)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.4\n    created: \"2023-08-17T21:54:16.441016622Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 77e56c7da2b3d87ed2d64e1448094c151003eb09e96ee5156807236ae3686281\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.15.1/crowd-1.15.1.tgz\n    version: 1.15.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\"\n        - \"Add annotations to Grafana dashboards ConfigMaps (#637)\"\n        - \"Add additional ConfigMaps to Helm Charts (#635)\"\n        - \"Update appVersions for DC apps (#638)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.4\n    created: \"2023-08-07T23:31:33.024695185Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: e82759c2efbf1850f8a63a760351f3036763060620fc23e26a509e549104f09d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.15.0/crowd-1.15.0.tgz\n    version: 1.15.0\n  - annotations:\n      artifacthub.io/changes: '- \"Disable liveness probes by default, make timeoutSeconds\n        configurable (#630)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.3\n    created: \"2023-07-26T00:47:39.411618718Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: ccc54931e2ea9808fabddad33838d2d63c08028e4eb626f8b8a127d09c8d96e1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.14.1/crowd-1.14.1.tgz\n    version: 1.14.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add liveness probes, make readinessProbes configurable (#626)\"\n        - \"make sharedHome.permissionFix.command helper to be per-product (#622)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.3\n    created: \"2023-07-25T09:31:55.728854333Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 2b9ea2b8424a77cfc76d1577fb3423ecefaf2821c94a59aba6a17ccf16a6c0a7\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.14.0/crowd-1.14.0.tgz\n    version: 1.14.0\n  - annotations:\n      artifacthub.io/changes: '- \"Run jmx init container as root: get fix from common\n        chart ver 1.2.3 (#608)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.3\n    created: \"2023-06-28T03:38:02.730053069Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 322871d41cec468f08c74dfbfd80e2a06d5d1d100b17d2055e6d4395b5114190\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.13.1/crowd-1.13.1.tgz\n    version: 1.13.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#599)\"\n        - \"Update Grafana dashboards for DC apps (#596)\"\n        - \"Update Grafana dashboards for DC apps (#595)\"\n        - \"Crowd dashboard (#593)\"\n        - \"Bamboo dashboard (#588)\"\n        - \"Make sessionAffinity configurable in service spec (#582)\"\n        - \"Add optional ServiceMonitors to DC Helm Charts (#573)\"\n        - \"Expose JMX beans on http endpoint (#562)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.3\n    created: \"2023-06-13T03:59:48.124399519Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.2\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 360a32e4540f25f68fe4253568a9f158929cb934934f2ab3189c3aa51af8a2b4\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.13.0/crowd-1.13.0.tgz\n    version: 1.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add priorityClassName to pod spec (#557)\"\n        - \"Add hostAliases for all DC products (#556)\"\n        - \"Crowd service type edge case documentation (#554)\"\n        - \"Add a warning to Crowd's values.yaml ingress.path field (#550)\"\n        - \"Update fluentd cm template for crowd (#547)\"\n        - \"Documentation for Crowd (#544)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.2\n    created: \"2023-04-18T04:45:10.978119517Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 35e8e7b18471451d3916884c62c86c578490562c4a9f44840b92a9139290f916\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.12.0/crowd-1.12.0.tgz\n    version: 1.12.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Fix typo in helpers. Add warnings about Crowd in docs (#534)\"\n        - \"Update appVersions for DC apps (#533)\"\n        - \"Update crowd helm chart (#532)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.2\n    created: \"2023-03-22T04:40:29.143918297Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 24cd0bb7b2a21b5ae8b4fae103022f8b891adee5556a22a8aad35303af71ff8b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.11.0/crowd-1.11.0.tgz\n    version: 1.11.0\n  - annotations:\n      artifacthub.io/changes: '- \"Add Bitbucket Mesh to Bitbucket Helm chart (#501)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.2\n    created: \"2023-02-20T03:19:52.071794704Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: bfbda0842363f713faf243f0205d282720599dbf4116e1e9a6821a7cb5706b28\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.10.0/crowd-1.10.0.tgz\n    version: 1.10.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Fix artifact hub annotation yaml\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.2\n    created: \"2023-02-15T23:07:54.280443039Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 8461799733e9b5f4c38f344b1cd3bcc19ff77cd9f458a6618459e641c43c2cdf\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.9.1/crowd-1.9.1.tgz\n    version: 1.9.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update appVersion to the latest LTS\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.2\n    created: \"2023-02-15T05:21:10.865821813Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: a6ec58ceffb43cd640ebe7313dd5f96da52c00de3f88b5c182dc5a6ed4f841ca\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.9.0/crowd-1.9.0.tgz\n    version: 1.9.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Fix artifacthub annotations\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.0\n    created: \"2022-12-11T23:57:43.157222Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 2b7bdb57785f2d5300ff8c5614b265c7a1471534b46793fd2d9f768002c00e15\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.8.1/crowd-1.8.1.tgz\n    version: 1.8.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Stop supporting 1.19 and 1.20 k8s\n        - kind: changed\n          description: Update appVersion to the latest LTS\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.1.0\n    created: \"2022-12-08T23:43:20.328339Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: df6eaab832e04f1e1beea31af2ef0f6791a7ae12088620479517505a098303fc\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.8.0/crowd-1.8.0.tgz\n    version: 1.8.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Patch release to fix Artifacthub metadata\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.0.2\n    created: \"2022-10-26T04:39:59.005382719Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 3a14a1aa5c0407a145f42ea44b249e469f381dcbe7b493fdfbb897acab5ef45e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.7.1/crowd-1.7.1.tgz\n    version: 1.7.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Pin Python version to 3.9.14\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/468\n        - kind: changed\n          description: Update Bitbucket ingress testing values\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/466\n        - kind: changed\n          description: Ingress Class Name is moved under spec field.\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/451\n        - kind: changed\n          description: Make ATL_FORCE_CFG_UPDATE configurable in values.yaml\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/454\n        - kind: changed\n          description: Add osquery related env vars for Terraform\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/462\n        - kind: changed\n          description: AWS cleanup and log colletion from k8s\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/461\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.0.2\n    created: \"2022-10-25T00:43:33.01330839Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 5c4aebb6e6a539b41dc5158fae76f7b87342000f025b4898c94111bb159c0d18\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.7.0/crowd-1.7.0.tgz\n    version: 1.7.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Crowd updated to 5.0.2 version (#455)\"\n        - \"Ingress Class Name is moved under spec (#450)\"\n        - \"Improved documentation (#448)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.0.2\n    created: \"2022-10-12T01:34:48.961798774Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 1acc49c45622f2763ce4359ba79e68fe0fb355c3469a1831bc0c999ad224e4dc\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.6.0/crowd-1.6.0.tgz\n    version: 1.6.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Use the custom ports for Crowd service\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/419\n        - kind: changed\n          description: Crowd updated to 5.0.1 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/430\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.0.1\n    created: \"2022-07-15T04:27:47.709511395Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: f96504c983684ed49c9621ef21d7a5f0fa90992668f7e95b267f6e18a964b0ec\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.5.0/crowd-1.5.0.tgz\n    version: 1.5.0\n  - annotations:\n      artifacthub.io/changes: \"- kind: added\\n  description: Make pod securityContext\n        optional\\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/389\\n-\n        kind: added\\n  description: Support for configuring ingress proxy settings\n        via values.yaml\\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/402\\n-\n        kind: fixed\\n  description: Fixed common.label error \\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/403\\n-\n        kind: added\\n  description: Add ATL_PROXY_NAME and ATL_PROXY_PORT to Crowd\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/407\\n-\n        kind: changed\\n  description: Update Crowd version to 5.0.0\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/412\\n\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 5.0.0\n    created: \"2022-05-25T04:04:17.041799458Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: d271f973878fd8516f2bed5d083ed8fc309a958d214921fb2373d8669737d03e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.4.0/crowd-1.4.0.tgz\n    version: 1.4.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update Crowd version to 4.4.1\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/396\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 4.4.1\n    created: \"2022-03-23T21:52:12.649342063Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 45a79240ebd28bee70f064b9c8ceb608087b83b0dbd96d8045571410724f8e33\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.3.0/crowd-1.3.0.tgz\n    version: 1.3.0\n  - annotations:\n      artifacthub.io/changes: \"- kind: added\\n  description: Add new feature additionalPorts\n        (for jmx-monitoring) \\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/353\\n-\n        kind: changed\\n  description: Set ActiveProcessorCount automatically based\n        on Values.<product>.resources.container.requests.cpu\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/352\\n-\n        kind: added\\n  description: Added topologySpreadConstraints to products\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/351\\n-\n        kind: changed\\n  description: Define podAnnotations as template to allow overrides\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/341\\n-\n        kind: added\\n  description: Added new feature to define loadBalancerIP\\n  links:\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/365\\n-\n        kind: added\\n  description: Added new feature podLabels\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/364\\n-\n        kind: added\\n  description: Added new feature additionalVolumeClaimTemplates\n        and provided example in documentation\\n  links:\\n  - name: Github PR\\n    url:\n        https://github.com/atlassian/data-center-helm-charts/pull/334\\n  - name: Github\n        PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/368\\n-\n        kind: added\\n  description: Added service account annotation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/363\\n-\n        kind: changed\\n  description: Updated Atlassian charts to use common definitions\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/303\\n-\n        kind: changed\\n  description: Improvements on documentation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/370\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/357\\n-\n        kind: added\\n  description: Added missing JVM_SUPPORT_RECOMMENDED_ARGS env\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/376\\n\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 4.4.0-jdk11\n    created: \"2022-02-14T04:05:36.723521234Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 1e1bd649b3a267527922d8f84a5f157c079135c785db7cadd61f1dd937effef9\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.2.0/crowd-1.2.0.tgz\n    version: 1.2.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add support for custom schedulerName\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/301\n        - kind: added\n          description: Enable configuring ingress.class name\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/313\n        - kind: changed\n          description: Make security context more flexible\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/321\n        - kind: added\n          description: Roll Statefulset Pods if ConfigMap changes\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/315\n        - kind: changed\n          description: Crowd DC updated to 4.4.0 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/345\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 4.4.0-jdk11\n    created: \"2021-11-04T03:20:38.640869101Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 047b9c89fc61e70f13488cb360fc1289a7918d795aed340b3330e9e3e0dad383\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.1.0/crowd-1.1.0.tgz\n    version: 1.1.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Improvements to graceful shutdown\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/282\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/275\n            url: https://github.com/atlassian/data-center-helm-charts/pull/276\n            url: https://github.com/atlassian/data-center-helm-charts/pull/277\n            url: https://github.com/atlassian/data-center-helm-charts/pull/279\n            url: https://github.com/atlassian/data-center-helm-charts/pull/280\n            url: https://github.com/atlassian/data-center-helm-charts/pull/284\n            url: https://github.com/atlassian/data-center-helm-charts/pull/285\n            url: https://github.com/atlassian/data-center-helm-charts/pull/289\n            url: https://github.com/atlassian/data-center-helm-charts/pull/290\n            url: https://github.com/atlassian/data-center-helm-charts/pull/291\n            url: https://github.com/atlassian/data-center-helm-charts/pull/293\n            url: https://github.com/atlassian/data-center-helm-charts/pull/295\n    apiVersion: v2\n    appVersion: 4.3.5-jdk11\n    created: \"2021-09-07T01:03:17.5314327Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: c6d4f5d875563b7cd1d92f31f4026f7c94fd0362e46c35e7c0a7a450cdb90edf\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-1.0.0/crowd-1.0.0.tgz\n    version: 1.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Enable NFS permission fixer by default\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/241\n        - kind: changed\n          description: Enable configuration for SET_PERMISSIONS docker image variable\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/261\n        - kind: added\n          description: Configurable grace periods\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/249\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/236\n            url: https://github.com/atlassian/data-center-helm-charts/pull/243\n            url: https://github.com/atlassian/data-center-helm-charts/pull/245\n            url: https://github.com/atlassian/data-center-helm-charts/pull/252\n            url: https://github.com/atlassian/data-center-helm-charts/pull/253\n            url: https://github.com/atlassian/data-center-helm-charts/pull/256\n            url: https://github.com/atlassian/data-center-helm-charts/pull/258\n            url: https://github.com/atlassian/data-center-helm-charts/pull/260\n            url: https://github.com/atlassian/data-center-helm-charts/pull/263\n            url: https://github.com/atlassian/data-center-helm-charts/pull/268\n            url: https://github.com/atlassian/data-center-helm-charts/pull/270\n            url: https://github.com/atlassian/data-center-helm-charts/pull/272\n    apiVersion: v2\n    appVersion: 4.3.5-jdk11\n    created: \"2021-08-27T05:31:25.4859967Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 8dbbf152b4eaeba82a0a2c4d200ed21ec3c191db5077786bb02c4f4cf6bc481b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.16.0/crowd-0.16.0.tgz\n    version: 0.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add Service annotations\n          links:\n          - name: Github PR\n            url: added://github.com/atlassian/data-center-helm-charts/pull/209\n        - kind: changed\n          description: Add support for providing a custom fluentd start command\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/218\n        - kind: changed\n          description: Renamed the 'master' branch to 'main'\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/232\n        - kind: changed\n          description: Update eks cluster yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/227\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/206\n            url: https://github.com/atlassian/data-center-helm-charts/pull/222\n            url: https://github.com/atlassian/data-center-helm-charts/pull/223\n            url: https://github.com/atlassian/data-center-helm-charts/pull/228\n            url: https://github.com/atlassian/data-center-helm-charts/pull/229\n            url: https://github.com/atlassian/data-center-helm-charts/pull/231\n            url: https://github.com/atlassian/data-center-helm-charts/pull/233\n            url: https://github.com/atlassian/data-center-helm-charts/pull/235\n    apiVersion: v2\n    appVersion: 4.3.5-jdk11\n    created: \"2021-08-17T01:45:27.1119147Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 48850b89000d2dea3fd18afc8bc12e134a5324761c8d477ae988541e10bb80f3\n    home: https://www.atlassian.com/software/crowd\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.15.0/crowd-0.15.0.tgz\n    version: 0.15.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Update Crowd version to 4.3.5-jdk11\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/212\n    apiVersion: v2\n    appVersion: 4.3.5-jdk11\n    created: \"2021-07-23T07:52:10.5184012Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: c45a3ae7b723a64eaa8de2208c64020ab5af5bd98bcb32773e5664b72c7173d9\n    home: https://www.atlassian.com/software/crowd\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.14.0/crowd-0.14.0.tgz\n    version: 0.14.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Volume docs updates\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/188\n    apiVersion: v2\n    appVersion: 4.3.0-jdk11\n    created: \"2021-07-22T05:12:22.710663321Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 6df192393167448789d9a8a358e15a8a191cc72c0afc23c71ffeb6c2d2a8b145\n    home: https://www.atlassian.com/software/crowd\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.13.0/crowd-0.13.0.tgz\n    version: 0.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Defining the following values in the helpers template for each chart, to allow template overrides\n        - kind: fixed\n          description: Wording improvement for warning in NOTES when PV is not used (#199)\n        - kind: fixed\n          description: Improve readability of values.yaml\n    apiVersion: v2\n    appVersion: 4.3.0-jdk11\n    created: \"2021-07-06T17:30:00.839987+10:00\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 611034f331d673cb15ac902a41dc1e18bfabfcb0812ff38c26305761e8b3f738\n    home: https://www.atlassian.com/software/crowd\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.12.0/crowd-0.12.0.tgz\n    version: 0.12.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add warning to NOTES when no persistent volumes are configured\n        - kind: added\n          description: Print service URL after helm installation\n        - kind: added\n          description: Improved documentation\n    apiVersion: v2\n    appVersion: 4.3.0-jdk11\n    created: \"2021-06-17T02:07:46.544414111Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 390ae7408acdbe7c08f96965131c7b7a13eee6ba0e925a296d55673548f5ddae\n    home: https://www.atlassian.com/software/crowd\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.11.0/crowd-0.11.0.tgz\n    version: 0.11.0\n  - apiVersion: v2\n    appVersion: 4.3.0-jdk11\n    created: \"2021-06-01T10:24:25.525269207Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: f991c7f7b0f71df76b05297f8ce8e9f55c56b5aeb551ce458162ca9fe878c303\n    home: https://www.atlassian.com/software/crowd\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.10.0/crowd-0.10.0.tgz\n    version: 0.10.0\n  - apiVersion: v2\n    appVersion: 4.3.0-jdk11\n    created: \"2021-05-25T06:48:58.8447249Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 8cb81bb1a8a935ec807000e740609d869635b376aedaf319a9948d60e43adf49\n    home: https://www.atlassian.com/software/crowd\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.9.0/crowd-0.9.0.tgz\n    version: 0.9.0\n  - apiVersion: v2\n    appVersion: 4.3.0-jdk11\n    created: \"2021-05-20T04:12:36.5583363Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 5514bb04cb2a619819c4aff0d807156ccd4bf63e68529fbfc7fae7b2b95e2db8\n    home: https://www.atlassian.com/software/crowd\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.8.0/crowd-0.8.0.tgz\n    version: 0.8.0\n  - apiVersion: v2\n    appVersion: 4.3.0-jdk11\n    created: \"2021-05-13T08:01:39.201111979Z\"\n    description: A chart for installing Crowd Data Center on Kubernetes\n    digest: 01ca1dc9b4dde03f39e3f9b30811372bd07b92209ea714e1d0cd05f553027ec5\n    home: https://www.atlassian.com/software/crowd\n    icon: https://wac-cdn.atlassian.com/dam/jcr:5d1374c2-276f-4bca-9ce4-813aba614b7a/confluence-icon-gradient-blue.svg?cdnVersion=696\n    keywords:\n    - Crowd\n    - Crowd Server\n    - Crowd Data Center\n    - Crowd DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: crowd\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/crowd-0.7.0/crowd-0.7.0.tgz\n    version: 0.7.0\n  jira:\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"DEVPROD-3811 Added support for OpenSearch for Jira. (#1099)\"\n        - \"Update appVersions for DC apps (#1113)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.3.4\n    created: \"2026-05-06T12:34:51.839584382Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    - condition: opensearch.enabled\n      name: opensearch\n      repository: https://opensearch-project.github.io/helm-charts\n      version: 3.5.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 30e2ab4db952d91716598a79aaac51eff0eaa7059a5e0738362d3a28a7881cb9\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.13/jira-2.0.13.tgz\n    version: 2.0.13\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.3.3\n    created: \"2026-04-09T06:07:11.041135308Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 56dd0b4eb19db828845b3a89199f443ba19fe1677bcbbdd97b777d0b907937d8\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.12/jira-2.0.12.tgz\n    version: 2.0.12\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.3.3\n    created: \"2026-04-07T19:46:28.320472776Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 21868fa73dabb10e483e8fb9fd21c97d663b7aa6cb700d22a32e59c799f3c6ab\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.11/jira-2.0.11.tgz\n    version: 2.0.11\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"DEVPROD-3580: Add gateway api support (#1084)\"\n        - \"Update appVersions for DC apps (#1100)\"\n        - \"TR-534 Make jira server xml tomcat 11 compatibile (#1091)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.3.3\n    created: \"2026-04-03T12:19:09.801757044Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 8563af08ca8d7f18faa6ff8139e80fe60d19157d2a6cdcf6b0ad258e0d249eae\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.10/jira-2.0.10.tgz\n    version: 2.0.10\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.3.1\n    created: \"2026-02-01T01:11:48.748321776Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: c412ae127318de598990e08395a12b66000603d5fb91e75ad7571f55caa7bfbe\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.9/jira-2.0.9.tgz\n    version: 2.0.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1071)\"\n        - \"feat: Added scrape timeout configuration on servicemonitor (#1067)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 11.3.1\n    created: \"2025-12-29T04:49:26.866119181Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 7d34fbd56c656835acb628d72585a9050dbbbd6f788453404b06b103c4e62586\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.8/jira-2.0.8.tgz\n    version: 2.0.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1058)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.13\n    created: \"2025-11-07T09:21:07.975393276Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 88450ae2b9b39c0b0d82285beb544f06d96c55c9668285a203bb7dcde1f7b919\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.7/jira-2.0.7.tgz\n    version: 2.0.7\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"fix: Add missing ErrorReportValve to default server.xml #1047 (#1047)\"\n        - \"fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.12\n    created: \"2025-11-03T18:10:24.506664952Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ef3f462116240b65c051ff11ecd7ecc6628ff7073be088640da6318822537588\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.6/jira-2.0.6.tgz\n    version: 2.0.6\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1049)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.12\n    created: \"2025-11-01T20:21:45.491913096Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 1eedb14c050fb402751d3581356c3e30a31dff6cf2d8db3a204081134197d99c\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.5/jira-2.0.5.tgz\n    version: 2.0.5\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"fix: Update Bitnami image references due to deprecation notice (#1037)\"\n        - \"Update appVersions for DC apps (#1029)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.9\n    created: \"2025-08-27T08:06:52.161079398Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 0c1757f0695afc55c44f098113a2449039c74bb6c7ed1239370e35ecfdfaacfc\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.4/jira-2.0.4.tgz\n    version: 2.0.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1021)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.8\n    created: \"2025-08-01T04:22:43.278625698Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: fa76488d7534cf4c84830cfe6ea5f731d0cecd929c244f1c069062e5425d448b\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.3/jira-2.0.3.tgz\n    version: 2.0.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#1014)\"\n        - \"Quote int in session vars (#1009)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.7\n    created: \"2025-06-16T21:06:14.239712721Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ff5c2b9397638d2282982f6fa70796a85cd9916996845e47e317393fa7d508f3\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.2/jira-2.0.2.tgz\n    version: 2.0.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#1006)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.6\n    created: \"2025-05-15T03:13:38.444253493Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: be7495274c95021d963fd73cb0348c8be83649416b398a4337f3285e86cea7b0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.1/jira-2.0.1.tgz\n    version: 2.0.1\n  - annotations:\n      artifacthub.io/changes: '- \"Remove condition to support legacy securityContext\n        format (#1000)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.5\n    created: \"2025-04-29T02:28:20.134900705Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 6953eaaf6d1d1d14e4ac289edc46907e5233689278fdc561ea3b2d27a3834cf9\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-2.0.0/jira-2.0.0.tgz\n    version: 2.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make session and autologin configurable for Jira and Confluence (#992)\"\n        - \"Make it possible to declare additional ingress paths (#991)\"\n        - \"Bring changelog in order (#990)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.5\n    created: \"2025-04-22T03:40:54.656457632Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 3c3fad42e2c80deb01cf03ac37ade0be40dea049aaaf79b71935f195123b9436\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.9/jira-1.22.9.tgz\n    version: 1.22.9\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Configure jira session timeout (#987)\"\n        - \"Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.5\n    created: \"2025-04-17T00:33:10.189596379Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ad509c4f35ea9039169634234b9ec0ec76c051e26ea2e3a68cf8a54d8733f91e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.8/jira-1.22.8.tgz\n    version: 1.22.8\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#977)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.5\n    created: \"2025-04-01T08:33:30.436087752Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 858998a7b8185ba515947d38f6dc164541ff4265bbd3828fc78b2a493162e16c\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.7/jira-1.22.7.tgz\n    version: 1.22.7\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#969)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.4\n    created: \"2025-03-19T10:58:51.873039218Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: b4cdbf9a401eeb39f979aa4c46a294fbeac95c78f454c691d29b9eeef23c1b7d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.6/jira-1.22.6.tgz\n    version: 1.22.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make access log pattern configurable for Jira and Confluence when running as non root (#961)\"\n        - \"Add tunnel config for Jira, hostNamespaces in all charts (#958)\"\n        - \"Allow setting subPath for local-home volumes (#947)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.3\n    created: \"2025-02-18T02:04:16.978899856Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 2eee0a7fd0412b8c7348a0a97ced9ac276ac3e526bc4401bbbafc7b98cf48812\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.5/jira-1.22.5.tgz\n    version: 1.22.5\n  - annotations:\n      artifacthub.io/changes: '- \"Round up fractional cpu values for ActiveProcessorsCount\n        (#944)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.2\n    created: \"2025-01-30T23:57:43.015798277Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 9f7bf1cde1c732a592843fa34447183b30b4735528a8b97dc2d0ef55a430ba42\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.4/jira-1.22.4.tgz\n    version: 1.22.4\n  - annotations:\n      artifacthub.io/changes: '- \"Set custom securityContext for import-certs init\n        container. Make affinity independent for Synchrony (#938)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.2\n    created: \"2025-01-13T08:43:16.109125702Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 48d6a6af8ad914a7da49dc8ff0bb29462f37ca6e941b19d600dcf170f50cfc10\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.3/jira-1.22.3.tgz\n    version: 1.22.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#933)\"\n        - \"Make it possible to set nodePort in services (#931)\"\n        - \"Make access log attributes configurable (#932)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 10.3.0\n    created: \"2024-12-16T23:16:42.169565624Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 2cb63a4ca4425823b2e26f83d1e8ae37ca309d68fa2c09b205aa64cb661e3b5a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.2/jira-1.22.2.tgz\n    version: 1.22.2\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#922)\"\n        - \"Make make stuckthreaddetectionvalve configurable (#921)\"\n        - \"Update Grafana dashboards for DC apps (#915)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.15\n    created: \"2024-12-03T20:13:31.515133545Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 0d9345fe20d901aaff5fc1d153e484bfafd200673d2bf1ddbabf54f1e04b299e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.1/jira-1.22.1.tgz\n    version: 1.22.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add s3 backups to Helm values (#907)\"\n        - \"Updated pod labels for all products (#901)\"\n        - \"Fix shutdown with jmx javaagent enabled (#899)\"\n        - \"Unset IDs for all the Grafana dashboards (#889)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.15\n    created: \"2024-11-15T03:00:28.113118232Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: d404b422a095e9115741810d03ac8620afe8076e090e82d6f735a1049f535603\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.22.0/jira-1.22.0.tgz\n    version: 1.22.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#881)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.13\n    created: \"2024-10-01T04:09:20.352939501Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 7ccf28c26b96d8958d2557ce4809bb08c43474494be31ab6e283dbc25f91c51d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.21.4/jira-1.21.4.tgz\n    version: 1.21.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update common dependency version (#878)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.13\n    created: \"2024-09-10T03:33:52.993603034Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.7\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 048b7bc3bc6d3ae6a9098976c1d498c21d98d8f36d3b4fcee950aa35585e71cb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.21.3/jira-1.21.3.tgz\n    version: 1.21.3\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#869)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.12\n    created: \"2024-08-26T06:47:24.172063806Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: aeebfd7f63d012b42bf24340269a5ea2363c345de547ce3079fda7887f207c32\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.21.2/jira-1.21.2.tgz\n    version: 1.21.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#865)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.12\n    created: \"2024-08-22T08:41:37.582438248Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ab13e401a5e76e864669c2a4d2fa6848a86a042d8eec145d2470d45da5a504f0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.21.1/jira-1.21.1.tgz\n    version: 1.21.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Added annotations to the StatefulSets (#857)\"\n        - \"Update appVersions for DC apps (#858)\"\n        - \"Add a dedicated helm values stanza for s3 attachments (#854)\"\n        - \"Make shared home pvc access mode configurable (#855)\"\n        - \"Allow referencing multiple secrets in additionalCertificates (#852)\"\n        - \"Make it possible to define resources for import-certs init container (#851)\"\n        - \"Move update strategy to root level (#849)\"\n        - \"Add helm value for custom jmx jar location when using other jmx init container images (#846)\"\n        - \"feat: add appProtocol for service meshes (#847)\"\n        - \"Make StatefulSet updateStrategy configurable (#845)\"\n        - \"Fix default for acceptCount (#832)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.12\n    created: \"2024-08-13T02:16:43.723174578Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ae3aa0b9c585c68feaa501fb37f183b7f41b564e32879e36902c97ba3adecf34\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.21.0/jira-1.21.0.tgz\n    version: 1.21.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#825)\"\n        - \"Make it possible to override proxy settings (#822)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.11\n    created: \"2024-07-07T21:51:07.108706779Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ee5790a3086605d0ee0f316107731a17fb2efc85a4912696cb9706a9a8e47f99\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.20.1/jira-1.20.1.tgz\n    version: 1.20.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#803)\"\n        - \"Set atlassian.logging.cloud.enabled system property to false if a custom FluentD config is used (#796)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.8\n    created: \"2024-05-13T22:07:17.422740455Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 8f6bad40bf8035fc715c6e090fd9012e1ebe338e4445223040bb2f62cdbb2496\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.20.0/jira-1.20.0.tgz\n    version: 1.20.0\n  - annotations:\n      artifacthub.io/changes: '- \"Make cacerts writable for user and group (#790)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.7\n    created: \"2024-04-22T06:38:06.388158477Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 28c0adc9b8fd99158ec853469b7ab8548f9755cdd9aaec54c1c3e4276e2d36bc\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.19.0/jira-1.19.0.tgz\n    version: 1.19.0\n  - annotations:\n      artifacthub.io/changes: '- \"Update appVersions for DC apps (#770)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.5\n    created: \"2024-03-26T03:31:05.497965495Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 5299104f8e1f682e43d9a19c3b9431595028e080bd0a4ca2a89093240c2f929e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.18.1/jira-1.18.1.tgz\n    version: 1.18.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add Openshift analytics (#763)\"\n        - \"Update appVersions for DC apps (#765)\"\n        - \"OpenShift Support (#752)\"\n        - \"Use testPods values for test images and container resources (#761)\"\n        - \"Relabel instance name on jmx service monitor (#757)\"\n        - \"Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.4\n    created: \"2024-02-27T22:52:08.102292979Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.6\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 99098f0035f2b8355addb0dc074b7ff2ca095c89600d34d25a2a57a4c1e9682d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.18/jira-1.18.tgz\n    version: \"1.18\"\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"StatefulSet PVC auto deletion (#736)\"\n        - \"Update appVersions for DC apps (#738)\"\n        - \"Add optional postStart hook (#735)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.1\n    created: \"2023-12-18T05:54:10.64721791Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: b231b52b45539609c6aa42b1ac52f4ee2c6c505b7da2e02605b6918de821c9ec\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.17.2/jira-1.17.2.tgz\n    version: 1.17.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make liveness probe configurable (#732)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.0\n    created: \"2023-12-11T00:31:05.91757052Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 1926d8b8bbe4d55c8a9f949398ae929fdf126c3b0dc350a39231cc2391669a9a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.17.1/jira-1.17.1.tgz\n    version: 1.17.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Make test pod metadata and spec configurable (#727)\"\n        - \"Optional analytics/support ConfigMap (#721)\"\n        - \"Fix ingress annotations comment (#720)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.12.0\n    created: \"2023-12-07T00:11:48.455053806Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: c64f57048984456c677a22a4c7e7e9c02a4054529912843cee8d70d3d6636748\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.17.0/jira-1.17.0.tgz\n    version: 1.17.0\n  - annotations:\n      artifacthub.io/changes: '- \"JMX container resources (#707)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.11\n    created: \"2023-10-30T20:13:53.336129151Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.5\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 6994b0c4fee65f4dda5be9322a32c7da6f11284841f65c2c8ac1040e76cfceef\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.16.6/jira-1.16.6.tgz\n    version: 1.16.6\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Fix custom jmx config (#699)\"\n        - \"Copy cacerts first, then import certs (#696)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.11\n    created: \"2023-10-24T05:50:01.188177823Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: d6755b6a5b1c08273f63b0403d001934b7f36e54d329628736ac866abd2c4a78\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.16.5/jira-1.16.5.tgz\n    version: 1.16.5\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.11\n    created: \"2023-10-11T21:45:47.647337484Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 70447a95e8a47ae93f3193c4b619f2e79b83a44c242aa5d0e5d6bc1ef239a1f9\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.16.4/jira-1.16.4.tgz\n    version: 1.16.4\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.11\n    created: \"2023-10-11T01:56:39.031573231Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 75b8451a8f4c86c2a9b669ffaa9a36f54dfa848b25d7c1b51ce899fb3203b5d1\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.16.3/jira-1.16.3.tgz\n    version: 1.16.3\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#683)\"\n        - \"Add quote to podAnnotation templating (#678)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.11\n    created: \"2023-10-08T21:12:06.044602637Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: a5e92175cb2b5ec8e307a7b0a50a549bc0480f260995c9eb5164499f4c2545f6\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.16.2/jira-1.16.2.tgz\n    version: 1.16.2\n  - annotations:\n      artifacthub.io/changes: '- \"Update Helm chart version\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.10\n    created: \"2023-09-20T23:33:31.617788801Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: a98a0089bebf5b5fffc5d083277838a2c20e55e68647f31f281c677f4e3b8d83\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.16.1/jira-1.16.1.tgz\n    version: 1.16.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Allow templating of pod annotations (#662)\"\n        - \"Make securityContext configurable for jmx exporter init container (#670)\"\n        - \"Add user provided certificates to the default Java truststore (#663)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.10\n    created: \"2023-09-18T06:13:49.449453506Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.4\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 1d29c4a6eaa476c9e37956c78aa2d4406004809da72d800be6b19427900e7405\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.16.0/jira-1.16.0.tgz\n    version: 1.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Decouple server and jmx annotations (#654)\"\n        - \"Disable startup probes by default (#653)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.9\n    created: \"2023-08-28T05:35:49.486603208Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: dfec6e85a2d53f36e2881535aced026758c87d658a6235e8bf105ecd032cfeeb\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.15.3/jira-1.15.3.tgz\n    version: 1.15.3\n  - annotations:\n      artifacthub.io/changes: '- \"Add defaultMode to additionalConfigMaps (#647)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.9\n    created: \"2023-08-22T05:27:07.818167206Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 6128a76253b96905a7a79aad718eb9dfa659a379f5168195e451160a50b72581\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.15.2/jira-1.15.2.tgz\n    version: 1.15.2\n  - annotations:\n      artifacthub.io/changes: '- \"Make startup probes optional (#646)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.9\n    created: \"2023-08-17T21:54:16.62379182Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 100eeac3fd92ff7e0ed3cee408a10110da7c5bf585cc7bef31432ddd363c15db\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.15.1/jira-1.15.1.tgz\n    version: 1.15.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\"\n        - \"Add annotations to Grafana dashboards ConfigMaps (#637)\"\n        - \"Add additional ConfigMaps to Helm Charts (#635)\"\n        - \"Update appVersions for DC apps (#638)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.9\n    created: \"2023-08-07T23:31:33.14055502Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: e872447749b60304889ffd42f27ef1a2a369c5f9aba15e49cdd7421d7407551d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.15.0/jira-1.15.0.tgz\n    version: 1.15.0\n  - annotations:\n      artifacthub.io/changes: '- \"Disable liveness probes by default, make timeoutSeconds\n        configurable (#630)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.8\n    created: \"2023-07-26T00:47:39.598690636Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 7f2506304ca24443da5001b23a7909dfe879672c484d7d00d2262d8af6db2a95\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.14.1/jira-1.14.1.tgz\n    version: 1.14.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add liveness probes, make readinessProbes configurable (#626)\"\n        - \"Support running Jira and Confluence containers as non root (incl running in OpenShift) (#623)\"\n        - \"make sharedHome.permissionFix.command helper to be per-product (#622)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.8\n    created: \"2023-07-25T09:31:55.933682502Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 17a79b62767eb02292d16db7551f2947acb33c02c58aa2e31194a3f20787c428\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.14.0/jira-1.14.0.tgz\n    version: 1.14.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\"\n        - \"Add s3 avatars storage support for Jira (#608)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.7\n    created: \"2023-06-28T03:38:02.86444161Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.3\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 9a368f76e8267a55ba37d71437cb1a81e0eadfd5525c10dad47b47ec96f43b99\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.13.1/jira-1.13.1.tgz\n    version: 1.13.1\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#599)\"\n        - \"Update Grafana dashboards for DC apps (#589)\"\n        - \"Bamboo dashboard (#588)\"\n        - \"Make sessionAffinity configurable in service spec (#582)\"\n        - \"Cleanup dashboards\"\n        - \"Jira Grafana Dashboards (#578)\"\n        - \"Add optional ServiceMonitors to DC Helm Charts (#573)\"\n        - \"Expose JMX beans on http endpoint (#562)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.7\n    created: \"2023-06-13T03:59:48.349815746Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.2.2\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: da03a1aa34ed306ba49048239584369d2d5266e3404b3aeb6af966e807e7d8ec\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.13.0/jira-1.13.0.tgz\n    version: 1.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Add priorityClassName to pod spec (#557)\"\n        - \"Update appVersions for DC apps (#558)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.5\n    created: \"2023-04-18T04:45:11.186230668Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 08c4eed84505da28b2d82b9e25795c9e4fc92a76236c86c3a5f2b1d8f1ad824f\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.12.0/jira-1.12.0.tgz\n    version: 1.12.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - \"Update appVersions for DC apps (#533)\"\n        - \"JIRA - Add livenessProbe check to monitor the health of applications for each pod (#511)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.4\n    created: \"2023-03-22T04:40:29.343259179Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ca102cbf416a5c87998d06ba4527b5afc99e1d7d1776317ddd07720251715fde\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.11.0/jira-1.11.0.tgz\n    version: 1.11.0\n  - annotations:\n      artifacthub.io/changes: '- \"Add Bitbucket Mesh to Bitbucket Helm chart (#501)\"'\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.3\n    created: \"2023-02-20T03:19:52.367162979Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: d5fe85b32081fe2936008f300c93f037176341e2f96b1d565318bd6dae2b055e\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.10.0/jira-1.10.0.tgz\n    version: 1.10.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Fix artifact hub annotation yaml\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.3\n    created: \"2023-02-15T23:07:54.59610867Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: a891669275532189ebc8f1d840ff85d02f7e208278b01edbf5a78b6f0e07ab3d\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.9.1/jira-1.9.1.tgz\n    version: 1.9.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update appVersion to the latest LTS\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.3\n    created: \"2023-02-15T05:21:11.201325035Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 437db8f8ccc1812ea0d440e5fb77dcdeaa47f474e5240f286dfbffcf78afe431\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.9.0/jira-1.9.0.tgz\n    version: 1.9.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Fix artifacthub annotations\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.0\n    created: \"2022-12-11T23:57:43.592126Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 0195ce685f50bc83ab6678e4afb508ee2cda9d5d851a73987040d1b6f5246534\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.8.1/jira-1.8.1.tgz\n    version: 1.8.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Stop supporting 1.19 and 1.20 k8s\n        - kind: changed\n          description: Update appVersion to the latest LTS\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 9.4.0\n    created: \"2022-12-08T23:43:20.739538Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 6591bcb4ae1dc3513d32c2b63d7c067cff51a06f85eac6c20584c5e2bd39af36\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.21.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.8.0/jira-1.8.0.tgz\n    version: 1.8.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Patch release to fix Artifacthub metadata\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.13\n    created: \"2022-10-26T04:39:59.296319961Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: a2440085f1921fa87836ec66775e64fcb39bc13c4eeb3c84f0534481eb911890\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.7.1/jira-1.7.1.tgz\n    version: 1.7.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Pin Python version to 3.9.14\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/468\n        - kind: changed\n          description: Update Bitbucket ingress testing values\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/466\n        - kind: changed\n          description: Ingress Class Name is moved under spec field.\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/451\n        - kind: changed\n          description: Make ATL_FORCE_CFG_UPDATE configurable in values.yaml\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/454\n        - kind: changed\n          description: Add osquery related env vars for Terraform\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/462\n        - kind: changed\n          description: AWS cleanup and log colletion from k8s\n          links:\n            - name: Github PR\n              url: https://github.com/atlassian/data-center-helm-charts/pull/461\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.13\n    created: \"2022-10-25T00:43:33.309359018Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ce99616dc1c529357b76d67b1e95a79e5947abf0b21c4d1b727a4d46560cb9f7\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.7.0/jira-1.7.0.tgz\n    version: 1.7.0\n  - annotations:\n      artifacthub.io/changes: |\n        - \"Ingress Class Name is moved under spec (#450)\"\n        - \"Improved documentation (#448)\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.13\n    created: \"2022-10-12T01:34:49.290339667Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 34cb81a11e904104cad3fa9403742cbfe8941ff0e330c25f47bae606826de873\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.6.0/jira-1.6.0.tgz\n    version: 1.6.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Use the custom ports for Jira service\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/419\n        - kind: changed\n          description: Jira updated to 8.20.10 version\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/430\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.10\n    created: \"2022-07-15T04:27:48.001739272Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 9a9c2992c371a70010a29b4c64f67dcb8bc22243284cb13648ab01bc79a24236\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.5.0/jira-1.5.0.tgz\n    version: 1.5.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update Jira version to 8.20.9\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/417\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.9\n    created: \"2022-06-09T17:25:22.88341+10:00\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 0ce2b5d83bf6f168a422a90a8046228d5a13dcb9c6a625be80fd6630bd796f83\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.4.1/jira-1.4.1.tgz\n    version: 1.4.1\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: added\n          description: Make pod securityContext optional\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/389\n        - kind: added\n          description: Support for configuring ingress proxy settings via values.yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/402\n        - kind: changed\n          description: Update Jira version to 8.20.8\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/412\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.8\n    created: \"2022-05-25T04:04:17.345472775Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 5b0f2011c850790cf98282902b0bef282e901a2e5d80477d76b594288998862a\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.4.0/jira-1.4.0.tgz\n    version: 1.4.0\n  - annotations:\n      artifacthub.io/changes: |\n        - kind: changed\n          description: Update Jira version to 8.20.7\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/396\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.7\n    created: \"2022-03-23T21:52:12.938959376Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 88c4b6d68e9bc895c7ecf84620d7a766a1f9235636787434ae3011a094221be0\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.3.0/jira-1.3.0.tgz\n    version: 1.3.0\n  - annotations:\n      artifacthub.io/changes: \"- kind: added\\n  description: Add new feature additionalPorts\n        (for jmx-monitoring) \\n  links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/353\\n-\n        kind: changed\\n  description: Set ActiveProcessorCount automatically based\n        on Values.<product>.resources.container.requests.cpu\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/352\\n-\n        kind: added\\n  description: Added topologySpreadConstraints to products\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/351\\n-\n        kind: changed\\n  description: Define podAnnotations as template to allow overrides\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/341\\n-\n        kind: added\\n  description: Added new feature to define loadBalancerIP\\n  links:\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/365\\n-\n        kind: added\\n  description: Added new feature podLabels\\n  links:\\n  - name:\n        Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/364\\n-\n        kind: added\\n  description: Added new feature additionalVolumeClaimTemplates\n        and provided example in documentation\\n  links:\\n  - name: Github PR\\n    url:\n        https://github.com/atlassian/data-center-helm-charts/pull/334\\n  - name: Github\n        PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/368\\n-\n        kind: added\\n  description: Added service account annotation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/363\\n-\n        kind: changed\\n  description: Updated Atlassian charts to use common definitions\\n\n        \\ links:\\n  - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/303\\n-\n        kind: changed\\n  description: Improvements on documentation\\n  links:\\n  -\n        name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/370\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/357\\n-\n        kind: changed\\n  description: Jira DC updated to 8.20.5 version (LTS)\\n  links:\\n\n        \\ - name: Github PR\\n    url: https://github.com/atlassian/data-center-helm-charts/pull/378\\n\"\n      artifacthub.io/containsSecurityUpdates: \"false\"\n    apiVersion: v2\n    appVersion: 8.20.5-jdk11\n    created: \"2022-02-14T04:05:37.029085067Z\"\n    dependencies:\n    - name: common\n      repository: https://atlassian.github.io/data-center-helm-charts\n      version: 1.0.0\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 66968fc1e415d4d547c92b0014fa31c7aa4a7736abcdd354c95895abd9210432\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.2.0/jira-1.2.0.tgz\n    version: 1.2.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add support for custom schedulerName\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/301\n        - kind: added\n          description: Bind EHCACHE ports as environmental variables\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/308\n        - kind: added\n          description: Enable configuring ingress.class name\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/313\n        - kind: removed\n          description: Cleanup redundant (not-used) jira.terminationGracePeriodSeconds\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/306\n        - kind: changed\n          description: Make security context more flexible\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/321\n        - kind: added\n          description: Roll Statefulset Pods if ConfigMap changes\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/315\n        - kind: changed\n          description: Jira DC updated to 8.20.1 version (LTS)\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/345\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.20.1-jdk11\n    created: \"2021-11-04T03:20:38.983881869Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 61b5836808e6e76adaf9a614d1528dadcd3c89fd91c0261004e8f7d9e0aa8d94\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.1.0/jira-1.1.0.tgz\n    version: 1.1.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Improvements to graceful shutdown\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/282\n        - kind: changed\n          description: Update Jira to 8.19.0\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/286\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/275\n            url: https://github.com/atlassian/data-center-helm-charts/pull/276\n            url: https://github.com/atlassian/data-center-helm-charts/pull/277\n            url: https://github.com/atlassian/data-center-helm-charts/pull/279\n            url: https://github.com/atlassian/data-center-helm-charts/pull/280\n            url: https://github.com/atlassian/data-center-helm-charts/pull/284\n            url: https://github.com/atlassian/data-center-helm-charts/pull/285\n            url: https://github.com/atlassian/data-center-helm-charts/pull/289\n            url: https://github.com/atlassian/data-center-helm-charts/pull/290\n            url: https://github.com/atlassian/data-center-helm-charts/pull/291\n            url: https://github.com/atlassian/data-center-helm-charts/pull/293\n            url: https://github.com/atlassian/data-center-helm-charts/pull/295\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.19.0-jdk11\n    created: \"2021-09-07T01:03:17.9327012Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: fa87addb94c4e380198824f86409059fa1bf2e4e9dcbe89a581d8ca00bb53f79\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-1.0.0/jira-1.0.0.tgz\n    version: 1.0.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Enable NFS permission fixer by default\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/241\n        - kind: changed\n          description: Enable configuration for SET_PERMISSIONS docker image variable\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/261\n        - kind: added\n          description: Configurable grace periods\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/249\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/236\n            url: https://github.com/atlassian/data-center-helm-charts/pull/243\n            url: https://github.com/atlassian/data-center-helm-charts/pull/245\n            url: https://github.com/atlassian/data-center-helm-charts/pull/252\n            url: https://github.com/atlassian/data-center-helm-charts/pull/253\n            url: https://github.com/atlassian/data-center-helm-charts/pull/256\n            url: https://github.com/atlassian/data-center-helm-charts/pull/258\n            url: https://github.com/atlassian/data-center-helm-charts/pull/260\n            url: https://github.com/atlassian/data-center-helm-charts/pull/263\n            url: https://github.com/atlassian/data-center-helm-charts/pull/268\n            url: https://github.com/atlassian/data-center-helm-charts/pull/270\n            url: https://github.com/atlassian/data-center-helm-charts/pull/272\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.13.9-jdk11\n    created: \"2021-08-27T05:31:25.7845406Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: b5fc0edfc058c34dedb7158b66e677bcf0af4fdfb31e930e0be75bd9b8294661\n    home: https://atlassian.github.io/data-center-helm-charts/\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.16.0/jira-0.16.0.tgz\n    version: 0.16.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Add Service annotations\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/209\n        - kind: added\n          description: Add support for providing a custom fluentd start command\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/218\n        - kind: changed\n          description: Renamed the 'master' branch to 'main'\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/232\n        - kind: changed\n          description: Update eks cluster yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/227\n        - kind: changed\n          description: Improve documentation\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/206\n            url: https://github.com/atlassian/data-center-helm-charts/pull/222\n            url: https://github.com/atlassian/data-center-helm-charts/pull/223\n            url: https://github.com/atlassian/data-center-helm-charts/pull/228\n            url: https://github.com/atlassian/data-center-helm-charts/pull/229\n            url: https://github.com/atlassian/data-center-helm-charts/pull/231\n            url: https://github.com/atlassian/data-center-helm-charts/pull/233\n            url: https://github.com/atlassian/data-center-helm-charts/pull/235\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.13.9-jdk11\n    created: \"2021-08-17T01:45:27.4100158Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 3b091b281252f481e78e8507bdba80653fdc86b13b69bf96f260cdf8722afb20\n    home: https://www.atlassian.com/software/jira\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.15.0/jira-0.15.0.tgz\n    version: 0.15.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: security\n          description: Update Jira version to 8.13.9-jdk11\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/212\n      artifacthub.io/containsSecurityUpdates: \"true\"\n    apiVersion: v2\n    appVersion: 8.13.9-jdk11\n    created: \"2021-07-23T07:52:10.9362943Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: ec41bb5f63bed4fe079aedc1f6841cb703e49b1a9cc5749657d4480e2fdff3b6\n    home: https://www.atlassian.com/software/jira\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.14.0/jira-0.14.0.tgz\n    version: 0.14.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Added Jira Proxy information to helm chart\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/202\n        - kind: changed\n          description: Volume docs updates\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/188\n    apiVersion: v2\n    appVersion: 8.13.7-jdk11\n    created: \"2021-07-22T05:12:23.021563331Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: a6b789356265c20d421a9f152fedd9fcfda8f3bbe705e18b1c897b20b8cb62fc\n    home: https://www.atlassian.com/software/jira\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.13.0/jira-0.13.0.tgz\n    version: 0.13.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: added\n          description: Defining the following values in the helpers template for each chart, to allow template overrides\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/173\n        - kind: fixed\n          description: Wording improvement for warning in NOTES when PV is not used\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/199\n        - kind: fixed\n          description: Improve readability of values.yaml\n          links:\n          - name: Github PR\n            url: https://github.com/atlassian/data-center-helm-charts/pull/182\n    apiVersion: v2\n    appVersion: 8.13.7-jdk11\n    created: \"2021-07-06T17:30:01.365393+10:00\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 60f310620bd60470efce682f9a0ffbb097c7712beba6f100903e5d25fc280b23\n    home: https://www.atlassian.com/software/jira\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.12.0/jira-0.12.0.tgz\n    version: 0.12.0\n  - annotations:\n      artifacthub.io/changes: |-\n        - kind: changed\n          description: Changed Jira version to 8.13.7-jdk11\n        - kind: added\n          description: Add warning to NOTES when no persistent volumes are configured\n        - kind: added\n          description: Print service URL after helm installation\n        - kind: added\n          description: Improved documentation\n    apiVersion: v2\n    appVersion: 8.13.7-jdk11\n    created: \"2021-06-17T02:07:46.678284884Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 815fb2bbe65418e510cde0a44bbdc3ccfde2599e80f189a96b6e99b6005099c9\n    home: https://www.atlassian.com/software/jira\n    icon: https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.11.0/jira-0.11.0.tgz\n    version: 0.11.0\n  - apiVersion: v2\n    appVersion: 8.13.6-jdk11\n    created: \"2021-06-01T10:24:25.836628681Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: 9765fd389198558ffb910c719251b469106b549580f3e32e98d5e44478fe4fda\n    home: https://www.atlassian.com/software/jira\n    icon: https://wac-cdn.atlassian.com/dam/jcr:826c97dc-1f5c-4955-bfcc-ea17d6b0c095/jira%20software-icon-gradient-blue.svg?cdnVersion=492\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.19.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.10.0/jira-0.10.0.tgz\n    version: 0.10.0\n  - apiVersion: v2\n    appVersion: 8.13.6-jdk11\n    created: \"2021-05-25T06:48:59.1769467Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: f26e760ff1abd0f7a3ce53d7e3b4c319df940fb8c8d3975a36253134d50055b1\n    home: https://www.atlassian.com/software/jira\n    icon: https://wac-cdn.atlassian.com/dam/jcr:826c97dc-1f5c-4955-bfcc-ea17d6b0c095/jira%20software-icon-gradient-blue.svg?cdnVersion=492\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.9.0/jira-0.9.0.tgz\n    version: 0.9.0\n  - apiVersion: v2\n    appVersion: 8.13.6-jdk11\n    created: \"2021-05-20T04:12:36.8734413Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: dad7819b524428f1fa447ba96f628d4c4c094d671ffa3e259df58ed3e6d0b03c\n    home: https://www.atlassian.com/software/jira\n    icon: https://wac-cdn.atlassian.com/dam/jcr:826c97dc-1f5c-4955-bfcc-ea17d6b0c095/jira%20software-icon-gradient-blue.svg?cdnVersion=492\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Jira DC\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.8.0/jira-0.8.0.tgz\n    version: 0.8.0\n  - apiVersion: v2\n    appVersion: 8.13.6-jdk11\n    created: \"2021-05-07T03:33:46.4079487Z\"\n    description: A chart for installing Jira Data Center on Kubernetes\n    digest: f236dc9ea0cc7f69a879bb32efabeb8f3e4fa11a944014a54d5fa99f99ad0d30\n    home: https://www.atlassian.com/software/jira\n    icon: https://wac-cdn.atlassian.com/dam/jcr:826c97dc-1f5c-4955-bfcc-ea17d6b0c095/jira%20software-icon-gradient-blue.svg?cdnVersion=492\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    - https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.7.0/jira-0.7.0.tgz\n    version: 0.7.0\n  - apiVersion: v2\n    appVersion: 8.13.0-jdk11\n    created: \"2021-05-04T05:38:38.946732021Z\"\n    description: A chart for installing Jira DC on Kubernetes\n    digest: 166acb16811b4d81e17eff604b3f0be639ea8dc66d4a0ebe311f7676fba7fde0\n    home: https://github.com/atlassian/data-center-helm-charts\n    keywords:\n    - Jira\n    - Jira Software\n    - Jira Server\n    - Jira Data Center\n    - Atlassian\n    kubeVersion: '>=1.17.x-0'\n    name: jira\n    sources:\n    - https://github.com/atlassian/data-center-helm-charts\n    type: application\n    urls:\n    - https://github.com/atlassian/data-center-helm-charts/releases/download/jira-0.6.0/jira-0.6.0.tgz\n    version: 0.6.0\ngenerated: \"2026-05-06T12:34:51.84156829Z\"\n"
  },
  {
    "path": "docs/docs/platforms/.pages",
    "content": "nav:\n    - PLATFORMS.md\n    - openshift\n    - ..."
  },
  {
    "path": "docs/docs/platforms/PLATFORMS.md",
    "content": "# Platform information\n\n!!! warning \"Support Disclaimer\"\n    Helm is a Kubernetes package manager that orchestrates the provisioning of applications onto existing Kubernetes infrastructure. The requirements for this infrastructure are described in [Prerequisites](../userguide/PREREQUISITES.md). The Kubernetes cluster remains your responsibility; we do not provide direct support for Kubernetes or the underlying hardware it runs on.\n\n    If you have followed our documentation on how to configure the Helm charts, and you're using correctly created components, we will then provide support if you encounter an error with installation after running the `helm install` command. \n\n    Read more about [what we support and what we don’t](../troubleshooting/SUPPORT_BOUNDARIES.md). \n\nUsing our Helm charts on different platforms:\n\n* [OpenShift](../openshift/OPENSHIFT)\n"
  },
  {
    "path": "docs/docs/platforms/openshift/OPENSHIFT.md",
    "content": "# Deploy To OpenShift\n\n!!! warning \"Support disclaimer\"\n    Helm is a Kubernetes package manager that orchestrates the provisioning of applications onto existing Kubernetes infrastructure. The requirements for this infrastructure are described in [Prerequisites](../../userguide/PREREQUISITES.md). The Kubernetes cluster remains your responsibility; we do not provide direct support for Kubernetes or the underlying hardware it runs on.\n\n    If you have followed our documentation on how to configure Helm charts, and you're correctly-created components, we will provide support if you encounter an error with installation after running the `helm install` command.\n\n    Read more about [what we support and what we don’t](../../troubleshooting/SUPPORT_BOUNDARIES.md).\n\n!!! info \"Official OpenShift support\"\n    **Starting from version 1.18, Atlassian Data Center Helm charts officially include support for OpenShift**.\n\n## :simple-redhatopenshift: Deploy with a restricted and nonroot security context constraint\n\nAtlassian Data Center Helm charts are vendor and cloud agnostic, and create objects from standard APIs that [OpenShift](https://www.openshift.com/){.external} fully supports.\n\nHowever, the default OpenShift **restricted** Security Context Constrain ([SCC](https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html){.external}) requires pods to be run with a UID and a SELinux context that are allocated to the namespace. It's therefore not possible to deploy DC Helm charts with the default settings (with pre-defined `securityContext` and containers that run as root). See [FAQs](../OPENSHIFT_FAQ) for typical errors.\n\n!!! warning \"ATL_TOMCAT_* environment variables\"\n    When running as restricted or nonroot SCC, some of `ATL_TOMCAT_*` environment variables passed to the Helm chart in `additionalEnvironmentVariables` will be ignored, because `server.xml` and  `seraph-config.xml` are mounted as a ConfigMaps rather than generated in the container entrypoint from Jinja templates. Both `<product>.tomcatConfig` and `<product>.seraphConfig` have a number of properties which you can override if necessary. Look at `tomcatConfig` stanza in the chart's values.yaml for more details.\n\n=== \"Restricted SCC (:octicons-thumbsup-16: Recommended)\"\n    !!! info \"Restricted SCC\"        \n        Restricted SCC denies access to all host features and requires pods to be run with a UID and a SELinux context that are allocated to the namespace.\n    \n    Running containers in OpenShift with a restricted SCC is the most secure approach. To be able to successfully deploy Atlassian DC Helm charts with a restricted SCC, set `openshift.runWithRestrictedSCC` to true in the Helm values file:\n\n    ```yaml\n    openshift:\n      runWithRestrictedSCC: true\n    ```\n\n    This property will:\n    \n    * unset `securityContext` on the pod and `initContainers` level, letting OpenShift set it\n    * trigger the creation of a ConfigMap with `server.xml` and `seraph-config.xml` that are mounted as read-only files into containers (rather than generated in the container entrypoint). Both `server.xml` and `seraph-config.xml` can be configured in `<product>.tomcatConfig` Helm stanza (except for Bitbucket which does not have these configuration files)\n    * disable the nfs-permission fixer init container that is run as root by default. If you need to change permissions in an existing shared-home volume, do it when provisioning/migrating the volume. See [FAQs](../OPENSHIFT_FAQ/#nfs-permission-fixer-is-disabled-how-can-i-make-shared-home-writable) for more details.\n\n=== \"Nonroot SCC\"\n    !!! info \"Nonroot SCC\"\n          Nonroot SCC provides all features of the restricted SCC but allows users to run with **any** non-root UID.\n\n    !!! info \"Supported versions\"\n        OpenShift nonroot SCC friendly values are available in versions `1.14.0+` for Jira and Confluence, and `1.18+` for Crowd and Bamboo. If you can't upgrade, consider using 'additionalFiles' to mount `server.xml` and `seraph-config.xml` as ConfigMaps, which should be created outside the Helm chart.\n\n    To be able to run DC containers as users created during an image build you need to let the ServiceAccount use the nonroot SCC. Typically, cluster admin privileges are required (replace namespace and Helm release name):\n     \n    ```bash\n    oc adm policy add-scc-to-user nonroot \\\n           system:serviceaccount:<namespace>:<helm-release-name>\n    ```\n    \n    Use the following Helm values (replace `jira` and `UIDs` depending on the deployed product):\n    \n    ```yaml\n    jira:\n      securityContext:\n        runAsUser: 2001\n        runAsGroup: 2001\n        fsGroup: 2001\n      tomcatConfig:\n        generateByHelm: true\n      seraphConfig:\n        generateByHelm: true\n    volumes:\n      sharedHome:\n        nfsPermissionFixer:\n          enabled: false  \n    ```\n\n    If you enabled `monitoring.exposeJmxMetrics`, you need to run the init container as non root:\n    \n    ```yaml\n    monitoring:\n      jmxExporterInitContainer:\n        runAsRoot: false\n    ```\n\n## :material-transit-connection-variant: OpenShift Routes\n\nTo create [OpenShift Routes](https://docs.openshift.com/container-platform/4.14/networking/routes/route-configuration.html){.external} use the following Helm values:\n\n```yaml\ningress:\n  create: true\n  openShiftRoute: true\n  host: your.hostname.com\n  path: /yourpath # optional\n```\n\nAdditional Route configuration include `annotations` and `routeHttpHeaders`:\n\n```yaml\ningress:\n  annotations: {}\n  routeHttpHeaders: {}\n```\nIngress values such as `maxBodySize`, `proxyConnectTimeout`, `proxyReadTimeout`, `proxySendTimeout`, `nginx`, and `className` are ignored when `ingress.openShiftRoute` is set to true.\nSee [FAQs](../OPENSHIFT_FAQ) for additional information on how to configure OpenShift routes."
  },
  {
    "path": "docs/docs/platforms/openshift/OPENSHIFT_FAQ.md",
    "content": "# OpenShift FAQs\n\n## Permission errors when starting containers\n\nIf you encounter the following log message upon starting the container, disregard it as it is not indicative of a critical error:\n\n```bash\nINFO:root:Generating /opt/atlassian/confluence/conf/server.xml from template server.xml.j2\nWARNING:root:Permission problem writing '/opt/atlassian/confluence/conf/server.xml'; skipping\nINFO:root:Generating /opt/atlassian/confluence/confluence/WEB-INF/classes/seraph-config.xml from template seraph-config.xml.j2\nWARNING:root:Permission problem writing '/opt/atlassian/confluence/confluence/WEB-INF/classes/seraph-config.xml'; skipping\nINFO:root:Generating /opt/atlassian/confluence/confluence/WEB-INF/classes/confluence-init.properties from template confluence-init.properties.j2\nWARNING:root:Permission problem writing '/opt/atlassian/confluence/confluence/WEB-INF/classes/confluence-init.properties'; skipping\n```\n\nThe issue arises because the container's entrypoint script tries to generate and save `server.xml` and `seraph-config.xml` files but is unable to due to insufficient permissions. This is a normal behavior when Atlassian DC containers run as a non-root user. Note that both `server.xml` and `seraph-config.xml` are generated by Helm and mounted as read-only files within the container. If you need to change the default values for the `server.xml`, you can do it in the `<product>.tomcatConfig` stanza in the Helm values file.\n\n## No pods have been created\n\nThis can happen when deploying Atlassian DC Helm charts to OpenShift with the default settings, and the service account has not been granted any SCC other than restricted.\nYou will typically find the following error in Kubernetes events:\n\n```bash\nError creating: pods \"jira-0\" is forbidden:\nunable to validate against any security context constraint:\n[provider \"anyuid\": Forbidden: not usable by user or serviceaccount,\nprovider restricted-v2: .spec.securityContext.fsGroup: \nInvalid value: []int64{2001}: 2001 is not an allowed group, provider \"restricted\":\nForbidden: not usable by user or serviceaccount, provider \"nonroot-v2\":\nForbidden: not usable by user or serviceaccount, provider \"nonroot\":\nForbidden: not usable by user or serviceaccount, provider \"hostmount-anyuid\":\nForbidden: not usable by user or serviceaccount, provider \"machine-api-termination-handler\":\nForbidden: not usable by user or serviceaccount, provider \"hostnetwork-v2\":\nForbidden: not usable by user or serviceaccount, provider \"hostnetwork\":\nForbidden: not usable by user or serviceaccount, provider \"hostaccess\":\nForbidden: not usable by user or serviceaccount, provider \"node-exporter\":\nForbidden: not usable by user or serviceaccount, provider \"efs-csi-scc\":\nForbidden: not usable by user or serviceaccount, provider \"privileged\":\nForbidden: not usable by user or serviceaccount]\n```\n\nTo fix this error, set `openshift.runWithRestrictedSCC` to true in Helm values.\n\nAnother possible error in the events:\n\n```bash\nError: container has runAsNonRoot and\nimage will run as root (pod: \"jira-0_atlassian\", container: container)\n```\n\nThis can happen if the ServiceAccount has been granted `nonroot` SCC privileges, but `runAsUser` has not been set in `securityContext`. To fix the error, use the following Helm values:\n\n```yaml\njira:\n  securityContext:\n    fsGroup: 2001\n    runAsUser: 2001\n```\n\nSee the complete list of Helm values for the [Nonroot SCC](../OPENSHIFT/#__tabbed_1_2).\n\n## What's the difference between restricted and nonroot SCC?\n\nFrom the security/compliance standpoint, **Restricted SCC** enforces a more secure set of rules, or rather limitations. However, running DC containers as nonroot users does not expose any security threats either. The only two disadvantages are that the ServiceAccount needs to be granted nonroot SCC privileges, and there are more Helm values to be overridden. See: [Nonroot SCC](../OPENSHIFT/#__tabbed_1_2).\n\n:octicons-thumbsup-16: Running with a Restricted SCC is the recommended way to deploy Atlassian DC Helm charts. See: [Restricted SCC](../OPENSHIFT/#__tabbed_1_1)\n\n\n## NFS permission fixer is Disabled, how can I make shared home writable?\n\nWhen running Atlassian DC containers with a restricted or nonroot SCC, it is not possible to run the nfs-permission fixer container because it runs as root. You need to make sure the volume is writable either for an unprivileged restricted SCC user or a user defined in `securityContext` (with UID like 2001, 2002, 2003 depending on the product).\n\nIf you run NFS server, you may either change permissions directly on the NFS server instance, or create a temporary ServiceAccount, grant it anyuid SCC privileges, create a pod that uses this ServiceAccount, mounts shared-home volume and recursively changes owner of the shared home directory. It can take longer for larger volumes. \n\n## Can I use a custom certificate and key for my route?\n\nBy default, all Routes that the Helm charts create will use the default OpenShift Router certificate and key. If you want to use a custom crt-key pair for an individual Route, create a [TLS secret](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_create/kubectl_create_secret_tls/){.external} with `tls.crt`, `tls.key` and `ca.crt` (optional) in `data` and provide the secret name in Helm values:\n\n```\ningress:\n  create: true\n  openShiftRoute: true\n  tlsSecretName: my-tls-secret\n```\n\n## How can I configure OpenShift routes?\n\nYou can provide custom annotations for your Routes in the `ingress` Helm values stanza. For example, to increase connection timeout, annotate your route:\n\n```yaml\ningress:\n  create: true\n  openShiftRoute: true\n  annotations:\n    haproxy.router.openshift.io/timeout: 60s\n```\n\nYou will find a list of available Route-specific annotations in the [official documentation](https://docs.openshift.com/container-platform/4.14/networking/routes/route-configuration.html#nw-route-specific-annotations_route-configuration){.external}.\n\n[Route HTTP Headers](https://docs.openshift.com/container-platform/4.14/rest_api/network_apis/route-route-openshift-io-v1.html#spec-httpheaders){.external} can be configured in the `ingress` Helm values stanza:\n\n```yaml\ningress:\n  create: true\n  openShiftRoute: true\n  routeHttpHeaders:\n    <your-actions>\n```\n\n## What route TLS termination types are supported?\n\nAtlassian DC Helm charts only support **Edge TLS termination**, i.e. TLS termination is performed by the OpenShift router.\n\nPassthrough and Reencrypt TLS termination isn't currently supported. See: [Secured Routes](https://docs.openshift.com/container-platform/4.14/networking/routes/secured-routes.html){.external}\n"
  },
  {
    "path": "docs/docs/troubleshooting/.pages",
    "content": "nav:\n    - TROUBLESHOOTING.md\n    - SUPPORT_BOUNDARIES.md\n    - LIMITATIONS.md\n    - ...\n"
  },
  {
    "path": "docs/docs/troubleshooting/LIMITATIONS.md",
    "content": "# Limitations \n\n## Product limitations\nWe haven't changed our Data Center applications' architecture to support Kubernetes. So, as is with all our Data Center products, the following limitations still exist:\n\n* We don't support horizontal or vertical autoscaling in our products. Read about [Product scaling](../userguide/resource_management/RESOURCE_SCALING.md).\n* More pods doesn't mean that the application will be more performant.\n* We still have session affinity, so you will need to have a network setup that supports that. \n\n## Jira and horizontal scaling\nAt present there are issues relating to index replication with Jira when immediately scaling up by more than 1 pod at a time.\n\n* [Index replication service is paused indefinitely](https://jira.atlassian.com/browse/JRASERVER-72125){.external}\n* [Automatic restore of indexes will fail ](https://jira.atlassian.com/browse/JRASERVER-62669){.external}\n\n!!!info \"Indexing improvements\" \n  \n    Please note that Jira is actively being worked on to address these issues in the coming releases.\n      \nAlthough these issues are Jira specific, they are exasperated on account of the significantly reduced startup times for Jira when running in a Kubernetes cluster. As such these issues can have an impact on horizontal scaling if [you don't take the correct approach](../userguide/resource_management/RESOURCE_SCALING.md#scaling-jira-safely).\n\n## Bamboo\nThere are a number of known limitations relating to Bamboo Data Center, these are documented below.\n\n### Deployment\nWith [Bamboo DC 8.1](https://confluence.atlassian.com/bamboo/bamboo-8-1-release-notes-1103070461.html){.external} deployments to K8s using the Helm charts are now possible. This release does however contain an issue where [partial unattended deployments to K8s do not work](https://jira.atlassian.com/browse/BAM-21542){.external}. \n\n!!!info \"Unattended setup\"\n  \n    Until [this issue](https://jira.atlassian.com/browse/BAM-21542){.external} has been resolved, the recommended approach for deploying Bamboo server is using an `unattended` approach. That is, providing values to all those properties labeled as `REQUIRED` and `UNATTENDED-SETUP` within the `values.yaml`. This has the added benefit of eliminating any manual intervention (via the setup wizard) required for configuring Bamboo post deployment.\n\n    It should also be noted that the property, `bamboo.unattendedSetup` should be set to `true` (current default value) for this to work.\n\n### Cluster size\nAt present Bamboo Data Center utilizes an [active-passive clustering model](https://confluence.atlassian.com/bamboo/clustering-with-bamboo-data-center-1063170551.html){.external}. This architecture is not ideal where K8s deployments are concerned.\n\n!!!warning \"1 pod clusters only\" \n  \n    At present, Bamboo server cluster sizes comprising only `1` pod is the only supported topology for now.\n\n### Server and agent affinity\nIt is preferable that the Bamboo server and agents are be deployed to the same cluster due to security and performance reasons. If agents are deployed outside the Kubernetes cluster, you need to expose Bamboo server JMS port as `LoadBalancer` or `NodeIP`:\n\n```\nbamboo:\n  jmsService:\n    enabled: true\n    type: (LoadBalancer|NodeIP)\n```\n!!!warning \"Security and performance considerations\"\n   \n   If Bamboo server JMS port is exposed, it is highly recommended that you either allow access to it for Bamboo agents CIDR only (inbound security group rules if on AWS), and/or secure remote agent by configuring SSL for [AMQ](https://confluence.atlassian.com/bamkb/how-to-secure-your-remote-agent-bamboo-server-757465762.html){.external}.\n   \n   Deploying Bamboo agents to the same cluster with the server or at least to the same region/availability zone/datacenter is highly recommended to avoid performance and latency issues.\n\n\n### Bamboo to Cloud App Link\nWhen configuring application links between Bamboo server and any Atlassian Cloud server product, the Bamboo server base URL needs to be used. [See public issue for more detail](https://jira.atlassian.com/browse/BAM-21439).\n\n### Import and export of large datasets\nAt present there is an issue with Bamboo where the `/server` and `/status` endpoints become un-usable when performing an [export or import of large datasets](https://jira.atlassian.com/browse/BAM-18673){.external}. \n\n!!!info \"Data migration\"\n\n    For large Bamboo instances we recommend using native database and filesystem backup tools instead of the built in [export](https://confluence.atlassian.com/bamboo/exporting-data-for-backup-289277255.html){.external} / [import](https://confluence.atlassian.com/bamboo/importing-data-from-backup-289277260.html){.external} functionality that Bamboo provides. See the [migration guide](../userguide/MIGRATION.md) for more details.\n\nThe Bamboo Helm chart does however provide a facility that can be used to import [data exports produced through Bamboo](https://confluence.atlassian.com/bamboo/exporting-data-for-backup-289277255.html){.external} at deployment time. This can be used by configuring the Bamboo server `values.yaml` appropriately i.e. \n\n```yaml\nimport:\n  type: import\n  path: \"/var/atlassian/application-data/shared-home/bamboo-export.zip\"\n```\n\nUsing this approach will restore the full dataset as part of the Helm install process.\n\n## Crowd\n\n### LoadBalancer service type\nIf a Kubernetes cluster has multiple cluster nodes and Crowd `service.type` is `LoadBalancer`, Crowd pods may receive client requests from different cluster node IPs. This will cause session invalidation in the client browser, which is a security feature of Crowd. You can resolve it by either:\n\n* Unticking \"Require consistent client IP address\" in Session configuration or\n* Configuring AWS LoadBalancer with session affinity by annotating a service. You can find more details in [AWS LoadBalancer documentation](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/service/annotations/).\n\n\n## Platform limitations\nThese configurations are explicitly not supported, and the Helm charts don’t work without modifications in these environments:\n\n\n* [Istio infrastructure](https://istio.io/latest/docs/ops/deployment/architecture/){.external}\n    * Due to several reasons, Istio is imposing networking rules on every workload in the Kubernetes cluster that doesn't work with our deployments.\n    * The current recommendation is to create an exemption for our workloads if Istio is enabled in the cluster by default.\n"
  },
  {
    "path": "docs/docs/troubleshooting/SUPPORT_BOUNDARIES.md",
    "content": "# Support boundaries\n\nThis page describes what is within our scope of support for Kubernetes deployments, and what isn't. \n\n???+ info \"Additional information\"\n    \n    * Read our [troubleshooting tips](TROUBLESHOOTING.md).\n\n    * Read about the [product and platform limitations](LIMITATIONS.md).\n\n\n## Supported components\n### Helm charts\n\nHelm is a Kubernetes package manager. It allows us to provide generic `YAML` templates that you configure with the specific values for your environments.\n\nAs described in the [Prerequisites](../userguide/PREREQUISITES.md), you are responsible for creating the components that are required by the product for your type of deployment. You need to supply the appropriate values to your specific `values.yaml` file that is used for installation. We provide documentation for different configuration options in the [Configuration guide](../userguide/CONFIGURATION.md) and the [Examples](../examples/EXAMPLES.md).\n\n!!!tip \"\" \n\n    If you have followed our documentation on how to configure the Helm charts, and you're using correctly created components, we will then provide support if you encounter an error with installation post `helm install`. \n\nIf you find any issues, [raise a ticket with our support team](https://support.atlassian.com/contact/){.external}. If you have general feedback or questions regarding the charts, use [Atlassian Community Kubernetes space](https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes){.external}.\n\n## Unsupported components\nThe [Prerequisites](../userguide/PREREQUISITES.md) can be created in multiple ways. You are responsible for creating them correctly so that they can be used successfully with the Helm charts. Additional details on these prerequisites and their requirements below: \n\n### Kubernetes cluster\nYou need to make sure that you have enough privileges to run the application and create all the necessary entities that the Helm charts require. There are also different Kubernetes flavours that might require specific knowledge of how to install the products in them. For example, OpenShift and Rancher have more strict rules regarding container permissions.\n\n!!!example \"\"\n    \n    See examples of [provisioning Kubernetes clusters on cloud-based providers](../examples/cluster/CLOUD_PROVIDERS.md).\n\n### Shared storage\nKubernetes setup requires you to have shared storage if you want to have a clustered instance. It's completely up to you how you set up the shared storage. The main requirement is that this storage needs to be accessible from Kubernetes and needs to be accessible from multiple pods. \n\nYou can use a managed storage solution like EFS, Azure files, or some other dedicated solution that provides NFS-like access (e.g. dedicated NFS server, NetApp).\n\nThere is a large number of combinations and potential setup scenarios and we can't support all of them. Our Helm charts expect you to provide a persistent volume claim, or a similar accessible shared storage in the `values.yaml` file.\n\n!!!example \"\"\n\n    See examples of [creating shared storage](../examples/storage/STORAGE.md). For more information about volumes go to the [Volumes section of the configuration guide](../userguide/CONFIGURATION.md#volumes). \n\n\n### Networking\nYou're required to configure the network access to the cluster. In Kubernetes, this usually means providing an ingress controller. \n\nIt is up to you to make sure that the network configuration doesn’t prevent nodes from communicating with each other and other components.\n\nYou also need to make sure that your instance is accessible to the users (DNS, firewalls, VPC config).\n\n!!!example \"\"\n\n    See an example of [provisioning an NGINX Ingress controller](../examples/ingress/CONTROLLERS.md). \n\n### Database\nThrough the `values.yaml` the database is provided as a connection string with the option to provide credentials and a driver. The database needs to be configured following product-specific requirements and needs to be accessible from Kubernetes.\n\n!!!example \"\"\n\n    See an example of [provisioning databases on cloud-based providers](../examples/database/CLOUD_PROVIDERS.md).\n\n## Bamboo - custom remote agents\nIf creating and using custom remote docker agents, you're required to ensure that they are configured, built and working as expected. \n\n!!!example \"\"\n\n    See an example of [customizing a remote agent with bespoke capabilities](../examples/bamboo/AGENT_CAPABILITIES.md).\n\n\n"
  },
  {
    "path": "docs/docs/troubleshooting/TROUBLESHOOTING.md",
    "content": "# Troubleshooting tips\n\nThis guide contains general tips on how to investigate an application deployment that doesn't work correctly.\n\n## General tips\n\nFirst, it is important to gather the information that will help you better understand where to focus your investigation efforts.\nThe next section assumes you've followed the [installation](../userguide/INSTALLATION.md) and [configuration](../userguide/CONFIGURATION.md) guides, and you can't access the installed product service. \n\nFor installation troubleshooting, you will need to access the Kubernetes cluster and have enough permissions to follow the commands below.\n\nWe highly recommend that you read through the Kubernetes official documentation describing [monitoring, logging and debugging](https://kubernetes.io/docs/tasks/debug-application-cluster/){.external}. Additionally, for great starting tips read the [Application Introspection and Debugging section](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-application-introspection/){.external}.\n\n???+ info \"Value placeholders\"\n    Some commands include `<release_name>` and `<namespace>`. Replace them with the Helm release name and namespace specified when running `helm install`.\n\n## My service is not accessible\n\nAfter `helm install` finishes, it prints a product service URL. It usually takes a few minutes for the service to start. If\nyou visit the URL too soon, it might return a `5XX` error HTTP code (the actual code might be dependent on your network implementation).\n\nIf you have waited long enough (more than 10 minutes), and the service is still not accessible, it is time to investigate the reason why this is the case.\n\n### Helm release verification \n\n1. Run `helm list --all-namespaces` to get the list of all installed chart releases.\n    * You should be able to see your installation in the list\n    * The status for the release should be `deployed`\n2. Run `helm test <release_name> -n <namespace>`\n    * This should return application tests in `succeeded` phase\n    * In case there are any test failures you will need to further investigate the particular domain\n   \n### DNS verification\n\nTo verify the DNS record from your machine, run a basic `dig` test:\n\n```shell\ndig SERVICE_DOMAIN_NAME\n```\n\nOr use a [web version of the tool](https://toolbox.googleapps.com/apps/dig/){.external}.\n\n### Investigate application logs\n\nYou can get application logs from the pods with a standard `kubectl` command:\n\n```shell\nkubectl logs APPLICATION_POD_NAME\n```\n\nYou can read the output and make sure it doesn't contain an error or an exception.\n\n### Get application pod details\n\nFor more details follow the [official guide for debugging](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-application-introspection/){.external}.\n\nGet the list of pods and their states:\n\n```shell\nkubectl get <release_name> -n <namespace> -o wide\n```\n\nGet details about a specific pod:\n\n```shell\nkubectl describe POD_NAME -n <namespace>\n```\n\n### Get storage details\n\nEach application pod needs to have successfully mounted local and shared home. You can find out the details for the persistent volume claims with this command: \n\n???+ info \"Prerequisities\"\n      The example needs to have [`jq`](https://stedolan.github.io/jq/){.external} tool installed.\n\n```shell\nkubectl get pods --all-namespaces -o=json | jq -c \\\n'.items[] | {name: .metadata.name, namespace: .metadata.namespace, claimName:.spec.volumes[] | select( has (\"persistentVolumeClaim\") ).persistentVolumeClaim.claimName }'\n```\nFind all the application pods in the output and verify they have the correct claims (shared home and local home). For more details follow the [documentation for persistent volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/){.external}.\n\n## Self signed certificates\n\nAccessing applications or websites that are encrypted with SSL using certificates not signed by a public authority will result in a connection error. The stacktrace will contain the following:\n\n```shell\ncaused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:\n       PKIX path building failed:sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target\n```\n\nTo fix the issue, follow the steps listed in the [Self Signed Certificates configuration guide](../userguide/CONFIGURATION.md#self-signed-certificates)."
  },
  {
    "path": "docs/docs/userguide/.pages",
    "content": "nav:\n    - PREREQUISITES.md\n    - VERIFICATION.md\n    - INSTALLATION.md\n    - CONFIGURATION.md\n    - MIGRATION.md\n    - OPERATION.md\n    - monitoring\n    - upgrades\n    - resource_management\n    - ...\n"
  },
  {
    "path": "docs/docs/userguide/CONFIGURATION.md",
    "content": "# Configuration\n\n## :material-directions-fork: Ingress\nIn order to make the Atlassian product available from outside of the Kubernetes cluster, you must provision a suitable HTTP/HTTPS traffic entry controller.\n\nThe Helm charts support exposing products using either:\n\n- Kubernetes **Ingress** resources (via an Ingress controller), or\n- Kubernetes **Gateway API** resources (via a Gateway API controller), by creating a `HTTPRoute`.\n\nThe exact details will be highly site-specific. These Helm charts were tested using the [NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/){.external}. We also provide [example instructions](../examples/ingress/CONTROLLERS.md) on how controllers can be installed and configured.\n\nThe charts themselves provide templates for either `Ingress` or `HTTPRoute` resources (depending on configuration). These include the required knobs for configuring hostnames, paths, timeouts, and (for NGINX Ingress) annotations.\n\nSome key considerations to note when configuring the controller are:\n\n!!!Ingress requirements\n    * At a minimum, the ingress needs the ability to support long request timeouts, as well as session affinity (aka \"sticky sessions\").\n    * The `Ingress` template provided as part of the Helm charts is geared toward the [NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/){.external} and can be configured via the `ingress` stanza in the appropriate `values.yaml`. Some key aspects that can be configured include:\n\n         * Usage of the NGINX Ingress Controller\n         * Ingress Controller annotations\n         * The request max body size\n         * The hostname of the ingress resource\n\n    * When installed, with the provided [configuration](https://kubernetes.github.io/ingress-nginx/deploy/){.external}, the NGINX Ingress Controller will provision an internet-facing (see diagram below) load balancer on your behalf. The load balancer should either support the [Proxy Protocol](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt){.external} or allow for the forwarding of `X-Forwarded-*` headers. This ensures any backend redirects are done so over the correct protocol.\n    * If the `X-Forwarded-*` headers are being used, then enable the [use-forwarded-headers](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#use-forwarded-headers){.external} option on the controllers `ConfigMap`. This ensures that these headers are appropriately passed on.\n    * The diagram below provides a high-level overview of how external requests are routed via an internet-facing load balancer to the correct service via Ingress.\n\n![ingress-architecture](../assets/images/ingress.png \"Request routing via Ingress\")\n\n!!!note \"Traffic flow (diagram)\"\n    0. Inbound client request\n    1. DNS routes request to appropriate LB\n    2. LB forwards request to internal Ingress\n    3. Ingress controller performs traffic routing lookup via Ingress object(s)\n    4. Ingress forwards request to appropriate service based on Ingress object routing rule\n    5. Service forwards request to appropriate pod\n    6. Pod handles request\n\n!!!info \"Request body size\"\n    By default the maximum allowed size for the request body is set to `250MB`. If the size in a request exceeds the maximum size of the client request body, an `413` error will be returned to the client. The maximum request body can be configured by changing the value of `maxBodySize` in `values.yaml`.\n\n## :material-account-group: Session Stickiness for High Availability\n\n### NGINX Ingress Controller\n\nSession stickiness is automatically enabled when using NGINX Ingress Controller:\n\n```yaml\ningress:\n  create: true\n  nginx: true  # Automatically enables session stickiness\n  host: bitbucket.example.com\n```\n\n#### Custom Configuration\n\n```yaml\ningress:\n  create: true\n  nginx: true\n  host: bitbucket.example.com\n  annotations:\n    \"nginx.ingress.kubernetes.io/session-cookie-name\": \"BITBUCKET-SESSION\"\n    \"nginx.ingress.kubernetes.io/session-cookie-max-age\": \"28800\"  # 8 hours\n    \"nginx.ingress.kubernetes.io/session-cookie-change-on-failure\": \"true\"\n```\n\n#### Verify Configuration\n\n```shell\n# Check ingress annotations\nkubectl describe ingress bitbucket -n atlassian\n\n# Test with curl (look for Set-Cookie header)\ncurl -I https://bitbucket.example.com/status\n```\n\n#### Common Issues\n\n| Issue | Solution |\n|-------|----------|\n| Users getting logged out randomly | Verify session stickiness annotations are applied |\n| Requests routing to different pods | Check if clustering is enabled |\n| Session cookies not working | Ensure ingress controller supports session affinity |\n\n### Gateway API (HTTPRoute)\n\nThe charts can create a Gateway API `HTTPRoute` instead of an `Ingress` resource.\n\n```yaml\ningress:\n  create: false\n\ngateway:\n  create: true\n  hostnames:\n    - bitbucket.example.com\n  https: true\n  parentRefs:\n    - name: atlassian-gateway\n      namespace: gateway-system  # optional\n```\n\nThe `gateway` stanza supports additional options for fine-tuning the `HTTPRoute`:\n\n- **`parentRefs`** – list of [ParentReference](https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference){.external} objects pointing to your `Gateway` resource (supports `name`, `namespace`, `sectionName`, etc.)\n- **`externalPort`** – non-standard port that users connect on (defaults to `443`/`80`)\n- **`timeouts`** – `request` and `backendRequest` timeouts (replaces Ingress `proxyReadTimeout`/`proxySendTimeout`)\n- **`filters`** – [HTTPRouteFilter](https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter){.external} list for header modification, redirects, or URL rewrites\n- **`additionalRules`** – extra [HTTPRouteRule](https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule){.external} entries for advanced routing (traffic splitting, header-based routing)\n- **`annotations`** / **`labels`** – metadata applied to the HTTPRoute resource\n\n!!!note \"Gateway mode without creating an HTTPRoute\"\n    Setting `gateway.hostnames` activates gateway mode for the product's proxy and base-URL configuration even when `gateway.create` is false. This allows use with a pre-existing Gateway or external proxy/load balancer.\n\nFor the full list of values and usage examples, see the [Gateway API guide](../examples/ingress/GATEWAY_API.md).\n\n!!!important \"Sticky sessions with Gateway API\"\n    Session affinity is **not** part of the standard Gateway API `HTTPRoute` spec. You must configure it using your Gateway implementation (for example, Envoy Gateway policy resources or Istio traffic policy). See [Session affinity with Gateway API](../examples/ingress/GATEWAY_API_SESSION_AFFINITY.md) for working examples and fallbacks.\n\n### Other Ingress Controllers\n\nFor other ingress controllers ([AWS ALB](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/){.external}, [Google Cloud Load Balancer](https://cloud.google.com/load-balancing){.external}, [Azure Application Gateway](https://azure.microsoft.com/en-us/products/application-gateway){.external}), refer to your controller's documentation for session stickiness configuration.\n\n## :material-directions-fork: LoadBalancer/NodePort Service Type\n\n!!!info \"Feature Availability\"\n    Service session affinity configuration is available starting from Helm chart version 1.13\n\nIt is possible to make the Atlassian product available from outside of the Kubernetes cluster without using an ingress controller.\n\n### NodePort Service Type\n\nWhen installing Helm release, you can set:\n\n```yaml\njira:\n  service:\n      type: NodePort\n      sessionAffinity: ClientIP\n      sessionAffinityConfig:\n        clientIP:\n          timeoutSeconds: 10800\n```\n\nThe service port will be exposed on a random port from the ephemeral port range (`30000`-`32767`) on all worker nodes. It is possible to explicitly set NodePort in `service.nodePort` (make sure it's not reserved for any existing service in the cluster). You can provision a LoadBalancer with `443` or `80` (or both) listeners that will forward traffic to the node port (you can get service node port by running `kubectl describe $service -n $namespace`). Both LoadBalancer and Kubernetes service should be configured to maintain session affinity. LoadBalancer session affinity should be configured as per instructions for your Kubernetes/cloud provider. Service session affinity is configured by overriding the default Helm chart values (see the above example). Make sure you configure networking rules to allow the LoadBalancer to communicate with the Kubernetes cluster worker node on the node port.\n\n!!!tip\n    For more information about Kubernetes service session affinity, see [Kubernetes documentation](https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity){.external}.\n\n### LoadBalancer Service Type\n    \nLoadBalancer service type is the automated way to expose the service on the node port, create a LoadBalancer for it and configure networking rules allowing communication between the LoadBalancer and the Kubernetes cluster worker nodes:\n\n```yaml\njira:\n  service:\n      type: LoadBalancer\n      sessionAffinity: ClientIP\n      sessionAffinityConfig:\n        clientIP:\n          timeoutSeconds: 10800\n```\n\n!!!warning \"AWS EKS users\"\n    If you install the Helm chart for the first time, you will need to skip overriding `sessionAffinity` in your `values.yaml`, otherwise the LoadBalancer will not be created and you will see the following error:\n    ```\n    Error syncing load balancer: failed to ensure load balancer: unsupported load balancer affinity: ClientIP\n    ```\n    Once the Helm chart is installed with the default `sessionAffinity`, run `helm upgrade` with `$productName.service.sessionAffinity` set to `ClientIP`.\n\n## :material-folder-home: Volumes\nThe Data Center products make use of filesystem storage. Each DC node has its own `local-home` volume, and all nodes in the DC cluster share a single `shared-home` volume.\n\nBy default, the Helm charts will configure all of these volumes as ephemeral [emptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir){.external} volumes. This makes it possible to install the charts without configuring any volume management, but comes with two big caveats:\n\n1. Any data stored in the `local-home` or `shared-home` will be lost every time a pod starts.\n1. Whilst the data that is stored in `local-home` can generally be regenerated (e.g. from the database), this can be a very expensive process that sometimes requires manual intervention.\n\nFor these reasons, the default volume configuration of the Helm charts is suitable only for running a single DC pod for evaluation purposes. Proper volume management needs to be configured in order for the data to survive restarts, and for multi-pod DC clusters to operate correctly.\n\nWhile you are free to configure your Kubernetes volume management in any way you wish, within the constraints imposed by the products, the recommended setup is to use Kubernetes [PersistentVolumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/){.external} and `PersistentVolumeClaims`.\n\nThe `local-home` volume requires a `PersistentVolume` with [ReadWriteOnce (RWO)](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes){.external} capability, and `shared-home` requires a `PersistentVolume` with [ReadWriteMany (RWX)](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes){.external} capability. Typically, this will be an NFS volume provided as part of your infrastructure, but some public-cloud Kubernetes engines provide their own `RWX` volumes (e.g. [AWS EFS](https://aws.amazon.com/efs/){.external}, [Google Filestore](https://cloud.google.com/filestore){.external}, [Azure Files](https://docs.microsoft.com/en-us/azure/storage/files/storage-files-introduction){.external}). While this entails a higher upfront setup effort, it gives the best flexibility.\n\n### Volumes configuration\nBy default, the charts will configure the `local-home` and `shared-home` values as follows:\n\n```yaml\nvolumes:\n  - name: local-home\n    emptyDir: {}\n  - name: shared-home\n    emptyDir: {}\n```\n\nAs explained above, this default configuration is suitable only for evaluation or testing purposes. Proper volume management needs to be configured.\n\n!!!info \"Bitbucket default `shared-home` location\"\n    For a single node Bitbucket deployment, if no `shared-home` volume is defined, then a subpath of `local-home` will automatically be used for this purpose, namely: `<LOCAL_HOME_DIRECTORY>/shared`. This behaviour is specific to Bitbucket itself and is not orchestrated via the Helm chart.\n\nIn order to enable the persistence of data stored in these volumes, it is necessary\nto replace these volumes with something else.\n\nThe recommended way is to enable the use of `PersistentVolume` and `PersistentVolumeClaim`\nfor both volumes, using your install-specific `values.yaml` file, for example:\n\n```yaml\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    persistentVolumeClaim:\n      create: true\n```\n\nThis will result in each pod in the `StatefulSet` creating a `local-home` `PersistentVolumeClaim`\nof type `ReadWriteOnce`, and a single `PersistentVolumeClaim` of type `ReadWriteMany` being created for the `shared-home`.\n\nFor each `PersistentVolumeClaim` created by the chart, a suitable `PersistentVolume` needs to be made available prior\nto installation. These can be provisioned either statically or dynamically, using an\nauto-provisioner.\n\nAn alternative to `PersistentVolumeClaims` is to use inline volume definitions,\neither for `local-home` or `shared-home` (or both), for example:\n\n```yaml\nvolumes:\n  localHome:\n    customVolume:\n      hostPath:\n        path: /path/to/my/data\n  sharedHome:\n    customVolume:\n      nfs:\n        server: mynfsserver\n        path: /export/path\n```\n\nGenerally, any valid Kubernetes volume resource definition can be substituted\nhere. However, as mentioned previously, externalising the volume definitions\nusing `PersistentVolumes` is the strongly recommended approach.\n\n### Volumes examples\n\n1. Bitbucket needs a dedicated NFS server providing persistence for a shared home if you are not using [Bitbucket Mesh](../examples/bitbucket/BITBUCKET_MESH.md). Prior to installing the Helm chart, a suitable NFS shared storage solution must be provisioned. The exact details of this resource will be highly site-specific, but you can use this example as a guide: [Implementation of an NFS Server for Bitbucket](../examples/storage/nfs/NFS.md). Please also review   [Bitbucket Supported platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms).\n2. We have an example detailing how an existing EFS filesystem can be created and consumed using static provisioning: [Shared storage - utilizing AWS EFS-backed filesystem](../examples/storage/aws/SHARED_STORAGE.md).\n3. You can also refer to an example on how a Kubernetes cluster and helm deployment can be configured to utilize AWS EBS backed volumes: [Local storage - utilizing AWS EBS-backed volumes](../examples/storage/aws/LOCAL_STORAGE.md).\n\n### Additional volumes\n\nIn addition to the `local-home` and `shared-home` volumes that are always\nattached to the product pods, you can attach your own volumes for your own\npurposes, and mount them into the product container.  Use the `additional`\n(under `volumes`) and `additionalVolumeMounts` values to both attach the volumes\nand mount them in to the product container.\n\nThis might be useful if, for example, you have a custom plugin that requires its\nown filesystem storage.\n\nExample:\n\n```yaml\njira:\n  additionalVolumeMounts:\n    - volumeName: my-volume\n      mountPath: /path/to/mount\nvolumes:\n  additional:\n    - name: my-volume\n      persistentVolumeClaim:\n        claimName: my-volume-claim\n```\n\n## :material-database: Database connectivity\n\nThe products need to be supplied with the information they need to connect to the\ndatabase service. Configuration for each product is mostly the same, with some small differences.\n\n### `database.url`\n\nAll products require the JDBC URL of the database. The format if this URL depends\non the JDBC driver being used, but some examples are:\n\n| Vendor        | JDBC driver class                               | Example JDBC URL                                        |   \n|---            |---                                              |---                                                      |\n| PostgreSQL    | `org.postgresql.Driver`                         | `jdbc:postgresql://<dbhost>:5432/<dbname>`              |   \n| MySQL         | `com.mysql.jdbc.Driver`                         | `jdbc:mysql://<dbhost>/<dbname>`                        |   \n| SQL Server    | `com.microsoft.sqlserver.jdbc.SQLServerDriver`  | `jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>`  |   \n| Oracle        | `oracle.jdbc.OracleDriver`                      | `jdbc:oracle:thin:@<dbhost>:1521:<SID>`                 |\n\n!!!info \"Database creation\"\n\n    The Atlassian product doesn't automatically create the database,`<dbname>`, in the `JDBC URL`, so you need to manually create a user and database for the used database instance. Details on how to create product-specific databases can be found below:\n\n    === \"Jira\"\n\n        [Connect Jira to an external database](https://confluence.atlassian.com/adminjiraserver/connecting-jira-applications-to-a-database-938846850.html){.external}\n\n    === \"Confluence\"\n\n        [Connect Confluence to an external database](https://confluence.atlassian.com/doc/database-configuration-159764.html#DatabaseConfiguration-Databasesetupsetup){.external}\n\n    === \"Bitbucket\"\n\n        [Connect Bitbucket to an external database](https://confluence.atlassian.com/bitbucketserver/connect-bitbucket-to-an-external-database-776640378.html){.external}\n\n    === \"Bamboo\"\n\n        [Connect Bamboo to an external database](https://confluence.atlassian.com/bamboo/connecting-bamboo-to-an-external-database-289276815.html){.external}\n\n    === \"Crowd\"\n\n        [Connect Crowd to an external database](https://confluence.atlassian.com/crowd/connecting-crowd-to-a-database-4030904.html){.external}\n\n\n### `database.driver`\n\nJira and Bitbucket require the JDBC driver class to be specified (Confluence and Bamboo will\nautoselect this based on the `database.type` value, see below). The JDBC driver must\ncorrespond to the JDBC URL used; see the table above for example driver classes.\n\nNote that the products only ship with certain JDBC drivers installed, depending\non the license conditions of those drivers.\n\n!!!warning \"Non-bundled DB drivers\"\n    MySQL and Oracle database drivers are not shipped with the products due to licensing restrictions.\n    You will need to provide [`additionalLibraries` configuration](#additional-libraries-plugins).\n\n### `database.type`\n\nJira, Confluence and Bamboo all require this value to be specified, this declares the\ndatabase engine to be used. The acceptable values for this include:\n\n| Vendor        |  Jira                 | Confluence     | Bamboo        |\n|---------------|-----------------------|---------------|---------------|\n| PostgreSQL    | `postgres72`          | `postgresql`  | `postgresql`  |\n| MySQL         | `mysql57` / `mysql8`  | `mysql`       | `mysql`       |\n| SQL Server    | `mssql`               | `mssql`       | `mssql`       |\n| Oracle        | `oracle10g`           | `oracle`      | `oracle12c`   |\n| Aurora PostgreSQL        | `postgresaurora96`    | | |\n\n\n### `database.credentials`\n\nAll products can have their database connectivity and credentials specified either\ninteractively during first-time setup, or automatically by specifying certain configuration\nvia Kubernetes.\n\nDepending on the product, the `database.type`, `database.url` and `database.driver` chart values\ncan be provided. In addition, the database username and password can be provided via a [Kubernetes secret](https://kubernetes.io/docs/concepts/configuration/secret/){.external},\nwith the secret name specified with the `database.credentials.secretName` chart value.\nWhen all the required information is provided in this way, the database connectivity configuration screen\nwill be bypassed during product setup.\n\n## :fontawesome-solid-user-tag: Namespace\n\nThe Helm charts are not opinionated whether they have a [Kubernetes namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/){.external} to themselves.\nIf you wish, you can run multiple Helm releases of the same product in the same namespace.\n\n## :fontawesome-solid-network-wired: Clustering\nBy default, the Helm charts will not configure the products for Data Center clustering. In order to enable clustering, the `enabled` property for clustering must be set to `true`.\n\n!!!warning \"Clustering by default for Crowd\"\n\t  Crowd does not offer clustering configuration via Helm Chart. Set `crowd.clustering.enabled` to `true/false` in `${CROWD_HOME}/shared/crowd.cfg.xml` and rollout restart Crowd StatefulSet after the initial product setup is complete.\n      \n!!!note \"\"\n\n    === \"Jira\"\n\n        ```yaml\n        jira:\n          clustering:\n            enabled: true\n        ```\n\n    === \"Confluence\"\n\n        ```yaml\n        confluence:\n          clustering:\n            enabled: true\n        ```\n\n    === \"Bitbucket\"\n\n        ```yaml\n        bitbucket:\n          clustering:\n            enabled: true\n        ```\n\n    === \"Bamboo\"\n\n        Because of the limitations outlined under [Bamboo and clustering](../troubleshooting/LIMITATIONS.md#cluster-size) the `clustering` stanza is not available as a configurable property in the Bamboo `values.yaml`.\n\n    === \"Crowd\"\n\n        Clustering is enabled by default. To disable clustering, set `crowd.clustering.enabled` to `false` in `${CROWD_HOME}/shared/crowd.cfg.xml` and rollout restart Crowd StatefulSet after the initial product setup is complete.\n\n\nIn addition, the `shared-home` volume must be correctly configured as a [ReadWriteMany (RWX)](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes){.external} filesystem (e.g. NFS, [AWS EFS](https://aws.amazon.com/efs/){.external}, [Azure Files](https://docs.microsoft.com/en-us/azure/storage/files/storage-files-introduction){.external}, [GCP Filestore](https://cloud.google.com/filestore){.external}, or any NFS-compatible storage)\n\n## :material-book-cog: Generating configuration files\n\nThe Docker entrypoint scripts generate application configuration on\nfirst start; not all of these files are regenerated on subsequent\nstarts. This is deliberate, to avoid race conditions or overwriting manual\nchanges during restarts and upgrades. However, in deployments where\nconfiguration is purely specified through the environment (e.g. Kubernetes)\nthis behaviour may be undesirable; this flag forces an update of all\ngenerated files.\n\nThe affected files are:\n- Jira: `dbconfig.xml`\n- Confluence: `confluence.cfg.xml`\n- Bamboo: `bamboo.cfg.xml`\n\nTo force update of the configuration files when pods restart, set `<product_name.forceConfigUpdate>` to true.\nYou can do it by passing an argument to helm install/update command:\n```\n--set jira.forceConfigUpdate=true\n```\nor set it in `values.yaml`:\n\n```\njira:\n  forceConfigUpdate: true\n```\n\n!!!info \"Bitbucket and Bitbucket Mesh configuration file\"\n    It's not possible to generate the Bitbucket and Bitbucket Mesh configuration files.\n    Bitbucket uses `${BITBUCKET_HOME}/shared/bitbucket.properties`. The properties are from \n    [bitbucket.properties file](https://confluence.atlassian.com/bitbucketserver/bitbucket-server-config-properties-776640155.html) \n    and can be provided as environment variables. For example:\n    ```yaml\n    bitbucket:\n      additionalEnvironmentVariables:\n      - name: SEACRH_ENABLED\n        value: false\n      - name: PLUGIN_SEARCH_CONFIG_BASEURL\n        value: http://my.opensearch.host\n    ```\n    Bitbucket Mesh uses `${BITBUCKET_HOME}/mesh.properties`. The properties are from \n    [mesh.properties file](https://confluence.atlassian.com/bitbucketserver/mesh-configuration-properties-1128304362.html) \n    and can be provided as environment variables. For example:\n    ```yaml\n    bitbucket:\n      mesh:\n        additionalEnvironmentVariables:\n        - name: GIT_PATH_EXECUTABLE\n          value: /usr/bin/git\n    ```\n\n    To translate property into an environment variable:\n\n    * dot `.` becomes underscore `_`\n    * dash `-` becomes underscore `_`\n    * Example: `this.new-property` becomes `THIS_NEW_PROPERTY`\n\n## :material-book-cog: Additional config properties\n\n!!!info \"Jira only\"\n    This feature is currently available for Jira only. It requires a Jira\n    container image version that supports the `ADDITIONAL_JIRA_CONFIG_*`\n    environment variables. See the\n    [Docker image documentation](../containers/JIRA.md#custom-jira-configproperties)\n    for full details on the underlying mechanism.\n\nThe Helm chart provides dedicated values for injecting properties into\n`jira-config.properties` without constructing environment variable names\nmanually:\n\n```yaml\njira:\n  additionalConfigProperties:\n    - \"jira.websudo.is.disabled=true\"\n    - \"jira.lf.top.bgcolour=#003366\"\n```\n\nThese are equivalent to setting `ADDITIONAL_JIRA_CONFIG_*` environment\nvariables directly. The values can also be set via `--set`:\n\n```bash\nhelm install jira atlassian-data-center/jira \\\n  --set 'jira.additionalConfigProperties[0]=jira.websudo.is.disabled=true'\n```\n\n### Injecting secrets\n\nFor values that reference Kubernetes Secrets (e.g. passwords), use\n`additionalConfigPropertiesExpandEnv`. Placeholders in `{VAR_NAME}` format are\nreplaced with the corresponding environment variable value at container\nstartup:\n\n```yaml\njira:\n  additionalEnvironmentVariables:\n    - name: MY_SECRET\n      valueFrom:\n        secretKeyRef:\n          name: my-k8s-secret\n          key: password\n\n  additionalConfigPropertiesExpandEnv:\n    - \"some.password={MY_SECRET}\"\n```\n\nAlternatively, you can use `jira.additionalEnvironmentVariables` to pass the\n`ADDITIONAL_JIRA_CONFIG_*` environment variables explicitly if you need full\ncontrol over naming.\n\n## :material-book-cog: Additional libraries & plugins\n\nThe products' Docker images contain the default set of bundled libraries and plugins.\nAdditional libraries and plugins can be mounted into the product containers during\nthe Helm install. One such use case for this is mounting `JDBC` drivers that are not\nshipped with the products' by default.\n\nTo make use of this mechanism, the additional files need to be available as part\nof a Kubernetes volume. Options here include putting them into the `shared-home` volume\nthat's [required as part of the prerequisites](PREREQUISITES.md#configure-a-shared-home-volume). Alternatively, you can\ncreate a custom `PersistenVolume` for them, as long as it has `ReadOnlyMany` capability.\n\n!!!info \"Custom volumes for loading libraries\"\n\n    If you're not using the `shared-home` volume, then you can declare your own custom\n    volume, by following the [Additional volumes](#additional-volumes) section above.\n\nYou could even store the files as a `ConfigMap` that gets mounted as a volume, but\nyou're likely to run into file size limitations there.\n\nAssuming that the existing `shared-home` volume is used for this, then the only\nconfiguration required is to specify the `additionalLibraries` in your `values.yaml`\nfile, e.g.\n\n```yaml\njira:\n  additionalLibraries:\n    - volumeName: shared-home\n      subDirectory: mylibs\n      fileName: lib1.jar\n    - volumeName: shared-home\n      subDirectory: mylibs\n      fileName: lib2.jar\n```    \n\nThis will mount the `lib1.jar` and `lib2.jar` from the `mylibs` sub-directory from `shared-home`\ninto the appropriate place in the container.\n\nSimilarly, you can use `additionalBundledPlugins` to load product plugins into the\ncontainer.\n\n!!!info \"System plugin\"\n\n    Plugins installed via this method will appear as system plugins\n    rather than user plugins. An alternative to this method is to install the\n    plugins via \"Manage Apps\" in the product system administration UI.\n\nFor more details on the above, and how 3rd party libraries can be supplied to a Pod see the example [External libraries and plugins](../examples/external_libraries/EXTERNAL_LIBS.md)\n\n### :material-book-cog: P1 Plugins\n\nWhile `additionalLibraries` and `additionalBundledPlugins` will mount files to `/opt/atlassian/<product-name>/lib` and `/opt/atlassian/<product-name>/<product-name>/WEB-INF/atlassian-bundled-plugins` respectively, plugins built on [Atlassian Plugin Framework 1](https://confluence.atlassian.com/adminjiraserver/important-directories-and-files-938847744.html#Importantdirectoriesandfiles-%3Cjira-application-dir%3E/atlassian-jira/WEB-INF/lib/){.external} need to be stored in `/opt/atlassian/<product-name>/<product-name>/WEB-INF/lib`. While there's no dedicated Helm values stanza for P1 plugins, it is fairly easy to persist them (the below example is for Jira deployed in namespace `atlassian`):\n\n* In your shared-home, create a directory called `p1-plugins`:\n  ```bash\n  kubectl exec -ti jira-0 -n atlassian \\\n          -- mkdir -p /var/atlassian/application-data/shared-home/p1-plugins\n  ```\n\n* Copy a P1 plugin to the newly created directory in shared-home:\n  ```bash\n  kubectl cp hello.jar \\\n    atlassian/jira-0:/var/atlassian/application-data/shared-home/p1-plugins/hello.jar\n  ```\n\n* Add the following to your custom values:\n  ```yaml\n  jira:\n    additionalVolumeMounts:\n      - name: shared-home\n        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/hello.jar\n        subPath: p1-plugins/hello.jar\n  ```\n\nRun `helm upgrade` to find `/var/atlassian/application-data/shared-home/p1-plugins/hello.jar` mounted into `/opt/atlassian/jira/atlassian-jira/WEB-INF/lib` in all pods of Jira StatefulSet.\n\nYou can use the same approach to mount any files from a `shared-home` volume into any location in the container to persist such files across container restarts.\n\n## :octicons-cpu-16: CPU and memory requests\n\nThe Helm charts allow you to specify container-level CPU and memory [resource requests and limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits){.external} e.g.\n\n```yaml\njira:\n  resources:\n    container:\n      requests:\n        cpu: \"4\"\n        memory: \"8G\"\n```\n\n!!!tip \"\"\n\n    By default, the Helm Charts have no container-level resource limits, however there are default requests that are set.\n\nSpecifying these values is fine for CPU limits/requests, but for memory\nresources it is also necessary to configure the JVM's memory limits.\nBy default, the JVM maximum heap size is set to 1 GB, so if you increase\n(or decrease) the container memory resources as above, you also need to change\nthe JVM's max heap size, otherwise the JVM won't take advantage of the extra\navailable memory (or it'll crash if there isn't enough).\n\nYou specify the JVM memory limits like this:\n\n```yaml\njira:\n  resources:\n    jvm:\n      maxHeap: \"8g\"\n```\n\nAnother difficulty for specifying memory resources is that the JVM requires\nadditional overheads over and above the max heap size, and the container resources\nneed to take account of that.  A safe rule-of-thumb would be for the container\nto request 2x the value of the max heap for the JVM.\n\nThis requirement to configure both the container memory and JVM heap will\nhopefully be removed.\n\nYou can read more about [resource scaling](../userguide/resource_management/RESOURCE_SCALING.md#vertical-scaling-adding-resources) and [resource requests and limits](../userguide/resource_management/REQUESTS_AND_LIMITS.md).\n\n\n## :octicons-container-16: Additional containers\n\nThe Helm charts allow you to add your own `container` and [initContainer](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/){.external} entries to the product pods. Use the `additionalContainers` and `additionalInitContainers` stanzas within the `values.yaml` for this. One use-case for an additional container would be to attach a sidecar container to the product pods.\n\n## :material-checkbox-multiple-marked-outline: Additional options\n\nThe Helm charts also allow you to specify:\n\n* [`additionalLabels`](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/){.external}\n* [`tolerations`](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/){.external},\n* [`nodeSelectors`](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector){.external}  \n* [`affinities`](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity){.external}.\n* [`ordinals`](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#start-ordinal){.external}.\n\nThese are standard Kubernetes structures that will be included in the pods.\n\n## :material-kubernetes: Startup, Readiness and Liveness Probes\n\n### Readiness Probe\n\nBy default, a `readinessProbe` is defined for the main (server) container for all Atlassian DC Helm charts. A `readinessProbe` makes `HTTP` calls to the application status endpoint (`/status`). A pod is not marked as ready until the `readinessProbe` receives an `HTTP` response code greater than or equal to `200`, and less than `400`, indicating success.\n\nIf a pod is not in a ready state, there is no [endpoint](https://kubernetes.io/docs/concepts/services-networking/service/#endpoints){.external} associated with a [service](https://kubernetes.io/docs/concepts/services-networking/service){.external}, as a result such a pod receives no traffic (if this is the only pod in the `StatefulSet`, you may see `503` response from the [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/){.external}).\n\nIt is possible to disable the `readinessProbe` (set `<product>.readinessProbe.enabled=false`) which may make sense if this is the first (cold) start of a DC product in Kubernetes. With a disabled `readinessProbe`, the pod almost immediately becomes ready after it has been started, and the Ingress URL will take you to a page showing node start process. We strongly recommend enabling the `readinessProbe` after the application has been fully migrated and setup in Kubernetes.\n\nDepending on the dataset size, resources allocation and application configuration, you may want to adjust the `readinessProbe` to work best for your particular DC workload:\n\n```yaml\nreadinessProbe:\n  # -- Whether to apply the readinessProbe check to pod.\n  #\n  enabled: true\n\n  # -- The initial delay (in seconds) for the container readiness probe,\n  # after which the probe will start running.\n  #\n  initialDelaySeconds: 10\n\n  # -- How often (in seconds) the container readiness probe will run\n  #\n  periodSeconds: 5\n\n  # -- Number of seconds after which the probe times out\n  #\n  timeoutSeconds: 1\n\n  # -- The number of consecutive failures of the container readiness probe\n  # before the pod fails readiness checks.\n  #\n  failureThreshold: 60\n```\n\n### Startup and Liveness Probes\n\n!!!warning \"`startupProbe` and `livenessProbe`\"\n\n    Both `startupProbe` and `livenessProbe` are disabled by default. Make sure you go through the [Kubernetes documentation](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/){.external} before enabling such probes. Misconfiguration can result in unwanted container restarts and failed \"cold\" starts.\n\n## :material-certificate: Self Signed Certificates\n\nThere are 2 ways to add self-signed certificates to Java truststore: from a single secret or multiple secrets.\n\n=== \"From a single secret\"\n    * Create a [Kubernetes secret](https://kubernetes.io/docs/concepts/configuration/secret/){.external} containing base64-encoded certificate(s). Here's an example [kubectl command](https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kubectl/#use-source-files){.external} to create a secret from 2 local files:\n    \n    ```shell\n    kubectl create secret generic dev-certificates \\\n        --from-file=stg.crt=./stg.crt \\\n        --from-file=dev.crt=./dev.crt -n $namespace\n    ```\n    \n    The resulting secret will have the following data:\n    \n    ```yaml\n    data:\n      stg.crt: base64encodedstgcrt\n      dev.crt: base64encodeddevcrt\n    ```\n    \n    !!!info \"You can have as many keys (certificates) in the secret as required. All keys will be mounted as files to `/tmp/crt` in the container and imported into Java truststore. In the example above, certificates will be mounted as `/tmp/crt/stg.crt` and `/tmp/crt/dev.crt`. File extension in the secret keys does not matter as long as the file is a valid certificate.\"\n    \n    * Provide the secret name in Helm values (unlike the case with multiple secrets you don't need to provide secret keys):\n    \n    ```yaml\n    jira:\n      additionalCertificates:\n         secretName: dev-certificates\n    ```\n=== \"From multiple secrets\"\n    * Create 2 [Kubernetes secrets](https://kubernetes.io/docs/concepts/configuration/secret/){.external} containing base64-encoded certificate(s). Here's an example [kubectl command](https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kubectl/#use-source-files){.external} to create 2 secrets from local files (the first one with 2 certificates/keys and the second one with just one):\n    \n    ```shell\n    kubectl create secret generic dev-certificates \\\n        --from-file=stg.crt=./stg.crt \\\n        --from-file=dev.crt=./dev.crt -n $namespace\n\n    kubectl create secret generic root-ca \\\n        --from-file=ca.crt=./ca.crt -n $namespace\n    ```\n    !!!info \"You can have as many keys (certificates) in the secrets, however, you will need to list the keys you'd like to get mounted. All keys will be mounted as files to `/tmp/crt` in the container and imported into Java truststore.\"\n    \n    * Provide the list of secrets and their keys in Helm values:\n    \n    ```yaml\n    jira:\n      additionalCertificates:\n        secretList:\n          - name: dev-certificates\n            keys:\n              - stg.crt\n              - dev.crt\n          - name: root-ca\n            keys:\n              - ca.crt\n    ```\n    To allow having identical keys in different secrets, filenames will have the following format: `<secret-name>-<key>`, so\n    files will get mounted as `/tmp/crt/dev-certificates-stg.crt`, `/tmp/crt/dev-certificates-dev.crt` and `/tmp/crt/root-ca-ca.crt`\n    and imported to Java truststore with the same aliases.\n\nThe product Helm chart will add additional `volumeMounts` and `volumes` to the pod(s), as well as an extra init container that will:\n\n* copy the default Java cacerts to a runtime volume shared between the init container and the main container at `/var/ssl`\n* run [keytool -import](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html){.external} to import all certificates in `/tmp/crt` mounted from secret(s) to `/var/ssl/cacerts`\n* `-Djavax.net.ssl.trustStore=/var/ssl/cacerts` system property will be automatically added to `JVM_SUPPORT_RECOMMENDED_ARGS` environment variable.\n\nIf necessary, it is possible to override the default `keytool -import` command:\n\n```yaml\njira:\n  additionalCertificates:\n     secretName: dev-certificates\n     customCmd: keytool -import ...\n```\n\n## :material-home-analytics: Atlassian Support and Analytics\n\nStarting from `1.17.0` Helm chart version, by default, an additional `ConfigMap` is created and mounted into `/opt/atlassian/helm` in the containers. This `ConfigMap` has 2 keys: `values.yaml` and `analytics.json` that are picked up by the [Atlassian Troubleshooting and Support Tools (ATST)](https://confluence.atlassian.com/support/troubleshooting-and-support-tools-790796813.html){.external} plugin. To disable either of the keys or the entire `ConfigMap`, set enabled to `false` in the following Helm values stanza:\n\n```yaml\natlassianAnalyticsAndSupport:\n  analytics:\n    enabled: true\n  helmValues:\n    enabled: true\n```\n\nHelm values are mounted to be included to the [support.zip](https://confluence.atlassian.com/support/create-a-support-zip-790796819.html){.external}. The values file is sanitized both on the Helm chart side (any `additionalEnvironmentVariables` and `additionalJvmArgs` that can potentially contain sensitive information are redacted) and ATST plugin that will redact hostnames, URLs, AWS ARNs and sensitive environment variables and JVM flags, if any. If the file is found at `/opt/atlassian/helm/values.yaml` you will see an option to include it to the support.zip when generating one in admin UI.\n\nAnalytics json is a subset of `values.yaml` and contains selected Helm values that are sent as an analytics event and written to analytics logs, if analytics is enabled in the product. Analytics values are purely informational and contain information on how Helm charts are used.\n\nYou can find the complete list of analytics values in `_helpers.tpl`, `<product>.analyticsJson`.\n\n## :material-tunnel: Tunnels\n\nJira and Confluence Helm charts support configuring tunnelling. To enable tunneling, set the following in your Helm values file:\n```yaml\njira:\n  tunnel:\n    additionalConnector:\n      port: 8093\n```\n\nAn additional connector will be added to server.xml along with `Dsecure.tunnel.upstream.port` system property.\nIf necessary, connector configuration can be overridden by setting `additionalConnector` properties to custom values:\n\n```yaml\njira:\n  tunnel:\n    additionalConnector:\n      port: 8093\n      connectionTimeout: \"200000\"\n      maxThreads: \"100\"\n      minSpareThreads: \"20\"\n      enableLookups: \"true\"\n      acceptCount: \"100\"\n      URIEncoding: \"UTF-8\"\n      secure: false\n```\n"
  },
  {
    "path": "docs/docs/userguide/INSTALLATION.md",
    "content": "# Installation \n\nFollow these instructions to install your Atlassian product using the Helm charts. Before you proceed with the installation, make sure you have followed the [Prerequisites guide](PREREQUISITES.md).\n\n## 1. Add the Helm chart repository\n\nAdd the Helm chart repository to your local Helm installation:\n\n```shell\nhelm repo add atlassian-data-center \\\n https://atlassian.github.io/data-center-helm-charts\n```\n\nUpdate the repository:\n\n```shell\nhelm repo update\n```\n\n## 2. Obtain `values.yaml`\n\nObtain the default product `values.yaml` file from the chart:\n\n```shell\nhelm show values atlassian-data-center/<product> > values.yaml\n```\n\n!!!warning \"Bamboo deployments\"\n\n    If deploying Bamboo, be sure to read about the current limitations relating to [Bamboo deployments and values.yaml](../troubleshooting/LIMITATIONS.md#deployment)\n\n## 3. Configure database\n\n!!!warning \"Crowd deployments\"\n\n    Crowd Data Center Helm chart does not support unattended installation. Connection to the database must be manually configured during the product setup.\n\nUsing the `values.yaml` file obtained in [step 2](#2-obtain-valuesyaml), configure the usage of the database provisioned as part of the [prerequisites](PREREQUISITES.md). \n\n!!!tip \"Automated setup steps\"\n    By providing all the required database values, you will bypass the database connectivity configuration during the product setup.\n\n!!!info \"Migration\"\n    If you are migrating an existing Data Center product to Kubernetes, use the values of your product's database. See [Migration guide](MIGRATION.md).\n\nCreate a Kubernetes secret to store the connectivity details of the database:\n\n```shell\nkubectl create secret generic <secret_name> --from-literal=username='<db_username>' --from-literal=password='<db_password>'\n``` \n\nUsing the Kubernetes secret, update the `database` stanza within `values.yaml` appropriately. Refer to the commentary within the `values.yaml` file for additional details on how to configure the remaining database values:\n\n```yaml\ndatabase:\n  type: <db_type>\n  url: <jdbc_url>\n  driver: <engine_driver>\n  credentials:\n    secretName: <secret_name>\n    usernameSecretKey: username\n    passwordSecretKey: password\n```\n\n!!!info \"Database connectivity\"\n    For additional information on how the above values should be configured, see the [Database connectivity section of the configuration guide](CONFIGURATION.md#database-connectivity).\n\n    Read about [Kubernetes secrets](https://kubernetes.io/docs/concepts/configuration/secret/){.external}.\n    \n## 4. Configure Ingress\nUsing the `values.yaml` file obtained in [step 2](#2-obtain-valuesyaml), configure how the product will be exposed outside the cluster. You can use either:\n\n- a Kubernetes **Ingress** (requires an [Ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/){.external}), or\n- a Kubernetes Gateway API **HTTPRoute** (requires a Gateway API controller and a `Gateway`).\n\nThe values you provide here will be used to provision either an `Ingress` or an `HTTPRoute` resource for your chosen controller. Refer to the associated comments within the `values.yaml` file for additional details.\n\n```yaml\ningress:\n  create: true #1. Setting true here will create an Ingress resource\n  nginx: true #2. If using the ingress-nginx controller set this property to true\n  maxBodySize: 250m\n  host: <dns_host_name> #2. Hosts can be precise matches (for example “foo.bar.com”) or a wildcard (for example “*.foo.com”).\n  path: \"/\"\n  annotations:\n    cert-manager.io/issuer: <certificate_issuer>\n  https: true\n  tlsSecretName: <tls_certificate_name>\n```\n\nAlternatively, to use Gateway API:\n\n```yaml\ningress:\n  create: false\n\ngateway:\n  create: true  # Creates an HTTPRoute resource\n  hostnames:\n    - <dns_host_name>\n  https: true\n  parentRefs:\n    - name: <gateway_name>\n      namespace: <gateway_namespace>  # optional, defaults to release namespace\n```\n\n!!!info \"Ingress configuration\"\n    For additional details on Ingress controllers see [the Ingress section of the configuration guide](CONFIGURATION.md#ingress). \n\n    See an example of [how to set up an NGINX Ingress Controller](../examples/ingress/INGRESS_NGINX.md) and an overview of [controller options](../examples/ingress/CONTROLLERS.md).\n\n!!!info \"Gateway API configuration\"\n    For Gateway API exposure, start with the [Gateway API controller guide](../examples/ingress/GATEWAY_API.md) and then configure [session affinity](../examples/ingress/GATEWAY_API_SESSION_AFFINITY.md). The Gateway API guide includes a full values reference and examples for timeouts, filters, and advanced routing.\n    \n## 5. Configure persistent storage\n\nUsing the `values.yaml` file obtained in [step 2](#2-obtain-valuesyaml), configure the `shared-home` that was provisioned as part of the [Prerequisites](PREREQUISITES.md). See [shared home example](../examples/storage/aws/SHARED_STORAGE.md).\n\nIf you are [migrating an existing Data Center product to Kubernetes](MIGRATION.md), use the values of your product's shared home. \n\n\n```yaml\nvolumes:\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: <pvc_name>\n```\n\nEach pod will also require its own `local-home` storage. This can be configured with a `StorageClass`, as can be seen in the [local home example](../examples/storage/aws/LOCAL_STORAGE.md). Having created the `StorageClass`, update `values.yaml` to make use of it: \n\n```yaml\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n      storageClassName: <storage-class-name>\n```\n!!!info \"Volume configuration\"\n    For more details, refer to the [Volumes section of the configuration guide](CONFIGURATION.md#volumes).\n    \n!!!tip \"Bitbucket shared storage\"\n    Bitbucket needs a dedicated NFS server providing persistence for a shared home. Prior to installing the Helm chart, a suitable NFS shared storage solution must be provisioned. The exact details of this resource will be highly site-specific, but you can use this example as a guide: [Implementation of an NFS Server for Bitbucket](../examples/storage/nfs/NFS.md).\n    \n## 6. Configure clustering\n\nBy default, the Helm charts will not configure the products for Data Center clustering. You can enable clustering in the `values.yaml` file:\n\n```yaml\n  clustering:\n    enabled: true\n```\n\n!!!warning \"Bamboo clustering\"\n    Because of the limitations outlined under [Bamboo and clustering](../troubleshooting/LIMITATIONS.md#cluster-size) the `clustering` stanza is not available as a configurable property in the Bamboo `values.yaml`.\n\n!!!warning \"Crowd clustering\"\n\t  Crowd does not offer clustering configuration via Helm Chart. Set `crowd.clustering.enabled` to `true/false` in `${CROWD_HOME}/shared/crowd.cfg.xml` and rollout restart Crowd StatefulSet after the initial product setup is complete.\n  \n## 7. Configure license \n\n!!!info \"Pre-configuring license\"\n    Pre-provisioning a license in this way is only applicable to `Confluence`, `Bitbucket` and `Bamboo` deployments. For `Jira` and `Crowd` deployments a license can be supplied via the setup wizard post deployment.\n\nYou can configure the product license if you provide a `license` stanzas within the `values.yaml` obtained in [step 2](#2-obtain-valuesyaml). To do that, create a Kubernetes secret to hold the product license:\n\n```shell\nkubectl create secret generic <license_secret_name> --from-literal=license-key='<product_license_key>'\n```\n\nUpdate the `values.yaml` file with the secrets:\n\n```yaml\nlicense:\n  secretName: <secret_name>\n  secretKey: license-key\n```\n???tip \"Sysadmin credentials for Bitbucket and Bamboo \"\n\n    `Bitbucket` and `Bamboo` are slightly different from the other products in that they can be completely configured during deployment, meaning no manual setup is required. To do this, you need to update the `sysadminCredentials` and also provide the `license` stanza from the previous step.\n\n    Create a Kubernetes secret to hold the Bitbucket/Bamboo system administrator credentials:\n\n    ```shell\n    kubectl create secret generic <sysadmin_creds_secret_name> --from-literal=username='<sysadmin_username>' --from-literal=password='<sysadmin_password>' --from-literal=displayName='<sysadmin_display_name>' --from-literal=emailAddress='<sysadmin_email>'\n    ```\n\n    Update the `values.yaml` file with the secrets:\n\n    ```yaml\n    sysadminCredentials:\n      secretName: <sysadmin_creds_secret_name>\n      usernameSecretKey: username\n      passwordSecretKey: password\n      displayNameSecretKey: displayName\n      emailAddressSecretKey: emailAddress\n    ```\n\n## 8. Configure container images\n\nBy default, container images are pulled from [official Atlassian DockerHub repositories](https://hub.docker.com/u/atlassian). Deployments may also use 2 other official non-Altassian images - [alpine](https://hub.docker.com/_/alpine) and [fluentd](https://hub.docker.com/r/fluent/fluentd-kubernetes-daemonset).\n\nIn air-gapped environments that cannot directly access DockerHub you will need to pass custom repositories/tags to the Helm installation/upgrade command.\n\n### Product images\n\nFor product images (such as Jira, Bitbucket, Confluence, Bamboo), update `values.yaml`:\n\n```\nimage:\n  registry: artifactory.mycompany.com\n  repository: jira\n  tag: 7.8.20\n```\n\n### Helper containers\n\nIf `volumes.sharedHome.persistentVolumeClaim.sharedHome.nfsPermissionFixer.enabled` is set to `true`, update `values.yaml`:\n\n```\nvolumes:\n  sharedHome:\n    nfsPermissionFixer:\n      imageRepo: artifactory.mycompany.com/alpine\n      imageTag: latest\n```\n\nIf `fluentd.enabled` is set to `true` (false by default), update `values.yaml`:\n\n```\nfluentd:\n  imageRepo: artifactory.mycompany.com/fluentd-kubernetes-daemonset\n  imageTag: v1.11.5-debian-elasticsearch7-1.2\n```\n\n## 9. Install your chosen product\n\n```shell\nhelm install <release-name> \\\n             atlassian-data-center/<product> \\\n             --namespace <namespace> \\\n             --version <chart-version> \\\n             --values values.yaml\n```\n\n!!!note \"Values & flags\"\n* `<release-name>` the name of your deployment. You can also use `--generate-name`.\n* `<product>` the product to install. Options include: \n  \n    * `jira` \n    * `confluence`\n    * `bitbucket`\n    * `bamboo`\n    * `bamboo-agent`\n    * `crowd`\n  \n* `<namespace>` optional flag for categorizing installed resources.\n* `<chart-version>` optional flag for defining the [chart version](https://artifacthub.io/packages/search?org=atlassian&sort=relevance&page=1){.external} to be used. If omitted, the latest version of the chart will be used.\n* `values.yaml` optional flag for defining your site-specific configuration information. If omitted, the chart config default will be used.\n* Add `--wait` if you wish the installation command to block until all of the deployed Kubernetes resources are ready, but be aware that this may wait for several minutes if anything is mis-configured.\n    \n!!!info \"Elasticsearch for Bitbucket\"\n    We highly recommend you use an external Elasticsearch installation for Bitbucket. When you run more than one node you need to have a separate Elasticsearch cluster to enable code search. See [Bitbucket Elasticsearch recommendations](../examples/bitbucket/BITBUCKET_ELASTICSEARCH.md).    \n        \n\n## 9. Test your deployed product \n\nMake sure the service pod/s are running, then test your deployed product:\n\n```shell\nhelm test <release-name> --logs --namespace <namespace>\n```\n\n* This will run some basic smoke tests against the deployed release.\n* If any of these tests fail, it is likely that the deployment was not successful. Check the status of the deployed resources for any obvious errors that may have caused the failure.\n\n## 10. Complete product setup \n\nUsing the service URL provided by Helm post install, open your product in a web browser and complete the setup via the setup wizard. \n\n## 11. Additional deployments\n\nBamboo agents and Bitbucket mirrors can also be deployed via their dedicated charts:\n\n=== \"Bamboo agent\"\n    !!!info \"Bamboo agent installation\"\n        [Instructions for deploying Bamboo agents](../examples/bamboo/REMOTE_AGENTS.md)\n\n=== \"Bitbucket mirror\"\n    !!!info \"Bitbucket mirror installation\"\n        [Instructions for deploying Bitbucket mirror's](../examples/bitbucket/BITBUCKET_MIRRORS.md)\n\n# Uninstall\nThe deployment and all of its associated resources can be un-installed with the following command:\n```shell\nhelm uninstall <release-name> atlassian-data-center/<product>\n```\n"
  },
  {
    "path": "docs/docs/userguide/MIGRATION.md",
    "content": "# Migration\n\nIf you already have an existing Data Center product deployment, you can migrate it to a Kubernetes cluster using the Data Center Helm charts. \n\nYou will need to migrate your database and your shared home (including local home for Bamboo), then all you need to do is to follow the [Installation guide](INSTALLATION.md), using your migrated resources instead of provisioning new ones.\n\n## Migrating your database\n\nTo migrate your database, you should point the Helm charts to the existing database or to a migrated version of the database. Do this by updating the `database` stanza in the `values.yaml` file as explained in the [Configure database step in the installation guide](INSTALLATION.md#3-configure-database).\n\n## Migrating your shared home\n\nApplication nodes should have access to a shared directory in the same path. Examples of what the shared file system stores include plugins, shared caches, repositories, attachments, and avatars. Configure your shared home by updating the `sharedHome` stanza in the `values.yaml` file as explained in the [Configure persistent storage step in the installation guide](INSTALLATION.md#5-configure-persistent-storage).\n\n## Migrating Bamboo server local home\n\nBamboo DC stores pertinent config data in local home, namely `bamboo.cfg.xml`. Care should be taken to include this data when migrating Bamboo DC deployments.\n\n## Helpful links\n\n* [Atlassian Data Center migration plan](https://confluence.atlassian.com/enterprise/atlassian-data-center-migration-plan-935363952.html){.external} - gives some guidance on overall process, organizational preparedness, estimated time frames, and app compatibility. \n* [Atlassian Data Center migration checklist](https://confluence.atlassian.com/enterprise/atlassian-data-center-migration-checklist-935383667.html){.external} - also provides useful tests and checks to perform throughout the moving process.\n* Migrating to another database - describes how to migrate your data from your existing database to another database:\n    * [Migrating Confluence to another database](https://confluence.atlassian.com/doc/migrating-to-another-database-148867.html){.external}\n    * [Migrating Jira to another database](https://confluence.atlassian.com/adminjiraserver/switching-databases-938846867.html){.external} \n    * [Migrating Bamboo to another database](https://confluence.atlassian.com/bamboo/moving-your-bamboo-data-to-a-different-database-289277250.html){.external} \n\n!!!tip \"Availability Zone proximity\"\n    For better performance consider co-locating your migrated database in the same Availability Zone (AZ) as your product nodes. Database-heavy operations, such as full re-index, become significantly faster when the database is collocated with the Data Center node in the same AZ. However we don't recommend this if you're running critical workloads.\n"
  },
  {
    "path": "docs/docs/userguide/OPERATION.md",
    "content": "# Operation\nOnce you have [installed your product](../userguide/INSTALLATION.md), use this document if you want to scale your product, update your product, or see what examples we have.\n\n## Expose JMX Metrics\n\nWhen `monitoring.exposeJmxMetrics` is enabled, [JMX exporter](https://github.com/prometheus/jmx_exporter){.external} runs as javaagent to expose http server and serve metrics of a local JVM. In other words, JMX MBeans (if enabled in the product) are exposed and available to be scraped by [Prometheus](https://prometheus.io/){.external}.\n\n[JMX exporter jar](https://github.com/prometheus/jmx_exporter){.external} isn't available in products dependencies or container images, that is why when `monitoring.exposeJmxMetrics`\nis enabled there are 2 ways to get it:\n\n* copy from an init container ([bitnamilegacy/jmx-exporter DockerHub image](https://hub.docker.com/r/bitnamilegacy/jmx-exporter){.external}) - the **default** option in values.yaml which works out of the box\n* manually download from [JMX exporter GitHub releases page](https://github.com/prometheus/jmx_exporter/tags){.external} and copy to shared-home or mount as a secret\n\n\n=== \"Init Container\"\n    ### Enable JMX Monitoring: The Default Method\n\n    You can expose JMX metrics by either passing `--set monitoring.exposeJmxMetrics=true` to your `helm install/upgrade command` or change the default value\n    in your `values.yaml` file:\n\n    ```yaml\n    monitoring:\n      exposeJmxMetrics: true\n    ```\n\n=== \"Manually Copy the Jar\"\n    ### Enable JMX Monitoring: Manually Copy the Jar\n\n    If you don't want to have an additional container which will slightly increase pod startup time, you can manually download the exporter jar, override its location and disable an init container:\n\n    First, download the jar:\n\n    ```shell\n    # check the latest version from https://github.com/prometheus/jmx_exporter/releases\n    wget -P . https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.18.0/jmx_prometheus_javaagent-0.18.0.jar\n    ```\n\n    Then, copy it to shared-home. The example below assumes that Confluence is deployed to `atlassian` namespace, and `volumes.sharedHome.mountPath` uses the default value:\n\n    ```\n    kubectl cp \\\n      jmx_prometheus_javaagent-0.18.0.jar \\\n      atlassian/confluence-0:/var/atlassian/application-data/shared-home/jmx_prometheus_javaagent-0.18.0.jar\n    ```\n\n    Disable an init container and set a custom jar location in the `values.yaml` file:\n\n    ```\n    monitoring:\n      exposeJmxMetrics: true\n      fetchJmxExporterJar: false\n      jmxExporterCustomJarLocation: /var/atlassian/application-data/shared-home/jmx_prometheus_javaagent-0.18.0.jar\n    ```\n\nRun `helm upgrade` to apply changes. Once done, you can verify metrics is available by running:\n\n```\nkubectl port-forward confluence-0 9999:9999 -n atlassian \n``` \n\nGo to `http://localhost:9999/metrics` in your local browser to verify metrics availability.\n\n!!!warning \"JMX service security\"\n    By default, JMX services are created as ClusterIP types, i.e. they are not available outside the Kubernetes cluster.\n    Because the metrics endpoint isn't password protected, make sure you protect it using your cloud provider's network security features (e.g., [AWS SecurityGroups](https://docs.aws.amazon.com/managedservices/latest/userguide/about-security-groups.html){.external}, [GCP Cloud Firewall](https://docs.cloud.google.com/firewall/docs){.external}, [Azure Network Security Groups](https://learn.microsoft.com/en-us/azure/virtual-network/network-security-groups-overview){.external}) when exposing it as a LoadBalancer if required:\n    ```\n    monitoring:\n      jmxExporterPortType: LoadBalancer\n    ``` \n\n### Scrape Metrics With Prometheus\n\nSee: [Prometheus Monitoring](monitoring/PROMETHEUS.md)\n\n\n## Managing resources\n\nYou can scale your application by [adding additonal pods](resource_management/RESOURCE_SCALING.md) or by [managing available resources with requests and limits](resource_management/RESOURCE_SCALING.md).\n\n## Upgrading application\n\n### Kubernetes update strategies\nKubernetes provides two strategies to update applications managed by `statefulset` controllers:\n\n#### Rolling update\nThe pods will be upgraded one by one until all pods run containers with the updated template. The upgrade is managed by \nKubernetes and the user has limited control during the upgrade process, after having modified the template. This is the default \nupgrade strategy in Kubernetes. \n\nTo perform a canary or multi-phase upgrade, a partition can be defined on the cluster and Kubernetes will upgrade just \nthe nodes in that partition. \n\nThe default implementation is based on *RollingUpdate* strategy with no *partition* defined. \n\n#### OnDelete strategy\nIn this strategy users select the pod to upgrade by deleting it, and Kubernetes will replace it by creating a new pod\n based on the updated template. To select this strategy the following should be replaced with the current \n implementation of `updateStrategy` in the `statefulset` spec:\n\n```yaml\n  updateStrategy:\n    type: OnDelete\n```  \n\n### Upgrade\n\n* To learn about upgrading the Helm charts see [Helm chart upgrade](upgrades/HELM_CHART_UPGRADE.md).  \n* To learn about upgrading the products without upgrading the Helm charts see [Products upgrade](upgrades/PRODUCTS_UPGRADE.md).\n\n\n## Examples\n### Logging\n#### How to deploy an EFK stack to Kubernetes\nThere are different methods to deploy an EFK stack. We provide two deployment methods, the first is deploying EFK locally on Kubernetes, and the second is using managed Elasticsearch outside the Kubernetes cluster. Please refer to [Logging in Kubernetes](../examples/logging/efk/EFK.md).\n"
  },
  {
    "path": "docs/docs/userguide/PREREQUISITES.md",
    "content": "# Prerequisites\n## Requirements\n\nIn order to deploy Atlassian’s Data Center products, the following is required:\n\n1. An understanding of [Kubernetes](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/){.external} and [Helm](https://helm.sh/){.external} concepts.\n2. [`kubectl` `v1.21` or later](https://kubernetes.io/docs/tasks/tools/), must be compatible with your cluster.\n3. [`helm` `v3.3` or later.](https://helm.sh/docs/intro/install/)\n\n## Environment setup\n\nBefore installing the Data Center Helm charts you need to set up your environment:\n\n1. [Create and connect to the Kubernetes cluster](#create-and-connect-to-the-kubernetes-cluster)\n2. [Provision an Ingress or Gateway API controller](#provision-an-ingress-or-gateway-api-controller)\n3. [Provision a database](#provision-a-database)\n4. [Configure a shared-home volume](#configure-a-shared-home-volume)\n5. [Configure a local-home volume](#configure-local-home-volume)\n\n!!!info \"Elasticsearch for Bitbucket\"\n    We highly recommend you use an external Elasticsearch installation for Bitbucket. When you run more than one node you need to have a separate Elasticsearch cluster to enable code search. See [Bitbucket Elasticsearch recommendations](../examples/bitbucket/BITBUCKET_ELASTICSEARCH.md).\n\n---\n\n### :material-kubernetes: Create and connect to the Kubernetes cluster\n\n* In order to install the charts to your Kubernetes cluster (version 1.21+), your Kubernetes client config must be configured appropriately, and you must have the necessary permissions.\n* It is up to you to set up security policies.\n\n!!!example \"\"\n      See examples of [provisioning Kubernetes clusters on cloud-based providers](../examples/cluster/CLOUD_PROVIDERS.md).\n\n<a id=\"provision-an-ingress-controller\"></a>\n### :material-directions-fork: Provision an Ingress or Gateway API controller\n\n* This step is necessary in order to make your Atlassian product available from outside of the Kubernetes cluster after deployment.\n* You can expose the product using either:\n    * the Kubernetes **Ingress** API (requires an Ingress controller), or\n    * the Kubernetes **Gateway API** (requires a Gateway API controller).\n* For Ingress, the Kubernetes project supports and maintains ingress controllers for the major cloud providers including; [AWS](https://github.com/kubernetes-sigs/aws-load-balancer-controller#readme){.external}, [GCE](https://github.com/kubernetes/ingress-gce/blob/master/README.md#readme){.external} and [nginx](https://github.com/kubernetes/ingress-nginx/blob/master/README.md#readme){.external}. There are also a number of open-source [third-party projects available](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/){.external}.\n* For Gateway API, see the Gateway API project docs and the list of implementations:\n    * Gateway API overview: <https://gateway-api.sigs.k8s.io/>\n    * Implementations: <https://gateway-api.sigs.k8s.io/implementations/>\n* The Helm charts can create either an `Ingress` (`ingress.create: true`) or an `HTTPRoute` (`gateway.create: true`) resource. These options are mutually exclusive.\n* For more information about exposure options and required configuration, see the [Ingress section of the configuration guide](CONFIGURATION.md#ingress).\n\n!!!example \"\"\n      See examples of [provisioning an NGINX Ingress Controller](../examples/ingress/INGRESS_NGINX.md) and [Gateway API setup](../examples/ingress/GATEWAY_API.md). For an overview, see [Provisioning a traffic entry controller](../examples/ingress/CONTROLLERS.md).\n\n### :material-database: Provision a database\n\n* Must be of a type and version supported by the Data Center product you wish to install:\n\n=== \"Jira\"\n      [Supported databases](https://confluence.atlassian.com/adminjiraserver/supported-platforms-938846830.html#Supportedplatforms-Databases){.external}\n=== \"Confluence\"\n      [Supported databases](https://confluence.atlassian.com/doc/supported-platforms-207488198.html#SupportedPlatforms-Databases){.external}\n=== \"Bitbucket\"\n      [Supported databases](https://confluence.atlassian.com/bitbucketserver/supported-platforms-776640981.html#Supportedplatforms-databasesDatabases){.external}\n=== \"Bamboo\"\n      [Supported databases](https://confluence.atlassian.com/bamboo/supported-platforms-289276764.html#Supportedplatforms-Databases){.external}\n=== \"Crowd\"\n      [Supported databases](https://confluence.atlassian.com/crowd/supported-platforms-191851.html#SupportedPlatforms-Databases){.external}\n\n* Must be reachable from the product deployed within your Kubernetes cluster.\n* The database service may be deployed within the same Kubernetes cluster as the Data Center product or elsewhere.\n* The products need to be provided with the information they need to connect to the database service. Configuration for each product is mostly the same, with some small differences. For more information go to the [Database connectivity section of the configuration guide](CONFIGURATION.md#database-connectivity).\n\n!!!info \"Reducing pod to database latency\"\n\n      For better performance consider co-locating your database in the same Availability Zone (AZ) as your product nodes. Database-heavy operations, such as full re-index, become significantly faster when the database is collocated with the Data Center node in the same AZ. However we don't recommend this if you're running critical workloads.\n\n!!!example \"\"\n      See an example of [provisioning databases on cloud-based providers](../examples/database/CLOUD_PROVIDERS.md).\n\n\n### :material-folder-network: Configure a shared-home volume\n* All of the Data Center products require a shared network filesystem if they are to be operated in multi-node clusters. If no shared filesystem is available, the products can only be operated in single-node configuration.\n* Some cloud based options for a shared filesystem include [Google Filestore](https://cloud.google.com/filestore){.external}, [AWS EFS](https://aws.amazon.com/efs/){.external}, [Azure Files](https://docs.microsoft.com/en-us/azure/storage/files/storage-files-introduction){.external}. You can also stand up your own NFS.\n\n!!! info \"Bitbucket shared storage\"\n      Due to the high performance requirements on IO operations, it is critical that you adhere to the requirements in [Bitbucket Supported platforms](https://confluence.atlassian.com/display/BitbucketServer/Supported+platforms).\n\n* The logical representation of the chosen storage type within Kubernetes can be defined as `PersistentVolumes` with an associated `PersistentVolumeClaims` in a `ReadWriteMany (RWX)` access mode.\n* For more information about volumes see the [Volumes section of the configuration guide](CONFIGURATION.md#volumes).\n\n!!!example \"\"\n      See examples of [creating shared storage](../examples/storage/STORAGE.md).\n\n### :material-folder-home: Configure local-home volume\n* As with the [shared-home](#configure-a-shared-home-volume), each pod requires its own volume for `local-home`. Each product needs this for defining operational data.\n* If not defined, an [emptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir){.external} will be utilised.\n* Although an `emptyDir` may be acceptable for evaluation purposes, we recommend that each pod is allocated its own volume.\n* A `local-home` volume could be logically represented within the cluster using a `StorageClass`. This will dynamically provision a persistent block volume (e.g., [AWS EBS](https://docs.aws.amazon.com/ebs/){.external}, [GCP Persistent Disks](https://docs.cloud.google.com/compute/docs/disks/persistent-disks){.external}, [Azure Managed Disks](https://azure.microsoft.com/en-au/products/storage/disks){.external}) to each pod depending on your cloud provider.\n\n!!!example \"\"\n      An example of this strategy can be found [the local storage example](../examples/storage/aws/LOCAL_STORAGE.md).\n"
  },
  {
    "path": "docs/docs/userguide/VERIFICATION.md",
    "content": "# Verification\n\nFrom release 1.11.0, all the Helm charts are signed with a GPG key, following the instructions on the official [Helm documentation](https://helm.sh/docs/topics/provenance/). \n\nTo verify the integrity of the charts, \n1. Download chart `.tgz` file, `.prov` file and `helm_key.pub` from [release assets](https://github.com/atlassian/data-center-helm-charts/releases), \n\n2. Import the public key into your local GPG keyring. (Install GnuPG tool if you haven't done so already.) \n    \n    ```shell\n    gpg --import helm_key.pub \n    ```\n   \n3. At present, Helm only supports the legacy gpg format so export the keyring into the legacy format:\n    ```\n    gpg --export >~/.gnupg/pubring.gpg\n    ```\n   \n4. Verify the chart.\n    ```\n    helm verify /path/to/product.tgz \n    ```\n   \nIf the verification is successful, the output would be something like: \n```shell\nhelm verify ~/Downloads/jira-1.11.0.tgz                                                                         \nSigned by: Atlassian DC Deployments <dc-deployments@atlassian.com>\nUsing Key With Fingerprint: DD1A5B2F7A599129274FB10AD38C66448E19B403\nChart Hash Verified: sha256:ca102cbf416a5c87998d06ba4527b5afc99e1d7d1776317ddd07720251715fde\n```"
  },
  {
    "path": "docs/docs/userguide/monitoring/.pages",
    "content": "nav:\n    - Prometheus and Grafana: PROMETHEUS.md\n    - Product specific dashboards: PRE_CANNED_CHARTS.md\n"
  },
  {
    "path": "docs/docs/userguide/monitoring/PRE_CANNED_CHARTS.md",
    "content": "# Pre-canned product charts\n\nThe instructions outlined on this page provide details on how you can deploy a set of Grafana dashboards specific to your provisioned DC product(s)\n\n!!!tip \"Pre-requisites\"\n    JMX metrics, Prometheus and Grafana will all need to be provisioned already to make use of this guide. For instructions on how to do this see, [Monitoring with Prometheus](PROMETHEUS.md)\n\n## 1. Enable Pre-canned dashboards\n\nUpdate the `grafana` stanza within the deployments `values.yaml` to enable dashboard creation with the appropriate labels i.e.\n\n```yaml\nmonitoring:\n  grafana:\n    createDashboards: true\n    dashboardLabels:\n      grafana_dashboard: \"1\"\n```\n\n!!!tip \"`grafana_dashboard` value\"\n    The value to assign to the label `dashboardLabels.grafana_dashboard` can be obtained by examining `Environment` variables for the grafana pod sidecar `grafana-sc-dashboard`. For instance:\n    ```bash\n    kubectl describe pod prometheus-stack-grafana-57dc5589b-2wh98 -n <prometheus-stack-namespace> | grep -A 20 grafana-sc-dashboard | grep -A 5 Environment\n    ```\n    **Note:** The name of the Grafana pod (`prometheus-stack-grafana-57dc5589b-2wh98`) may vary slightly between deploys\n    \n\n    will return something like\n    ```bash\n    Environment:\n        METHOD:        WATCH\n        LABEL:         grafana_dashboard\n        LABEL_VALUE:   1\n        FOLDER:        /tmp/dashboards\n        RESOURCE:      both\n    ```\n    In this case we're interested in the value for the label `grafana_dashboard`, that is `1`. As such the `grafana` stanza, above` has been updated with this value. \n\nNow perform an upgrade using the updated `values.yaml`:\n```bash\nhelm upgrade confluence atlassian-data-center/confluence -f values.yaml --wait --namespace <namespace>\n```\n\n## 2. Dashboard confirmation\n\nConfirm the dashboards are provisioned and working by running (replace pod name with an actual Grafana pod name):\n\n```\nkubectl port-forward prometheus-stack-grafana-57dc5589b-2wh98 3000:3000 -n <prometheus-stack-namespace>\n```\n\nNow go to `http://localhost:3000` in your local browser. Once logged into Grafana (The default credentials are `admin:prom-operator`) select **Dashboards > Filter by tag > Product name**. You should be presented with a list of product specific dashboards that can be viewed, for instance\n\n![Jira Dashboards](../../assets/images/grafana_dashboards/filter_by_tag.png)\n\n"
  },
  {
    "path": "docs/docs/userguide/monitoring/PROMETHEUS.md",
    "content": "# Monitoring with Prometheus\n\nThe instructions outlined on this page provide details on how you can enable [Prometheus](https://prometheus.io/){.external} monitoring on your stack with [Grafana](https://grafana.com/){.external}\n\n## 1. Install Prometheus stack\n\n!!!abstract \"Note\"\n    * This approach will also install Grafana\n    * For the purposes of this guide the Prometheus stack will be installed with the release name `prometheus-stack`.\n\nInstall [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack){.external} Helm chart\n\nFetch the repo and perform an update\n```bash\nhelm repo add prometheus-community https://prometheus-community.github.io/helm-charts\nhelm repo update\n```\nNow install the Prometheus stack\n```bash\nhelm install prometheus-stack prometheus-community/kube-prometheus-stack\n```\n\n!!!tip \"Persist Prometheus & Grafana data\"\n\n    By default, the Prometheus stack configures Pods to store data using an `emptyDir` volume, meaning data is not persisted when the Pods are redeployed/restarted. To maintain state, persistent storage for Prometheus and Grafana can be enabled. This can be done by updating the `prometheus-stack` with the following `yaml`:\n    \n    ```yaml linenums=\"1\" title=\"Maintain chart and metric state\"\n    grafana:\n      persistence:\n        enabled: true\n        size: 10Gi\n      sidecar:\n        dashboards:\n          enabled: true\n          label: grafana_dashboard\n          labelValue: 1\n    prometheus:\n      prometheusSpec:\n        storageSpec:\n          volumeClaimTemplate:\n            spec:\n              accessModes:\n                - ReadWriteOnce\n              resources:\n                requests:\n                  storage: 10Gi\n    ```\n\n    This `yaml` (added to a file called `prometheus-persistence.yaml`) can then be used to upgrade the `prometheus-stack`\n\n    ```bash\n    helm upgrade prometheus-stack prometheus-community/kube-prometheus-stack -f prometheus-persistence.yaml --wait --namespace <prometheus-stack-namespace> \n    ```\n    \n\n## 2. Expose JMX metrics\n\nFollow [these instructions](../OPERATION.md#expose-jmx-metrics) for details on how to enable and expose `JMX` for your product via a dedicated `Service`. \n\n\n## 3. Create a ServiceMonitor\n    \nNow that `JMX` metrics are exposed, we need a way of scraping them. This will be done using the [Prometheus custom resource definition; ServiceMonitor](https://github.com/prometheus-operator/prometheus-operator/tree/e1ed82c75b05d3579f2349369b6077b4c0b9b4f8#customresourcedefinitions){.external}. There are two ways this `ServiceMonitor` can be provisioned:\n\n1. Automatically - using `helm upgrade`\n2. Manually - deploy a new `serviceMonitor` CRD\n\n=== \"Automatically\"\n\n    Update the `serviceMonitor` stanza within the deployments `values.yaml` and perform a `helm upgrade`.\n    \n    ```yaml linenums=\"1\" title=\"Automated deployment\"\n    serviceMonitor:\n      create: true\n      prometheusLabelSelector:\n        release: prometheus-stack\n      scrapeIntervalSeconds: 30\n    ```\n\n    !!!tip \"`prometheusLabelSelector` identification\"\n        The `prometheusLabelSelector.release` value will be the release name used for provisioning Prometheus stack in [1. Install Prometheus stack](#1-install-prometheus-stackto). It can also be identified using the following:\n        ```bash\n        kubectl get prometheus/prometheus-stack-kube-prom-prometheus -n <prometheus-stack-namespace> -o jsonpath={'.spec.serviceMonitorSelector.matchLabels'}\n        ```\n\n    Now perform an upgrade using the updated `values.yaml`:\n    ```bash\n    helm upgrade confluence atlassian-data-center/confluence -f values.yaml --wait --namespace <dc-product-namespace>\n    ```\n\n=== \"Manually\"\n\n    Alternatively you can manually provision the `serviceMontitor` by creating a new file called `serviceMonitor.yaml` with the following:\n    \n    ```yaml linenums=\"1\" title=\"Manual deployment\"\n    apiVersion: monitoring.coreos.com/v1\n    kind: ServiceMonitor\n    metadata:\n      name: confluence\n      labels:\n        release: prometheus-stack\n    spec:\n      endpoints:\n      - interval: 15s\n        path: /metrics\n        port: jmx\n        scheme: http\n      namespaceSelector:\n        any: true\n      selector:\n        matchLabels:\n          app.kubernetes.io/name: confluence\n    ```\n\n    !!!tip \"Particular values to be aware of\"\n        The above example assumes that:\n\n        * the DC Helm release name is `confluence`\n        * `labels.release` is `prometheus-stack` (release name used for provisioning Prometheus stack in [1. Install Prometheus stack](#1-install-prometheus-stack).\n    \n    Now provision the `serviceMonitor`:\n    ```bash\n    kubectl apply -f servicemonitor.yaml\n    ```\n\n## 4. Expose & confirm Prometheus service\nOut of the box Prometheus services are not exposed, the simplest way to do this is to forward the service port (replace pod name with an actual Prometheus pod name):\n```\nkubectl port-forward prometheus-prometheus-stack-kube-prom-prometheus-0 9090:9090 -n <prometheus-stack-namespace>\n```\n\nNavigate to the URL `http://localhost:9090` in your browser and then select; **Status -> Targets**. You should be able to see your product pods as targets.\n\n\n## 5. Access Grafana\n\nTo access Grafana, run (replace pod name with an actual Grafana pod name):\n\n```\nkubectl port-forward prometheus-stack-grafana-57dc5589b-2wh98 3000:3000 -n <prometheus-stack-namespace>\n```\n\n!!!info \"Grafana details\"\n\n    * The name of the Grafana pod (`prometheus-stack-grafana-57dc5589b-2wh98`) may vary slightly between deploys\n    * The default credentials are `admin:prom-operator` (these can be overridden when deploying kube-prometheus-stack). Alternatively, you may expose grafana service as a `LoadBalancer` `Service` type.\n\nand go to `http://localhost:3000` in your browser.\n\nYou can then create a new [Dashboard](https://grafana.com/docs/grafana/latest/dashboards/) and use any of the exported metrics. To get the list of available metrics, run:\n\n```\nkubectl port-forward confluence-0 9999:9999 -n <dc-product-namespace> \n``` \n\nand go to `http://localhost:9999/metrics` in your local browser. You should see a list of available metrics that can be used.\n\n## 6. Provision Pre-canned product dashboards\n\nWe provide a set of Grafana specific dashboards for each DC product. These can be provisioned by following the [Pre-canned product charts guide.](PRE_CANNED_CHARTS.md)\n\n## Existing Standalone Prometheus Instance\n\n!!!warning \"JMX service security\"\n    By default, JMX services are created as ClusterIP types, i.e. they are not available outside the Kubernetes cluster.\n    If your Prometheus instance, is deployed outside the Kubernetes cluster, you will need to expose the `JMX` service:\n    ```\n    monitoring:\n      jmxExporterPortType: LoadBalancer\n    ``` \n    Make sure you restrict access to the Prometheus endpoint to only authorized CIDR ranges because JMX endpoints are not password protected. Configure your load balancer's network security rules to limit inbound access. \n\n    See: [jmx_exporter does not support authentication to the HTTP \n    endpoint](https://github.com/prometheus/jmx_exporter/issues/687)\n\nIf you use a standalone Prometheus in Kubernetes, you need to manually create scrape configuration. See: [Monitor Jira with Prometheus and Grafana](https://confluence.atlassian.com/adminjiraserver/monitor-jira-with-prometheus-and-grafana-1155466715.html).\n\n"
  },
  {
    "path": "docs/docs/userguide/resource_management/JIRA_INDEX_SNAPSHOT.md",
    "content": "# Creating an initial index snapshot in Jira\n\nThese steps should be followed to enable shared index snapshots with Jira:\n\n1. Log into the Jira instance as the Administrator\n1. Go to `Settings` -> `System` -> `Indexing`\n1. There should be no errors on this page i.e.\n![good-index](../../assets/images/good-index.png)\n1.  If there are errors (as seen below) perform a `Full re-index` before proceeding\n![bad-index](../../assets/images/bad-index.png)\n1. Once the `Full re-index` is complete, scroll down to `Index Recovery` settings visible on the same page\n![index-recovery-settings](../../assets/images/index-recovery-settings.png)\n1. Take note of the current settings\n1. Temporarily change these values (`Edit Settings`), as depicted in the screenshot below. The cron expression will create an index snapshot every minute\n![edit-index-recovery-settings](../../assets/images/edit-index-recovery-settings.png)\n1. Wait for the snapshot to be created, by checking for an archive in `<shared-home>/export/indexsnapshots`\n1. When the snapshot is available, revert the settings noted in `step 6`, or back to the defaults:\n![default-index-recovery-settings](../../assets/images/default-index-recovery-settings.png)\n1. Consider keeping the `Enable index recovery` setting so that it is set to `ON`\n1. Proceed with [scaling the cluster as necessary](RESOURCE_SCALING.md#horizontal-scaling-adding-pods)"
  },
  {
    "path": "docs/docs/userguide/resource_management/REQUESTS_AND_LIMITS.md",
    "content": "# Resource requests and limits\nTo ensure that Kubernetes appropriately schedules resources, the respective product `values.yaml` is configured with default `cpu` and `memory` [resource request values](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/){.external} .\n\n## Resource requests\nThe default resource requests that are used for each product are defined below. \n>Note: these values are geared towards small data sets. For larger enterprise deployments refer to the [Data Center infrastructure recommendations](https://confluence.atlassian.com/enterprise/data-center-infrastructure-recommendations-972333478.html){.external}.\n\nUsing the [formula](#memory-request-sizing) below, the `memory` specific values are derived from the default `JVM` requirements defined for each product's Docker container.\n\n| Product  | CPU   |  Memory |\n|----------|:-----:|------:|\n| [Jira](https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/#markdown-header-memory-heap-size){.external}                        | `2`   | `2G`  |\n| [Confluence](https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/src/master/#markdown-header-memory-heap-size){.external}     | `2`   | `2G`  |\n| [Bitbucket](https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/src/master/){.external}                                        | `2`   | `2G`  |\n| [Bamboo](https://bitbucket.org/atlassian-docker/docker-bamboo-server/src/master/){.external}                                                      | `2`   | `2G`  |\n| [Bamboo agent](https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base/src/master/){.external}                                                      | `1`   | `2G`  |\n| [Crowd](https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/src/master/){.external}                                                       | `2`   | `1G`  |\n\n### Synchrony container resources\n\nA Confluence cluster requires a Synchrony container. The default resource requests that are used for the Synchrony container are:\n\n* `cpu: 2`\n* `memory: 2.5G` \n\n### Memory request sizing\nRequest sizing must allow for the size of the product `JVM`. That means the `maximum heap size`, `minumum heap size` and the `reserved code cache size` (if applicable) plus other JVM overheads, must be considered when defining the request `memory` size. As a rule of thumb the formula below can be used to deduce the appropriate request memory size.\n```shell\n(maxHeap + codeCache) * 1.5\n```\n\n## Resource limits\nEnvironmental and hardware constraints are different for each deployment, therefore the product's `values.yaml` does not provide a resource [`limit`](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container){.external} definition. Resource usage limits can be defined by updating the commented out the `resources.container.limits` stanza within the appropriate `values.yaml`. For example:\n\n```yaml\ncontainer:\n  limits:\n    cpu: \"2\"\n    memory: \"4G\"\n  requests:\n    cpu: \"2\" \n    memory: \"2G\"\n```\n\n## Init and Additional Containers\n\nBy default, NFS permission fixer and JMX init containers, as well as Fluentd additional container don't have resources requests and limits. You can set them in `values.yaml`:\n\n```yaml\nvolumes:\n  sharedHome:\n    nfsPermissionFixer:\n      resources:\n        requests:\n          cpu: 1\n          memory: 256Mi\n        limits:\n          cpu: 1\n          memory: 256Mi\n\nmonitoring:\n  jmxExporterInitContainer:\n    resources:\n      requests:\n        cpu: 1\n        memory: 256Mi\n      limits:\n        cpu: 1\n        memory: 256Mi  \n\nfluentd:\n  resources:\n    requests:\n      cpu: 1\n      memory: 256Mi\n    limits:\n      cpu: 1\n      memory: 256Mi\n```\n"
  },
  {
    "path": "docs/docs/userguide/resource_management/RESOURCE_SCALING.md",
    "content": "# Product scaling\nFor optimum performance and stability the appropriate resource `requests` and `limits` should be defined for each pod. The number of pods in the product cluster should also be carefully considered. Kubernetes provides means for horizontal and vertical scaling of the deployed pods within a cluster, these approaches are described below.\n\n## Horizontal scaling - adding pods\nThe Helm charts provision one `StatefulSet` by default. The number of replicas within this `StatefulSet` can be altered either declaratively or imperatively. Note that the Ingress must support cookie-based session affinity in order for the products to work correctly in a multi-node configuration.\n\n\n=== \"Declaratively\"\n      1. Update `values.yaml` by modifying the `replicaCount` appropriately.\n      2. Apply the patch:\n      ```shell\n      helm upgrade <release> <chart> -f <values file>\n      ```\n\n=== \"Imperatively\"\n      ```shell\n      kubectl scale statefulsets <statefulsetset-name> --replicas=n\n      ```\n\n!!!note \"Initial cluster size\"\n      **Jira**, **Confluence**, and **Crowd** all require manual configuration after the first pod is deployed and before scaling up to additional pods, therefore when you deploy the product only one pod (replica) is created. The initial number of pods that should be started at deployment of each product is set in the `replicaCount` variable found in the values.yaml and should always be kept as 1.\n\n!!!warning \"Bamboo cluster size\"\n      **Bamboo server** currently has [limitations relating to clustering](../../troubleshooting/LIMITATIONS.md#cluster-size), as such, unlike the other products Bamboo server can only be scaled to a maximum of `1` pod.\n\nFor details on modifying the `cpu` and `memory` requirements of the `StatefulSet` see section [Vertical Scaling](#vertical-scaling-adding-resources) below. Additional details on the resource requests and limits used by the `StatfulSet` can be found in [Resource requests and limits](REQUESTS_AND_LIMITS.md).\n\n### Scaling Jira safely\nAt present there are issues relating to index replication with Jira when immediately scaling up by more than 1 pod at a time. See [Jira and horizontal scaling](../../troubleshooting/LIMITATIONS.md#jira-limitations-and-horizontal-scaling).\n\n!!!warning \"Before scaling your cluster\"\n\n      Make sure there's at least one snapshot file in the `<shared-home>/export/indexsnapshots` directory. New pods will attempt to use the files in this directory to replicate the index. If there is no snapshot present in  `<shared-home>/export/indexsnapshots` then [create an initial index snapshot](JIRA_INDEX_SNAPSHOT.md)\n\nHaving followed the steps above, and ensured a healthy snapshot index is available, [scale the cluster as necessary](#horizontal-scaling-adding-pods). Once scaling is complete confirm that the index is still healthy [using the approach prescribed in Step 3](JIRA_INDEX_SNAPSHOT.md). If there are still indexing issues then please refer to the guides below for details on how address them:\n\n* [Unable to perform a background re-index error](https://confluence.atlassian.com/jirakb/how-to-fix-a-jira-application-that-is-unable-to-perform-a-background-re-index-at-this-time-error-316637947.html)\n* [Troubleshoot index problems in Jira server](https://confluence.atlassian.com/jirakb/troubleshoot-index-problems-in-jira-server-203394752.html)\n\n## Vertical scaling - adding resources\nThe resource `requests` and `limits` for a `StatefulSet` can be defined before product deployment or for deployments that are already running within the Kubernetes cluster. Take note that vertical scaling will result in the pod being re-created with the updated values.\n\n### Prior to deployment\nBefore performing a helm install update the appropriate products `values.yaml` `container` stanza with the desired `requests` and `limits` values i.e. \n```yaml\n container: \n  limits:\n    cpu: \"4\"\n    memory: \"4G\"\n  requests:\n    cpu: \"2\"\n    memory: \"2G\"\n```\n\n### Post deployment\nFor existing deployments the `requests` and `limits` values can be dynamically updated either declaratively or imperatively \n\n=== \"Declaratively\"\n      This the preferred approach as it keeps the state of the cluster, and the helm charts themselves in sync.\n      \n      1. Update `values.yaml` appropriately\n      2. Apply the patch:\n      \n      ```shell\n      helm upgrade <release> <chart> -f <values file>\n      ```\n\n=== \"Imperatively\"\n      Using `kubectl edit` on the appropriate `StatefulSet` the respective `cpu` and `memory` values can be modified i.e.\n\n      ```yaml\n      resources:\n        requests:\n          cpu: \"2\"\n          memory: 2G\n      ```\n\n      Saving the changes will then result in the existing product pod(s) being re-provisioned with the updated values.\n"
  },
  {
    "path": "docs/docs/userguide/upgrades/.pages",
    "content": "nav:\n    - Helm chart upgrade: HELM_CHART_UPGRADE.md\n    - Products upgrade: PRODUCTS_UPGRADE.md"
  },
  {
    "path": "docs/docs/userguide/upgrades/HELM_CHART_UPGRADE.md",
    "content": "# Helm chart upgrade\nEach Helm chart has a default product version that might change in next Helm chart \nversion. So be aware that if you upgrade the Helm chart, it might lead to upgrading the product as well. This depends on the current and target Helm chart versions. \n\n!!!important \"Do you want to upgrade the product to a new version?\" \n     If you want to upgrade the product version without upgrading the Helm chart then \n     refer to [Product upgrades](PRODUCTS_UPGRADE.md). \n\nBefore upgrading the Helm chart, first consider: \n\n* the version of the current Helm chart\n* the version of the product running on your Kubernetes cluster\n* the target version of the Helm chart you want to upgrade to\n* the target version of the product you want to upgrade to\n\nYou need to know if the target product version is zero-downtime compatible (if it is subject to change). \nBased on this information you may need to choose a different upgrade method.\n\n!!!info \"Upgrade product strategies\"\n    There are two options for upgrade:\n    \n    * _Normal upgrade_: The service will have interruptions during the upgrade.\n    * _Rolling upgrade_: The upgrade will proceed with zero downtime.\n \n\n## 1. Find the current version of the installed Helm chart\nTo find the current version of Helm chart and the product version run the following command:\n\n ```shell \n helm list --namespace <namespace> \n ```\n\nYou can see the current Helm chart tag version in the `CHART` column, and the current product tag version in the `APP VERSION` \ncolumn for each release name. \n\n\n## 2. Define the target Helm chart version\n!!! hint \"Do you have the Atlassian Helm chart repository locally?\"\n    Make sure you have the Atlassian Helm chart repository in your local Helm repositories. Run the following command to add them:\n    \n    ```shell\n    helm repo add atlassian-data-center \\\n         https://atlassian.github.io/data-center-helm-charts\n    ```\n\nUpdate the Helm chart repository on your local Helm installation:\n\n```shell \nhelm repo update\n```\n\n!!! warning \"Target Helm chart version\"\n    The target Helm chart version must be higher than the current Helm chart version.\n    \nTo see all available Helm chart versions of the specific product run this command:\n\n```shell \nhelm search repo atlassian-data-center/<product> --versions\n```\n\n    \n Select the target Helm chart version. You can find the default application version (target product version tag) \n in the `APP VERSION` column.\n  \n  \n!!!error \"Upgrading the Helm chart to a MAJOR version is not backward compatible.\"\n     The Helm chart is [semantically versioned](https://semver.org/){.external}. You need to take some extra\n     steps if you are upgrading the Helm chart to a MAJOR version. Before you proceed, learn about the steps for your \n     target version in the [upgrading section](../../README.md#upgrading). \n     \n## 3. Define the upgrade method\n\nConsidering the current and target **product** versions there are different scenarios: \n\n1. The versions are different, and the target product version is not zero-downtime compatible.  \n2. The versions are different, and the target product version is zero-downtime compatible.  \n3. The versions are the same.\n \n!!!important \"See the following links to find out if two versions of a product are zero-downtime compatible\"\n\n     * Jira: [Upgrading Jira with zero downtime](https://confluence.atlassian.com/adminjiraserver/upgrading-jira-data-center-with-zero-downtime-938846953.html){.external}   \n     * Confluence: [Upgrading Confluence with zero downtime](https://confluence.atlassian.com/doc/upgrade-confluence-without-downtime-1027127923.html){.external}  \n     * Bitbucket: [Upgrading Bitbucket with zero downtime](https://confluence.atlassian.com/bitbucketserver/upgrade-bitbucket-without-downtime-1038780379.html){.external}\n     * Bamboo: Zero downtime upgrades for Bamboo server and Bamboo agents are currently not supported.\n     * Crowd: Zero downtime upgrades for Crowd are currently not supported.\n\n!!! note \"All supported Jira versions are zero-downtime compatible\"\n     The minimum supported version of Jira in the Data Center Helm Charts is `8.19`. \n     Considering any Jira version later than 8.x is zero-downtime compatible, all supported Jira Data Center versions \n     are zero-downtime compatible. \n\nBased on the scenario follow one of these options in the next step:\n\n* **Normal upgrade**: Upgrade Helm chart when the target product version is not zero-downtime compatible, or you want \nto avoid mixed version during the upgrade. In this option the product will have a downtime during the upgrade process. \n* **Rolling upgrade**: Upgrade Helm chart when the target product version is zero-downtime compatible. This option \nwill only apply when the target product version is zero-downtime compatible. If you are not sure about this see the links above. \n* **No product upgrade**: Upgrade the Helm chart with no change in product version. We recommend this method when the target product version is the same as the current product version, or for any other reason you may not want to change the product version but still upgrade the helm chart. \n \n## 4. Get the current Helm release values\n\n!!! warning \"--reuse-values argument\"\n    Do not pass `--reuse-values` to `helm upgrade` command because the default values in the new Helm chart version will be ignored\n    which can result in templating errors and upgrade failures.\n\n\nIf you have not saved the original values file used during the initial Helm chart installation, you can retrieve user-supplied values:\n\n```shell\nhelm get values <release-name> -n <namespace> -o yaml > values.yaml\n```\n\nUse this file in the argument to `helm upgrade` command, for example:\n\n```shell\n-f /home/user/values.yaml\n```\n \n## 5. Upgrade the Helm chart\n \n!!! hint \"Tip: Monitor the pods during the upgrade process\"\n     You can monitor the pod activities during the upgrade by running the following command in a separate terminal: \n     ```shell \n     kubectl get pods --namespace <namespace> --watch\n     ```\n      \n=== \"Normal upgrade\"\n    ### Helm chart upgrade with downtime\n     \n    You need to use this method to upgrade the Helm chart if:\n\n    * the target product version is not zero downtime-compatible\n    * for any other reason you would prefer to avoid running the cluster in mix mode\n    \n    !!!warning \"Upgrading the Helm chart might change the product version\" \n        If you want to upgrade the Helm chart to a newer version but don't want to change \n        the product version then follow the _Upgrade with no change in product version_ tab.\n    \n    The strategy for upgrading the product with downtime is to scale down the cluster to zero nodes and then \n    start the nodes with new product versions. And finally scale the cluster up to the original number of nodes. \n    Here are step-by-step instructions for the upgrade process:\n    \n    1. Find out the number of nodes in the cluster.\n        ```shell\n        kubectl describe sts <release-name> --namespace <namespace> | grep 'Replicas'\n        ```\n    2. Upgrade the Helm chart.  \n        Replace the product name in the following command:\n        ```shell\n        helm upgrade <release-name> atlassian-data-center/<product> \\\n         --version <target-helm-chart-version> \\\n         -f <path-to-values-yaml> \\\n         --set replicaCount=1 \\\n         --wait \\\n         --namespace <namespace>\n        ```\n        The cluster will scale down to zero nodes. Then one pod with the target product version will be recreated \n        and join the cluster. \n    \n    3. Scale up the cluster.\n        After you confirm the new pod is in `Running` status then scale up the cluster to the same number \n        of nodes as before the upgrade: \n        ```shell\n        helm upgrade <release-name> atlassian-data-center/confluence \\\n         -f <path-to-values-yaml> \\\n         --set replicaCount=<n> \\\n         --wait \\\n         --namespace <namespace>\n        ``` \n\n\n=== \"Rolling upgrade\"\n         \n    ### Helm chart upgrade with zero downtime\n \n     \n    !!!warning \"Upgrade the Helm chart might change the product version\" \n        If you want to upgrade the Helm chart to newer version but don't want to change \n        the product version then follow the _Upgrade with no change in product version_ tab.\n        \n    !!! warning \"Rolling upgrade is not possible if the cluster has only one node\"\n         If you have just one node in the cluster then you can't take advantage of the zero-downtime approach. You may \n         scale up the cluster to at least two nodes before upgrading or there will be a downtime during the upgrade. \n              \n    In order to upgrade the Helm chart when the target product version is different from the current product version, \n    you can use upgrade with zero downtime to avoid any service interruption during the upgrade.\n    To use this option the target version must be zero-downtime compatible. \n    \n    !!!important \"Make sure the product target version is zero downtime-compatible\" \n         To ensure you will have a smooth upgrade make sure the product target version is zero-downtime \n         compatible. If you still aren't sure about this go back to step 3. \n\n    \n    Here are the step-by-step instructions of the upgrade process. These steps may vary for each product:\n     \n\n    === \"Jira\"\n        1. Put Jira into upgrade mode. \n            Go to **Administration > Applications > Jira upgrades** and click **Put Jira into upgrade mode**. \n            ![upgrade-mode](../../assets/images/jira-upgrade-1.png)\n        \n        2. Run the upgrade using Helm. \n        \n            ```shell\n            helm upgrade <release-name> atlassian-data-center/jira \\\n             --version <target-helm-chart-version> \\\n             -f <path-to-values-yaml> \\\n             --wait \\\n             --namespace <namespace>\n            ```\n        \n        4. Wait for the upgrade to finish. \n            The pods will be recreated with the updated version, one at a time.\n            \n            ![upgrade-mode](../../assets/images/jira-upgrade-2.png)\n        \n        3. Finalize the upgrade.\n            After all the pods are active with the new version, click **Run upgrade tasks** to finalize the upgrade:\n            \n            ![upgrade-mode](../../assets/images/jira-upgrade-3.png)\n             \n    === \"Confluence\"\n         1. Put Confluence into upgrade mode. \n             From the admin page click on *Rolling Upgrade* and set the Confluence in Upgrade mode:\n             \n             ![upgrade-mode](../../assets/images/confluence-upgrade-1.png)\n         \n         2. Run the upgrade using Helm. \n             ```shell\n             helm upgrade <release-name> atlassian-data-center/confluence \\\n                 --version <target-helm-chart-version> \\\n                 -f <path-to-values-yaml> \\\n                 --wait \\\n                 --namespace <namespace>\n             ```\n             Wait until all pods are recreated and are back to `Running` status. \n         \n         4. Wait for the upgrade to finish. \n             The pods will be recreated with the updated version, one at a time.\n             \n             ![upgrade-mode](../../assets/images/confluence-upgrade-2.png)\n         \n         3. Finalize the upgrade. \n             After all the pods are active with the new version, click **Run upgrade tasks** to finalize the upgrade:\n             \n             ![upgrade-mode](../../assets/images/confluence-upgrade-3.png)\n    \n    === \"Bitbucket\"\n        1. Put Bitbucket into upgrade mode. \n            From the admin page click on *Rolling Upgrade* and set the Bitbucket in Upgrade mode:\n            \n            ![upgrade-mode](../../assets/images/bitbucket-upgrade-1.png)\n            \n        2. Run the upgrade using Helm. \n        \n            ```shell\n            helm upgrade <release-name> atlassian-data-center/bitbucket \\\n             --version <target-helm-chart-version> \\\n             -f <path-to-values-yaml> \\\n             --wait \\\n             --namespace <namespace>\n            ```\n            Wait until all pods are recreated and are back to `Running` status. \n        \n        3. Wait for the upgrade to finish. \n            The pods will be recreated with the updated version, one at a time.\n            \n            ![upgrade-mode](../../assets/images/bitbucket-upgrade-2.png)\n            \n        4. Finalize the upgrade. \n            After all the pods are active with the new version, click **Run upgrade tasks** to finalize the upgrade:\n            \n            ![upgrade-mode](../../assets/images/bitbucket-upgrade-3.png)\n\n    === \"Bamboo\"\n        !!!warning \"Bamboo and zero downtime upgrades\"\n            Zero downtime upgrades for Bamboo server and Bamboo agents are currently not supported.\n\n    === \"Crowd\"\n        !!!warning \"Crowd and zero downtime upgrades\"\n            Zero downtime upgrades for Crowd are currently not supported.\n\n     \n=== \"Upgrade with no change in the product version\"\n    ###Helm chart upgrade with no change in product version  \n    \n    If your target Helm chart has a different product version in comparison with the current product version, and you \n    still want to keep the current product version unchanged, you should use the following command to upgrade the Helm chart:\n    \n    ```shell \n    helm upgrade <release-name> atlassian-data-center/<product> \\\n        --version <helm-chart-target-version> \\\n        -f <path-to-values-yaml> \\\n        --set image.tag=<current-product-tag> \\\n        --wait \\\n        --namespace <namespace>\n    ``` \n        \n    However, when the product versions of target and current Helm charts are the same,\n    then you can run the following command to upgrade the Helm chart only:\n    \n    ```shell \n    helm upgrade <release-name> atlassian-data-center/<product> \\\n         --version <helm-chart-target-version> \\\n         -f <path-to-values-yaml> \\\n         --wait \\\n         --namespace <namespace>\n    ```\n"
  },
  {
    "path": "docs/docs/userguide/upgrades/PRODUCTS_UPGRADE.md",
    "content": "# Products upgrade\n\nWe recommend upgrading the Helm chart rather than upgrading the product directly. However, if you want to upgrade the \nproduct to a specific version that is not listed in the Helm charts, or if you don't want to upgrade Helm chart\nto a newer version but you still need to upgrade the product version, then you are in a right place.   \n\nTo upgrade the product to a newer version without upgrading the Helm chart follow these steps:\n\n## 1. Find the tag of the target image\nGo to the Atlassian Docker Hub page of the relevant product to pick a tag that matches your target version.\n\n!!! note \"Atlassian Docker Hub page for supported products:\"\n    * Jira: [atlassian/jira-software](https://hub.docker.com/r/atlassian/jira-software/tags){.external}\n    * Confluence: [atlassian/confluence](https://hub.docker.com/r/atlassian/confluence/tags){.external}\n    * Bitbucket: [atlassian/bitbucket](https://hub.docker.com/r/atlassian/bitbucket/tags){.external}\n    * Bamboo: [atlassian/bamboo](https://hub.docker.com/r/atlassian/bamboo/tags){.external}\n    * Bamboo agent: [atlassian/bamboo-agent-base](https://hub.docker.com/r/atlassian/bamboo-agent-base/tags){.external}\n    * Crowd: [atlassian/crowd](https://hub.docker.com/r/atlassian/crowd){.external}\n\nIn the example you're running Jira using the `8.13.0-jdk11` tag, and you'll be upgrading to `8.13.1-jdk11` - our *target*.\n    \n## 2. Define the upgrade strategy\nThere are two strategies to upgrade the application:\n\n* _Normal upgrade_: The service will have interruptions during the upgrade.\n* _Rolling upgrade_: The upgrade will proceed with zero downtime.\n \nYou can use rolling upgrade only if the target version is zero-downtime compatible. \n\n!!! important \"Can you use the rolling upgrade option?\"\n    To confirm if you can run a rolling upgrade option, check your current and target product versions in the relevant link:  \n    \n     * Jira: [Upgrading Jira with zero downtime](https://confluence.atlassian.com/adminjiraserver/upgrading-jira-data-center-with-zero-downtime-938846953.html){.external} \n     * Confluence: [Upgrading Confluence with zero downtime](https://confluence.atlassian.com/doc/upgrade-confluence-without-downtime-1027127923.html){.external} \n     * Bitbucket: [Upgrading Bitbucket with zero downtime](https://confluence.atlassian.com/bitbucketserver/upgrade-bitbucket-without-downtime-1038780379.html){.external}\n     * Bamboo: Zero downtime upgrades for Bamboo server and Bamboo agents are currently not supported.\n\n## 3. Upgrade the product \n=== \"Normal Upgrade\"\n    \n    ### Normal upgrade            \n    \n    !!! info \"The service will have interruptions during the normal upgrade\"\n        You can use this method to upgrade the Helm chart if:\n        \n         * The target product version is not zero-downtime compatible\n         * If you prefer to avoid running the cluster in mix mode\n\n     The strategy for normal upgrading is to scale down the cluster to zero nodes, and then \n     start one node with the new product version. Then scale up the cluster to the original number of nodes. \n     Here are the step-by-step instructions for the upgrade process:\n     \n     1. Find out the current number of nodes.\n     Run the following command: \n     ```shell\n     kubectl describe sts <release-name> --namespace <namespace> | grep 'Replicas'\n     ```\n     2. Run the upgrade using Helm.\n     Based on the product you want to upgrade replace the product name in the following command and run:\n     ```shell\n     helm upgrade <release-name> atlassian-data-center/<product> \\\n         --reuse-values \\\n         --set replicaCount=1 \\\n         --set image.tag=<target-tag> \\\n         --wait \\\n         --namespace <namespace>\n     ```\n     The cluster will scale down to zero nodes. Then one pod with the target product version will be recreated \n     and join the cluster. \n     \n     3. Scale up the cluster.\n     After you confirm the new pod is in `Running` status then scale up the cluster to the same number \n     of nodes as before the upgrade: \n     ```shell\n     helm upgrade <release-name> atlassian-data-center/confluence \\\n         --reuse-values \\\n         --set replicaCount=<n> \\\n         --wait \\\n         --namespace <namespace>\n     ``` \n\n=== \"Rolling upgrade\"\n    ### Rolling (zero downtime) upgrade\n    \n    !!! info \"Select the product tab to upgrade\"\n        Upgrading the product with zero downtime is bit different for each product. Please select the product and follow \n        the steps to complete the rolling upgrade.  \n        \n    === \"Jira\"  \n        \n        ### Jira rolling upgrade\n        Let's say we have Jira version `8.19.0` deployed to our Kubernetes cluster, and we want to upgrade it to version\n        `8.19.1`, which we'll call the *target version*. You can substitute the target version for the one you need, as long as\n        it's newer than the current one.\n        \n        #### 1. Find tag of the target image.\n        \n        Go to [atlassian/jira-software](https://hub.docker.com/r/atlassian/jira-software/tags){.external}\n        Docker Hub page to pick a tag that matches your target version.\n        \n        In the example we're running Jira using the `8.19.0-jdk11` tag, and we'll be upgrading to `8.19.1-jdk11` - our *target*.\n        \n        #### 2. Put Jira into upgrade mode.\n        \n        Go to **Administration > Applications > Jira upgrades** and click **Put Jira into upgrade mode**.\n        \n          ![upgrade-mode](../../assets/images/jira-upgrade-1.png)\n        \n        #### 3. Run the upgrade using Helm.\n        \n        Run the Helm *upgrade* command with your release name (`<release-name>`) and the target image from a previous step\n        (`<target-tag>`). For more details, refer to the [Helm documentation](https://helm.sh/docs/).\n        \n         ```shell\n         helm upgrade <release-name>  atlassian-data-center/jira \\ \n              --wait \\\n              --reuse-values \\\n              --set image.tag=<target-tag>\n         ```\n        \n        If you used `kubectl scale` after installing the Helm chart, you'll need to add `--set\n        replicaCount=<number-of-jira-nodes>` to the command. Otherwise, the deployment will be scaled back to the original\n        number, which most likely is one node.\n        \n        #### 4. Wait for the upgrade to finish.\n        The pods will be recreated with the updated version, one at a time.\n        \n        ![upgrade-mode](../../assets/images/jira-upgrade-2.png)\n        \n        #### 5. Finalize the upgrade.\n        After all pods are active with the new version, click **Run upgrade tasks** to finalize the upgrade:\n        \n        ![upgrade-mode](../../assets/images/jira-upgrade-3.png)\n    \n    \n    === \"Confluence\"\n        !!!warning \"ATL_FORCE_CFG_UPDATE\"\n            Make sure `additionalEnvironmentVariables.ATL_FORCE_CFG_UPDATE` is not excplicitly set to `true` in Helm values before a ZDU upgrade.\n            Setting it to `true` and performing a ZDU upgrade will result in build numbers mismatch. \n        \n        ### Confluence rolling upgrade\n        Let's say we have Confluence version `7.12.0` deployed to our Kubernetes cluster, and we want to upgrade it to version\n        `7.12.1`, which we'll call the *target version*. You can substitute the target version for the one you need, as long as\n        it's newer than the current one.\n        \n        !!!note \"Follow the link to confirm the *target version* is zero-downtime compatible\"\n                [Upgrading Confluence with zero downtime](https://confluence.atlassian.com/doc/upgrade-confluence-without-downtime-1027127923.html){.external} \n    \n        #### 1. Find the tag of the target image.\n        \n        Go to [atlassian/confluence](https://hub.docker.com/r/atlassian/confluence/tags){.external}\n        Docker Hub page to pick a tag that matches your target version.\n        \n        In the example we're running Confluence using the `7.12.0-jdk11` tag, and we'll be upgrading to `7.12.1-jdk11` - our *target*.\n        \n        #### 2. Put Confluence into upgrade mode.\n        \n        From the admin page click on *Rolling Upgrade* and set the Confluence in Upgrade mode:\n        \n          ![upgrade-mode](../../assets/images/confluence-upgrade-1.png)\n        \n        #### 3. Run the upgrade using Helm.\n        \n        Run the Helm *upgrade* command with your release name (`<release-name>`) and the target image from a previous step\n        (`<target-tag>`). For more details, refer to the [Helm documentation](https://helm.sh/docs/).\n        \n         ```shell\n         helm upgrade <release-name>  atlassian-data-center/confluence \\\n             --wait \\\n             --reuse-values \\ \n             --set image.tag=<target-tag>\n         ```\n        \n        If you used `kubectl scale` after installing the Helm chart, you'll need to add `--set\n        replicaCount=<number-of-confluence-nodes>` to the command. Otherwise, the deployment will be scaled back to the original\n        number, which most likely is one node.\n        \n        #### 4. Wait for the upgrade to finish.\n        The pods will be recreated with the updated version, one at a time.\n        \n        ![upgrade-mode](../../assets/images/confluence-upgrade-2.png)\n        \n        #### 5. Finalize the upgrade.\n        After all the pods are activated with the new version, finalize the upgrade:\n        \n        ![upgrade-mode](../../assets/images/confluence-upgrade-3.png)\n    \n    \n    === \"Bitbucket\"\n        \n        ### Bitbucket rolling upgrade\n        Let's say we have Bitbucket version `7.12.0` deployed to our Kubernetes cluster, and we want to upgrade it to version\n        `7.12.1`, which we'll call the *target version*. You can substitute the target version for the one you need, as long as\n        it's newer than the current one.\n        \n        !!!note \"Follow the link to find out if the *target version* is zero-downtime compatible\"\n                [Upgrading Bitbucket with zero downtime](https://confluence.atlassian.com/bitbucketserver/upgrade-bitbucket-without-downtime-1038780379.html){.external}\n        #### 1. Find tag of the target image.\n        \n        Go to [atlassian/bitbucket](https://hub.docker.com/r/atlassian/bitbucket/tags){.external}\n        Docker Hub page to pick a tag that matches your target version.\n        \n        In the example we're running Bitbucket using the `7.12.0-jdk11` tag, and we'll be upgrading to `7.12.1-jdk11` - our *target*.\n        \n        #### 2. Put Bitbucket into upgrade mode.\n        \n        From the admin page click on **Rolling Upgrade** and set the Bitbucket to Upgrade mode:\n        \n          ![upgrade-mode](../../assets/images/bitbucket-upgrade-1.png)\n        \n        #### 3. Run the upgrade using Helm.\n        \n        Run the Helm *upgrade* command with your release name (`<release-name>`) and the target image from a previous step\n        (`<target-tag>`). For more details, consult the [Helm documentation](https://helm.sh/docs/).\n        \n         ```shell\n         helm upgrade <release-name>  atlassian-data-center/bitbucket \\\n             --wait \\\n             --reuse-values \\\n             --set image.tag=<target-tag>\n         ```\n        \n        If you used `kubectl scale` after installing the Helm chart, you'll need to add `--set\n        replicaCount=<number-of-bb-nodes>` to the command. Otherwise, the deployment will be scaled back to the original\n        number, which most likely is one node.\n        \n        #### 4. Wait for the upgrade to finish.\n        The pods will be recreated with the updated version, one at a time.\n        \n        ![upgrade-mode](../../assets/images/bitbucket-upgrade-2.png)\n        \n        #### 5. Finalize the upgrade.\n        After all the pods are active with the new version, finalize the upgrade:\n        \n        ![upgrade-mode](../../assets/images/bitbucket-upgrade-3.png)\n\n    === \"Bamboo\"\n\n        !!!warning \"Bamboo and zero downtime upgrades\"\n            Zero downtime upgrades for Bamboo server and Bamboo agents are currently not supported.\n\n    === \"Crowd\"\n        !!!warning \"Crowd and zero downtime upgrades\"\n            Zero downtime upgrades for Crowd are currently not supported.\n        \n        \n"
  },
  {
    "path": "docs/mkdocs.yml",
    "content": "site_name: Atlassian DC Helm Charts\ntheme:\n  name: material\n  custom_dir: overrides\n  favicon: assets/logos/favicon.png\n  logo: assets/logos/atlassian-logo.svg\n  palette:\n    - scheme: default\n      toggle:\n        icon: material/lightbulb-outline\n        name: Switch to dark mode\n    - scheme: slate\n      toggle:\n        icon: material/lightbulb\n        name: Switch to light mode\n  features:\n    - search.suggest\n    - search.highlight\n    - navigation.instant\n    - navigation.tabs\n    - content.code.copy\nrepo_url: https://github.com/atlassian/data-center-helm-charts\nrepo_name: atlassian/data-center-helm-charts\nedit_uri: edit/main/docs/docs/\nplugins:\n  - search\n  - awesome-pages\n  - minify:\n      minify_html: true\n      minify_js: true\n      htmlmin_opts:\n        remove_comments: true\nmarkdown_extensions:\n  - pymdownx.emoji:\n      emoji_index: !!python/name:material.extensions.emoji.twemoji\n      emoji_generator: !!python/name:material.extensions.emoji.to_svg\n  - pymdownx.highlight\n  - pymdownx.inlinehilite\n  - pymdownx.superfences\n  - pymdownx.tabbed:\n      alternate_style: true\n  - pymdownx.details\n  - meta\n  - admonition\n  - attr_list\n  - toc:\n      # insert a blank space before the character\n      permalink: \" ¶\"\nextra_css:\n  - assets/stylesheets/extra.css\nextra:\n  analytics:\n    provider: google\n    property: G-FZ7HCVNVPY\n  social:\n    - icon: fontawesome/brands/atlassian\n      link: https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes\ncopyright: Copyright &copy; [2024] Atlassian and others.\n"
  },
  {
    "path": "docs/overrides/main.html",
    "content": "{% extends \"base.html\" %}\n\n{% block announce %}\n<a href=\"https://community.atlassian.com/t5/Atlassian-Data-Center-on/gh-p/DC_Kubernetes\" title=\"Share your feedback with the Atlassian Data Center on Kubernetes Community\" style=\"color:white\"><strong>Share your feedback and join the discussion</strong></a>\n{% endblock %}\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "mkdocs-material\nmkdocs-minify-plugin\nmkdocs-awesome-pages-plugin"
  },
  {
    "path": "docs_internal/ROUTING.md",
    "content": "# Routing: Ingress vs Gateway Internals\n\nThis document explains how the `common.gateway.*` template helpers abstract over\nthe `ingress` and `gateway` values sections, and why they are shaped this way.\nRead this when you need to understand the full picture.\n\n## The two values sections\n\nUsers configure external access via one of two values sections:\n\n```yaml\ningress: # K8s Ingress API path\n  host: ...\n  https: ...\n  path: ...\n\ngateway: # K8s Gateway API path (or external proxy)\n  hostnames: [ ... ]\n  https: ...\n  externalPort: ...\n  path: ...\n```\n\nBoth sections carry two kinds of settings:\n\n1. **Product routing** — hostname, https, port, path. These tell the application\n   how users reach it (proxy settings, base URL, etc.). Present at the top of\n   each section.\n2. **Resource creation** — className, annotations, gatewayName, filters, etc.\n   These only matter when `create: true` and configure the Ingress/HTTPRoute\n   resource. Present below the section divider in `values.yaml`.\n\nThe product routing settings are conceptually identical across both sections —\nonly the key names differ (`host` vs `hostnames`, `port` vs `externalPort`).\n\n## Mode detection\n\nThe helpers use two concepts to decide which values to read:\n\n| Helper           | Returns `\"true\"` when                        | Purpose                                            |\n|------------------|----------------------------------------------|----------------------------------------------------|\n| `useGatewayMode` | `gateway.hostnames` is non-empty             | Determines which section to read values from       |\n| `isConfigured`   | `ingress.host` or `gateway.hostnames` is set | Determines if external access is configured at all |\n\nKey design decisions:\n\n- **Mode is implicit.** Setting `gateway.hostnames` activates gateway mode.\n  There is no explicit toggle — `gateway.create` controls HTTPRoute creation,\n  not mode selection.\n- **Mutual exclusion.** Setting both `ingress.host` and `gateway.hostnames`\n  is a validation error. The user must choose one path.\n- **`gateway.create` only controls the HTTPRoute resource.** A user with a\n  pre-existing Gateway or external load balancer can set `gateway.hostnames`\n  without `gateway.create: true` and get correct product configuration\n  (NOTE: only the first hostname will be used in such case).\n\n## Helper dependency graph\n\n```\nisConfigured ──────────────────── used by: statefulset guards, NOTES.txt, bamboo.baseUrl\nuseGatewayMode ────┬───────────── used by: all helpers below\n                   │\n                   ├─ https ───── scheme\n                   ├─ hostname    │\n                   ├─ externalPort│\n                   │              ▼\n                   │           origin ── used by: product baseUrl, NOTES.txt, SETUP_BASEURL\n                   │\n                   └─ path ──────────── used by: product path helpers (jira.path, etc.)\n```\n\n## How values flow into the product\n\nThe helpers feed into two main outputs:\n\n### 1. Environment variables (statefulset.yaml)\n\nGuarded by `isConfigured` — only set when a hostname is configured.\n\n| Env var                                | Helper            | Products  |\n|----------------------------------------|-------------------|-----------|\n| `ATL_PROXY_NAME` / `SERVER_PROXY_NAME` | `hostname`        | all       |\n| `ATL_PROXY_PORT` / `SERVER_PROXY_PORT` | `externalPort`    | all       |\n| `ATL_TOMCAT_SCHEME` / `SERVER_SCHEME`  | `scheme`          | all       |\n| `ATL_TOMCAT_SECURE` / `SERVER_SECURE`  | `https`           | all       |\n| `ATL_BASE_URL`                         | `origin` + `path` | bamboo    |\n| `SETUP_BASEURL`                        | `origin`          | bitbucket |\n| `SERVER_CONTEXT_PATH`                  | `path`            | bitbucket |\n\n### 2. Tomcat server.xml (configmap-server-config.yaml)\n\nProducts that generate `server.xml` via Helm (jira, confluence, bamboo, crowd)\nset the `<Connector>` proxy attributes using these helpers. The `proxyPort`\nattribute uses `externalPort` as a default but can be overridden per-product\nvia `<product>.tomcatConfig.proxyPort`.\n\n## Supported configurations\n\n### Standard: Ingress with resource creation\n\n```yaml\ningress:\n  create: true\n  host: app.example.com\n  https: true\n```\n\nCreates an Ingress resource. Product configured via `ingress.*` values.\n\n### Standard: Gateway API with HTTPRoute creation\n\n```yaml\ngateway:\n  create: true\n  hostnames: [ app.example.com ]\n  https: true\n  gatewayName: my-gateway\n```\n\nCreates an HTTPRoute. Product configured via `gateway.*` values.\n\n### External proxy with gateway config (no resource created)\n\n```yaml\ngateway:\n  create: false\n  hostnames: [ app.example.com ]\n  https: true\n  externalPort: 8443\n```\n\nNo K8s routing resource created. Product configured via `gateway.*` values.\nUse this when traffic is routed by an external load balancer, a pre-existing\nGateway, or any proxy not managed by this chart.\n\n### External proxy with ingress config (legacy, no resource created)\n\n```yaml\ningress:\n  create: false\n  host: app.example.com\n  https: true\n```\n\nSame as above but using `ingress.*` values. This is the legacy way to configure\nan external proxy.\n\n### Invalid: both configured\n\n```yaml\ningress:\n  host: app.example.com      # ← cannot set both\ngateway:\n  hostnames: [ app.example.com ]  # ← cannot set both\n```\n\nFails validation with: \"Cannot set both gateway.hostnames and ingress.host\".\n\n## Why \"externalPort\" instead of \"port\"?\n\nThe `ingress.port` field existed as an undocumented, partially working feature.\nIt was confusing for two reasons:\n\n1. **Unclear purpose.** \"Port\" of what? Users would reasonably assume it\n   configures the Ingress resource itself — but it doesn't. It never appeared\n   in the generated Ingress spec. It only fed into the product's proxy env vars\n   (`ATL_PROXY_PORT` / `SERVER_PROXY_PORT`).\n2. **Inconsistent support.** It worked for the proxy port env var but was\n   ignored by `bamboo.baseUrl` (so `ATL_BASE_URL` was wrong), ignored by all\n   NOTES.txt outputs (displayed URL omitted the port), and ignored by the\n   `configmap-server-config.yaml` `proxyPort` attribute (which had its own\n   separate default).\n\nThe gateway section introduces `externalPort` to fix this:\n\n- **Clear name.** \"External port\" immediately communicates: this is the port\n  users hit to reach the application. Not an internal port, not a container\n  port, not a gateway listener port.\n- **Fully wired.** It flows consistently into env vars, `origin` (URL building),\n  NOTES.txt output, and Tomcat server.xml configuration.\n- **Documented.** It has a clear comment explaining that it does not change\n  the Gateway or load balancer — it must match the actual port in use.\n\nThe `ingress.port` field is retained for backward compatibility but is not\ndocumented in the default `values.yaml`. New users should use the `gateway`\nsection where `externalPort` provides a consistent, well-named alternative.\n\n## Why \"common.gateway\" naming?\n\nThe helpers are namespaced under `common.gateway` even though they handle both\ningress and gateway cases. This is a forward-looking choice — the Gateway API\nis the successor to the Ingress API in Kubernetes, and \"gateway\" as a general\nconcept (\"the entry point for traffic\") fits both use cases. Renaming to\nsomething neutral like `common.routing` was considered but adds no clarity\nfor the extra churn.\n\n## Product-specific helpers\n\nEach product has a `<product>.path` helper that wraps `common.gateway.path`\nwith the product's own `contextPath` default. The pattern is:\n\n```\ninclude \"common.gateway.path\" (dict\n    \"useGatewayMode\" (include \"common.gateway.useGatewayMode\" .)\n    \"gatewayPath\"    .Values.gateway.path\n    \"ingressPath\"    .Values.ingress.path\n    \"contextPath\"    .Values.<product>.service.contextPath\n)\n```\n\nBamboo additionally has `bamboo.baseUrl` which combines `origin` + `path`\nwith a localhost fallback when no external access is configured.\n"
  },
  {
    "path": "mvnvm.properties",
    "content": "mvn_version=3.6.3"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>data-center-helm-charts</artifactId>\n    <groupId>com.atlassian.datacenter.k8s</groupId>\n    <version>0.1.0-SNAPSHOT</version>\n\n    <scm>\n        <connection>scm:git:git@github.com:atlassian/data-center-helm-charts.git</connection>\n        <developerConnection>scm:git:git@github.com:atlassian/data-center-helm-charts.git</developerConnection>\n        <url>scm:git:git@github.com:atlassian/data-center-helm-charts.git</url>\n    </scm>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.assertj</groupId>\n            <artifactId>assertj-core</artifactId>\n            <version>${assertj.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>${junit5.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-params</artifactId>\n            <version>${junit5.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.dataformat</groupId>\n            <artifactId>jackson-dataformat-yaml</artifactId>\n            <version>${jackson.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.vavr</groupId>\n            <artifactId>vavr</artifactId>\n            <version>${vavr.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.vavr</groupId>\n            <artifactId>vavr-jackson</artifactId>\n            <version>${vavr.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.assertj</groupId>\n            <artifactId>assertj-vavr</artifactId>\n            <version>0.4.2</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.fabric8</groupId>\n            <artifactId>kubernetes-client</artifactId>\n            <version>${kubernetes-client.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-simple</artifactId>\n            <version>${slf4j.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>commons-io</groupId>\n            <artifactId>commons-io</artifactId>\n            <version>${commons-io.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.google.code.findbugs</groupId>\n            <artifactId>jsr305</artifactId>\n            <version>3.0.2</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>io.rest-assured</groupId>\n            <artifactId>rest-assured</artifactId>\n            <version>5.1.1</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <properties>\n        <maven.compiler.source>11</maven.compiler.source>\n        <maven.compiler.target>11</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\n        <junit5.version>5.9.0</junit5.version>\n        <assertj.version>3.27.7</assertj.version>\n        <vavr.version>0.10.3</vavr.version>\n        <jackson.version>2.13.3</jackson.version>\n        <kubernetes-client.version>6.0.0</kubernetes-client.version>\n        <slf4j.version>1.7.36</slf4j.version>\n        <commons-io.version>2.14.0</commons-io.version>\n\n        <dockerImage.registry />\n        <dockerImage.repository />\n        <dockerImage.version />\n        <skip.dockerImage.pull>false</skip.dockerImage.pull>\n\n        <helm.src.path>${project.basedir}/src/main/charts</helm.src.path>\n\n        <helm.release.prefix>${user.name}</helm.release.prefix>\n\n        <log.download.dir>${project.build.directory}/logs</log.download.dir>\n\n        <kubernetes.target.namespace>ci</kubernetes.target.namespace>\n\n        <kubernetes.ingress.domain>internal.shared-dev.us-west-2.kitt-inf.net</kubernetes.ingress.domain>\n        <aks.ingress.domain>aks.k8s.bbsperf.com</aks.ingress.domain>\n        <gke.ingress.domain>gke.k8s.bbsperf.com</gke.ingress.domain>\n        <kitt.ingress.domain>${kubernetes.ingress.domain}</kitt.ingress.domain>\n        <eks.ingress.domain>ci.deplops.com</eks.ingress.domain>\n        <!-- ARN of an ACM issued certificate for the above domain -->\n        <eks.ingress.certificate>foo</eks.ingress.certificate>\n        <!-- Can be either 'internal' or 'internet-facing' -->\n        <eks.alb.loadbalancer.scheme>internet-facing</eks.alb.loadbalancer.scheme>\n        <eks.ssh.loadbalancer.scheme>internet-facing</eks.ssh.loadbalancer.scheme>\n        <custom.ingress.uri />\n\n        <shared.pvc.name>atlassian-dc-shared-home-pvc</shared.pvc.name>\n\n        <persistence.enabled>true</persistence.enabled>\n        <clustering.enabled>true</clustering.enabled>\n        <!--\n            Number of instance replicas to start during initial setup. This value is currently only used by Bitbucket,\n            other products' values.yaml ignore this property. Other products need to perform additional setup steps on\n            a single node after Helm chart installation.\n        -->\n        <replica.count>2</replica.count>\n        <!-- Expected number of replicas after instance has been started -->\n        <target.replica.count>2</target.replica.count>\n\n        <db.init.script.file/>\n\n        <extra.parameters />\n\n        <helm.debug>true</helm.debug>\n\n        <!-- The directory in which the helm (un)install script should look for the chart values files for integration testing -->\n        <chart.testValues.basedir>${project.build.directory}/config</chart.testValues.basedir>\n\n        <!-- Deploy standalone Elasticsearch for BB? -->\n        <chart.testValues.es.deploy>true</chart.testValues.es.deploy>\n\n        <!-- Deploy Mesh nodes for BB? -->\n        <chart.testValues.mesh.deploy>false</chart.testValues.mesh.deploy>\n        <chart.testValues.mesh.version>1.4.0</chart.testValues.mesh.version>\n\n    </properties>\n\n    <build>\n        <pluginManagement>\n            <plugins>\n                <plugin>\n                    <groupId>org.apache.maven.plugins</groupId>\n                    <artifactId>maven-surefire-plugin</artifactId>\n                    <version>3.0.0-M5</version>\n                </plugin>\n            </plugins>\n        </pluginManagement>\n\n        <testResources>\n            <testResource>\n                <!-- Apply filtering to the helm CI config, to substitute various properties -->\n                <directory>src/test/config</directory>\n                <filtering>true</filtering>\n                <targetPath>${project.build.directory}/config</targetPath>\n            </testResource>\n        </testResources>\n    </build>\n\n    <profiles>\n        <profile>\n            <id>custom-docker-image</id>\n            <properties>\n                <dockerImage.registry>docker.atl-paas.net</dockerImage.registry>\n                <dockerImage.version>${user.name}</dockerImage.version>\n            </properties>\n        </profile>\n\n        <profile>\n            <id>default-chart-values</id>\n            <!--\n            Activating this profile will cause the helm_install.sh script to *not* find the integration-test values.yaml\n            files, resulting in the Helm chart being installed with the default values.\n            -->\n            <properties>\n                <chart.testValues.basedir>dummy</chart.testValues.basedir>\n                <chart.testValues.es.deploy>false</chart.testValues.es.deploy>\n            </properties>\n        </profile>\n\n        <profile>\n            <id>post-install-tests</id>\n            <build>\n                <plugins>\n                    <plugin>\n                        <groupId>org.apache.maven.plugins</groupId>\n                        <artifactId>maven-surefire-plugin</artifactId>\n                        <configuration>\n                            <includes>\n                                <include>test/postinstall/*.java</include>\n                            </includes>\n                            <systemPropertyVariables>\n                                <helmParametersFileLocation>${helmParametersFileLocation}</helmParametersFileLocation>\n                            </systemPropertyVariables>\n                        </configuration>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n    </profiles>\n\n</project>\n"
  },
  {
    "path": "scripts/generate_k8s_support_bundle.sh",
    "content": "#!/bin/bash\n\n# This script can be used to generate a \"support\" bundle that can\n# be used to facilitate investigations into problematic deployments.\n#\n# Usage:\n# 1. Ensure you are already authenticated to the target cluster\n# 2. Ensure kubeconfig is updated to point to the target cluster\n# 3. Ensure you have privileges to list and read objects in the target namespace\n# 3. Run: generate_k8s_support_bundle.sh -n <namespace>\n#\n\nNAMESPACE=\"\"\n\nPOD_LOG=\"pod_logs\"\nEVENT_LOG=\"event_logs\"\nINGRESS_LOG=\"ingress_logs\"\nNODE_LOG=\"node_logs\"\nRESOURCE_LOG=\"resource_logs\"\nHELM_DATA=\"helm_data\"\n\nsetup_directories() {\n  if [ -z \"${ENV_STATS}\" ]; then\n    ENV_STATS=\"./k8s-support\"\n  fi\n  mkdir -p \"${ENV_STATS}\"       \\\n  \"${ENV_STATS}/${POD_LOG}\"     \\\n  \"${ENV_STATS}/${INGRESS_LOG}\"   \\\n  \"${ENV_STATS}/${EVENT_LOG}\"   \\\n  \"${ENV_STATS}/${RESOURCE_LOG}\"\\\n  \"${ENV_STATS}/${NODE_LOG}\"    \\\n  \"${ENV_STATS}/${HELM_DATA}\"\n}\n\nget_helm_chart_data() {\n  echo \"[INFO]: Getting Helm deployment details...\"\n  RELEASES=($(helm list -q -n \"${NAMESPACE}\"))\n  for RELEASE in \"${RELEASES[@]}\"; do\n     helm get values \"${RELEASE}\" -n \"${NAMESPACE}\" -o yaml > \"${ENV_STATS}\"/${HELM_DATA}/\"${RELEASE}\"_current_values.yaml 2>&1\n     helm status \"${RELEASE}\" -n \"${NAMESPACE}\" > \"${ENV_STATS}\"/${HELM_DATA}/\"${RELEASE}\"_status.yaml 2>&1\n  done\n}\n\nget_pod_data() {\n  echo \"[INFO]: Getting pod logs...\"\n  PODS=($(kubectl get pods -n \"${NAMESPACE}\" --no-headers -o custom-columns=\":metadata.name\"))\n  for POD in \"${PODS[@]}\"; do\n    kubectl logs \"${POD}\" -n \"${NAMESPACE}\" > \"${ENV_STATS}\"/${POD_LOG}/\"${POD}\"_log.log 2>&1\n    kubectl describe pod \"${POD}\" -n \"${NAMESPACE}\" > \"${ENV_STATS}\"/${POD_LOG}/\"${POD}\"_describe.log 2>&1\n  done\n}\n\nget_nginx_data() {\n  echo \"[INFO]: Getting Ingress controller logs...\"\n  NGINX_PODS=($(kubectl get pods -n \"${INGRESS_CONTROLLER_NAMESPACE}\" --no-headers -o custom-columns=\":metadata.name\"))\n  for POD in \"${NGINX_PODS[@]}\"; do\n    kubectl logs \"${POD}\" -n \"${INGRESS_CONTROLLER_NAMESPACE}\" > \"${ENV_STATS}\"/${INGRESS_LOG}/\"${POD}\"_log.log 2>&1\n    kubectl describe pod \"${POD}\" -n \"${INGRESS_CONTROLLER_NAMESPACE}\" > \"${ENV_STATS}\"/${INGRESS_LOG}/\"${POD}\"_describe.log 2>&1\n  done\n\n  # checking status of ingress controller svc may be important to troubleshoot any LoadBalancer issues\n  kubectl describe svc -n \"${INGRESS_CONTROLLER_NAMESPACE}\" > \"${ENV_STATS}\"/${INGRESS_LOG}/nginx_svc_describe.log 2>&1\n}\n\nget_event_data() {\n  echo \"[INFO]: Getting namespace events...\"\n  kubectl get events -o wide -n \"${NAMESPACE}\" > \"${ENV_STATS}\"/${EVENT_LOG}/events.log 2>&1\n}\n\nget_pod_status() {\n  echo \"[INFO]: Getting all pods...\"\n  kubectl get pods -o wide -n \"${NAMESPACE}\" > \"${ENV_STATS}\"/current_pod_status.log 2>&1\n}\n\nget_resource_data() {\n  echo \"[INFO]: Describing resources...\"\n  RESOURCES=(svc ingress pvc sts pv)\n  for RESOURCE in \"${RESOURCES[@]}\"; do\n    echo \"[INFO]: Describing ${RESOURCE}\"\n    kubectl describe \"${RESOURCE}\" -n \"${NAMESPACE}\" > \"${ENV_STATS}\"/${RESOURCE_LOG}/\"${RESOURCE}\"_describe.log 2>&1\n  done\n}\n\nget_node_data() {\n  echo \"[INFO]: Describing nodes...\"\n  kubectl describe nodes > \"${ENV_STATS}\"/${NODE_LOG}/nodes.log 2>&1\n}\n\nget_app_logs() {\n  echo \"[INFO]: Getting application logs...\"\n  PRODUCTS=(bamboo-agent bamboo bitbucket confluence confluence-synchrony jira crowd)\n  for PRODUCT in \"${PRODUCTS[@]}\"; do\n    LOGS_DIR=\"logs\"\n    CONTAINER=${PRODUCT}\n    if [ \"${PRODUCT}\" == \"jira\" ] || [ \"${PRODUCT}\" == \"bitbucket\" ]; then\n      LOGS_DIR=\"log\"\n    fi\n    if [ \"${PRODUCT}\" == \"confluence-synchrony\" ]; then\n      LOGS_DIR=\"./\"\n      CONTAINER=\"synchrony\"\n    fi\n    PRODUCT_PODS=($(kubectl get pods -n \"${NAMESPACE}\" -l=app.kubernetes.io/name=\"${PRODUCT}\" --no-headers -o custom-columns=\":metadata.name\"))\n    for POD in \"${PRODUCT_PODS[@]}\"; do\n      mkdir -p \"${ENV_STATS}\"/app-logs/\"${POD}\"\n      kubectl cp \"${POD}\":${LOGS_DIR} \"${ENV_STATS}\"/app-logs/\"${POD}\"/ -n \"${NAMESPACE}\" -c ${CONTAINER}\n      echo \"[INFO]: App log obtained from ${POD}:/var/atlassian/application-data\"\n    done\n  done\n}\n\ncreate_archive() {\n  echo \"[INFO]: Generating tar.gz archive...\"\n  tar -czf k8s-support.tar.gz \"${ENV_STATS}\"\n}\n\ndisplay_help()\n{\n   echo \"To run this script <namespace> must be supplied.\"\n   echo \"\"\n   echo \"Syntax: generate_k8s_support_bundle.sh -n <namespace>\"\n   echo \"\"\n   echo \"options:\"\n   echo \"-n     Target namespace.\"\n   echo \"-a     Include application logs.\"\n   echo \"-i     Include ingress controller logs. Supply ingess controller namespace with this flag.\"\n   echo \"-o     Include worker node definitions. RBAC to list and get nodes is required.\"\n   echo \"-h     Print help.\"\n   echo\n   exit 0;\n}\n\nwhile getopts \"aoh:n:i:\" option\ndo\n  case \"${option}\" in\n    n)\n      NAMESPACE=${OPTARG}\n      ;;\n    a)\n      CAPTURE_APP_LOGS=true\n      ;;\n    i)\n      INGRESS_CONTROLLER_NAMESPACE=${OPTARG}\n      ;;\n    o)\n      CAPTURE_NODE_LOGS=true\n      ;;\n    h)\n      display_help\n      ;;\n    \\?)\n      display_help\n      ;;\n  esac\ndone\n\nif ! command -v kubectl &>/dev/null; then\n    echo \"[ERROR]: kubectl is not installed or not found in PATH\"\n    exit 1\nfi\n\nif [ -z \"${NAMESPACE}\" ]; then\n    display_help\nfi\n\n### GENERATE SUPPORT BUNDLE ###\nsetup_directories\nget_helm_chart_data\nget_pod_status\nget_pod_data\nget_event_data\nget_resource_data\nif [ -n \"${CAPTURE_NODE_LOGS}\" ]; then\n  get_node_data\nfi\nif [ -n \"${INGRESS_CONTROLLER_NAMESPACE}\" ]; then\n    get_nginx_data\nfi\nif [ -n \"${CAPTURE_APP_LOGS}\" ]; then\n    get_app_logs\nfi\ncreate_archive\n\necho \"[INFO]: Logs and events saved to ${ENV_STATS}\"\n\nls -la \"${ENV_STATS}\"\n"
  },
  {
    "path": "src/main/charts/README.md.gotmpl",
    "content": "{{ template \"chart.header\" . }} {{/* This template is used to auto-generate the chart README.md files - see https://github.com/norwoodj/helm-docs */}}\n{{ template \"chart.deprecationWarning\" . }}\n\n{{ template \"chart.badgesSection\" . }}\n\n{{ template \"chart.description\" . }}\n\nFor installation please follow [the documentation](https://atlassian.github.io/data-center-helm-charts/).\n\n{{ template \"chart.homepageLine\" . }}\n\n{{ template \"chart.maintainersSection\" . }}\n\n{{ template \"chart.sourcesSection\" . }}\n\n{{ template \"chart.requirementsSection\" . }}\n\n{{ template \"chart.valuesSection\" . }}"
  },
  {
    "path": "src/main/charts/bamboo/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n# Ignore non-template files from symlinked common_templates\ntemplates/common_templates/*.md\n"
  },
  {
    "path": "src/main/charts/bamboo/Changelog.md",
    "content": "# Change Log\n\n## 2.0.13\n\n**Release date:** 2026-5-6\n\n![AppVersion: 12.1.6](https://img.shields.io/static/v1?label=AppVersion&message=12.1.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1114)\n\n## 2.0.12\n\n**Release date:** 2026-4-9\n\n![AppVersion: 12.1.3](https://img.shields.io/static/v1?label=AppVersion&message=12.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.11\n\n**Release date:** 2026-4-7\n\n![AppVersion: 12.1.3](https://img.shields.io/static/v1?label=AppVersion&message=12.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.10\n\n**Release date:** 2026-4-3\n\n![AppVersion: 12.1.3](https://img.shields.io/static/v1?label=AppVersion&message=12.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DEVPROD-3580: Add gateway api support (#1084)\n* Update appVersions for DC apps (#1100)\n\n## 2.0.9\n\n**Release date:** 2026-2-1\n\n![AppVersion: 12.1.1](https://img.shields.io/static/v1?label=AppVersion&message=12.1.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1074)\n\n## 2.0.8\n\n**Release date:** 2025-12-29\n\n![AppVersion: 12.1.0](https://img.shields.io/static/v1?label=AppVersion&message=12.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1071)\n* feat: Added scrape timeout configuration on servicemonitor (#1067)\n\n## 2.0.7\n\n**Release date:** 2025-11-7\n\n![AppVersion: 11.0.8](https://img.shields.io/static/v1?label=AppVersion&message=11.0.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1058)\n\n## 2.0.6\n\n**Release date:** 2025-11-3\n\n![AppVersion: 11.0.7](https://img.shields.io/static/v1?label=AppVersion&message=11.0.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1052)\n* fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\n\n## 2.0.5\n\n**Release date:** 2025-11-1\n\n![AppVersion: 11.0.5](https://img.shields.io/static/v1?label=AppVersion&message=11.0.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1049)\n\n## 2.0.4\n\n**Release date:** 2025-8-27\n\n![AppVersion: 11.0.4](https://img.shields.io/static/v1?label=AppVersion&message=11.0.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Update Bitnami image references due to deprecation notice (#1037)\n* Update appVersions for DC apps (#1029)\n\n## 2.0.3\n\n**Release date:** 2025-8-1\n\n![AppVersion: 11.0.3](https://img.shields.io/static/v1?label=AppVersion&message=11.0.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1022)\n\n## 2.0.2\n\n**Release date:** 2025-6-16\n\n![AppVersion: 11.0.2](https://img.shields.io/static/v1?label=AppVersion&message=11.0.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1014)\n\n## 2.0.1\n\n**Release date:** 2025-5-15\n\n![AppVersion: 11.0.1](https://img.shields.io/static/v1?label=AppVersion&message=11.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1005)\n\n## 2.0.0\n\n**Release date:** 2025-4-29\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.22.9\n\n**Release date:** 2025-4-22\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to declare additional ingress paths (#991)\n* Bring changelog in order (#990)\n\n## 1.22.8\n\n**Release date:** 2025-4-17\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\n\n## 1.22.7\n\n**Release date:** 2025-4-1\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#977)\n\n## 1.22.6\n\n**Release date:** 2025-3-19\n\n![AppVersion: 10.2.2](https://img.shields.io/static/v1?label=AppVersion&message=10.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#969)\n\n## 1.22.5\n\n**Release date:** 2025-2-18\n\n![AppVersion: 10.2.1](https://img.shields.io/static/v1?label=AppVersion&message=10.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add tunnel config for Jira, hostNamespaces in all charts (#958)\n* Allow setting subPath for local-home volumes (#947)\n\n## 1.22.4\n\n**Release date:** 2025-1-30\n\n![AppVersion: 10.2.0](https://img.shields.io/static/v1?label=AppVersion&message=10.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Round up fractional cpu values for ActiveProcessorsCount (#944)\n\n## 1.22.3\n\n**Release date:** 2025-1-13\n\n![AppVersion: 10.2.0](https://img.shields.io/static/v1?label=AppVersion&message=10.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set custom securityContext for import-certs init container. Make affinity independent for Synchrony (#938)\n\n## 1.22.2\n\n**Release date:** 2024-12-16\n\n![AppVersion: 10.1.1](https://img.shields.io/static/v1?label=AppVersion&message=10.1.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#933)\n* Make it possible to set nodePort in services (#931)\n* Make access log attributes configurable (#932)\n\n## 1.22.1\n\n**Release date:** 2024-12-3\n\n![AppVersion: 10.1.0](https://img.shields.io/static/v1?label=AppVersion&message=10.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#922)\n* Make make stuckthreaddetectionvalve configurable (#921)\n* Update Grafana dashboards for DC apps (#915)\n\n## 1.22.0\n\n**Release date:** 2024-11-15\n\n![AppVersion: 10.0.3](https://img.shields.io/static/v1?label=AppVersion&message=10.0.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#905)\n* Updated pod labels for all products (#901)\n* Fix shutdown with jmx javaagent enabled (#899)\n* Unset IDs for all the Grafana dashboards (#889)\n\n## 1.21.4\n\n**Release date:** 2024-10-1\n\n![AppVersion: 10.0.1](https://img.shields.io/static/v1?label=AppVersion&message=10.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#881)\n\n## 1.21.3\n\n**Release date:** 2024-9-10\n\n![AppVersion: 10.0.0](https://img.shields.io/static/v1?label=AppVersion&message=10.0.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update common dependency version (#878)\n\n## 1.21.2\n\n**Release date:** 2024-8-26\n\n![AppVersion: 10.0.0](https://img.shields.io/static/v1?label=AppVersion&message=10.0.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#869)\n\n## 1.21.1\n\n**Release date:** 2024-8-22\n\n![AppVersion: 9.6.5](https://img.shields.io/static/v1?label=AppVersion&message=9.6.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#865)\n\n## 1.21.0\n\n**Release date:** 2024-8-13\n\n![AppVersion: 9.6.4](https://img.shields.io/static/v1?label=AppVersion&message=9.6.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Added annotations to the StatefulSets (#857)\n* Update appVersions for DC apps (#858)\n* Make shared home pvc access mode configurable (#855)\n* Allow referencing multiple secrets in additionalCertificates (#852)\n* Make it possible to define resources for import-certs init container (#851)\n* Move update strategy to root level (#849)\n* Add helm value for custom jmx jar location when using other jmx init container images (#846)\n* feat: add appProtocol for service meshes (#847)\n* Make StatefulSet updateStrategy configurable (#845)\n* Fix default for acceptCount (#832)\n\n## 1.20.1\n\n**Release date:** 2024-7-7\n\n![AppVersion: 9.6.3](https://img.shields.io/static/v1?label=AppVersion&message=9.6.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to override proxy settings (#822)\n* Update appVersions for DC apps (#823)\n\n## 1.20.0\n\n**Release date:** 2024-5-13\n\n![AppVersion: 9.6.2](https://img.shields.io/static/v1?label=AppVersion&message=9.6.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#798)\n\n## 1.19.0\n\n**Release date:** 2024-4-22\n\n![AppVersion: 9.6.1](https://img.shields.io/static/v1?label=AppVersion&message=9.6.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make cacerts writable for user and group (#790)\n\n## 1.18.1\n\n**Release date:** 2024-3-26\n\n![AppVersion: 9.6.0](https://img.shields.io/static/v1?label=AppVersion&message=9.6.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Get rid of server repo references (#777)\n\n## 1.18.0\n\n**Release date:** 2024-2-27\n\n![AppVersion: 9.5.1](https://img.shields.io/static/v1?label=AppVersion&message=9.5.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Openshift analytics (#763)\n* Update appVersions for DC apps (#765)\n* OpenShift Support (#752)\n* Use testPods values for test images and container resources (#761)\n* Relabel instance name on jmx service monitor (#757)\n* Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\n\n## 1.17.2\n\n**Release date:** 2023-12-18\n\n![AppVersion: 9.4.2](https://img.shields.io/static/v1?label=AppVersion&message=9.4.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* StatefulSet PVC auto deletion (#736)\n* Update appVersions for DC apps (#738)\n* Add optional postStart hook (#735)\n\n## 1.17.1\n\n**Release date:** 2023-12-11\n\n![AppVersion: 9.4.1](https://img.shields.io/static/v1?label=AppVersion&message=9.4.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make liveness probe configurable (#732)\n\n## 1.17.0\n\n**Release date:** 2023-12-7\n\n![AppVersion: 9.4.1](https://img.shields.io/static/v1?label=AppVersion&message=9.4.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make test pod metadata and spec configurable (#727)\n* Optional analytics/support ConfigMap (#721)\n* Fix ingress annotations comment (#720)\n\n## 1.16.6\n\n**Release date:** 2023-10-30\n\n![AppVersion: 9.4.0](https://img.shields.io/static/v1?label=AppVersion&message=9.4.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* JMX container resources (#707)\n\n## 1.16.5\n\n**Release date:** 2023-10-24\n\n![AppVersion: 9.3.4](https://img.shields.io/static/v1?label=AppVersion&message=9.3.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix custom jmx config (#699)\n* Copy cacerts first, then import certs (#696)\n\n## 1.16.4\n\n**Release date:** 2023-10-11\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.3\n\n**Release date:** 2023-10-11\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.2\n\n**Release date:** 2023-10-8\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add quote to podAnnotation templating (#678)\n\n## 1.16.1\n\n**Release date:** 2023-9-20\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.0\n\n**Release date:** 2023-9-18\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make securityContext configurable for jmx exporter init container (#670)\n* Add user provided certificates to the default Java truststore (#663)\n\n## 1.15.3\n\n**Release date:** 2023-8-28\n\n![AppVersion: 9.3.2](https://img.shields.io/static/v1?label=AppVersion&message=9.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Decouple server and jmx annotations (#654)\n* Disable startup probes by default (#653)\n\n## 1.15.2\n\n**Release date:** 2023-8-22\n\n![AppVersion: 9.3.2](https://img.shields.io/static/v1?label=AppVersion&message=9.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add defaultMode to additionalConfigMaps (#647)\n\n## 1.15.1\n\n**Release date:** 2023-8-17\n\n![AppVersion: 9.3.2](https://img.shields.io/static/v1?label=AppVersion&message=9.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make startup probes optional (#646)\n\n## 1.15.0\n\n**Release date:** 2023-8-7\n\n![AppVersion: 9.3.1](https://img.shields.io/static/v1?label=AppVersion&message=9.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\n* Add annotations to Grafana dashboards ConfigMaps (#637)\n* Add additional ConfigMaps to Helm Charts (#635)\n\n## 1.14.1\n\n**Release date:** 2023-7-26\n\n![AppVersion: 9.3.1](https://img.shields.io/static/v1?label=AppVersion&message=9.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Disable liveness probes by default, make timeoutSeconds configurable (#630)\n\n## 1.14.0\n\n**Release date:** 2023-7-25\n\n![AppVersion: 9.3.1](https://img.shields.io/static/v1?label=AppVersion&message=9.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add liveness probes, make readinessProbes configurable (#626)\n* make sharedHome.permissionFix.command helper to be per-product (#622)\n\n## 1.13.1\n\n**Release date:** 2023-6-28\n\n![AppVersion: 9.3.0](https://img.shields.io/static/v1?label=AppVersion&message=9.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\n\n## 1.13.0\n\n**Release date:** 2023-6-13\n\n![AppVersion: 9.3.0](https://img.shields.io/static/v1?label=AppVersion&message=9.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#599)\n* Update Grafana dashboards for DC apps (#589)\n* Bamboo dashboard (#588)\n* Make sessionAffinity configurable in service spec (#582)\n* Add optional ServiceMonitors to DC Helm Charts (#573)\n* Enable JMS traffic via Service (#570)\n* Expose JMX beans on http endpoint (#562)\n\n## 1.12.0\n\n**Release date:** 2023-4-18\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add priorityClassName to pod spec (#557)\n* Add hostAliases for all DC products (#556)\n\n## 1.11.0\n\n**Release date:** 2023-3-22\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#531)\n\n## 1.10.0\n\n**Release date:** 2023-2-20\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Bitbucket Mesh to Bitbucket Helm chart (#501)\n\n## 1.9.1\n\n**Release date:** 2023-2-16\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifact hub annotation yaml\n\n## 1.9.0\n\n**Release date:** 2023-2-15\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n## 1.8.1\n\n**Release date:** 2022-12-12\n\n![AppVersion: 9.0.1](https://img.shields.io/static/v1?label=AppVersion&message=9.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifacthub.io annotations\n\n## 1.8.0\n\n**Release date:** 2022-12-9\n\n![AppVersion: 9.0.1](https://img.shields.io/static/v1?label=AppVersion&message=9.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* CLIP-1644: Stop supporting 1.19-1.20 k8s (#486)\n* Update appVersion to 9.0.1\n* Use `ingress.https` flag to enable tls in ingress (#487)\n\n## 1.7.1\n\n**Release date:** 2022-10-26\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Patch release to fix Artifacthub metadata\n\n## 1.7.0\n\n**Release date:** 2022-10-25\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Pin Python version to 3.9.14 (#468)\n* Update Bitbucket ingress testing values (#466)\n* Ingress Class Name is moved under spec field. (#451)\n* Make ATL_FORCE_CFG_UPDATE configurable in values.yaml (#454)\n* Add osquery related env vars for Terraform (#462)\n* AWS cleanup and log colletion from k8s (#461)\n\n## 1.6.0\n\n**Release date:** 2022-10-12\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Bamboo version to 9.0.0 (#455)\n* Improved documentation (#448, #440)\n\n\n## 1.5.0\n\n**Release date:** 2022-07-14\n\n![AppVersion: 8.2.4](https://img.shields.io/static/v1?label=AppVersion&message=8.2.4&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix: Use the custom ports for Bamboo service (#419)\n* Update Bamboo version to 8.2.4 (#430)\n\n## 1.4.0\n\n**Release date:** 2022-05-25\n\n![AppVersion: 8.2.3](https://img.shields.io/static/v1?label=AppVersion&message=8.2.3&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make pod securityContext optional (#389)\n* Support for configuring ingress proxy settings via values.yaml (#402)\n* Update Bamboo version to 8.2.3 (#412)\n\n## 1.3.0\n\n**Release date:** 2022-03-24\n\n![AppVersion: 8.1.3](https://img.shields.io/static/v1?label=AppVersion&message=8.1.3&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* TFKUBE-384: ATL_BASE_URL should be appropriately set when ingress.path is supplied (#391)\n* Update Bamboo version to 8.1.3 (#396)\n\n## 1.2.0\n\n**Release date:** 2022-02-14\n\n![AppVersion: 8.1.2-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.1.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DCD-1452: Updated appVersion to the latest product LTS version. (#378)\n* Added end-to-end test for Bamboo Helm chart using Terraform (#375)\n* Improvements on [documentation](https://github.com/atlassian/data-center-helm-charts/) (#370)\n* Updated Atlassian charts to use common definitions (#303)\n* Added service account annotation (#363)\n* Added new feature additionalVolumeClaimTemplates and provided example in documentation (#334, #368)\n\n\n## 1.0.0\n\n**Release date:** 2022-01-11\n\nThis is the first officially supported version of the Helm chart.\n\n![AppVersion: 8.1.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.1.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Support for defining podLabels (#366)\n* Support for defining loadBalancerIP (#365)\n* Support for defining podAnnotations (#341)\n\n## 0.0.2\n\n**Release date:** 2021-11-03\n\n![AppVersion: 8.1.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.1.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* BAMBK8S-194: Support for unattended setups (#359)\n* DCKUBE-738: Add topologySpreadConstraints to products (#351)\n* BAMBK8S-129: Bamboo pre-seeding configuration (#349)\n* BAMBK8S-86: Initial agent support (#335)\n* Add additionalPorts for the Bamboo StatefulSet (#353)\n\n## 0.0.1\n\nInitial release\n"
  },
  {
    "path": "src/main/charts/bamboo/Chart.yaml",
    "content": "apiVersion: v2\nname: bamboo\ndescription: A chart for installing Bamboo Data Center on Kubernetes\ntype: application\nversion: '2.0.13'\nappVersion: 12.1.7\nkubeVersion: \">=1.21.x-0\"\nkeywords:\n- Bamboo\n- Bamboo Server\n- Bamboo Data Center\n- Bamboo DC\n- Atlassian\nhome: https://www.atlassian.com/software/bamboo\nicon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\nsources:\n- https://github.com/atlassian/data-center-helm-charts\n- https://bitbucket.org/atlassian-docker/docker-bamboo-server\ndeprecated: false\nannotations:\n  artifacthub.io/containsSecurityUpdates: \"false\"\n  artifacthub.io/changes: |-\n    - \"Update appVersions for DC apps (#1114)\"\ndependencies:\n- name: common\n  version: 1.2.7\n  repository: https://atlassian.github.io/data-center-helm-charts\n"
  },
  {
    "path": "src/main/charts/bamboo/README.md",
    "content": "# bamboo\n\n![Version: 2.0.13](https://img.shields.io/badge/Version-2.0.13-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 12.1.7](https://img.shields.io/badge/AppVersion-12.1.7-informational?style=flat-square)\n\nA chart for installing Bamboo Data Center on Kubernetes\n\n**Homepage:** <https://www.atlassian.com/software/bamboo>\n\n## Source Code\n\n* <https://github.com/atlassian/data-center-helm-charts>\n* <https://bitbucket.org/atlassian-docker/docker-bamboo-server>\n\n## Requirements\n\nKubernetes: `>=1.21.x-0`\n\n| Repository | Name | Version |\n|------------|------|---------|\n| https://atlassian.github.io/data-center-helm-charts | common | 1.2.7 |\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| additionalConfigMaps | list | `[]` | Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix for a ConfigMap name, fileName is used as subPath  |\n| additionalContainers | list | `[]` | Additional container definitions that will be added to all Bamboo pods  |\n| additionalFiles | list | `[]` | Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into service container. Configuration details below (camelCase is important!): 'name'      - References existing ConfigMap or secret name. 'type'      - 'configMap' or 'secret' 'key'       - The file name. 'mountPath' - The destination directory in a container. VolumeMount and Volumes are added with this name and index position, for example; custom-config-0, keystore-2  |\n| additionalInitContainers | list | `[]` | Additional initContainer definitions that will be added to all Bamboo pods  |\n| additionalLabels | object | `{}` | Additional labels that should be applied to all resources  |\n| affinity | object | `{}` | Standard K8s affinities that will be applied to all Bamboo pods  |\n| atlassianAnalyticsAndSupport.analytics.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a JSON which DC products will read and send analytics events to Atlassian data pipelines  |\n| atlassianAnalyticsAndSupport.helmValues.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a YAML file which can be optionally including to support.zip  |\n| bamboo.accessLog.localHomeSubPath | string | `\"log\"` | The subdirectory within the local-home volume where access logs should be stored.  |\n| bamboo.accessLog.mountPath | string | `\"/opt/atlassian/bamboo/logs\"` | The path within the Bamboo container where the local-home volume should be mounted in order to capture access logs.  |\n| bamboo.additionalAnnotations | object | `{}` | Defines additional annotations to the Bamboo StateFulSet. This might be required when deploying using a GitOps approach |\n| bamboo.additionalBundledPlugins | list | `[]` | Specifies a list of additional Bamboo plugins that should be added to the Bamboo container. Note plugins installed via this method will appear as bundled plugins rather than user plugins. These should be specified in the same manner as the 'additionalLibraries' property. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  NOTE: only .jar files can be loaded using this approach. OBR's can be extracted (unzipped) to access the associated .jar  An alternative to this method is to install the plugins via \"Manage Apps\" in the product system administration UI.  |\n| bamboo.additionalCertificates | object | `{\"customCmd\":null,\"initContainer\":{\"resources\":{},\"securityContext\":{}},\"secretList\":[],\"secretName\":null}` | Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates  |\n| bamboo.additionalCertificates.customCmd | string | `nil` | Custom command to be executed in the init container to import certificates  |\n| bamboo.additionalCertificates.initContainer.resources | object | `{}` | Resources allocated to the import-certs init container  |\n| bamboo.additionalCertificates.initContainer.securityContext | object | `{}` | Custom SecurityContext for the import-certs init container  |\n| bamboo.additionalCertificates.secretList | list | `[]` | A list of secrets with their respective keys holding certificates to be added to the Java truststore. It is mandatory to specify which keys from secret data need to be mounted as files to the init container.  |\n| bamboo.additionalCertificates.secretName | string | `nil` | Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.  |\n| bamboo.additionalEnvironmentVariables | list | `[]` | Defines any additional environment variables to be passed to the Bamboo container. See https://hub.docker.com/r/atlassian/bamboo for supported variables.  |\n| bamboo.additionalJvmArgs | list | `[]` | Specifies a list of additional arguments that can be passed to the Bamboo JVM, e.g. system properties.  |\n| bamboo.additionalLibraries | list | `[]` | Specifies a list of additional Java libraries that should be added to the Bamboo container. Each item in the list should specify the name of the volume that contains the library, as well as the name of the library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which directory in the volume contains the library file. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  |\n| bamboo.additionalPorts | list | `[]` | Defines any additional ports for the Bamboo container.  |\n| bamboo.additionalVolumeClaimTemplates | list | `[]` | Defines additional volumeClaimTemplates that should be applied to the Bamboo pod. Note that this will not create any corresponding volume mounts; those needs to be defined in bamboo.additionalVolumeMounts  |\n| bamboo.additionalVolumeMounts | list | `[]` | Defines any additional volumes mounts for the Bamboo container. These can refer to existing volumes, or new volumes can be defined via 'volumes.additional'.  |\n| bamboo.brokerUrl | string | `nil` | Override the server/agent broker URL; this is optional.  |\n| bamboo.containerSecurityContext | object | `{}` | Standard K8s field that holds security configurations that will be applied to a container. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/  |\n| bamboo.disableAgentAuth | bool | `false` | Whether to disable agent authentication. Setting this to true skips the agent approval step in the UI. For more information see: https://confluence.atlassian.com/bamboo/agent-authentication-289277196.html  The default is false.  |\n| bamboo.forceConfigUpdate | bool | `false` | The Docker entrypoint.py generates application configuration on first start; not all of these files are regenerated on subsequent starts. By default, bamboo.cfg.xml is generated only once. Set `forceConfigUpdate` to true to change this behavior.  |\n| bamboo.import | object | `{\"path\":null,\"type\":\"clean\"}` | Bamboo can optionally import an existing exported dataset on first-run. These optional values can configure the import file or skip this stage entirely. For more details on importing and exporting see the documentation:  https://confluence.atlassian.com/bamboo/exporting-data-for-backup-289277255.html https://confluence.atlassian.com/bamboo/importing-data-from-backup-289277260.html  |\n| bamboo.import.path | string | `nil` | Path to the existing export to import to the new installation. This should be accessible by the cluster node; e.g. via the shared-home or `additionalVolumeMounts` below.  |\n| bamboo.import.type | string | `\"clean\"` | Import type. Valid values are `clean` (for a new install) or `import`, in which case you should provide the file path. The default is `clean`.  |\n| bamboo.jmsService.annotations | object | `{}` | Additional annotations to apply to the JMS Service  |\n| bamboo.jmsService.enabled | bool | `false` | Whether to create a separate Service for JMS Agent traffic  |\n| bamboo.jmsService.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| bamboo.jmsService.port | int | `54663` | The port on which the Bamboo K8s Service will listen for Agent traffic  |\n| bamboo.jmsService.type | string | `\"ClusterIP\"` | The type of K8s service to use for JMS  |\n| bamboo.license | object | `{\"secretKey\":\"license\",\"secretName\":null}` | The Bamboo DC license that should be used. If supplied here the license configuration will be skipped in the setup wizard.  |\n| bamboo.license.secretKey | string | `\"license\"` | The key (default 'licenseKey') in the Secret used to store the license information  |\n| bamboo.license.secretName | string | `nil` | The secret that contains the license information  |\n| bamboo.livenessProbe.customProbe | object | `{}` | Custom livenessProbe to override the default tcpSocket probe  |\n| bamboo.livenessProbe.enabled | bool | `false` | Whether to apply the livenessProbe check to pod.  |\n| bamboo.livenessProbe.failureThreshold | int | `12` | The number of consecutive failures of the Bamboo container liveness probe before the pod fails liveness checks.  |\n| bamboo.livenessProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| bamboo.livenessProbe.periodSeconds | int | `5` | How often (in seconds) the Bamboo container liveness probe will run  |\n| bamboo.livenessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| bamboo.ports.http | int | `8085` | The port on which the Bamboo container listens for HTTP traffic  |\n| bamboo.ports.jms | int | `54663` | JMS port  |\n| bamboo.postStart | object | `{\"command\":null}` | PostStart is executed immediately after a container is created. However, there is no guarantee that the hook will execute before the container ENTRYPOINT. See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks  |\n| bamboo.readinessProbe.customProbe | object | `{}` | Custom ReadinessProbe to override the default /status httpGet  |\n| bamboo.readinessProbe.enabled | bool | `true` | Whether to apply the readinessProbe check to pod.  |\n| bamboo.readinessProbe.failureThreshold | int | `30` | The number of consecutive failures of the Bamboo container readiness probe before the pod fails readiness checks.  |\n| bamboo.readinessProbe.initialDelaySeconds | int | `30` | The initial delay (in seconds) for the Bamboo container readiness probe, after which the probe will start running.  |\n| bamboo.readinessProbe.periodSeconds | int | `10` | How often (in seconds) the Bamboo container readiness probe will run  |\n| bamboo.readinessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| bamboo.resources.container.requests.cpu | string | `\"2\"` | Initial CPU request by Bamboo pod  |\n| bamboo.resources.container.requests.memory | string | `\"2G\"` | Initial Memory request by Bamboo pod  |\n| bamboo.resources.jvm.maxHeap | string | `\"1024m\"` | The maximum amount of heap memory that will be used by the Bamboo JVM  |\n| bamboo.resources.jvm.minHeap | string | `\"512m\"` | The minimum amount of heap memory that will be used by the Bamboo JVM  |\n| bamboo.securityContext.fsGroup | int | `2005` | The GID used by the Bamboo docker image GID will default to 2005 if not supplied and securityContextEnabled is set to true. This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Bamboo container. However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260  |\n| bamboo.securityContext.fsGroupChangePolicy | string | `\"OnRootMismatch\"` | fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod. This field only applies to volume types that support fsGroup controlled ownership and permissions. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods  |\n| bamboo.securityContextEnabled | bool | `true` | Whether to apply security context to pod.  |\n| bamboo.securityToken.secretKey | string | `\"security-token\"` | The key (default `secretKey`) in the Secret used to store the Bamboo shared key.  |\n| bamboo.securityToken.secretName | string | `nil` | The name of the K8s Secret that contains the security token. When specified the token will overrided the generated one. This secret should also be shared with the agent deployment. An Example of creating a K8s secret for the secret below: 'kubectl create secret generic <secret-name> --from-literal=security-token=<security token>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| bamboo.seraphConfig | object | `{\"autoLoginCookieAge\":\"1209600\",\"generateByHelm\":false}` | By default seraph-config.xml is generated in the container entrypoint from a template shipped with an official Bamboo image. However, seraph-config.xml generation may fail if container is not run as root, which is a common case if Bamboo is deployed to OpenShift.  |\n| bamboo.seraphConfig.generateByHelm | bool | `false` | Mount seraph-config.xml as a ConfigMap. Override configuration elements if necessary  |\n| bamboo.service.annotations | object | `{}` | Additional annotations to apply to the Service  |\n| bamboo.service.contextPath | string | `nil` | The Tomcat context path that Bamboo will use. The ATL_TOMCAT_CONTEXTPATH will be set automatically.  |\n| bamboo.service.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| bamboo.service.nodePort | string | `nil` | Only applicable if service.type is NodePort. NodePort for Bamboo service  |\n| bamboo.service.port | int | `80` | The port on which the Bamboo K8s Service will listen for http traffic  |\n| bamboo.service.sessionAffinity | string | `\"None\"` | Session affinity type. If you want to make sure that connections from a particular client are passed to the same pod each time, set sessionAffinity to ClientIP. See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity  |\n| bamboo.service.sessionAffinityConfig | object | `{\"clientIP\":{\"timeoutSeconds\":null}}` | Session affinity configuration  |\n| bamboo.service.sessionAffinityConfig.clientIP.timeoutSeconds | string | `nil` | Specifies the seconds of ClientIP type session sticky time. The value must be > 0 && <= 86400 (for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).  |\n| bamboo.service.type | string | `\"ClusterIP\"` | The type of K8s service to use for Bamboo  |\n| bamboo.setPermissions | bool | `true` | Boolean to define whether to set local home directory permissions on startup of Bamboo container. Set to 'false' to disable this behaviour.  |\n| bamboo.shutdown.command | string | `\"/shutdown-wait.sh\"` | By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/), using a script supplied by the Docker image. If any other shutdown behaviour is needed it can be achieved by overriding this value. Note that the shutdown command needs to wait for the application shutdown completely before exiting; see [the default command](https://bitbucket.org/atlassian-docker/docker-bamboo-server/src/master/shutdown-wait.sh) for details.  |\n| bamboo.shutdown.terminationGracePeriodSeconds | int | `30` | The termination grace period for pods during shutdown. This should be set to the internal grace period, plus a small buffer to allow the JVM to fully terminate.  |\n| bamboo.startupProbe.enabled | bool | `false` | Whether to apply the startupProbe check to pod.  |\n| bamboo.startupProbe.failureThreshold | int | `120` | The number of consecutive failures of the Bamboo container startup probe before the pod fails startup checks.  |\n| bamboo.startupProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| bamboo.startupProbe.periodSeconds | int | `5` | How often (in seconds) the Bamboo container startup probe will run  |\n| bamboo.sysadminCredentials | object | `{\"displayNameSecretKey\":\"displayName\",\"emailAddressSecretKey\":\"emailAddress\",\"passwordSecretKey\":\"password\",\"secretName\":null,\"usernameSecretKey\":\"username\"}` | The admin user configuration, and credentials that Bamboo should use. If supplied here the admin configuration will be skipped in the setup wizard.  |\n| bamboo.sysadminCredentials.displayNameSecretKey | string | `\"displayName\"` | The key in the Kubernetes Secret that contains the sysadmin display name  |\n| bamboo.sysadminCredentials.emailAddressSecretKey | string | `\"emailAddress\"` | The key in the Kubernetes Secret that contains the sysadmin email address  |\n| bamboo.sysadminCredentials.passwordSecretKey | string | `\"password\"` | The key in the Kubernetes Secret that contains the sysadmin password  |\n| bamboo.sysadminCredentials.secretName | string | `nil` | The secret that contains the admin user information  |\n| bamboo.sysadminCredentials.usernameSecretKey | string | `\"username\"` | The key in the Kubernetes Secret that contains the sysadmin username  |\n| bamboo.tomcatConfig | object | `{\"acceptCount\":\"100\",\"accessLogMaxDays\":\"-1\",\"address\":null,\"bambooEncryptionKey\":null,\"clientAuth\":null,\"compressibleMimeType\":null,\"compression\":null,\"compressionMinSize\":null,\"connectionTimeout\":\"20000\",\"customServerXml\":\"\",\"enableLookups\":\"false\",\"generateByHelm\":false,\"keyPass\":null,\"keystoreFile\":null,\"keystorePass\":null,\"maxHttpHeaderSize\":\"8192\",\"maxThreads\":\"100\",\"mgmtPort\":\"8005\",\"minSpareThreads\":\"10\",\"port\":\"8085\",\"protocol\":\"HTTP/1.1\",\"proxyInternalIps\":null,\"proxyName\":null,\"proxyPort\":null,\"redirectPort\":\"8443\",\"requestAttributesEnabled\":\"false\",\"scheme\":null,\"secret\":null,\"secretRequired\":null,\"secure\":null,\"sslCertificateFile\":null,\"sslCertificateKeyFile\":null,\"sslEnabled\":null,\"sslPass\":null,\"sslProtocol\":null,\"stuckThreadDetectionValveThreshold\":\"120\",\"trustedProxies\":null,\"truststoreFile\":null,\"truststorePass\":null}` | By default Tomcat's server.xml is generated in the container entrypoint from a template shipped with an official Bamboo image. However, server.xml generation may fail if container is not run as root, which is a common case if Bamboo is deployed to OpenShift. See: https://bitbucket.org/atlassian-docker/docker-bamboo-server/src/master/README.md for a complete list of xml elements. |\n| bamboo.tomcatConfig.customServerXml | string | `\"\"` | Custom server.xml to be mounted into /opt/atlassian/bamboo/conf  |\n| bamboo.tomcatConfig.generateByHelm | bool | `false` | Mount server.xml as a ConfigMap. Override configuration elements if necessary  |\n| bamboo.topologySpreadConstraints | list | `[]` | Defines topology spread constraints for Bamboo pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| bamboo.unattendedSetup | bool | `true` | To skip the setup wizard post deployment set this property to 'true' and ensure values for all 'REQUIRED' and 'UNATTENDED-SETUP' stanzas (see banner of this file) have been supplied.  For release 1.0.0 this value is by default set to 'true' and should not be changed.  |\n| bamboo.useHelmReleaseNameAsContainerName | bool | `false` | Whether the main container should acquire helm release name. By default the container name is `bamboo` which corresponds to the name of the Helm Chart.  |\n| database.credentials.passwordSecretKey | string | `\"password\"` | The key ('password') in the Secret used to store the database login password  |\n| database.credentials.secretName | string | `nil` | from-literal=password=<password>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| database.credentials.usernameSecretKey | string | `\"username\"` | The key ('username') in the Secret used to store the database login username  |\n| database.type | string | `nil` | The database type that should be used. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Valid values include: * 'postgresql' * 'mysql' * 'oracle12c' * 'mssql' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasetype  |\n| database.url | string | `nil` | The jdbc URL of the database. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Example URLs include: * 'jdbc:postgresql://<dbhost>:5432/<dbname>' * 'jdbc:mysql://<dbhost>/<dbname>' * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>' * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl  |\n| fluentd.command | string | `nil` | The command used to start Fluentd. If not supplied the default command will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"  Note: The custom command can be free-form, however pay particular attention to the process that should ultimately be left running in the container. This process should be invoked with 'exec' so that signals are appropriately propagated to it, for instance SIGTERM. An example of how such a command may look is: \"<command 1> && <command 2> && exec <primary command>\" |\n| fluentd.customConfigFile | bool | `false` | Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default) should be used for Fluentd. If enabled this config must supplied via the 'fluentdCustomConfig' property below.  |\n| fluentd.elasticsearch.enabled | bool | `true` | Set to 'true' if Fluentd should send all log events to an Elasticsearch service.  |\n| fluentd.elasticsearch.hostname | string | `\"elasticsearch\"` | The hostname of the Elasticsearch service that Fluentd should send logs to.  |\n| fluentd.elasticsearch.indexNamePrefix | string | `\"bamboo\"` | The prefix of the Elasticsearch index name that will be used  |\n| fluentd.enabled | bool | `false` | Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod  |\n| fluentd.extraVolumes | list | `[]` | Specify custom volumes to be added to Fluentd container (e.g. more log sources)  |\n| fluentd.fluentdCustomConfig | object | `{}` | Custom fluent.conf file  |\n| fluentd.httpPort | int | `9880` | The port on which the Fluentd sidecar will listen  |\n| fluentd.imageRepo | string | `\"fluent/fluentd-kubernetes-daemonset\"` | The Fluentd sidecar image repository  |\n| fluentd.imageTag | string | `\"v1.11.5-debian-elasticsearch7-1.2\"` | The Fluentd sidecar image tag  |\n| fluentd.resources | object | `{}` | Resources requests and limits for fluentd sidecar container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| gateway.additionalRules | list | `[]` | Advanced routing rules. Use this for complex routing scenarios like header-based routing, traffic splitting, or multiple backends. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule  |\n| gateway.annotations | object | `{}` | Annotations to add to the HTTPRoute resource.  |\n| gateway.create | bool | `false` | Set to 'true' if an HTTPRoute Resource should be created. This depends on a pre-provisioned Gateway API controller being available and a Gateway resource. Cannot be enabled if ingress.create is true.  |\n| gateway.filters | list | `[]` | HTTP filters to apply to requests. Can be used to add/remove headers, perform redirects, or rewrite URLs. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter  |\n| gateway.hostnames | list | `[]` | The hostnames that should be routed to Bamboo. At least one hostname is required when gateway.create is true. Setting hostnames activates gateway mode for product configuration even when gateway.create is false, allowing use with a pre-existing Gateway or external proxy. The first entry is used as the canonical hostname for base URL, proxy settings, and NOTES output — list the primary/public hostname first.  |\n| gateway.https | bool | `true` | Whether users access the application over HTTPS. This does not configure TLS on the Gateway or load balancer — it must match how traffic is actually routed to the application.  |\n| gateway.labels | object | `{}` | Labels to add to the HTTPRoute resource.  |\n| gateway.parentRefs | list | `[]` | Reference to the parent Gateway resource. Supports any standard parentRef fields (name, namespace, sectionName, etc.). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference  |\n| gateway.path | string | `nil` | The base path for routing. When empty, falls back to the product's service.contextPath (same behavior as ingress). Set explicitly to override, e.g. \"/bamboo\".  |\n| gateway.pathType | string | `\"PathPrefix\"` | Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\". PathPrefix is recommended for most use cases.  |\n| gateway.timeouts | object | `{\"backendRequest\":\"60s\",\"request\":\"60s\"}` | Timeout configuration for HTTPRoute rules. Note: when migrating from Ingress, these replace proxyReadTimeout and proxySendTimeout. There is no Gateway API equivalent for proxyConnectTimeout or maxBodySize — those require controller-specific policies (e.g. Envoy Gateway BackendTrafficPolicy). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts  |\n| hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| image.pullPolicy | string | `\"IfNotPresent\"` | Image pull policy  |\n| image.repository | string | `\"atlassian/bamboo\"` | The Bamboo Docker image to use https://hub.docker.com/r/atlassian/bamboo  |\n| image.tag | string | `\"\"` | The docker image tag to be used - defaults to the Chart appVersion  |\n| ingress.additionalPaths | list | `[]` | Additional paths to be added to the Ingress resource to point to different backend services  |\n| ingress.annotations | object | `{}` | The custom annotations that should be applied to the Ingress Resource. If using an ingress-nginx controller be sure that the annotations you add here are compatible with those already defined in the 'ingess.yaml' template  |\n| ingress.className | string | `\"nginx\"` | The class name used by the ingress controller if it's being used.  Please follow documenation of your ingress controller. If the cluster contains multiple ingress controllers, this setting allows you to control which of them is used for Atlassian application traffic.  |\n| ingress.create | bool | `false` | Set to 'true' if an Ingress Resource should be created. This depends on a pre-provisioned Ingress Controller being available.  |\n| ingress.host | string | `nil` | The fully-qualified hostname (FQDN) of the Bamboo instance. This value is used to configure the product's proxy settings and, when ingress.create is true, the Ingress resource routing rules.  |\n| ingress.https | bool | `true` | Whether users access the application over HTTPS. Set to 'false' if not using TLS, e.g. when reaching the service via localhost port-forwarding.  |\n| ingress.maxBodySize | string | `\"250m\"` | The max body size to allow. Requests exceeding this size will result in an HTTP 413 error being returned to the client.  |\n| ingress.nginx | bool | `true` | Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx' controller. https://kubernetes.github.io/ingress-nginx/  This will populate the Ingress Resource with annotations that are specific to the K8s ingress-nginx controller. Set to 'false' if a different controller is to be used, in which case the appropriate annotations for that controller must be specified below under 'ingress.annotations'.  |\n| ingress.openShiftRoute | bool | `false` | Set to true if you want to create an OpenShift Route instead of an Ingress  |\n| ingress.path | string | `nil` | The base path for the application, e.g. '/bamboo'. Defaults to 'bamboo.service.contextPath'.  |\n| ingress.proxyConnectTimeout | int | `60` | Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.  |\n| ingress.proxyReadTimeout | int | `60` | Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.  |\n| ingress.proxySendTimeout | int | `60` | Sets a timeout for transmitting a request to the proxied server. The timeout is set only between two successive write operations, not for the transmission of the whole request. If the proxied server does not receive anything within this time, the connection is closed.  |\n| ingress.routeHttpHeaders | object | `{}` | routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only  |\n| ingress.tlsSecretName | string | `nil` | The name of the K8s Secret that contains the TLS private key and corresponding certificate. When utilised, TLS termination occurs at the ingress point where traffic to the Service and it's Pods is in plaintext.  Usage is optional and depends on your use case. The Ingress Controller itself can also be configured with a TLS secret for all Ingress Resources. https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets https://kubernetes.io/docs/concepts/services-networking/ingress/#tls  |\n| monitoring.exposeJmxMetrics | bool | `false` | Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter  |\n| monitoring.fetchJmxExporterJar | bool | `true` | Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar to shared home and provide an absolute path in jmxExporterCustomJarLocation  |\n| monitoring.grafana.createDashboards | bool | `false` | Create ConfigMaps with Grafana dashboards  |\n| monitoring.grafana.dashboardAnnotations | object | `{}` | Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage  |\n| monitoring.grafana.dashboardLabels | object | `{}` | Label selector for Grafana dashboard importer sidecar  |\n| monitoring.jmxExporterCustomConfig | object | `{}` | Custom JMX config with the rules  |\n| monitoring.jmxExporterCustomJarLocation | string | `nil` | Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home  |\n| monitoring.jmxExporterImageRepo | string | `\"bitnamilegacy/jmx-exporter\"` | Image repository with jmx_exporter jar  |\n| monitoring.jmxExporterImageTag | string | `\"0.18.0\"` |  |\n| monitoring.jmxExporterInitContainer | object | `{\"customSecurityContext\":{},\"jmxJarLocation\":null,\"resources\":{},\"runAsRoot\":true}` | JMX exporter init container configuration  |\n| monitoring.jmxExporterInitContainer.customSecurityContext | object | `{}` | Custom SecurityContext for the jmx exporter init container  |\n| monitoring.jmxExporterInitContainer.jmxJarLocation | string | `nil` | The location of the JMX exporter jarfile in the JMX exporter image Leave blank for default bitnami image  |\n| monitoring.jmxExporterInitContainer.resources | object | `{}` | Resources requests and limits for the JMX exporter init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| monitoring.jmxExporterInitContainer.runAsRoot | bool | `true` | Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume. Set to false if running containers as root is not allowed in the cluster.  |\n| monitoring.jmxExporterPort | int | `9999` | Port number on which metrics will be available  |\n| monitoring.jmxExporterPortType | string | `\"ClusterIP\"` | JMX exporter port type  |\n| monitoring.jmxServiceAnnotations | object | `{}` | Annotations added to the jmx service  |\n| monitoring.serviceMonitor.create | bool | `false` | Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.  |\n| monitoring.serviceMonitor.prometheusLabelSelector | object | `{}` | ServiceMonitorSelector of the prometheus instance.  |\n| monitoring.serviceMonitor.scrapeIntervalSeconds | int | `30` | Scrape interval for the JMX service.  |\n| monitoring.serviceMonitor.scrapeTimeoutSeconds | int | `20` | How long until a scrape request times out. It cannot be greater than the scrape interval.  |\n| nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Bamboo pods  |\n| openshift.runWithRestrictedSCC | bool | `false` | When set to true, the containers will run with a restricted Security Context Constraint (SCC). See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server configuration files as ConfigMaps.  |\n| ordinals | object | `{\"enabled\":false,\"start\":0}` | Set a custom start ordinal number for the K8s stateful set. Note that this depends on the StatefulSetStartOrdinal K8s feature gate, which has entered beta state with K8s version 1.27.  |\n| ordinals.enabled | bool | `false` | Enable only if StatefulSetStartOrdinal K8s feature gate is available.  |\n| ordinals.start | int | `0` | Set start ordinal to a positive integer, defaulting to 0.  |\n| podAnnotations | object | `{}` | Custom annotations that will be applied to all Bamboo pods  |\n| podDisruptionBudget | object | `{\"annotations\":{},\"enabled\":false,\"labels\":{},\"maxUnavailable\":null,\"minAvailable\":null}` | PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.  |\n| podLabels | object | `{}` | Custom labels that will be applied to all Bamboo pods  |\n| priorityClassName | string | `nil` | Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster. For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| replicaCount | int | `1` | The initial number of Bamboo pods that should be started at deployment time. Note that Bamboo requires manual configuration via the browser post deployment after the first pod is deployed.  At present Bamboo Data Center utilizes an `active-passive` clustering model. This architecture is not ideal where K8s deployments are concerned. As such a Bamboo server cluster comprising only `1` pod is the recommended topology for now. For more detail see: https://atlassian.github.io/data-center-helm-charts/troubleshooting/LIMITATIONS#cluster-size  |\n| schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Bamboo pods. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| serviceAccount.annotations | object | `{}` | Annotations to add to the ServiceAccount (if created)  |\n| serviceAccount.create | bool | `true` | Set to 'true' if a ServiceAccount should be created, or 'false' if it already exists.  |\n| serviceAccount.imagePullSecrets | list | `[]` | For Docker images hosted in private registries, define the list of image pull secrets that should be utilized by the created ServiceAccount https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod  |\n| serviceAccount.name | string | `nil` | The name of the ServiceAccount to be used by the pods. If not specified, but the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name will be auto-generated, otherwise the 'default' ServiceAccount will be used. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server  |\n| testPods | object | `{\"affinity\":{},\"annotations\":{},\"image\":{\"permissionsTestContainer\":\"debian:stable-slim\",\"statusTestContainer\":\"alpine:latest\"},\"labels\":{},\"nodeSelector\":{},\"resources\":{},\"schedulerName\":null,\"tolerations\":[]}` | Metadata and pod spec for pods started in Helm tests  |\n| tolerations | list | `[]` | Standard K8s tolerations that will be applied to all Bamboo pods  |\n| updateStrategy | object | `{}` | StatefulSet update strategy. When unset defaults to Rolling update. See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets  |\n| volumes.additional | list | `[]` | Defines additional volumes that should be applied to all Bamboo pods. Note that this will not create any corresponding volume mounts; those needs to be defined in bamboo.additionalVolumeMounts  |\n| volumes.localHome.customVolume | object | `{}` | Static provisioning of local-home using K8s PVs and PVCs  NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for pods is not recommended. Dynamic provisioning described above is the prescribed approach.  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the local-home volume(s). If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static  |\n| volumes.localHome.mountPath | string | `\"/var/atlassian/application-data/bamboo\"` | Specifies the path in the Bamboo container to which the local-home volume will be mounted.  |\n| volumes.localHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically created for each pod based on the 'StorageClassName' supplied below.  |\n| volumes.localHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the local-home volume claims.  |\n| volumes.localHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the local-home volume claim.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted | string | `nil` | Configures the volume retention behavior that applies when the StatefulSet is deleted.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled | string | `nil` | Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.  |\n| volumes.localHome.subPath | string | `nil` | Specifies the sub-directory of the local-home volume that will be mounted in to the Bamboo container.  |\n| volumes.sharedHome.customVolume | object | `{}` | Static provisioning of shared-home using K8s PVs and PVCs  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the shared-home volume. If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/  |\n| volumes.sharedHome.mountPath | string | `\"/var/atlassian/application-data/shared-home\"` | Specifies the path in the Bamboo container to which the shared-home volume will be mounted.  |\n| volumes.sharedHome.nfsPermissionFixer.command | string | `nil` | By default, the fixer will change the group ownership of the volume's root directory to match the Bamboo container's GID (2001), and then ensures the directory is group-writeable. If this is not the desired behaviour, command used can be specified here.  |\n| volumes.sharedHome.nfsPermissionFixer.enabled | bool | `true` | If 'true', this will alter the shared-home volume's root directory so that Bamboo can write to it. This is a workaround for a K8s bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260  |\n| volumes.sharedHome.nfsPermissionFixer.imageRepo | string | `\"alpine\"` | Image repository for the permission fixer init container. Defaults to alpine  |\n| volumes.sharedHome.nfsPermissionFixer.imageTag | string | `\"latest\"` | Image tag for the permission fixer init container. Defaults to latest  |\n| volumes.sharedHome.nfsPermissionFixer.mountPath | string | `\"/shared-home\"` | The path in the K8s initContainer where the shared-home volume will be mounted  |\n| volumes.sharedHome.nfsPermissionFixer.resources | object | `{}` | Resources requests and limits for nfsPermissionFixer init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| volumes.sharedHome.persistentVolumeClaim.accessModes | list | `[\"ReadWriteMany\"]` | Specify the access modes that should be used for the 'shared-home' volume claim. Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations. Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes  |\n| volumes.sharedHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically created for shared-home based on the 'StorageClassName' supplied below.  |\n| volumes.sharedHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the shared-home volume claims.  |\n| volumes.sharedHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the 'shared-home' volume claim.  |\n| volumes.sharedHome.subPath | string | `nil` | Specifies the sub-directory of the shared-home volume that will be mounted in to the Bamboo container.  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/main/charts/bamboo/grafana-dashboards/overview.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"DOWN\"\n                }\n              },\n              \"type\": \"special\"\n            },\n            {\n              \"options\": {\n                \"from\": 1,\n                \"result\": {\n                  \"index\": 1,\n                  \"text\": \"UP\"\n                },\n                \"to\": 9999999\n              },\n              \"type\": \"range\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 1\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 22,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Pid{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Status\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 21,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Uptime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}/1000\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"dateTimeAsIso\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 23,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_StartTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Start time\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 0\n      },\n      \"id\": 24,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_OperatingSystem_AvailableProcessors{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Available CPU Cores\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 19,\n        \"w\": 5,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 18,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"jvm_threads_state{namespace=\\\"$namespace\\\", service=\\\"$service\\\", state=\\\"BLOCKED\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ state }} ({{ pod }})\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Blocked Threads\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 8,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 0\n      },\n      \"id\": 33,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"60s\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 40\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(java_lang_OperatingSystem_ProcessCpuLoad{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} * 100)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"cpu load ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"CPU\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 7\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"100*(jvm_memory_bytes_used{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"}/jvm_memory_bytes_max{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Used {{ area }} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Heap Used %\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 7\n      },\n      \"id\": 34,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 32,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"\\\"http-nio-8085\\\" count (10.0.3.117:9999)\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 25,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_errorCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} error ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Tomcat Request Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 80\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 20\n      },\n      \"id\": 19,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(Catalina_ThreadPool_currentThreadCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} / Catalina_ThreadPool_maxThreads{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}) * 100\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"used {{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 90,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Tomcat Threads\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 20\n      },\n      \"id\": 26,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_processingTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m]) / increase(Catalina_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat Request Processing Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 20\n      },\n      \"id\": 27,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"8.2.5\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"Catalina_Manager_activeSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"active on {{context}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"Catalina_Manager_rejectedSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"rejected on {{context}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Tomcat Sessions\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 30,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Database\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 40,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_2_ActiveConnections\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_2_TotalConnections\",\n          \"hide\": false,\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Total and Active connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 32\n      },\n      \"id\": 42,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_2_ThreadsAwaitingConnection\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Threads awaiting connection\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 32\n      },\n      \"id\": 44,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_2_IdleConnections\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Idle connections\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bamboo\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"java_lang_Memory_HeapMemoryUsage_committed{product=\\\"bamboo\\\"}\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"java_lang_Memory_HeapMemoryUsage_committed{product=\\\"bamboo\\\"}\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"java_lang_Memory_HeapMemoryUsage_committed{product=\\\"bamboo\\\"}\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"java_lang_Memory_HeapMemoryUsage_committed{product=\\\"bamboo\\\"}\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bamboo Overview\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bamboo/templates/NOTES.txt",
    "content": "Thank you for installing {{ title .Chart.Name }}.\n\nYour release is named {{ .Release.Name }}, and resides in namespace {{ .Release.Namespace }}.\n\nPlease run sanity tests against the release to verify it's healthy:\n\n  $ helm test {{ .Release.Name }} -n {{ .Release.Namespace }}\n\nIf the Kubernetes resources in the release are still starting up, then the tests may fail, so it\nis advisable to wait for the tests to pass before continuing.\n\nTo see the custom values you used for this release:\n\n  $ helm get values {{ .Release.Name }} -n {{ .Release.Namespace }}\n\n{{ if eq (include \"common.gateway.isConfigured\" .) \"true\" -}}\n{{ title .Chart.Name }} service URL: {{ include \"bamboo.baseUrl\" . }}\n{{- else }}\nGet the {{ title .Chart.Name }} URL by running these commands in the same shell:\n{{- if contains \"NodePort\" .Values.bamboo.service.type }}\n  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ .Release.Name }})\n  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n  echo http://$NODE_IP:$NODE_PORT\n{{- else if contains \"LoadBalancer\" .Values.bamboo.service.type }}\n  NOTE: It may take a few minutes for the LoadBalancer hostname to be available.\n        You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ .Release.Name }}'\n\n  export SERVICE_HOSTNAME=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ .Release.Name }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n  echo http://$SERVICE_HOSTNAME:{{ .Values.bamboo.service.port }}\n{{- else if contains \"ClusterIP\" .Values.bamboo.service.type }}\n  Step 1: Get the pod name\n    $ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"app.kubernetes.io/instance={{ .Release.Name }}\" -o jsonpath=\"{.items[0].metadata.name}\")\n  Step 2 (Optional): Check if the pod name has been exported successfully and the pod status\n    $ echo POD_NAME: $POD_NAME && echo POD_STATUS: $(kubectl get pod $POD_NAME -o jsonpath='{.status.phase}')\n  Step 3: Wait for pods up and running, then forward pod port to localhost\n    $ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME {{ .Values.bamboo.ports.http }}\n  Step 4: Access {{ title .Chart.Name }} on localhost:\n    http://localhost:{{ .Values.bamboo.ports.http }}\n{{- end }}\n{{- end }}\n{{- if not ( or .Values.volumes.localHome.persistentVolumeClaim.create .Values.volumes.localHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Local Home!!!        #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{- if not ( or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Shared Home!!!       #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n\nFor further documentation, see https://atlassian.github.io/data-center-helm-charts/"
  },
  {
    "path": "src/main/charts/bamboo/templates/_fluentd_templates.tpl",
    "content": "{{- define \"fluentd.container\" -}}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd\n  image: {{ .Values.fluentd.imageRepo }}:{{ .Values.fluentd.imageTag }}\n  command: [\"sh\", \"-c\", {{ include \"fluentd.start.command\" . | quote }}]\n{{- if .Values.fluentd.resources }}\n  resources:\n  {{- with .Values.fluentd.resources }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- end }}\n  volumeMounts:\n    - name: local-home\n      mountPath: /application-data/logs\n      subPath: logs\n      readOnly: true\n    - name: fluentd-config\n      mountPath: /fluentd/etc\n      readOnly: true\n{{- if .Values.fluentd.extraVolumes }}\n  {{ toYaml .Values.fluentd.extraVolumes | nindent 4}}\n{{- end }}\n  env:\n    - name: POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: POD_NAMESPACE\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.namespace\n    - name: POD_IP\n      valueFrom:\n        fieldRef:\n          fieldPath: status.podIP\n    - name: HELM_RELEASE_NAME\n      value: {{ include \"common.names.fullname\" . }}\n{{ end }}\n{{ end }}\n\n{{- define \"fluentd.config.volume\" }}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd-config\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-fluentd-config\n{{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n\n{{/* Define a sanitized list of additionalEnvironmentVariables */}}\n{{- define \"bamboo.sanitizedAdditionalEnvVars\" -}}\n{{- range .Values.bamboo.additionalEnvironmentVariables }}\n- name: {{ .name }}\n  value: {{ if regexMatch \"(?i)(secret|token|password)\" .name }}\"Sanitized by Support Utility\"{{ else}}{{ .value }}{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define a sanitized list of additionalJvmArgs */}}\n{{- define \"bamboo.sanitizedAdditionalJvmArgs\" -}}\n{{- range .Values.bamboo.additionalJvmArgs }}\n {{- $jvmArgs := regexSplit \"=\" . -1 }}\n   {{- if regexMatch \"(?i)(secret|token|password).*$\" (first $jvmArgs) }}\n-  {{ first $jvmArgs }}=Sanitized by Support Utility{{ else}}\n-  {{ . }}\n{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define sanitized Helm values */}}\n{{- define \"bamboo.sanitizedValues\" -}}\n{{- $sanitizedAdditionalEnvs := dict .Chart.Name (dict \"additionalEnvironmentVariables\" (include \"bamboo.sanitizedAdditionalEnvVars\" .)) }}\n{{- $sanitizedAdditionalJvmArgs := dict .Chart.Name (dict \"additionalJvmArgs\" (include \"bamboo.sanitizedAdditionalJvmArgs\" .)) }}\n{{- $mergedValues := merge $sanitizedAdditionalEnvs $sanitizedAdditionalJvmArgs .Values }}\n{{- toYaml $mergedValues | replace \" |2-\" \"\" | replace \" |-\" \"\" |  replace \"|2\" \"\" | nindent 4 }}\n{{- end }}\n\n{{- define \"bamboo.analyticsJson\" }}\n{\n  \"imageTag\": {{ if or (eq .Values.image.tag \"\") (eq .Values.image.tag nil) }}{{ .Chart.AppVersion | quote }}{{ else }}{{ regexSplit \"-\" .Values.image.tag -1 | first |  quote }}{{ end }},\n  \"replicas\": {{ .Values.replicaCount }},\n  \"isJmxEnabled\": {{ .Values.monitoring.exposeJmxMetrics }},\n  \"ingressType\": {{ if not .Values.ingress.create }}\"NONE\"{{ else }}{{ if .Values.ingress.nginx }}\"NGINX\"{{ else }}\"OTHER\"{{ end }}{{ end }},\n{{- $sanitizedMinorVersion := regexReplaceAll \"[^0-9]\" .Capabilities.KubeVersion.Minor \"\" }}\n  \"k8sVersion\": \"{{ .Capabilities.KubeVersion.Major }}.{{ $sanitizedMinorVersion }}\",\n  \"serviceType\": {{ if regexMatch \"^(ClusterIP|NodePort|LoadBalancer|ExternalName)$\" .Values.bamboo.service.type }}{{ snakecase .Values.bamboo.service.type | upper | quote }}{{ else }}\"UNKNOWN\"{{ end }},\n{{- if eq .Values.database.type nil }}\n  \"dbType\": \"UNKNOWN\",\n{{- else }}\n{{- $databaseTypeMap := dict \"postgres\" \"POSTGRES\" \"mssql\" \"MSSQL\" \"sqlserver\" \"SQLSERVER\" \"oracle\" \"ORACLE\" \"mysql\" \"MYSQL\" }}\n{{- $dbTypeInValues := .Values.database.type }}\n{{- $dbType := \"UNKNOWN\" | quote }}\n{{- range $key, $value := $databaseTypeMap }}\n{{- if regexMatch (printf \"(?i)%s\" $key) $dbTypeInValues }}\n  {{- $dbType = $value | quote }}\n{{- end }}\n{{- end }}\n  \"dbType\": {{ $dbType }},\n{{- end }}\n  \"isSharedHomePVCCreated\": {{ .Values.volumes.sharedHome.persistentVolumeClaim.create }},\n  \"isServiceMonitorCreated\": {{ .Values.monitoring.serviceMonitor.create }},\n  \"isGrafanaDashboardsCreated\": {{ .Values.monitoring.grafana.createDashboards }},\n  \"isRunOnOpenshift\": {{ .Capabilities.APIVersions.Has \"route.openshift.io/v1/Route\" }},\n  \"isRunWithRestrictedSCC\": {{ .Values.openshift.runWithRestrictedSCC }},\n  \"isOpenshiftRouteCreated\": {{ .Values.ingress.openShiftRoute}}\n}\n{{- end }}\n\n{{/*\nDeduce the base URL for bamboo.\n*/}}\n{{- define \"bamboo.baseUrl\" -}}\n{{- if eq (include \"common.gateway.isConfigured\" .) \"true\" -}}\n{{- include \"common.gateway.origin\" . -}}{{ include \"bamboo.path\" . -}}\n{{- else -}}\n{{- print \"http://localhost:8085/\" -}}\n{{- end -}}\n{{- end }}\n\n{{/*\nCreate default value for the service path.\n*/}}\n{{- define \"bamboo.path\" -}}\n{{- include \"common.gateway.path\" (dict\n  \"useGatewayMode\" (include \"common.gateway.useGatewayMode\" .)\n  \"gatewayPath\"   .Values.gateway.path\n  \"ingressPath\"   .Values.ingress.path\n  \"contextPath\"   .Values.bamboo.service.contextPath\n) -}}\n{{- end }}\n\n{{/*\nAlias for backward compatibility with ingress templates.\n*/}}\n{{- define \"bamboo.ingressPath\" -}}\n{{- include \"bamboo.path\" . -}}\n{{- end }}\n\n{{/*\nThe name of the service account to be used.\nIf the name is defined in the chart values, then use that,\nelse if we're creating a new service account then use the name of the Helm release,\nelse just use the \"default\" service account.\n*/}}\n{{- define \"bamboo.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.name -}}\n{{- .Values.serviceAccount.name -}}\n{{- else -}}\n{{- if .Values.serviceAccount.create -}}\n{{- include \"common.names.fullname\" . -}}\n{{- else -}}\ndefault\n{{- end -}}\n{{- end -}}\n{{- end }}\n\n{{/*\nPod labels\n*/}}\n{{- define \"bamboo.podLabels\" -}}\n{{ with .Values.podLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe command that should be run by the nfs-fixer init container to correct the permissions of the shared-home root directory.\n*/}}\n{{- define \"bamboo.sharedHome.permissionFix.command\" -}}\n{{- $securityContext := .Values.bamboo.securityContext }}\n{{- with .Values.volumes.sharedHome.nfsPermissionFixer }}\n    {{- if .command }}\n        {{ .command }}\n    {{- else }}\n        {{- $gid := default $securityContext.fsGroup 2005 }}\n        {{- printf \"(chgrp %v %s; chmod g+w %s)\" $gid .mountPath .mountPath }}\n    {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe command that should be run to start the fluentd service\n*/}}\n{{- define \"fluentd.start.command\" -}}\n{{- if .Values.fluentd.command }}\n{{ .Values.fluentd.command }}\n{{- else }}\n{{- print \"exec fluentd -c /fluentd/etc/fluent.conf -v\" }}\n{{- end }}\n{{- end }}\n\n{{- define \"bamboo.image\" -}}\n{{- if .Values.image.registry -}}\n{{ .Values.image.registry}}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- else -}}\n{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefines the volume mounts used by the Bamboo container.\nNote that the local-home volume is mounted twice, once for the local-home directory itself, and again\non Tomcat's logs directory. THis ensures that Tomcat+Bamboo logs get captured in the same volume.\n*/}}\n{{ define \"bamboo.volumeMounts\" }}\n- name: local-home\n  mountPath: {{ .Values.volumes.localHome.mountPath | quote }}\n  {{- if .Values.volumes.localHome.subPath }}\n  subPath: {{ .Values.volumes.localHome.subPath | quote }}\n  {{- end }}\n- name: local-home\n  mountPath: {{ .Values.bamboo.accessLog.mountPath | quote }}\n  subPath: {{ .Values.bamboo.accessLog.localHomeSubPath | quote }}\n- name: shared-home\n  mountPath: {{ .Values.volumes.sharedHome.mountPath | quote }}\n  {{- if .Values.volumes.sharedHome.subPath }}\n  subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n  {{- end }}\n{{- if or .Values.bamboo.additionalCertificates.secretName .Values.bamboo.additionalCertificates.secretList }}\n- name: keystore\n  mountPath: /var/ssl\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  mountPath: /opt/atlassian/helm\n{{- end }}\n{{- if or .Values.bamboo.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  mountPath: /opt/atlassian/bamboo/conf/server.xml\n  subPath: server.xml\n- name: init-properties\n  mountPath: /opt/atlassian/bamboo/atlassian-bamboo/WEB-INF/classes/bamboo-init.properties\n  subPath: bamboo-init.properties\n{{- end }}\n{{- if or .Values.bamboo.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: seraph-config-xml\n  mountPath: /opt/atlassian/bamboo/atlassian-bamboo/WEB-INF/classes/seraph-config.xml\n  subPath: seraph-config.xml\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bamboo.podAnnotations\" -}}\n{{- range $key, $value := .Values.podAnnotations }}\n{{ $key }}: {{ tpl $value $ | quote }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional init containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bamboo.additionalInitContainers\" -}}\n{{- with .Values.additionalInitContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bamboo.additionalContainers\" -}}\n{{- with .Values.additionalContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional ports here instead of in values.yaml to allow template overrides\n*/}}\n{{- define \"bamboo.additionalPorts\" -}}\n{{- with .Values.bamboo.additionalPorts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional volume mounts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bamboo.additionalVolumeMounts\" -}}\n{{- with .Values.bamboo.additionalVolumeMounts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bamboo.additionalEnvironmentVariables\" -}}\n{{- with .Values.bamboo.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional library declared, generate a volume mount that injects that library into the Bamboo lib directory\n*/}}\n{{- define \"bamboo.additionalLibraries\" -}}\n{{- range .Values.bamboo.additionalLibraries }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/bamboo/lib/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional plugin declared, generate a volume mount that injects that library into the Bamboo plugins directory\n*/}}\n{{- define \"bamboo.additionalBundledPlugins\" -}}\n{{- range .Values.bamboo.additionalBundledPlugins }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/bamboo/atlassian-bamboo/WEB-INF/atlassian-bundled-plugins/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bamboo.volumes\" -}}\n{{ if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n{{ include \"bamboo.volumes.localHome\" . }}\n{{- end }}\n{{ include \"bamboo.volumes.sharedHome\" . }}\n{{- with .Values.volumes.additional }}\n{{- toYaml . | nindent 0 }}\n{{- end }}\n{{- if or .Values.bamboo.additionalCertificates.secretName .Values.bamboo.additionalCertificates.secretList }}\n- name: keystore\n  emptyDir: {}\n{{- if .Values.bamboo.additionalCertificates.secretName }}\n- name: certs\n  secret:\n    secretName: {{ .Values.bamboo.additionalCertificates.secretName }}\n{{- else }}\n{{- range .Values.bamboo.additionalCertificates.secretList }}\n- name: {{ .name }}\n  secret:\n    secretName: {{ .name }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-helm-values\n{{- end }}\n{{- if or .Values.bamboo.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-server-config\n    items:\n      - key: server.xml\n        path: server.xml\n- name: init-properties\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-init-properties\n    items:\n      - key: bamboo-init.properties\n        path: bamboo-init.properties\n{{- end }}\n{{- if or .Values.bamboo.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: seraph-config-xml\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-server-config\n    items:\n      - key: seraph-config.xml\n        path: seraph-config.xml\n{{- end }}\n{{- end }}\n\n{{- define \"bamboo.volumes.localHome\" -}}\n{{- if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n- name: local-home\n{{ if .Values.volumes.localHome.customVolume }}\n{{- toYaml .Values.volumes.localHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bamboo.volumes.sharedHome\" -}}\n- name: shared-home\n{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\n  persistentVolumeClaim:\n    claimName: {{ include \"common.names.fullname\" . }}-shared-home\n{{ else }}\n{{ if .Values.volumes.sharedHome.customVolume }}\n{{- toYaml .Values.volumes.sharedHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bamboo.volumeClaimTemplates\" -}}\n{{- if or .Values.volumes.localHome.persistentVolumeClaim.create .Values.bamboo.additionalVolumeClaimTemplates }}\n{{- if and .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled }}\npersistentVolumeClaimRetentionPolicy:\n    whenDeleted: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted}}\n    whenScaled: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled}}\n{{- end}}\nvolumeClaimTemplates:\n{{- if .Values.volumes.localHome.persistentVolumeClaim.create }}\n- apiVersion: v1\n  kind: PersistentVolumeClaim\n  metadata:\n    name: local-home\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .Values.volumes.localHome.persistentVolumeClaim.storageClassName }}\n    storageClassName: {{ .Values.volumes.localHome.persistentVolumeClaim.storageClassName | quote }}\n    {{- end }}\n    {{- with .Values.volumes.localHome.persistentVolumeClaim.resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- range .Values.bamboo.additionalVolumeClaimTemplates }}\n- metadata:\n    name: {{ .name }}\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .storageClassName }}\n    storageClassName: {{ .storageClassName | quote }}\n    {{- end }}\n    {{- with .resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bamboo.databaseEnvVars\" -}}\n{{- if .Values.bamboo.forceConfigUpdate }}\n- name: ATL_FORCE_CFG_UPDATE\n  value: \"true\"\n{{- end }}\n{{ with .Values.database.type }}\n- name: ATL_DB_TYPE\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.url }}\n- name: ATL_JDBC_URL\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.credentials.secretName }}\n- name: ATL_JDBC_USER\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.usernameSecretKey }}\n- name: ATL_JDBC_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.passwordSecretKey }}\n{{ end }}\n{{ end }}\n\n{{- define \"flooredCPU\" -}}\n    {{- if hasSuffix \"m\" (. | toString) }}\n    {{- div (trimSuffix \"m\" .) 1000 | default 1 }}\n    {{- else }}\n    {{- . }}\n    {{- end }}\n{{- end}}\n\n{{/*\nDefine additional hosts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bamboo.additionalHosts\" -}}\n{{- with .Values.additionalHosts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{- define \"bamboo.addCrtToKeystoreCmd\" }}\n{{- if .Values.bamboo.additionalCertificates.customCmd}}\n{{ .Values.bamboo.additionalCertificates.customCmd}}\n{{- else }}\nset -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \"Adding $crt to keystore\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\n{{- end }}\n{{- end }}\n\n\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/config-jvm.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jvm-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  additional_jvm_args: >-\n    {{- range .Values.bamboo.additionalJvmArgs }}\n    {{ . }}\n    {{- end }}\n    -XX:ActiveProcessorCount={{ max 1 (include \"flooredCPU\" .Values.bamboo.resources.container.requests.cpu | float64  | int) }}\n    {{- if or .Values.bamboo.additionalCertificates.secretName .Values.bamboo.additionalCertificates.secretList }}\n    -Djavax.net.ssl.trustStore=/var/ssl/cacerts\n    {{- end }}\n  max_heap: {{ .Values.bamboo.resources.jvm.maxHeap }}\n  min_heap: {{ .Values.bamboo.resources.jvm.minHeap }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/configmap-additional-config.yaml",
    "content": "{{- range $i, $key := .Values.additionalConfigMaps -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-{{ $key.name }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- range $key.keys }}\n  {{ .fileName -}}: |\n{{  .content | trim | indent 4 }}\n{{- end }}\n---\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/configmap-fluentd.yaml",
    "content": "{{ if .Values.fluentd.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-fluentd-config\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{ if .Values.fluentd.customConfigFile }}\n{{- range $key, $value := .Values.fluentd.fluentdCustomConfig }}\n  {{ $key }}: |\n{{ $value | indent 4 }}\n  {{- end }}\n  {{ else }}\n  fluent.conf: |\n    <source>\n      @type tail\n      path /application-data/logs/atlassian-bamboo.log*\n      read_from_head true\n      tag bamboo.log\n      <parse>\n        @type regexp\n        expression /^(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}) (?<message>.*)$/\n      </parse>\n    </source>\n\n    <filter **>\n      @type record_transformer\n      <record>\n        podname \"#{ENV['POD_NAME']}\"\n        podnamespace \"#{ENV['POD_NAMESPACE']}\"\n        podip \"#{ENV['POD_IP']}\"\n        helmrelease \"#{ENV['HELM_RELEASE_NAME']}\"\n      </record>\n    </filter>\n\n    <filter **>\n      @type stdout\n    </filter>\n\n    <match **>\n      @type elasticsearch\n      host {{ .Values.fluentd.elasticsearch.hostname }}\n      logstash_format true\n      logstash_prefix {{ .Values.fluentd.elasticsearch.indexNamePrefix }}\n    </match>\n    {{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/configmap-init-properties.yaml",
    "content": "{{ if or .Values.bamboo.tomcatConfig.generateByHelm .Values.bamboo.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-init-properties\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  bamboo-init.properties: |\n      bamboo.home = {{ .Values.volumes.localHome.mountPath }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/configmap-jmx-config.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{- if .Values.monitoring.jmxExporterCustomConfig }}\n  jmx-config.yaml: |\n  {{- with .Values.monitoring.jmxExporterCustomConfig }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- else }}\n  jmx-config.yaml: |\n    rules:\n      - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n        name: java_lang_$2_$3\n        labels:\n          product: \"bamboo\"\n      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n        name: java_lang_Memory_HeapMemoryUsage_$1\n        labels:\n          product: \"bamboo\"\n      - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n        name: java_lang_G1_$1_Generation_$2\n        labels:\n          product: \"bamboo\"\n      - pattern: '.*'\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/configmap-server-config.yaml",
    "content": "{{ if or .Values.bamboo.tomcatConfig.generateByHelm .Values.bamboo.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-server-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if or .Values.bamboo.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n  server.xml: |\n{{- if .Values.bamboo.tomcatConfig.customServerXml }}\n{{- .Values.bamboo.tomcatConfig.customServerXml | nindent 6 }}\n{{- else }}\n    <?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <Server port=\"{{ .Values.bamboo.tomcatConfig.mgmtPort | default \"8005\" }}\"\n            shutdown=\"SHUTDOWN\">\n\n      <Listener className=\"org.apache.catalina.startup.VersionLoggerListener\"/>\n      <Listener className=\"org.apache.catalina.core.AprLifecycleListener\"\n                SSLEngine=\"on\"/>\n      <Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\"/>\n      <Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\"/>\n      <Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\"/>\n\n      <Service name=\"Catalina\">\n\n        <Connector port=\"{{ .Values.bamboo.tomcatConfig.port | default \"8080\" }}\"\n                   maxThreads=\"{{ .Values.bamboo.tomcatConfig.maxThreads | default \"100\" }}\"\n                   minSpareThreads=\"{{ .Values.bamboo.tomcatConfig.minSpareThreads | default \"10\" }}\"\n                   connectionTimeout=\"{{ .Values.bamboo.tomcatConfig.connectionTimeout | default \"20000\" }}\"\n                   enableLookups=\"{{ .Values.bamboo.tomcatConfig.enableLookups | default \"false\" }}\"\n                   protocol=\"{{ .Values.bamboo.tomcatConfig.protocol | default \"HTTP/1.1\" }}\"\n                   redirectPort=\"{{ .Values.bamboo.tomcatConfig.redirectPort | default \"8443\" }}\"\n                   acceptCount=\"{{ .Values.bamboo.tomcatConfig.acceptCount | default \"100\" }}\"\n                   secure=\"{{ default (include \"common.gateway.https\" .) .Values.bamboo.tomcatConfig.secure }}\"\n                   scheme=\"{{ default (include \"common.gateway.scheme\" .) .Values.bamboo.tomcatConfig.scheme }}\"\n                   proxyName=\"{{ .Values.bamboo.tomcatConfig.proxyName | default (include \"common.gateway.hostname\" .)  }}\"\n                   proxyPort=\"{{ .Values.bamboo.tomcatConfig.proxyPort | default (include \"common.gateway.externalPort\" .)  }}\"\n\n                   {{- if .Values.bamboo.tomcatConfig.address }}\n                   address=\"{{ .Values.bamboo.tomcatConfig.address }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.secret }}\n                   secret=\"{{ .Values.bamboo.tomcatConfig.secret }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.secretRequired }}\n                   secretRequired=\"{{ .Values.bamboo.tomcatConfig.secretRequired }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.bambooEncryptionKey }}\n                   {{- if or (semverCompare \"<9.5.0\" .Chart.AppVersion) (semverCompare \"<9.5.0\" (.Values.image.tag | default .Chart.AppVersion )) }}\n                   bambooEncryptionKey=\"{{ .Values.bamboo.tomcatConfig.bambooEncryptionKey }}\"\n                   {{- else }}\n                   productEncryptionKey=\"{{ .Values.bamboo.tomcatConfig.bambooEncryptionKey }}\"\n                   {{- end }}\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.sslEnabled }}\n                   SSLEnabled=\"{{ .Values.bamboo.tomcatConfig.sslEnabled }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.sslProtocol }}\n                   sslProtocol=\"{{ .Values.bamboo.tomcatConfig.sslProtocol }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.sslCertificateFile }}\n                   SSLCertificateFile=\"{{ .Values.bamboo.tomcatConfig.sslCertificateFile }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.sslCertificateKeyFile }}\n                   SSLCertificateKeyFile=\"{{ .Values.bamboo.tomcatConfig.sslCertificateKeyFile }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.sslPass }}\n                   SSLPassword=\"{{ .Values.bamboo.tomcatConfig.sslPass }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.keystoreFile }}\n                   keystoreFile=\"{{ .Values.bamboo.tomcatConfig.keystoreFile }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.keystorePass }}\n                   keystorePass=\"{{ .Values.bamboo.tomcatConfig.keystorePass }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.keyPass }}\n                   keyPass=\"{{ .Values.bamboo.tomcatConfig.keyPass }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.clientAuth }}\n                   clientAuth=\"{{ .Values.bamboo.tomcatConfig.clientAuth }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.truststoreFile }}\n                   truststoreFile=\"{{ .Values.bamboo.tomcatConfig.truststoreFile }}\"\n                   {{- end }}\n                   {{- if .Values.bamboo.tomcatConfig.truststorePass }}\n                   truststorePass=\"{{ .Values.bamboo.tomcatConfig.truststorePass }}\"\n                   {{- end }}\n                   relaxedPathChars=\"[]|\"\n                   relaxedQueryChars=\"[]|{}^\\`&quot;&lt;&gt;\"\n                   bindOnInit=\"false\"\n                   maxHttpHeaderSize=\"{{ .Values.bamboo.tomcatConfig.maxHttpHeaderSize | default \"8192\" }}\"\n                   useBodyEncodingForURI=\"true\"\n                   {{- if and .Values.bamboo.tomcatConfig.compression (ne .Values.bamboo.tomcatConfig.compression \"\") }}\n                   compression={{ .Values.bamboo.tomcatConfig.compression | quote }}\n                   compressibleMimeType={{ .Values.bamboo.tomcatConfig.compressibleMimeType | default \"text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml\" | quote }}\n                   compressionMinSize=\"{{ .Values.bamboo.tomcatConfig.compressionMinSize | default \"2048\" | quote }}\"\n                   {{- else }}\n                   compression=\"off\"\n                   {{- end }}\n                   disableUploadTimeout=\"true\">\n          <UpgradeProtocol className=\"org.apache.coyote.http2.Http2Protocol\" />\n        </Connector>\n\n        <Engine name=\"Catalina\"\n                defaultHost=\"localhost\">\n\n          <Host name=\"localhost\"\n                appBase=\"webapps\"\n                unpackWARs=\"true\"\n                autoDeploy=\"true\">\n\n\n        {{- if or .Values.bamboo.tomcatConfig.proxyInternalIps .Values.bamboo.tomcatConfig.trustedProxies }}\n          <Valve className=\"org.apache.catalina.valves.RemoteIpValve\"\n               {{- if .Values.bamboo.tomcatConfig.trustedProxies }}\n                 trustedProxies=\"{{ .Values.bamboo.tomcatConfig.trustedProxies | replace \".\" \"\\\\.\" }}\"\n               {{- end }}\n               {{- if .Values.bamboo.tomcatConfig.trustedProxies }}\n                 internalProxies=\"{{ .Values.bamboo.tomcatConfig.proxyInternalIps | replace \".\" \"\\\\.\" }}\"\n               {{- end }}\n                 remoteIpHeader=\"x-forwarded-for\"\n                 proxiesHeader=\"x-forwarded-by\"\n                 protocolHeader=\"x-forwarded-proto\"/>\n        {{- end }}\n\n            <Context path=\"{{ .Values.bamboo.service.contextPath | default \"\" }}\"\n                     docBase=\"${catalina.home}/atlassian-bamboo\"\n                     reloadable=\"false\"\n                     useHttpOnly=\"true\">\n              <Resource name=\"UserTransaction\"\n                        auth=\"Container\"\n                        type=\"javax.transaction.UserTransaction\"\n                        factory=\"org.objectweb.jotm.UserTransactionFactory\"\n                        jotm.timeout=\"60\"/>\n              <Manager pathname=\"\"/>\n              <JarScanner scanManifest=\"false\"/>\n              <Valve className=\"org.apache.catalina.valves.StuckThreadDetectionValve\"\n                     threshold=\"{{ .Values.bamboo.tomcatConfig.stuckThreadDetectionValveThreshold | default \"120\" }}\" />\n            </Context>\n\n          </Host>\n          <Valve className=\"org.apache.catalina.valves.AccessLogValve\"\n                 maxDays=\"{{ .Values.bamboo.tomcatConfig.accessLogMaxDays | default \"-1\" }}\"\n                 requestAttributesEnabled=\"{{ .Values.bamboo.tomcatConfig.requestAttributesEnabled | default \"false\" }}\"\n                 pattern=\"%a %{bamboo.request.id}r %{bamboo.request.username}r %t &quot;%m %U%q %H&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; &quot;%{bamboo.request.assession.id}r&quot;\"/>\n        </Engine>\n\n      </Service>\n    </Server>\n{{- end }}\n{{- end }}\n    {{- if or .Values.bamboo.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n  seraph-config.xml: |\n    <security-config>\n        <parameters>\n            <init-param>\n                <param-name>login.url</param-name>\n                <param-value>/userlogin!doDefault.action?os_destination=${originalurl}</param-value>\n            </init-param>\n\n            <init-param>\n            <!--\n              the URL to redirect to when the user explicitly clicks on a login link (rather than being redirected after\n              trying to access a protected resource). Most of the time, this will be the same value as 'login.url'.\n                - same properties as login.url above\n            -->\n              <param-name>link.login.url</param-name>\n              <param-value>/userlogin!doDefault.action?os_destination=${originalurl}</param-value>\n              <!--<param-value>/secure/Dashboard.jspa?os_destination=${originalurl}</param-value>-->\n              <!--<param-value>http://sso.mycompany.com/login?redirectTo=${originalurl}</param-value>-->\n            </init-param>\n\n            <init-param>\n                <!-- called by the logout servlet -->\n                <param-name>logout.url</param-name>\n                <param-value>/userLogout.action?os_destination=${originalurl}</param-value>\n            </init-param>\n\n            <!-- The key that the original URL is stored with in the session -->\n            <init-param>\n                <param-name>original.url.key</param-name>\n                <param-value>os_security_originalurl</param-value>\n            </init-param>\n\n            <init-param>\n                <param-name>login.cookie.key</param-name>\n                <param-value>seraph.bamboo</param-value>\n            </init-param>\n\n            <!-- Specify 3 characters to make cookie encoding unique for your application, to prevent collisions if more than one Seraph-based app is used.-->\n            <init-param>\n                <param-name>cookie.encoding</param-name>\n                <param-value>BAM</param-value>\n            </init-param>\n\n            <init-param>\n                <param-name>autologin.cookie.age</param-name>\n                <param-value>{{ .Values.bamboo.seraphConfig.autoLoginCookieAge | default \"1209600\" }}</param-value>\n            </init-param>\n\n            <!--only basic authentication available-->\n            <init-param>\n              <param-name>authentication.type</param-name>\n              <param-value>os_authType</param-value>\n            </init-param>\n        </parameters>\n\n        <!-- Determines what roles (permissions) a user has. -->\n        <rolemapper class=\"com.atlassian.bamboo.user.authentication.BambooRoleMapper\"/>\n        <authenticator class=\"com.atlassian.bamboo.user.authentication.BambooAuthenticator\"/>\n        <controller class=\"com.atlassian.bamboo.user.authentication.BambooSecurityController\"/>\n        <elevatedsecurityguard class=\"com.atlassian.bamboo.user.authentication.BambooElevatedSecurityGuard\"/>\n\n        <!-- If you're authenticating against a Crowd server you can use this authenticator for single sign-on.\n             Enable it after configuring your Crowd properties through user management and restart Bamboo. It does not support\n             Crowd property changes at runtime. If you need to switch back to local users, revert the change and\n             restart Bamboo again.\n         -->\n         <!--<authenticator class=\"com.atlassian.crowd.integration.seraph.v25.BambooAuthenticator\"/>-->\n\n        <services>\n            <!-- Specifies role requirements for accessing specified URL paths -->\n            <service class=\"com.atlassian.seraph.service.PathService\">\n                <init-param>\n                    <param-name>config.file</param-name>\n                    <param-value>/seraph-paths.xml</param-value>\n                </init-param>\n            </service>\n        </services>\n\n        <interceptors>\n            <interceptor class=\"com.atlassian.bamboo.user.authentication.InvalidateSessionDuringLogin\"/>\n        </interceptors>\n    </security-config>\n{{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/configmap-values-analytics.yaml",
    "content": "{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-helm-values\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n  values.yaml: |\n  {{- include \"bamboo.sanitizedValues\" . }}\n{{- end }}\n{{- if .Values.atlassianAnalyticsAndSupport.analytics.enabled }}\n  analytics.json: |\n  {{- include \"bamboo.analyticsJson\" . | nindent 4 }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/configmaps-grafana-dashboards.yaml",
    "content": "{{- if .Values.monitoring.grafana.createDashboards }}\n{{- $grafanaDashboards := .Files.Glob \"grafana-dashboards/*.json\" -}}\n{{- range $index, $grafanaDashboard := $grafanaDashboards -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n{{- $fileName := split \"/\" $index }}\n  name: {{ include \"common.names.fullname\" . }}-{{ $fileName._1 | trimSuffix \".json\" }}-dashboard\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.monitoring.grafana.dashboardLabels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- if .Values.monitoring.grafana.dashboardAnnotations }}\n  annotations:\n    {{- with .Values.monitoring.grafana.dashboardAnnotations}}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- end }}\ndata:\n  {{ include \"common.names.fullname\" . }}-{{ .Release.Namespace}}-{{ $fileName._1}}: |\n{{ .Files.Get $index | indent 4 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/httproute.yaml",
    "content": "{{- if .Values.gateway.create }}\n{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: gateway.networking.k8s.io/v1\nkind: HTTPRoute\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.gateway.labels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.gateway.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  # Reference to the Gateway\n  parentRefs:\n  {{- toYaml .Values.gateway.parentRefs | nindent 2 }}\n  \n  # Hostnames to match\n  hostnames:\n  {{- range .Values.gateway.hostnames }}\n  - {{ . | quote }}\n  {{- end }}\n  \n  # Routing rules\n  rules:\n  # Default rule - routes to Bamboo service\n  - matches:\n    - path:\n        type: {{ .Values.gateway.pathType }}\n        value: {{ include \"bamboo.path\" . }}\n    {{- with .Values.gateway.timeouts }}\n    timeouts:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n    {{- with .Values.gateway.filters }}\n    filters:\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n    backendRefs:\n    - name: {{ include \"common.names.fullname\" . }}\n      port: {{ .Values.bamboo.service.port }}\n      weight: 100\n  \n  {{- with .Values.gateway.additionalRules }}\n  {{- toYaml . | nindent 2 }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.create }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{ if .Values.ingress.nginx }}\n    \"nginx.ingress.kubernetes.io/affinity\": \"cookie\"\n    \"nginx.ingress.kubernetes.io/affinity-mode\": \"persistent\"\n    \"nginx.ingress.kubernetes.io/proxy-body-size\": {{ .Values.ingress.maxBodySize }}\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": {{ .Values.ingress.proxyConnectTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": {{ .Values.ingress.proxyReadTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": {{ .Values.ingress.proxySendTimeout|quote }}\n    {{- end }}\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{ if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n    - hosts:\n        - {{ .Values.ingress.host }}\n      {{ if .Values.ingress.tlsSecretName }}\n      secretName: {{ .Values.ingress.tlsSecretName }}\n      {{ end }}\n{{ end }}\n  ingressClassName: {{ default \"nginx\" .Values.ingress.className }}\n  rules:\n    - host: {{ .Values.ingress.host }}\n      http:\n        paths:\n          - path: {{ include \"bamboo.ingressPath\" . }}\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"common.names.fullname\" $ }}\n                port:\n                  number: {{ $.Values.bamboo.service.port }}\n         {{- range $path := .Values.ingress.additionalPaths }}\n          - path: {{ $path.path }}\n            pathType: {{ $path.pathType | default \"Prefix\" }}\n            backend:\n              service:\n                name: {{ $path.service }}\n                port:\n                  number: {{ $path.portNumber }}\n         {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/pdb.yaml",
    "content": "{{- if .Values.podDisruptionBudget.enabled }}\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.podDisruptionBudget.labels }}\n      {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.podDisruptionBudget.annotations }}\n  annotations:\n    {{- range $key, $value := . }}\n    {{ $key }}: {{ $value | quote }}\n    {{- end }}\n  {{- end }}\nspec:\n  {{- with .Values.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ . }}\n  {{- else }}\n  minAvailable: {{ .Values.podDisruptionBudget.minAvailable | default 0 }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/route.yaml",
    "content": "{{- if and .Values.ingress.create .Values.ingress.openShiftRoute }}\nkind: Route\napiVersion: route.openshift.io/v1\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{- if .Values.ingress.routeHttpHeaders }}\n  httpHeaders:\n{{- with .Values.ingress.routeHttpHeaders }}\n{{- toYaml . | nindent 4 }}\n{{- end }}\n{{- end }}\n  host: {{ .Values.ingress.host }}\n  path: {{ include \"bamboo.ingressPath\" . }}\n  to:\n    kind: Service\n    name: {{ include \"common.names.fullname\" . }}\n    weight: 100\n  port:\n    targetPort: http\n{{- if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n{{- if .Values.ingress.tlsSecretName }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace .Values.ingress.tlsSecretName) }}\n{{- if $secretData }}\n{{- if hasKey $secretData.data \"tls.crt\" }}\n    certificate: |\n      {{- index $secretData.data \"tls.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"tls.key\" }}\n    key: |\n      {{- index $secretData.data \"tls.key\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"ca.crt\" }}\n    caCertificate: |\n      {{- index $secretData.data \"ca.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- end }}\n{{- end }}\n    termination: edge\n    insecureEdgeTerminationPolicy: Redirect\n  wildcardPolicy: None\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/service-jms.yaml",
    "content": "{{- if .Values.bamboo.jmsService.enabled}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jms\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{- with .Values.bamboo.jmsService.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  type: {{ .Values.bamboo.jmsService.type }}\n  {{- if and (eq .Values.bamboo.jmsService.type \"LoadBalancer\") (not (empty .Values.bamboo.jmsService.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.bamboo.jmsService.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.bamboo.jmsService.port }}\n      targetPort: jms\n      protocol: TCP\n      name: jms\n  selector:\n  {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/service-jmx.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{- with .Values.monitoring.jmxServiceAnnotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  type: {{ .Values.monitoring.jmxExporterPortType }}\n  ports:\n    - port: {{ .Values.monitoring.jmxExporterPort}}\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n  {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/service-monitor.yaml",
    "content": "{{- if .Values.monitoring.serviceMonitor.create }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-service-monitor\n  labels:\n  {{- with .Values.monitoring.serviceMonitor.prometheusLabelSelector }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  endpoints:\n  - interval: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeIntervalSeconds }}\n    path: /metrics\n    port: jmx\n    scheme: http\n    relabelings:\n      - action: replace\n        sourceLabels:\n          - __meta_kubernetes_pod_name\n        targetLabel: instance\n    scrapeTimeout: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeTimeoutSeconds }}\n  selector:\n    matchLabels:\n    {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{- with .Values.bamboo.service.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  type: {{ .Values.bamboo.service.type }}\n  sessionAffinity: {{ .Values.bamboo.service.sessionAffinity }}\n  {{- if .Values.bamboo.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  sessionAffinityConfig:\n    clientIP:\n      timeoutSeconds: {{ .Values.bamboo.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  {{- end }}\n  {{- if and (eq .Values.bamboo.service.type \"LoadBalancer\") (not (empty .Values.bamboo.service.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.bamboo.service.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.bamboo.service.port }}\n      targetPort: http\n      protocol: TCP\n      name: http\n      {{- if and (eq .Values.bamboo.service.type \"NodePort\") .Values.bamboo.service.nodePort}}\n      nodePort: {{ .Values.bamboo.service.nodePort }}\n      {{- end }}\n  selector:\n  {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"bamboo.serviceAccountName\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- with .Values.serviceAccount.imagePullSecrets }}\nimagePullSecrets:\n  {{- toYaml . | nindent 2 }}\n{{- end -}}\n{{- end -}}"
  },
  {
    "path": "src/main/charts/bamboo/templates/shared-home-pvc.yaml",
    "content": "{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-shared-home\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nspec:\n  accessModes:\n  {{ range .Values.volumes.sharedHome.persistentVolumeClaim.accessModes }}\n    - {{ . }}\n  {{ end }}\n  {{- if .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName }}\n  storageClassName: {{ .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName | quote }}\n  {{- end }}\n  {{- with .Values.volumes.sharedHome.persistentVolumeClaim.resources }}\n  resources:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/statefulset.yaml",
    "content": "{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.bamboo.additionalAnnotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  {{- if .Values.updateStrategy }}\n  {{- with .Values.updateStrategy }}\n  updateStrategy:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{ if .Values.ordinals.enabled }}\n  ordinals:\n    start: {{ .Values.ordinals.start }}\n  {{ end }}\n  replicas: {{ .Values.replicaCount }}\n  serviceName: {{ include \"common.names.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/config-jvm.yaml\") . | sha256sum }}\n        {{- if .Values.additionalConfigMaps }}\n        checksum/config-additional: {{ include (print $.Template.BasePath \"/configmap-additional-config.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- if .Values.fluentd.enabled }}\n        checksum/config-fluentd: {{ include (print $.Template.BasePath \"/configmap-fluentd.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- include \"bamboo.podAnnotations\" . | nindent 8 }}\n      labels:\n        {{- include \"common.labels.commonLabels\" . | nindent 8 }}\n        {{- include \"bamboo.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"bamboo.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.bamboo.shutdown.terminationGracePeriodSeconds }}\n      hostAliases:\n        {{- include \"bamboo.additionalHosts\" . | nindent 8 }}\n      {{- if .Values.openshift.runWithRestrictedSCC }}\n      {{- else }}\n      {{- if .Values.bamboo.securityContextEnabled }}\n      {{- with .Values.bamboo.securityContext }}\n      securityContext:\n        {{ toYaml . | nindent 8 }}\n        {{- if not .fsGroup }}\n        fsGroup: 2005\n        {{- end }}\n      {{- end }}\n      {{- end }}\n      {{- end }}\n      initContainers:\n        {{- include \"bamboo.additionalInitContainers\" . | nindent 8 }}\n        {{- if and .Values.volumes.sharedHome.nfsPermissionFixer.enabled (not .Values.openshift.runWithRestrictedSCC) }}\n        - name: nfs-permission-fixer\n          image: {{ .Values.volumes.sharedHome.nfsPermissionFixer.imageRepo }}:{{ .Values.volumes.sharedHome.nfsPermissionFixer.imageTag }}\n          imagePullPolicy: IfNotPresent\n          {{- if .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          resources:\n          {{- with .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- end }}\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: {{ .Values.volumes.sharedHome.nfsPermissionFixer.mountPath | quote }}\n              {{- if .Values.volumes.sharedHome.subPath }}\n              subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n              {{- end }}\n          command: [\"sh\", \"-c\", {{ include \"bamboo.sharedHome.permissionFix.command\" . | quote }}]\n        {{- end }}\n        {{- include \"common.jmx.initContainer\" . | nindent 8 }}\n        {{- if or .Values.bamboo.additionalCertificates.secretName .Values.bamboo.additionalCertificates.secretList }}\n        - name: import-certs\n          image: {{ include \"bamboo.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          volumeMounts:\n            - name: keystore\n              mountPath: /var/ssl\n          {{- if.Values.bamboo.additionalCertificates.secretName }}\n            - name: certs\n              mountPath: /tmp/crt\n          {{- else }}\n          {{- range .Values.bamboo.additionalCertificates.secretList }}\n            {{- $secretName := .name }}\n            {{- range .keys }}\n            - name: {{ $secretName }}\n              mountPath: /tmp/crt/{{$secretName}}-{{ . }}\n              subPath: {{ . }}\n            {{- end }}\n          {{- end }}\n          {{- end }}\n          command: [\"/bin/bash\"]\n          args: [\"-c\", {{ include \"bamboo.addCrtToKeystoreCmd\" . }}]\n          resources:\n          {{- with .Values.bamboo.additionalCertificates.initContainer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          securityContext:\n          {{- with .Values.bamboo.additionalCertificates.initContainer.securityContext }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n        {{- end }}\n      containers:\n        - name: {{ if .Values.bamboo.useHelmReleaseNameAsContainerName}}{{ include \"common.names.fullname\" . }}{{ else }}{{ .Chart.Name }}{{ end }}\n          image: {{ include \"bamboo.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          env:\n            {{ if eq (include \"common.gateway.https\" .) \"true\" }}\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            {{ end }}\n            - name: ATL_BASE_URL\n              value: {{ include \"bamboo.baseUrl\" . | quote }}\n            {{ if .Values.bamboo.service.contextPath }}\n            - name: ATL_TOMCAT_CONTEXTPATH\n              value: {{ .Values.bamboo.service.contextPath | quote }}\n            {{ end }}\n            - name: ATL_TOMCAT_PORT\n              value: {{ .Values.bamboo.ports.http | quote }}\n            {{ if eq (include \"common.gateway.isConfigured\" .) \"true\" }}\n            - name: ATL_PROXY_NAME\n              value: {{ include \"common.gateway.hostname\" . | quote }}\n            - name: ATL_PROXY_PORT\n              value: {{ include \"common.gateway.externalPort\" . | quote }}\n            {{ end }}\n            {{- include \"bamboo.databaseEnvVars\" . | nindent 12 }}\n            - name: SET_PERMISSIONS\n              value: {{ .Values.bamboo.setPermissions | quote }}\n            - name: BAMBOO_SHARED_HOME\n              value: {{ .Values.volumes.sharedHome.mountPath | quote }}\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            {{ if .Values.bamboo.brokerUrl }}\n            - name: ATL_CLIENT_BROKER_URL\n              value: {{ .Values.bamboo.brokerUrl | quote }}\n            {{ end }}\n            {{ if .Values.bamboo.securityToken.secretName }}\n            - name: SECURITY_TOKEN\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .Values.bamboo.securityToken.secretName }}\n                  key: {{ .Values.bamboo.securityToken.secretKey }}\n            {{ end }}\n            {{ if .Values.bamboo.disableAgentAuth }}\n            - name: ATL_BAMBOO_DISABLE_AGENT_AUTH\n              value: \"true\"\n            {{ end }}\n            {{ if .Values.bamboo.license.secretName }}\n            - name: ATL_LICENSE\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .Values.bamboo.license.secretName }}\n                  key: {{ .Values.bamboo.license.secretKey }}\n            {{ end }}\n            {{ if .Values.bamboo.sysadminCredentials.secretName }}\n            - name: ATL_ADMIN_USERNAME\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .Values.bamboo.sysadminCredentials.secretName }}\n                  key: {{ .Values.bamboo.sysadminCredentials.usernameSecretKey }}\n            - name: ATL_ADMIN_PASSWORD\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .Values.bamboo.sysadminCredentials.secretName }}\n                  key: {{ .Values.bamboo.sysadminCredentials.passwordSecretKey }}\n            - name: ATL_ADMIN_FULLNAME\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .Values.bamboo.sysadminCredentials.secretName }}\n                  key: {{ .Values.bamboo.sysadminCredentials.displayNameSecretKey }}\n            - name: ATL_ADMIN_EMAIL\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .Values.bamboo.sysadminCredentials.secretName }}\n                  key: {{ .Values.bamboo.sysadminCredentials.emailAddressSecretKey }}\n            {{ end }}\n            {{ if .Values.bamboo.import.type }}\n            - name: ATL_IMPORT_OPTION\n              value: {{ .Values.bamboo.import.type }}\n            - name: ATL_IMPORT_PATH\n              value: {{ .Values.bamboo.import.path }}\n            {{ end }}\n            - name: ATL_BAMBOO_ENABLE_UNATTENDED_SETUP\n              value: {{ .Values.bamboo.unattendedSetup | quote }}\n            {{- if .Values.monitoring.exposeJmxMetrics }}\n            - name: CATALINA_OPTS\n              value: {{ include \"common.jmx.javaagent\" . | replace \"\\n\" \"\" | quote }}\n            {{- end }}\n            {{- include \"bamboo.additionalEnvironmentVariables\" . | nindent 12 }}\n          ports:\n            - name: http\n              containerPort: {{ .Values.bamboo.ports.http }}\n              protocol: TCP\n            - name: jms\n              containerPort: {{ .Values.bamboo.ports.jms }}\n              protocol: TCP\n            {{- include \"common.jmx.port\" . | nindent 12 }}\n            {{- include \"bamboo.additionalPorts\" . | nindent 12 }}\n          {{- if .Values.bamboo.readinessProbe.enabled }}\n          readinessProbe:\n            {{- if .Values.bamboo.readinessProbe.customProbe}}\n            {{- with .Values.bamboo.readinessProbe.customProbe }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n            {{- else }}\n            httpGet:\n              port: {{ .Values.bamboo.ports.http }}\n              path: {{ .Values.bamboo.service.contextPath }}/rest/api/latest/status\n            initialDelaySeconds: {{ .Values.bamboo.readinessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.bamboo.readinessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.bamboo.readinessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.bamboo.readinessProbe.failureThreshold }}\n            {{- end }}\n          {{- end }}\n          {{- if .Values.bamboo.startupProbe.enabled }}\n          startupProbe:\n            tcpSocket:\n              port: {{ .Values.bamboo.ports.http }}\n            initialDelaySeconds: {{ .Values.bamboo.startupProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.bamboo.startupProbe.periodSeconds }}\n            failureThreshold: {{ .Values.bamboo.startupProbe.failureThreshold }}\n          {{- end }}\n          {{- if .Values.bamboo.livenessProbe.enabled }}\n          livenessProbe:\n          {{- if .Values.bamboo.livenessProbe.customProbe}}\n          {{- with .Values.bamboo.livenessProbe.customProbe }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- else }}\n            tcpSocket:\n              port: {{ .Values.bamboo.ports.http }}\n            initialDelaySeconds: {{ .Values.bamboo.livenessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.bamboo.livenessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.bamboo.livenessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.bamboo.livenessProbe.failureThreshold }}\n          {{- end }}\n          {{- end }}\n          {{- with .Values.bamboo.containerSecurityContext}}\n          securityContext:\n          {{- toYaml . | nindent 12}}\n          {{- end}}\n          {{- with .Values.bamboo.resources.container }}\n          resources:\n            {{- toYaml . | nindent 12 }}\n          {{- end }}\n          volumeMounts:\n            {{- include \"bamboo.volumeMounts\" . | nindent 12 }}\n            {{- include \"common.jmx.config.volumeMounts\" . | nindent 12 }}\n            {{- include \"bamboo.additionalVolumeMounts\" . | nindent 12 }}\n            {{- include \"bamboo.additionalLibraries\" . | nindent 12 }}\n            {{- include \"bamboo.additionalBundledPlugins\" . | nindent 12 }}\n            {{- range $i, $n := .Values.additionalFiles }}\n            - name: {{ .name }}-{{$i}}\n              mountPath: {{ .mountPath }}/{{ .key }}\n              subPath: {{ .key }}\n            {{ end }}\n            {{- range $i, $n := .Values.additionalConfigMaps }}\n            {{- range .keys }}\n            - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n              mountPath: {{ .mountPath }}/{{ .fileName }}\n              subPath: {{ .fileName }}\n            {{ end }}\n            {{- end }}\n          lifecycle:\n          {{- if .Values.bamboo.postStart.command }}\n            postStart:\n              exec:\n                command: [\"/bin/sh\", \"-c\", {{- .Values.bamboo.postStart.command | quote }}]\n          {{- end }}\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", {{ .Values.bamboo.shutdown.command | quote }}]\n        {{- include \"fluentd.container\" . | nindent 8 }}\n        {{- include \"bamboo.additionalContainers\" . | nindent 8 }}\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bamboo.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.schedulerName }}\n      schedulerName: {{ .Values.schedulerName  | quote }}\n      {{- end }}\n      {{- if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n      {{- end }}\n      volumes:\n        {{- range $i, $n := .Values.additionalFiles }}\n        - name: {{ .name }}-{{$i}}\n          {{ .type }}:\n            {{ if hasPrefix .type \"secret\" }}{{ .type}}Name{{ else }}name{{ end }}: {{ .name }}\n            items:\n              - key: {{ .key }}\n                path: {{ .key }}\n        {{ end }}\n        {{- range $i, $key := .Values.additionalConfigMaps }}\n        {{- with $ }}\n        {{- range $key.keys }}\n        - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n          configMap:\n            name: {{ include \"common.names.fullname\" $ }}-{{ $key.name }}\n            {{- if .defaultMode }}\n            defaultMode: {{ .defaultMode }}\n            {{- end }}\n            items:\n              - key: {{ .fileName }}\n                path: {{ .fileName }}\n            {{- end }}\n        {{ end }}\n        {{- end }}\n        {{ include \"bamboo.volumes\" . | nindent 8 }}\n        {{ include \"fluentd.config.volume\" . | nindent 8 }}\n        {{ include \"common.jmx.config.volume\" . | nindent 8 }}\n  {{ include \"bamboo.volumeClaimTemplates\" . | nindent 2 }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/tests/test-application-status.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"bamboo.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.statusTestContainer }}\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: STATUS_URL\n          value: \"http://{{ include \"common.names.fullname\" . }}:{{ .Values.bamboo.service.port }}/rest/api/latest/status\"\n      command:\n        - /bin/sh\n        - -c\n        - |\n          apk add -q jq curl\n          count=1\n          while [ $count -le 20 ]\n          do\n            STATUS=$(curl -s \"$STATUS_URL\")\n            RESPONSE_CODE=$(curl -s -o /dev/null -I -w \"%{http_code}\" \"$STATUS_URL\")\n            echo \"Status URL is: $STATUS_URL\"\n            echo \"Response code for status test: $RESPONSE_CODE\"\n            echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n            echo $STATUS | jq -e '.status|test(\"RUNNING|FIRST_RUN\")'\n            if [ $? == 0 ]; then\n              exit 0\n            fi\n            sleep 10\n            count=$(( $count + 1 ))\n          done\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/tests/test-database-connectivity.yaml",
    "content": "{{ if .Values.database.credentials.secretName }}\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-db-connectivity-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"bamboo.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  serviceAccountName: {{ include \"bamboo.serviceAccountName\" . }}\n  containers:\n    - name: test\n      image: {{ include \"bamboo.image\" . | quote }}\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: JDBC_DRIVER\n          value: {{ .Values.database.driver | quote }}\n        - name: JDBC_URL\n          value: {{ .Values.database.url | quote }}\n        - name: JDBC_USER\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.usernameSecretKey }}\n        - name: JDBC_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.passwordSecretKey }}\n        - name: CLASSPATH\n          value: \"/opt/atlassian/bamboo/lib/*\"\n      command:\n        - /bin/bash\n        - -ec\n        - |\n          cat <<EOF | jshell - > output.txt\n          var jdbcUrl = System.getenv(\"JDBC_URL\");\n          var jdbcUsername = System.getenv(\"JDBC_USER\");\n          var jdbcPassword = System.getenv(\"JDBC_PASSWORD\");\n\n          System.out.println(\"Establishing connection to \" + jdbcUrl);\n          try (var c = java.sql.DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)) {\n             System.out.println(\"Connection established OK, \" + c.getClass());\n          }\n          EOF\n          cat output.txt\n          grep -q \"Connection established OK\" output.txt\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/templates/tests/test-shared-home-permissions.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"bamboo.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.permissionsTestContainer }}\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        {{- with .Values.bamboo.securityContext }}\n        {{- if .fsGroup }}\n        runAsUser: {{ .fsGroup }}\n        runAsGroup: {{ .fsGroup }}\n        {{- else }}\n        runAsUser: {{ 2005 }}\n        runAsGroup: {{ 2005 }}\n        {{- end }}\n        {{- end }}\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n          {{- if .Values.volumes.sharedHome.subPath }}\n          subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n          {{- end }}\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  volumes:\n    {{ include \"bamboo.volumes.sharedHome\" . | nindent 4 }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo/values.yaml",
    "content": "## Atlassian Bamboo Data Center Helm values\n#\n# HEADS UP!\n#\n# Release 1.0.0 of this chart only support FULL unattended setups.\n#\n# All setup data (denoted with 'UNATTENDED-SETUP') required for configuring Bamboo including\n# sections declared as 'REQUIRED' must be supplied up-front as part of this file.\n# The property 'bamboo.unattendedSetup' is set, by default, to 'true'.\n#\n# As a result, post helm install of this chart, there is no manual setup required for Bamboo.\n#\n# Data loss will occur if sections declared as 'REQUIRED' are not configured appropriately!\n# These sections are:\n# - database\n# - volumes\n#\n# Additional details on pre-provisioning these required resources can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#3-configure-database\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#5-configure-persistent-storage\n#\n# To manage external access to the Bamboo instance, a Gateway API HTTPRoute or an Ingress\n# resource can be configured under the 'gateway' or 'ingress' stanza respectively.\n# This requires a pre-provisioned gateway/ingress controller to be present.\n#\n# Additional details on configuring external access can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#4-configure-ingress\n#\n##\n\n\n# -- The initial number of Bamboo pods that should be started at deployment time.\n# Note that Bamboo requires manual configuration via the browser post deployment\n# after the first pod is deployed.\n#\n# At present Bamboo Data Center utilizes an `active-passive` clustering model.\n# This architecture is not ideal where K8s deployments are concerned. As such\n# a Bamboo server cluster comprising only `1` pod is the recommended topology\n# for now. For more detail see:\n# https://atlassian.github.io/data-center-helm-charts/troubleshooting/LIMITATIONS#cluster-size\n#\nreplicaCount: 1\n\n# -- Set a custom start ordinal number for the K8s stateful set.\n# Note that this depends on the StatefulSetStartOrdinal K8s feature gate,\n# which has entered beta state with K8s version 1.27.\n#\nordinals:\n\n  # -- Enable only if StatefulSetStartOrdinal K8s feature gate is available.\n  #\n  enabled: false\n\n  # -- Set start ordinal to a positive integer, defaulting to 0.\n  #\n  start: 0\n\n# -- StatefulSet update strategy. When unset defaults to Rolling update.\n# See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets\n#\nupdateStrategy: {}\n  # type: OnDelete\n\n# Image configuration\n#\nimage:\n\n  # -- The Bamboo Docker image to use\n  # https://hub.docker.com/r/atlassian/bamboo\n  #\n  repository: atlassian/bamboo\n\n  # -- Image pull policy\n  #\n  pullPolicy: IfNotPresent\n\n  # -- The docker image tag to be used - defaults to the Chart appVersion\n  #\n  tag: \"\"\n\n# K8s ServiceAccount configuration. Give fine-grained identity and authorization\n# to Pods\n#\nserviceAccount:\n\n  # -- Set to 'true' if a ServiceAccount should be created, or 'false' if it\n  # already exists.\n  #\n  create: true\n\n  # -- The name of the ServiceAccount to be used by the pods. If not specified, but\n  # the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name\n  # will be auto-generated, otherwise the 'default' ServiceAccount will be used.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server\n  #\n  name:\n\n  # -- For Docker images hosted in private registries, define the list of image pull\n  # secrets that should be utilized by the created ServiceAccount\n  # https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod\n  #\n  imagePullSecrets: []\n  # - name: secretName\n\n  # -- Annotations to add to the ServiceAccount (if created)\n  #\n  annotations: {}\n\n# REQUIRED - Database configuration\n#\n# Bamboo requires a backend database. The configuration below can be used to define the\n# database to use and its connection details.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#database-connectivity\n#\ndatabase:\n\n  # -- The database type that should be used. If not specified, then it will need to be\n  # provided via the browser during manual configuration post deployment. Valid values\n  # include:\n   # * 'postgresql'\n   # * 'mysql'\n   # * 'oracle12c'\n   # * 'mssql'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasetype\n  #\n  type:\n\n  # -- The jdbc URL of the database. If not specified, then it will need to be provided\n  # via the browser during manual configuration post deployment. Example URLs include:\n   # * 'jdbc:postgresql://<dbhost>:5432/<dbname>'\n   # * 'jdbc:mysql://<dbhost>/<dbname>'\n   # * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>'\n   # * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl\n  #\n  url:\n\n  # JDBC connection credentials\n  #\n  credentials:\n\n    # -- The name of the K8s Secret that contains the database login credentials.\n    # If the secret is specified, then the credentials will be automatically utilised on\n    # Bamboo startup. If the secret is not provided, then the credentials will need to be\n    # provided via the browser during manual configuration post deployment.\n    #\n    # Example of creating a database credentials K8s secret below:\n    # 'kubectl create secret generic <secret-name> --from-literal=username=<username> \\\n    # --from-literal=password=<password>'\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    # -- The key ('username') in the Secret used to store the database login username\n    #\n    usernameSecretKey: username\n\n    # -- The key ('password') in the Secret used to store the database login password\n    #\n    passwordSecretKey: password\n\n# REQUIRED - Volume configuration\n#\n# By default, the charts will configure the local-home and shared-home as ephemeral\n# volumes i.e. 'emptyDir: {}'. This is fine for evaluation purposes but for production\n# deployments this is not ideal and so local-home and shared-home should both be configured\n# appropriately.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#volumes\n#\nvolumes:\n\n  # Each pod requires its own volume for 'local-home'. This is needed for key data\n  # that help define how Bamboo works.\n  # https://confluence.atlassian.com/bamboo/installing-bamboo-data-center-1063170560.html\n  #\n  localHome:\n\n    # Dynamic provisioning of local-home using the K8s Storage Classes\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/LOCAL_STORAGE/\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically\n      # created for each pod based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the name of the 'StorageClass' that should be used for the local-home\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests and/or limits for the local-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # This field controls if and how PVCs are deleted during the lifecycle of a StatefulSet.\n    # Only configure the below two attributes when your Kubernetes version is 1.27+, and\n    # feature gate StatefulSetAutoDeletePVC is enabled.\n    #\n    # For each policy that you can configure, you can set the value to either Delete or Retain.\n    #\n    # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention\n    #\n    persistentVolumeClaimRetentionPolicy:\n\n      # -- Configures the volume retention behavior that applies when the StatefulSet is deleted.\n      #\n      whenDeleted:\n\n      # -- Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.\n      #\n      whenScaled:\n\n    # -- Static provisioning of local-home using K8s PVs and PVCs\n    #\n    # NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for\n    # pods is not recommended. Dynamic provisioning described above is the prescribed\n    # approach.\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the local-home volume(s). If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Bamboo container to which the local-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/bamboo\"\n\n    # -- Specifies the sub-directory of the local-home volume that will be mounted in to the\n    # Bamboo container.\n    #\n    subPath:\n\n  # A volume for 'shared-home' is required by Bamboo to effectively operate in multi-node\n  # environment\n  # https://confluence.atlassian.com/bamboo/bamboo-data-center-requirements-1063170547.html#BambooDataCenterrequirements-Sharedfilesystem\n  #\n  sharedHome:\n\n    # Dynamic provisioning of local-home using the K8s Storage Classes\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically\n      # created for shared-home based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the access modes that should be used for the 'shared-home' volume claim.\n      # Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations.\n      # Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable.\n      # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes\n      #\n      accessModes:\n        - ReadWriteMany\n\n      # -- Specify the name of the 'StorageClass' that should be used for the 'shared-home'\n      #volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests and/or limits for the shared-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # -- Static provisioning of shared-home using K8s PVs and PVCs\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the shared-home volume. If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Bamboo container to which the shared-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/shared-home\"\n\n    # -- Specifies the sub-directory of the shared-home volume that will be mounted in to the\n    # Bamboo container.\n    #\n    subPath:\n\n    # Modify permissions on shared-home\n    #\n    nfsPermissionFixer:\n\n      # -- If 'true', this will alter the shared-home volume's root directory so that Bamboo\n      # can write to it. This is a workaround for a K8s bug affecting NFS volumes:\n      # https://github.com/kubernetes/examples/issues/260\n      #\n      enabled: true\n\n      # -- The path in the K8s initContainer where the shared-home volume will be mounted\n      #\n      mountPath: \"/shared-home\"\n\n      # -- Image repository for the permission fixer init container. Defaults to alpine\n      #\n      imageRepo: alpine\n\n      # -- Image tag for the permission fixer init container. Defaults to latest\n      #\n      imageTag: latest\n\n      # -- Resources requests and limits for nfsPermissionFixer init container\n      # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n      #\n      resources: {}\n      #  requests:\n      #    cpu: \"1m\"\n      #    memory: \"20Mi\"\n      #  limits:\n      #    cpu: \"1\"\n      #    memory: \"1G\"\n\n      # -- By default, the fixer will change the group ownership of the volume's root directory\n      # to match the Bamboo container's GID (2001), and then ensures the directory is\n      # group-writeable. If this is not the desired behaviour, command used can be specified\n      # here.\n      #\n      command:\n\n  # -- Defines additional volumes that should be applied to all Bamboo pods.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in bamboo.additionalVolumeMounts\n  #\n  additional: []\n\n# Ingress configuration\n#\n# Use this section when routing external traffic to Bamboo via a Kubernetes Ingress\n# resource (K8s Ingress API). Requires a pre-provisioned Ingress Controller.\n# If using the Gateway API instead, see the 'gateway' section below.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#ingress\n#\ningress:\n\n  # -- Set to 'true' if an Ingress Resource should be created. This depends on a\n  # pre-provisioned Ingress Controller being available.\n  #\n  create: false\n\n  # -- The fully-qualified hostname (FQDN) of the Bamboo instance. This value is used\n  # to configure the product's proxy settings and, when ingress.create is true,\n  # the Ingress resource routing rules.\n  #\n  host:\n\n  # -- Whether users access the application over HTTPS. Set to 'false' if not\n  # using TLS, e.g. when reaching the service via localhost port-forwarding.\n  #\n  https: true\n\n  # -- The base path for the application, e.g. '/bamboo'.\n  # Defaults to 'bamboo.service.contextPath'.\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when ingress.create is true.\n  # They configure the Ingress resource itself and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Set to true if you want to create an OpenShift Route instead of an Ingress\n  #\n  openShiftRoute: false\n\n  # -- routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only\n  #\n  routeHttpHeaders: {}\n\n  # -- The class name used by the ingress controller if it's being used.\n  #\n  # Please follow documenation of your ingress controller. If the cluster\n  # contains multiple ingress controllers, this setting allows you to control\n  # which of them is used for Atlassian application traffic.\n  #\n  className: \"nginx\"\n\n  # -- Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx'\n  # controller.\n  # https://kubernetes.github.io/ingress-nginx/\n  #\n  # This will populate the Ingress Resource with annotations that are specific to\n  # the K8s ingress-nginx controller. Set to 'false' if a different controller is\n  # to be used, in which case the appropriate annotations for that controller must\n  # be specified below under 'ingress.annotations'.\n  #\n  nginx: true\n\n  # -- The max body size to allow. Requests exceeding this size will result\n  # in an HTTP 413 error being returned to the client.\n  #\n  maxBodySize: 250m\n\n  # -- Defines a timeout for establishing a connection with a proxied server. It should\n  # be noted that this timeout cannot usually exceed 75 seconds.\n  #\n  proxyConnectTimeout: 60\n\n  # -- Defines a timeout for reading a response from the proxied server. The timeout is\n  # set only between two successive read operations, not for the transmission of the\n  # whole response. If the proxied server does not transmit anything within this time,\n  # the connection is closed.\n  #\n  proxyReadTimeout: 60\n\n  # -- Sets a timeout for transmitting a request to the proxied server. The timeout is set\n  # only between two successive write operations, not for the transmission of the whole\n  # request. If the proxied server does not receive anything within this time, the\n  # connection is closed.\n  #\n  proxySendTimeout: 60\n\n  # -- The custom annotations that should be applied to the Ingress Resource.\n  # If using an ingress-nginx controller be sure that the annotations you add\n  # here are compatible with those already defined in the 'ingess.yaml' template\n  #\n  annotations: {}\n\n  # -- The name of the K8s Secret that contains the TLS private key and corresponding\n  # certificate. When utilised, TLS termination occurs at the ingress point where\n  # traffic to the Service and it's Pods is in plaintext.\n  #\n  # Usage is optional and depends on your use case. The Ingress Controller itself\n  # can also be configured with a TLS secret for all Ingress Resources.\n  # https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets\n  # https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n  #\n  tlsSecretName:\n\n  # -- Additional paths to be added to the Ingress resource to point to different backend services\n  #\n  additionalPaths: []\n    #- path: /static-content\n    #  pathType: Prefix\n    #  service: static-content-svc\n    #  portNumber: 80\n\n# Gateway API configuration\n#\n# Use this section when routing external traffic to Bamboo via the Kubernetes\n# Gateway API, or when using an external proxy/load balancer without creating\n# any K8s routing resource. Only one of 'ingress' or 'gateway' should be used.\n# https://gateway-api.sigs.k8s.io/\n#\ngateway:\n\n  # -- Set to 'true' if an HTTPRoute Resource should be created. This depends on a\n  # pre-provisioned Gateway API controller being available and a Gateway resource.\n  # Cannot be enabled if ingress.create is true.\n  #\n  create: false\n\n  # -- The hostnames that should be routed to Bamboo. At least one hostname\n  # is required when gateway.create is true. Setting hostnames activates gateway\n  # mode for product configuration even when gateway.create is false, allowing\n  # use with a pre-existing Gateway or external proxy.\n  # The first entry is used as the canonical hostname for base URL, proxy\n  # settings, and NOTES output — list the primary/public hostname first.\n  #\n  hostnames: []\n  # - bamboo.example.com\n  # - ci.example.com\n\n  # -- Whether users access the application over HTTPS.\n  # This does not configure TLS on the Gateway or load balancer — it must match\n  # how traffic is actually routed to the application.\n  #\n  https: true\n\n  # -- The port users connect on. Defaults to 443 (https) or 80 (http).\n  # This does not change the Gateway or load balancer port — it must match\n  # the port that is actually used. Only set for non-standard ports.\n  #\n  # externalPort:\n\n  # -- The base path for routing. When empty, falls back to the product's\n  # service.contextPath (same behavior as ingress). Set explicitly to\n  # override, e.g. \"/bamboo\".\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when gateway.create is true.\n  # They configure the HTTPRoute resource and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Reference to the parent Gateway resource. Supports any standard\n  # parentRef fields (name, namespace, sectionName, etc.).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference\n  #\n  parentRefs: []\n    # - name: example-gateway\n    #   namespace: example-gateway-namespace\n    #   sectionName: https\n\n  # -- Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\".\n  # PathPrefix is recommended for most use cases.\n  #\n  pathType: \"PathPrefix\"\n\n  # -- Annotations to add to the HTTPRoute resource.\n  #\n  annotations: {}\n  # kubernetes.io/ingress.class: gateway\n  # cert-manager.io/cluster-issuer: letsencrypt\n\n  # -- Labels to add to the HTTPRoute resource.\n  #\n  labels: {}\n  # environment: production\n  # team: platform\n\n  # -- HTTP filters to apply to requests. Can be used to add/remove headers,\n  # perform redirects, or rewrite URLs.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter\n  #\n  filters: []\n  # - type: RequestHeaderModifier\n  #   requestHeaderModifier:\n  #     add:\n  #     - name: X-Forwarded-Proto\n  #       value: https\n\n  # -- Advanced routing rules. Use this for complex routing scenarios like\n  # header-based routing, traffic splitting, or multiple backends.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule\n  #\n  additionalRules: []\n  # - matches:\n  #   - path:\n  #       type: PathPrefix\n  #       value: /api\n  #   backendRefs:\n  #   - name: bamboo-api\n  #     port: 8085\n\n  # -- Session affinity (sticky sessions) is required for Atlassian DC products but\n  # is not part of the standard Gateway API HTTPRoute spec. It must be configured\n  # separately through your Gateway implementation's own policy resources.\n  # See docs/docs/examples/ingress/GATEWAY_API_SESSION_AFFINITY.md for working examples.\n\n  # -- Timeout configuration for HTTPRoute rules.\n  # Note: when migrating from Ingress, these replace proxyReadTimeout and\n  # proxySendTimeout. There is no Gateway API equivalent for\n  # proxyConnectTimeout or maxBodySize — those require controller-specific\n  # policies (e.g. Envoy Gateway BackendTrafficPolicy).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts\n  #\n  timeouts:\n    request: \"60s\"\n    backendRequest: \"60s\"\n\n# Bamboo configuration\n#\nbamboo:\n\n  # -- Whether the main container should acquire helm release name. By default the container name is `bamboo` which corresponds to the name of the Helm Chart.\n  #\n  useHelmReleaseNameAsContainerName: false\n\n  # -- To skip the setup wizard post deployment set this property to 'true' and\n  # ensure values for all 'REQUIRED' and 'UNATTENDED-SETUP' stanzas\n  # (see banner of this file) have been supplied.\n  #\n  # For release 1.0.0 this value is by default set to 'true' and should not be changed.\n  #\n  unattendedSetup: true\n\n  # -- Override the server/agent broker URL; this is optional.\n  #\n  brokerUrl:\n\n  # The security token with which the agent will authenticate to the Bamboo server.\n  # The token should be set to a 40-character hexadecimal string. There are many ways\n  # to generate a hex string like this, here is one: \"xxd -l 20 -p /dev/urandom\"\n  # Additional details are here: https://confluence.atlassian.com/bamboo/agent-authentication-289277196.html\n  #\n  securityToken:\n\n    # -- The name of the K8s Secret that contains the security token. When specified the token\n    # will overrided the generated one. This secret should also be shared with the agent deployment.\n    # An Example of creating a K8s secret for the secret below:\n    # 'kubectl create secret generic <secret-name> --from-literal=security-token=<security token>'\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    # -- The key (default `secretKey`) in the Secret used to store the Bamboo shared key.\n    #\n    secretKey: security-token\n\n  # -- Whether to disable agent authentication. Setting this to true\n  # skips the agent approval step in the UI. For more information see:\n  # https://confluence.atlassian.com/bamboo/agent-authentication-289277196.html\n  #\n  # The default is false.\n  #\n  disableAgentAuth: false\n\n  # UNATTENDED-SETUP\n  #\n  # -- The Bamboo DC license that should be used.\n  # If supplied here the license configuration will be\n  # skipped in the setup wizard.\n  #\n  license:\n\n    # -- The secret that contains the license information\n    #\n    secretName:\n\n    # -- The key (default 'licenseKey') in the Secret used to store the license information\n    #\n    secretKey: license\n\n  # UNATTENDED-SETUP\n  #\n  # -- The admin user configuration, and credentials\n  # that Bamboo should use. If supplied here the admin\n  # configuration will be skipped in the setup wizard.\n  #\n  sysadminCredentials:\n\n    # -- The secret that contains the admin user information\n    #\n    secretName:\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin username\n    #\n    usernameSecretKey: username\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin password\n    #\n    passwordSecretKey: password\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin display name\n    #\n    displayNameSecretKey: displayName\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin email address\n    #\n    emailAddressSecretKey: emailAddress\n\n  # -- Bamboo can optionally import an existing exported dataset on\n  # first-run. These optional values can configure the import file or\n  # skip this stage entirely. For more details on importing and\n  # exporting see the documentation:\n  #\n  # https://confluence.atlassian.com/bamboo/exporting-data-for-backup-289277255.html\n  # https://confluence.atlassian.com/bamboo/importing-data-from-backup-289277260.html\n  #\n  import:\n\n    # -- Import type. Valid values are `clean` (for a new install) or\n    # `import`, in which case you should provide the file path. The\n    # default is `clean`.\n    #\n    type: clean\n\n    # -- Path to the existing export to import to the new\n    # installation. This should be accessible by the cluster node;\n    # e.g. via the shared-home or `additionalVolumeMounts` below.\n    #\n    path:\n\n  # K8s Service configuration\n  #\n  service:\n\n    # -- The port on which the Bamboo K8s Service will listen for http traffic\n    #\n    port: 80\n\n    # -- The type of K8s service to use for Bamboo\n    #\n    type: ClusterIP\n\n    # --  Only applicable if service.type is NodePort. NodePort for Bamboo service\n    #\n    nodePort:\n\n    # -- Session affinity type. If you want to make sure that connections from a particular client\n    # are passed to the same pod each time, set sessionAffinity to ClientIP.\n    # See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity\n    #\n    sessionAffinity: None\n\n    # -- Session affinity configuration\n    #\n    sessionAffinityConfig:\n\n      clientIP:\n\n        # -- Specifies the seconds of ClientIP type session sticky time.\n        # The value must be > 0 && <= 86400 (for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).\n        #\n        timeoutSeconds:\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- The Tomcat context path that Bamboo will use. The ATL_TOMCAT_CONTEXTPATH\n    # will be set automatically.\n    #\n    contextPath:\n\n    # -- Additional annotations to apply to the Service\n    #\n    annotations: {}\n\n  # K8s Service configuration for JMS\n  #\n  jmsService:\n\n    # -- Whether to create a separate Service for JMS Agent traffic\n    #\n    enabled: false\n\n    # -- The port on which the Bamboo K8s Service will listen for Agent traffic\n    #\n    port: 54663\n\n    # -- The type of K8s service to use for JMS\n    #\n    type: ClusterIP\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- Additional annotations to apply to the JMS Service\n    #\n    annotations: {}\n\n  # Standard K8s field that holds pod-level security attributes and common container settings.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  # Do not populate when deploying to OpenShift, unless anyuid policy is attached to a service account.\n\n  # -- Whether to apply security context to pod.\n  #\n  securityContextEnabled: true\n\n  securityContext:\n\n    # -- The GID used by the Bamboo docker image\n    # GID will default to 2005 if not supplied and securityContextEnabled is set to true.\n    # This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Bamboo container.\n    # However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260\n    #\n    fsGroup: 2005\n\n    # -- fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod.\n    # This field only applies to volume types that support fsGroup controlled ownership and permissions.\n    # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods\n    #\n    fsGroupChangePolicy: \"OnRootMismatch\"\n\n  # -- Standard K8s field that holds security configurations that will be applied to a container.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  #\n  containerSecurityContext: {}\n\n  # -- Boolean to define whether to set local home directory permissions on startup\n  # of Bamboo container. Set to 'false' to disable this behaviour.\n  #\n  setPermissions: true\n\n  # Port definitions\n  #\n  ports:\n\n    # -- The port on which the Bamboo container listens for HTTP traffic\n    #\n    http: 8085\n\n    # -- JMS port\n    #\n    jms: 54663\n\n  # Confirm that Bamboo is up and running with a ReadinessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes\n  #\n  readinessProbe:\n\n    # -- Whether to apply the readinessProbe check to pod.\n    #\n    enabled: true\n\n    # -- The initial delay (in seconds) for the Bamboo container readiness probe,\n    # after which the probe will start running.\n    #\n    initialDelaySeconds: 30\n\n    # -- How often (in seconds) the Bamboo container readiness probe will run\n    #\n    periodSeconds: 10\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Bamboo container readiness probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 30\n\n    # -- Custom ReadinessProbe to override the default /status httpGet\n    #\n    customProbe: {}\n#      tcpSocket:\n#        port: 8080\n#      periodSeconds: 5\n#      failureThreshold: 120\n\n  # Confirm that Bamboo is up and running with a StartupProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-startup-probes\n  #\n  startupProbe:\n\n    # -- Whether to apply the startupProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Bamboo container startup probe will run\n    #\n    periodSeconds: 5\n\n    # -- The number of consecutive failures of the Bamboo container startup probe\n    # before the pod fails startup checks.\n    #\n    failureThreshold: 120\n\n  # Ensure that the server responds with a LivenessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-tcp-liveness-probe\n  #\n  livenessProbe:\n\n    # -- Whether to apply the livenessProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Bamboo container liveness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Bamboo container liveness probe\n    # before the pod fails liveness checks.\n    #\n    failureThreshold: 12\n\n    # -- Custom livenessProbe to override the default tcpSocket probe\n    #\n    customProbe: {}\n\n  # Bamboo log configuration\n  #\n  accessLog:\n\n    # -- The path within the Bamboo container where the local-home volume should be\n    # mounted in order to capture access logs.\n    #\n    mountPath: \"/opt/atlassian/bamboo/logs\"\n\n    # -- The subdirectory within the local-home volume where access logs should be\n    # stored.\n    #\n    localHomeSubPath: \"log\"\n\n  shutdown:\n\n    # -- The termination grace period for pods during shutdown. This\n    # should be set to the internal grace period, plus a small buffer\n    # to allow the JVM to fully terminate.\n    #\n    terminationGracePeriodSeconds: 30\n\n    # -- By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/),\n    # using a script supplied by the Docker image. If any other\n    # shutdown behaviour is needed it can be achieved by overriding\n    # this value. Note that the shutdown command needs to wait for the\n    # application shutdown completely before exiting; see [the default\n    # command](https://bitbucket.org/atlassian-docker/docker-bamboo-server/src/master/shutdown-wait.sh)\n    # for details.\n    #\n    command: \"/shutdown-wait.sh\"\n\n  # -- PostStart is executed immediately after a container is created.\n  # However, there is no guarantee that the hook will execute before the container ENTRYPOINT.\n  # See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n  #\n  postStart:\n    command:\n\n  # Pod resource requests\n  #\n  resources:\n\n    # JVM Memory / Heap Size definitions. These values below are based on the\n    # defaults defined for the Bamboo docker container.\n    # https://bitbucket.org/atlassian-docker/docker-bamboo-server/src/master\n    #\n    jvm:\n\n      # -- The maximum amount of heap memory that will be used by the Bamboo JVM\n      #\n      maxHeap: \"1024m\"\n\n      # -- The minimum amount of heap memory that will be used by the Bamboo JVM\n      #\n      minHeap: \"512m\"\n\n    # Specifies the standard K8s resource requests and/or limits for the Bamboo\n    # container. It is important that if the memory resources are specified here,\n    # they must allow for the size of the Bamboo JVM. That means the maximum heap\n    # size, plus other JVM overheads, must be accommodated.\n    # Allowing for (maxHeap)*1.5 would be an example.\n    #\n    container:\n\n      requests:\n\n        # -- Initial CPU request by Bamboo pod\n        #\n        cpu: \"2\"\n\n        # -- Initial Memory request by Bamboo pod\n        #\n        memory: \"2G\"\n      #  limits:\n      #    cpu: \"2\"\n      #    memory: \"2G\"\n\n  # -- The Docker entrypoint.py generates application configuration on\n  # first start; not all of these files are regenerated on subsequent starts.\n  # By default, bamboo.cfg.xml is generated only once. Set `forceConfigUpdate` to true\n  # to change this behavior.\n  #\n  forceConfigUpdate: false\n\n  # -- Specifies a list of additional arguments that can be passed to the Bamboo JVM, e.g.\n  # system properties.\n  #\n  additionalJvmArgs: []\n\n  # -- By default Tomcat's server.xml is generated in the container entrypoint from a template\n  # shipped with an official Bamboo image. However, server.xml generation may fail if container\n  # is not run as root, which is a common case if Bamboo is deployed to OpenShift.\n  # See: https://bitbucket.org/atlassian-docker/docker-bamboo-server/src/master/README.md for a complete list of xml elements.\n  tomcatConfig:\n\n    # -- Mount server.xml as a ConfigMap. Override configuration elements if necessary\n    #\n    generateByHelm: false\n\n    mgmtPort: \"8005\"\n    port: \"8085\"\n    maxThreads: \"100\"\n    minSpareThreads: \"10\"\n    connectionTimeout: \"20000\"\n    enableLookups: \"false\"\n    protocol: \"HTTP/1.1\"\n    redirectPort: \"8443\"\n    acceptCount: \"100\"\n    # secure is set based on the https setting (gateway.https or ingress.https)\n    secure:\n    # scheme is set based on the https setting (http if false, https if true)\n    scheme:\n    # proxyName is set to the configured hostname (gateway.hostnames[0] or ingress.host)\n    proxyName:\n    # proxyPort is set to the external port (defaults to 443 for https, 80 for http)\n    proxyPort:\n    maxHttpHeaderSize: \"8192\"\n    address:\n    secret:\n    secretRequired:\n    bambooEncryptionKey:\n    sslEnabled:\n    sslProtocol:\n    sslCertificateFile:\n    sslCertificateKeyFile:\n    sslPass:\n    keystoreFile:\n    keystorePass:\n    keyPass:\n    clientAuth:\n    truststoreFile:\n    truststorePass:\n    compression:\n    compressibleMimeType:\n    compressionMinSize:\n    proxyInternalIps:\n    trustedProxies:\n    requestAttributesEnabled: \"false\"\n    accessLogMaxDays: \"-1\"\n    stuckThreadDetectionValveThreshold: \"120\"\n\n    # -- Custom server.xml to be mounted into /opt/atlassian/bamboo/conf\n    #\n    customServerXml: |\n#      <?xml version='1.0' encoding='utf-8'?>\n#      <Server port=\"8005\" shutdown=\"SHUTDOWN\">\n#      </Server>\n\n  # -- By default seraph-config.xml is generated in the container entrypoint from a template\n  # shipped with an official Bamboo image. However, seraph-config.xml generation may fail if container\n  # is not run as root, which is a common case if Bamboo is deployed to OpenShift.\n  #\n  seraphConfig:\n\n    # -- Mount seraph-config.xml as a ConfigMap. Override configuration elements if necessary\n    #\n    generateByHelm: false\n\n    autoLoginCookieAge: \"1209600\"\n\n  # -- Specifies a list of additional Java libraries that should be added to the\n  # Bamboo container. Each item in the list should specify the name of the volume\n  # that contains the library, as well as the name of the library file within that\n  # volume's root directory. Optionally, a subDirectory field can be included to\n  # specify which directory in the volume contains the library file. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  additionalLibraries: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n  # -- Specifies a list of additional Bamboo plugins that should be added to the\n  # Bamboo container. Note plugins installed via this method will appear as\n  # bundled plugins rather than user plugins. These should be specified in the same\n  # manner as the 'additionalLibraries' property. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  # NOTE: only .jar files can be loaded using this approach. OBR's can be extracted\n  # (unzipped) to access the associated .jar\n  #\n  # An alternative to this method is to install the plugins via \"Manage Apps\" in the\n  # product system administration UI.\n  #\n  additionalBundledPlugins: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n  # -- Defines any additional volumes mounts for the Bamboo container. These\n  # can refer to existing volumes, or new volumes can be defined via\n  # 'volumes.additional'.\n  #\n  additionalVolumeMounts: []\n\n  # -- Defines additional annotations to the Bamboo StateFulSet. This might be required when deploying using a GitOps approach\n  additionalAnnotations: {}\n  #  argocd.argoproj.io/sync-wave: \"10\"\n\n  # -- Defines any additional environment variables to be passed to the Bamboo\n  # container. See https://hub.docker.com/r/atlassian/bamboo for\n  # supported variables.\n  #\n  additionalEnvironmentVariables: []\n\n  # -- Defines any additional ports for the Bamboo container.\n  #\n  additionalPorts: []\n  #  - name: jmx\n  #    containerPort: 5555\n  #    protocol: TCP\n\n  # -- Defines additional volumeClaimTemplates that should be applied to the Bamboo pod.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in bamboo.additionalVolumeMounts\n  #\n  additionalVolumeClaimTemplates: []\n  #  - name: myadditionalvolumeclaim\n  #    storageClassName:\n  #    resources:\n  #      requests:\n  #        storage: 1Gi\n\n  # -- Defines topology spread constraints for Bamboo pods. See details:\n  # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n  #\n  topologySpreadConstraints: []\n  # - maxSkew: 1\n  #   topologyKey: kubernetes.io/hostname\n  #   whenUnsatisfiable: ScheduleAnyway\n  #   labelSelector:\n  #     matchLabels:\n\n  # -- Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates\n  #\n  additionalCertificates:\n    # -- Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data\n    # will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.\n    #\n    secretName:\n    # -- A list of secrets with their respective keys holding certificates to be added to the Java truststore.\n    # It is mandatory to specify which keys from secret data need to be mounted as files to the init container.\n    #\n    secretList: []\n    #- name: self-signed-ca\n    #  keys:\n    #    - ca.crt\n    #    - intermediate.crt\n    #- name: stg-intermediate\n    #  keys:\n    #    - stg.crt\n\n    # -- Custom command to be executed in the init container to import certificates\n    #\n    customCmd:\n\n    initContainer:\n      # -- Resources allocated to the import-certs init container\n      #\n\n      resources: {}\n      # -- Custom SecurityContext for the import-certs init container\n      #\n      securityContext: {}\n\n# Monitoring\n#\nmonitoring:\n\n  # -- Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter\n  #\n  exposeJmxMetrics: false\n\n  # --  JMX exporter init container configuration\n  #\n  jmxExporterInitContainer:\n\n    # -- The location of the JMX exporter jarfile in the JMX exporter image\n    # Leave blank for default bitnami image\n    #\n    jmxJarLocation:\n\n\n    # -- Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume.\n    # Set to false if running containers as root is not allowed in the cluster.\n    #\n    runAsRoot: true\n\n    # -- Custom SecurityContext for the jmx exporter init container\n    #\n    customSecurityContext: {}\n\n    # -- Resources requests and limits for the JMX exporter init container\n    # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n    #\n    resources: {}\n    #  requests:\n    #    cpu: \"1m\"\n    #    memory: \"20Mi\"\n    #  limits:\n    #    cpu: \"1\"\n    #    memory: \"1G\"\n\n  # -- Annotations added to the jmx service\n  #\n  jmxServiceAnnotations: {}\n\n  # -- Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar\n  # to shared home and provide an absolute path in jmxExporterCustomJarLocation\n  #\n  fetchJmxExporterJar: true\n\n  # -- Image repository with jmx_exporter jar\n  #\n  jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n  jmxExporterImageTag: 0.18.0\n\n  # -- Port number on which metrics will be available\n  #\n  jmxExporterPort: 9999\n\n  # -- JMX exporter port type\n  #\n  jmxExporterPortType: ClusterIP\n\n  # -- Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home\n  #\n  jmxExporterCustomJarLocation:\n\n  # -- Custom JMX config with the rules\n  #\n  jmxExporterCustomConfig: {}\n  #  rules:\n  #   - pattern: \".*\"\n\n  serviceMonitor:\n\n    # -- Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.\n    #\n    create: false\n\n    # -- ServiceMonitorSelector of the prometheus instance.\n    #\n    prometheusLabelSelector: {}\n      # release: prometheus\n\n    # -- Scrape interval for the JMX service.\n    #\n    scrapeIntervalSeconds: 30\n\n    # -- How long until a scrape request times out. It cannot be greater than the scrape interval.\n    #\n    scrapeTimeoutSeconds: 20\n\n  grafana:\n\n    # -- Create ConfigMaps with Grafana dashboards\n    #\n    createDashboards: false\n\n    # -- Label selector for Grafana dashboard importer sidecar\n    #\n    dashboardLabels: {}\n    # grafana_dashboard: dc_monitoring\n\n    # -- Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage\n    #\n    dashboardAnnotations: {}\n      # k8s-sidecar-target-directory: /tmp/dashboards/example-folder\n\n# Fluentd configuration\n#\n# Bamboo log collection and aggregation can be enabled using Fluentd. This config\n# assumes an existing ELK stack has been stood up and is available.\n# https://www.fluentd.org/\n#\nfluentd:\n\n  # -- Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod\n  #\n  enabled: false\n\n  # -- The Fluentd sidecar image repository\n  #\n  imageRepo: fluent/fluentd-kubernetes-daemonset\n\n  # -- The Fluentd sidecar image tag\n  #\n  imageTag: v1.11.5-debian-elasticsearch7-1.2\n\n  # -- Resources requests and limits for fluentd sidecar container\n  # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n  #\n  resources: {}\n  #  requests:\n  #    cpu: \"1m\"\n  #    memory: \"20Mi\"\n  #  limits:\n  #    cpu: \"1\"\n  #    memory: \"1G\"\n\n  # -- The command used to start Fluentd. If not supplied the default command\n  # will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"\n  #\n  # Note: The custom command can be free-form, however pay particular attention to\n  # the process that should ultimately be left running in the container. This process\n  # should be invoked with 'exec' so that signals are appropriately propagated to it,\n  # for instance SIGTERM. An example of how such a command may look is:\n  # \"<command 1> && <command 2> && exec <primary command>\"\n  command:\n\n  # -- Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default)\n  # should be used for Fluentd. If enabled this config must supplied via the\n  # 'fluentdCustomConfig' property below.\n  #\n  customConfigFile: false\n\n  # -- Custom fluent.conf file\n  #\n  fluentdCustomConfig: {}\n  # fluent.conf: |\n    # <source>\n    #   @type tail\n    #   <parse>\n    #   @type multiline\n    #   format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n    #   </parse>\n    #   path /opt/atlassian/bamboo/logs/access_log.*\n    #   pos_file /tmp/bamboolog.pos\n    #   tag bamboo-access-logs\n    # </source>\n\n  # -- The port on which the Fluentd sidecar will listen\n  #\n  httpPort: 9880\n\n  # Elasticsearch config based on your ELK stack\n  #\n  elasticsearch:\n\n    # -- Set to 'true' if Fluentd should send all log events to an Elasticsearch service.\n    #\n    enabled: true\n\n    # -- The hostname of the Elasticsearch service that Fluentd should send logs to.\n    #\n    hostname: elasticsearch\n\n    # -- The prefix of the Elasticsearch index name that will be used\n    #\n    indexNamePrefix: bamboo\n\n  # -- Specify custom volumes to be added to Fluentd container (e.g. more log sources)\n  #\n  extraVolumes: []\n  # - name: local-home\n  #   mountPath: /opt/atlassian/bamboo/logs\n  #   subPath: log\n  #   readOnly: true\n\n\n# -- Custom annotations that will be applied to all Bamboo pods\n#\npodAnnotations: {}\n#  name: <value>\n\n# -- Custom labels that will be applied to all Bamboo pods\n#\npodLabels: {}\n#  name: <value>\n\n# -- Standard K8s node-selectors that will be applied to all Bamboo pods\n#\nnodeSelector: {}\n#  name: <value>\n\n# -- Standard K8s tolerations that will be applied to all Bamboo pods\n#\ntolerations: []\n# - effect: <name>\n#   operator: <operator>\n#   key: <key>\n\n# -- Standard K8s affinities that will be applied to all Bamboo pods\n#\naffinity: {}\n#  name: <value>\n\n# -- Standard K8s schedulerName that will be applied to all Bamboo pods.\n# Check Kubernetes documentation on how to configure multiple schedulers:\n# https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n#\nschedulerName:\n\n# -- Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster.\n# For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n#\npriorityClassName:\n\n# -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n#\nhostNamespaces: {}\n\n# -- Additional container definitions that will be added to all Bamboo pods\n#\nadditionalContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional initContainer definitions that will be added to all Bamboo pods\n#\nadditionalInitContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional labels that should be applied to all resources\n#\nadditionalLabels: {}\n#  name: <value>\n\n# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be\n# mounted into service container. Configuration details below (camelCase is important!):\n  # 'name'      - References existing ConfigMap or secret name.\n  # 'type'      - 'configMap' or 'secret'\n  # 'key'       - The file name.\n  # 'mountPath' - The destination directory in a container.\n# VolumeMount and Volumes are added with this name and index position, for example;\n# custom-config-0, keystore-2\n#\nadditionalFiles: []\n#  - name: custom-config\n#    type: configMap\n#    key: log4j.properties\n#    mountPath:  /var/atlassian\n#  - name: custom-config\n#    type: configMap\n#    key: web.xml\n#    mountPath: /var/atlassian\n#  - name: keystore\n#    type: secret\n#    key: keystore.jks\n#    mountPath: /var/ssl\n\n# -- PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/\n# You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.\n#\npodDisruptionBudget:\n  enabled: false\n  labels: {}\n  annotations: {}\n  minAvailable:\n  maxUnavailable:\n\n# -- Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix\n# for a ConfigMap name, fileName is used as subPath\n#\nadditionalConfigMaps: []\n#  - name: extra-configmap\n#    keys:\n#      - fileName: hello.properties\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        defaultMode:\n#        content: |\n#          foo=bar\n#          hello=world\n#      - fileName: hello.xml\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        content: |\n#          <xml>\n#          </xml>\n\natlassianAnalyticsAndSupport:\n\n  analytics:\n\n    # -- Mount ConfigMap with selected Helm chart values as a JSON\n    # which DC products will read and send analytics events to Atlassian data pipelines\n    #\n    enabled: true\n\n  helmValues:\n\n    # -- Mount ConfigMap with selected Helm chart values as a YAML file\n    # which can be optionally including to support.zip\n    #\n    enabled: true\n\n# -- Metadata and pod spec for pods started in Helm tests\n#\ntestPods:\n  resources: {}\n  labels: {}\n  annotations: {}\n  nodeSelector: {}\n  tolerations: []\n  affinity: {}\n  schedulerName:\n  image:\n    permissionsTestContainer: debian:stable-slim\n    statusTestContainer: alpine:latest\n\nopenshift:\n\n  # -- When set to true, the containers will run with a restricted Security Context Constraint (SCC).\n  # See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html\n  # This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server\n  # configuration files as ConfigMaps.\n  #\n  runWithRestrictedSCC: false\n"
  },
  {
    "path": "src/main/charts/bamboo-agent/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n# Ignore non-template files from symlinked common_templates\ntemplates/common_templates/*.md\n"
  },
  {
    "path": "src/main/charts/bamboo-agent/Changelog.md",
    "content": "# Change Log\n\n## 2.0.13\n\n**Release date:** 2026-5-6\n\n![AppVersion: 12.1.6](https://img.shields.io/static/v1?label=AppVersion&message=12.1.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1114)\n\n## 2.0.12\n\n**Release date:** 2026-4-9\n\n![AppVersion: 12.1.3](https://img.shields.io/static/v1?label=AppVersion&message=12.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.11\n\n**Release date:** 2026-4-7\n\n![AppVersion: 12.1.3](https://img.shields.io/static/v1?label=AppVersion&message=12.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.10\n\n**Release date:** 2026-4-3\n\n![AppVersion: 12.1.3](https://img.shields.io/static/v1?label=AppVersion&message=12.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DEVPROD-3580: Add gateway api support (#1084)\n* Update appVersions for DC apps (#1100)\n\n## 2.0.9\n\n**Release date:** 2026-2-1\n\n![AppVersion: 12.1.1](https://img.shields.io/static/v1?label=AppVersion&message=12.1.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1074)\n\n## 2.0.8\n\n**Release date:** 2025-12-29\n\n![AppVersion: 12.1.0](https://img.shields.io/static/v1?label=AppVersion&message=12.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1070)\n\n## 2.0.7\n\n**Release date:** 2025-11-7\n\n![AppVersion: 11.0.8](https://img.shields.io/static/v1?label=AppVersion&message=11.0.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1058)\n\n## 2.0.6\n\n**Release date:** 2025-11-3\n\n![AppVersion: 11.0.7](https://img.shields.io/static/v1?label=AppVersion&message=11.0.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1052)\n\n## 2.0.5\n\n**Release date:** 2025-11-1\n\n![AppVersion: 11.0.5](https://img.shields.io/static/v1?label=AppVersion&message=11.0.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1049)\n\n## 2.0.4\n\n**Release date:** 2025-8-27\n\n![AppVersion: 11.0.4](https://img.shields.io/static/v1?label=AppVersion&message=11.0.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1029)\n\n## 2.0.3\n\n**Release date:** 2025-8-1\n\n![AppVersion: 11.0.3](https://img.shields.io/static/v1?label=AppVersion&message=11.0.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1022)\n\n## 2.0.2\n\n**Release date:** 2025-6-16\n\n![AppVersion: 11.0.2](https://img.shields.io/static/v1?label=AppVersion&message=11.0.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1014)\n\n## 2.0.1\n\n**Release date:** 2025-5-15\n\n![AppVersion: 11.0.1](https://img.shields.io/static/v1?label=AppVersion&message=11.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1005)\n\n## 2.0.0\n\n**Release date:** 2025-4-29\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.22.9\n\n**Release date:** 2025-4-22\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to declare additional ingress paths (#991)\n* Bring changelog in order (#990)\n\n## 1.22.8\n\n**Release date:** 2025-4-17\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\n\n## 1.22.7\n\n**Release date:** 2025-4-1\n\n![AppVersion: 10.2.3](https://img.shields.io/static/v1?label=AppVersion&message=10.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#977)\n\n## 1.22.6\n\n**Release date:** 2025-3-19\n\n![AppVersion: 10.2.2](https://img.shields.io/static/v1?label=AppVersion&message=10.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#969)\n\n## 1.22.5\n\n**Release date:** 2025-2-18\n\n![AppVersion: 10.2.1](https://img.shields.io/static/v1?label=AppVersion&message=10.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add tunnel config for Jira, hostNamespaces in all charts (#958)\n\n## 1.22.4\n\n**Release date:** 2025-1-30\n\n![AppVersion: 10.2.0](https://img.shields.io/static/v1?label=AppVersion&message=10.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.22.3\n\n**Release date:** 2025-1-13\n\n![AppVersion: 10.2.0](https://img.shields.io/static/v1?label=AppVersion&message=10.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#936)\n\n## 1.22.2\n\n**Release date:** 2024-12-16\n\n![AppVersion: 10.1.1](https://img.shields.io/static/v1?label=AppVersion&message=10.1.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#930)\n\n## 1.22.1\n\n**Release date:** 2024-12-3\n\n![AppVersion: 10.1.0](https://img.shields.io/static/v1?label=AppVersion&message=10.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#918)\n\n## 1.22.0\n\n**Release date:** 2024-11-15\n\n![AppVersion: 10.0.3](https://img.shields.io/static/v1?label=AppVersion&message=10.0.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#905)\n\n## 1.21.4\n\n**Release date:** 2024-10-1\n\n![AppVersion: 10.0.1](https://img.shields.io/static/v1?label=AppVersion&message=10.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#881)\n\n## 1.21.3\n\n**Release date:** 2024-9-10\n\n![AppVersion: 10.0.0](https://img.shields.io/static/v1?label=AppVersion&message=10.0.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update common dependency version (#878)\n\n## 1.21.2\n\n**Release date:** 2024-8-26\n\n![AppVersion: 10.0.0](https://img.shields.io/static/v1?label=AppVersion&message=10.0.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#869)\n\n## 1.21.1\n\n**Release date:** 2024-8-22\n\n![AppVersion: 9.6.5](https://img.shields.io/static/v1?label=AppVersion&message=9.6.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#865)\n\n## 1.21.0\n\n**Release date:** 2024-8-13\n\n![AppVersion: 9.6.4](https://img.shields.io/static/v1?label=AppVersion&message=9.6.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#858)\n* Make shared home pvc access mode configurable (#855)\n\n## 1.20.1\n\n**Release date:** 2024-7-7\n\n![AppVersion: 9.6.3](https://img.shields.io/static/v1?label=AppVersion&message=9.6.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#823)\n\n## 1.20.0\n\n**Release date:** 2024-5-13\n\n![AppVersion: 9.6.2](https://img.shields.io/static/v1?label=AppVersion&message=9.6.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#798)\n* Make server protocol configurable (#794)\n\n## 1.19.0\n\n**Release date:** 2024-4-22\n\n![AppVersion: 9.6.1](https://img.shields.io/static/v1?label=AppVersion&message=9.6.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#787)\n\n## 1.18.1\n\n**Release date:** 2024-3-26\n\n![AppVersion: 9.6.0](https://img.shields.io/static/v1?label=AppVersion&message=9.6.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#773)\n\n## 1.18.0\n\n**Release date:** 2024-2-27\n\n![AppVersion: 9.5.1](https://img.shields.io/static/v1?label=AppVersion&message=9.5.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* OpenShift Support (#752)\n* Update appVersions for DC apps (#762)\n* Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\n\n## 1.17.2\n\n**Release date:** 2023-12-18\n\n![AppVersion: 9.4.2](https://img.shields.io/static/v1?label=AppVersion&message=9.4.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* StatefulSet PVC auto deletion (#736)\n* Update appVersions for DC apps (#738)\n\n## 1.17.1\n\n**Release date:** 2023-12-11\n\n![AppVersion: 9.4.1](https://img.shields.io/static/v1?label=AppVersion&message=9.4.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.17.0\n\n**Release date:** 2023-12-7\n\n![AppVersion: 9.4.1](https://img.shields.io/static/v1?label=AppVersion&message=9.4.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make test pod metadata and spec configurable (#727)\n* Optional analytics/support ConfigMap (#721)\n* BAM-25528: Unset pre-stop hook for bamboo-agent (#719)\n\n## 1.16.6\n\n**Release date:** 2023-10-30\n\n![AppVersion: 9.4.0](https://img.shields.io/static/v1?label=AppVersion&message=9.4.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* JMX container resources (#707)\n\n## 1.16.5\n\n**Release date:** 2023-10-24\n\n![AppVersion: 9.3.4](https://img.shields.io/static/v1?label=AppVersion&message=9.3.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#697)\n\n## 1.16.4\n\n**Release date:** 2023-10-11\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.3\n\n**Release date:** 2023-10-11\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.2\n\n**Release date:** 2023-10-8\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add quote to podAnnotation templating (#678)\n\n## 1.16.1\n\n**Release date:** 2023-9-20\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.0\n\n**Release date:** 2023-9-18\n\n![AppVersion: 9.3.3](https://img.shields.io/static/v1?label=AppVersion&message=9.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Allow templating of pod annotations (#662)\n* Make securityContext configurable for jmx exporter init container (#670)\n\n## 1.15.3\n\n**Release date:** 2023-8-28\n\n![AppVersion: 9.3.2](https://img.shields.io/static/v1?label=AppVersion&message=9.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.15.2\n\n**Release date:** 2023-8-22\n\n![AppVersion: 9.3.2](https://img.shields.io/static/v1?label=AppVersion&message=9.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.15.1\n\n**Release date:** 2023-8-17\n\n![AppVersion: 9.3.2](https://img.shields.io/static/v1?label=AppVersion&message=9.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#643)\n\n## 1.15.0\n\n**Release date:** 2023-8-7\n\n![AppVersion: 9.3.1](https://img.shields.io/static/v1?label=AppVersion&message=9.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.14.1\n\n**Release date:** 2023-7-26\n\n![AppVersion: 9.3.1](https://img.shields.io/static/v1?label=AppVersion&message=9.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.14.0\n\n**Release date:** 2023-7-25\n\n![AppVersion: 9.3.1](https://img.shields.io/static/v1?label=AppVersion&message=9.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add liveness probes, make readinessProbes configurable (#626)\n* Add additionalFiles to bamboo-agent Helm chart (#625)\n* Add additionalVolumes and additionalVolumeMounts to bamboo-agent (#619)\n\n## 1.13.1\n\n**Release date:** 2023-6-28\n\n![AppVersion: 9.3.0](https://img.shields.io/static/v1?label=AppVersion&message=9.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\n\n## 1.13.0\n\n**Release date:** 2023-6-13\n\n![AppVersion: 9.3.0](https://img.shields.io/static/v1?label=AppVersion&message=9.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#599)\n* Bamboo dashboard (#588)\n* Expose JMX beans on http endpoint (#562)\n\n## 1.12.0\n\n**Release date:** 2023-4-18\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add priorityClassName to pod spec (#557)\n* Add hostAliases for all DC products (#556)\n\n## 1.11.0\n\n**Release date:** 2023-3-22\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#531)\n\n## 1.10.0\n\n**Release date:** 2023-2-20\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Bitbucket Mesh to Bitbucket Helm chart (#501)\n\n## 1.9.1\n\n**Release date:** 2023-2-16\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifact hub annotation yaml\n\n## 1.9.0\n\n**Release date:** 2023-2-15\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n## 1.8.1\n\n**Release date:** 2022-12-12\n\n![AppVersion: 9.0.1](https://img.shields.io/static/v1?label=AppVersion&message=9.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifacthub.io annotations\n\n## 1.8.0\n\n**Release date:** 2022-12-9\n\n![AppVersion: 9.0.1](https://img.shields.io/static/v1?label=AppVersion&message=9.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* CLIP-1644: Stop supporting 1.19-1.20 k8s (#486)\n* Update appVersion to 9.0.1\n\n## 1.7.1\n\n**Release date:** 2022-10-26\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Patch release to fix Artifacthub metadata\n\n## 1.7.0\n\n**Release date:** 2022-10-25\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Pin Python version to 3.9.14 (#468)\n* Update Bitbucket ingress testing values (#466)\n* Ingress Class Name is moved under spec field. (#451)\n* Make ATL_FORCE_CFG_UPDATE configurable in values.yaml (#454)\n* Add osquery related env vars for Terraform (#462)\n* AWS cleanup and log colletion from k8s (#461)\n\n## 1.6.0\n\n**Release date:** 2022-10-12\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Bamboo Agent updated to 9.0.0 (#455)\n\n## 1.5.0\n\n**Release date:** 2022-07-14\n\n![AppVersion: 8.2.4](https://img.shields.io/static/v1?label=AppVersion&message=8.2.4&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Bamboo Agent updated to 8.2.4 (#430)\n\n## 1.4.0\n\n**Release date:** 2022-05-25\n\n![AppVersion: 8.2.3](https://img.shields.io/static/v1?label=AppVersion&message=8.2.3&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make pod securityContext optional (#389)\n* Update Bamboo agent version to 8.2.3 (#412)\n\n\n## 1.3.0\n\n**Release date:** 2022-03-24\n\n![AppVersion: 8.1.3](https://img.shields.io/static/v1?label=AppVersion&message=8.1.3&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Bamboo version to 8.1.3 (#396)\n\n\n## 1.2.0\n\n**Release date:** 2022-02-14\n\n![AppVersion: 8.1.2-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.1.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCD-1452: Updated appVersion to the latest product LTS version. (#378)\n* Added end-to-end test for Bamboo Helm chart using Terraform (#375)\n* Improvements on [documentation](https://github.com/atlassian/data-center-helm-charts/) (#370)\n* Updated Atlassian charts to use common definitions (#303)\n* Added service account annotation (#363)\n\n\n## 1.0.0\n\n**Release date:** 2022-01-11\n\nThis is the first officially supported version of the Helm chart.\n\n![AppVersion: 8.1.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.1.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Support for defining podLabels (#366)\n* Support for defining podAnnotations (#341)\n\n## 0.0.2\n\n**Release date:** 2021-12-17\n\n![AppVersion: 8.1.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.1.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-738: Add topologySpreadConstraints to products (#351)\n* Add additionalPorts for the Bamboo Agent Deployment (#353)\n* BAMBK8S-86: Initial agent support (#335)\n\n## 0.0.1\n\nInitial release\n"
  },
  {
    "path": "src/main/charts/bamboo-agent/Chart.yaml",
    "content": "apiVersion: v2\nname: bamboo-agent\ndescription: A chart for installing Bamboo Data Center remote agents on \n  Kubernetes\ntype: application\nversion: '2.0.13'\nappVersion: 12.1.7\nkubeVersion: \">=1.21.x-0\"\nkeywords:\n- Bamboo\n- Bamboo Agent\n- Bamboo Data Center\n- Bamboo DC\n- Atlassian\nhome: https://www.atlassian.com/software/bamboo\nicon: https://atlassian.github.io/data-center-helm-charts/icons/bamboo.svg\nsources:\n- https://github.com/atlassian/data-center-helm-charts\n- https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\ndeprecated: false\nannotations:\n  artifacthub.io/containsSecurityUpdates: \"false\"\n  artifacthub.io/changes: |-\n    - \"Update appVersions for DC apps (#1114)\"\ndependencies:\n- name: common\n  version: 1.2.7\n  repository: https://atlassian.github.io/data-center-helm-charts\n"
  },
  {
    "path": "src/main/charts/bamboo-agent/README.md",
    "content": "# bamboo-agent\n\n![Version: 2.0.13](https://img.shields.io/badge/Version-2.0.13-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 12.1.7](https://img.shields.io/badge/AppVersion-12.1.7-informational?style=flat-square)\n\nA chart for installing Bamboo Data Center remote agents on Kubernetes\n\n**Homepage:** <https://www.atlassian.com/software/bamboo>\n\n## Source Code\n\n* <https://github.com/atlassian/data-center-helm-charts>\n* <https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base>\n\n## Requirements\n\nKubernetes: `>=1.21.x-0`\n\n| Repository | Name | Version |\n|------------|------|---------|\n| https://atlassian.github.io/data-center-helm-charts | common | 1.2.7 |\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| additionalContainers | list | `[]` | Additional container definitions that will be added to all Bamboo agent pods  |\n| additionalFiles | list | `[]` | Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into service container. Configuration details below (camelCase is important!): 'name'      - References existing ConfigMap or Secret name. 'type'      - 'configMap' or 'secret' 'key'       - The file name. 'mountPath' - The destination directory in a container. VolumeMount and Volumes are added with this name and index position, for example; custom-config-0, keystore-2  |\n| additionalHosts | list | `[]` | Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file. https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ |\n| additionalInitContainers | list | `[]` | Additional initContainer definitions that will be added to all Bamboo agent pods  |\n| additionalLabels | object | `{}` | Additional labels that should be applied to all resources  |\n| affinity | object | `{}` | Standard K8s affinities that will be applied to all Bamboo agent pods  |\n| agent.additionalEnvironmentVariables | list | `[]` | Defines any additional environment variables to be passed to the Bamboo agent container. See https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base for supported variables.  |\n| agent.additionalPorts | list | `[]` | Defines any additional ports for the Bamboo agent container.  |\n| agent.additionalVolumeMounts | object | `{}` | Defines any additional volume mounts for the Bamboo agent container. These can refer to existing volumes, or new volumes can be defined via 'volumes.additional'.  |\n| agent.containerSecurityContext | object | `{}` | Standard K8s field that holds security configurations that will be applied to a container. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/  |\n| agent.readinessProbe.command | string | `\"/probe-readiness.sh\"` | Command to use to check the readiness status. This is provided by the agent image.  |\n| agent.readinessProbe.failureThreshold | int | `30` | The number of consecutive failures of the Bamboo agent container readiness probe before the pod fails readiness checks.  |\n| agent.readinessProbe.initialDelaySeconds | int | `1` | The initial delay (in seconds) for the Bamboo agent container readiness probe, after which the probe will start running. When used in conjunction with a startupProbe this can be short.  |\n| agent.readinessProbe.periodSeconds | int | `5` | How often (in seconds) the Bamboo agent container readiness probe will run  |\n| agent.resources.container.requests.cpu | string | `\"1\"` | Initial CPU request by Bamboo agent pod  |\n| agent.resources.container.requests.memory | string | `\"2G\"` | Initial Memory request by Bamboo agent pod  |\n| agent.resources.jvm.maxHeap | string | `\"512m\"` | The maximum amount of heap memory that will be used by the Bamboo agent JVM  |\n| agent.resources.jvm.minHeap | string | `\"256m\"` | The minimum amount of heap memory that will be used by the Bamboo agent JVM  |\n| agent.securityContext.fsGroup | int | `2005` | The GID used by the Bamboo docker image GID will default to 2005 if not supplied and securityContextEnabled is set to true. This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Bamboo container. However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260  |\n| agent.securityContext.fsGroupChangePolicy | string | `\"OnRootMismatch\"` | fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod. This field only applies to volume types that support fsGroup controlled ownership and permissions. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods  |\n| agent.securityContextEnabled | bool | `true` | Whether to apply security context to pod.  |\n| agent.securityToken.secretKey | string | `\"security-token\"` |  |\n| agent.securityToken.secretName | string | `nil` | The name of the K8s Secret that contains the security token. When specified the token will be automatically utilised on agent boot. An Example of creating a K8s secret for the secret below: 'kubectl create secret generic <secret-name> --from-literal=security-token=<security token>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| agent.server | string | `nil` |  |\n| agent.serverProtocol | string | `\"http\"` | The network protocol used for accessing the Bamboo server. Valid values are \"http\" for unencrypted connections or \"https\" for encrypted connections using TLS/SSL.  |\n| agent.shutdown.command | string | `nil` | Custom command for a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/). Undefined by default which means no pre-stop hook is being executed when an agent container needs to be stopped and deleted  |\n| agent.shutdown.terminationGracePeriodSeconds | int | `30` | The termination grace period for pods during shutdown. This should be set to the internal grace period, plus a small buffer to allow the JVM to fully terminate.  |\n| agent.startupProbe.command | string | `\"/probe-startup.sh\"` | Command to use to check the startup status. This is provided by the agent image.  |\n| agent.startupProbe.failureThreshold | int | `120` | The number of consecutive failures of the Bamboo agent container startup probe before the pod fails readiness checks.  |\n| agent.startupProbe.initialDelaySeconds | int | `1` | The initial delay (in seconds) for the Bamboo agent container startup probe, after which the probe will start running.  |\n| agent.startupProbe.periodSeconds | int | `1` | How often (in seconds) the Bamboo agent container startup probe will run  |\n| agent.topologySpreadConstraints | list | `[]` | Defines topology spread constraints for Bamboo agent pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| image.pullPolicy | string | `\"IfNotPresent\"` | Image pull policy  |\n| image.repository | string | `\"atlassian/bamboo-agent-base\"` | The Bamboo agent Docker image to use https://hub.docker.com/r/atlassian/bamboo-agent-base  |\n| image.tag | string | `\"\"` | The docker image tag to be used - defaults to the Chart appVersion  |\n| nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Bamboo agent pods  |\n| openshift.runWithRestrictedSCC | bool | `false` | When set to true, the containers will run with a restricted Security Context Constraint (SCC). See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server configuration files as ConfigMaps.  |\n| podAnnotations | object | `{}` | Custom annotations that will be applied to all Bamboo agent pods  |\n| podLabels | object | `{}` | Custom labels that will be applied to all Bamboo agent pods  |\n| priorityClassName | string | `nil` | Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster. For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| replicaCount | int | `1` | The initial number of Bamboo agent pods that should be started at deployment time.  |\n| schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Bamboo agent pods. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| serviceAccount.annotations | object | `{}` | Annotations to add to the ServiceAccount (if created)  |\n| serviceAccount.create | bool | `true` | Set to 'true' if a ServiceAccount should be created, or 'false' if it already exists.  |\n| serviceAccount.imagePullSecrets | list | `[]` | For Docker images hosted in private registries, define the list of image pull secrets that should be utilized by the created ServiceAccount https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod  |\n| serviceAccount.name | string | `nil` | The name of the ServiceAccount to be used by the pods. If not specified, but the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name will be auto-generated, otherwise the 'default' ServiceAccount will be used. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server  |\n| tolerations | list | `[]` | Standard K8s tolerations that will be applied to all Bamboo agent pods  |\n| volumes | object | `{\"additional\":null}` | Defines additional volumes that should be applied to all Bamboo agent pods. Note that this will not create any corresponding volume mounts which need to be defined in bamboo.additionalVolumeMounts  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/main/charts/bamboo-agent/templates/NOTES.txt",
    "content": "Thank you for installing {{ title .Chart.Name }}.\n\nYour release is named {{ .Release.Name }}, and resides in namespace {{ .Release.Namespace }}.\n\nPlease run sanity tests against the release to verify it's healthy:\n\n  $ helm test {{ .Release.Name }} -n {{ .Release.Namespace }}\n\nIf the Kubernetes resources in the release are still starting up, then the tests may fail, so it\nis advisable to wait for the tests to pass before continuing.\n\nTo see the custom values you used for this release:\n\n  $ helm get values {{ .Release.Name }} -n {{ .Release.Namespace }}\n{{- if not .Values.agent.securityToken -}}\n\n#################################################################################\n######      WARNING: Security token not provided for authentication!!!      #####\n######      Agents will not be able to authenticate with Bamboo server.     #####\n#################################################################################\n{{- end }}\n{{- if not .Values.agent.server -}}\n\n#################################################################################\n######           WARNING: Bamboo Server URL not provided!!!                 #####\n######      Agents will not be able to connect to the Bamboo server.        #####\n#################################################################################\n{{- end }}\n\nFor further documentation, see https://atlassian.github.io/data-center-helm-charts/"
  },
  {
    "path": "src/main/charts/bamboo-agent/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nThe K8s DNS record for the Bamboo server service\n*/}}\n{{- define \"agent.bambooServerServiceDns\" -}}\n{{- if .Values.agent.server }}\n{{- printf \"%s://%s\" .Values.agent.serverProtocol .Values.agent.server }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe secret token with which to authenticate to the Bamboo server\n*/}}\n{{- define \"agent.securityToken\" -}}\n{{- if .Values.agent.securityToken }}\n{{- printf .Values.agent.securityToken }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe name of the service account to be used.\nIf the name is defined in the chart values, then use that,\nelse if we're creating a new service account then use the name of the Helm release,\nelse just use the \"default\" service account.\n*/}}\n{{- define \"agent.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.name -}}\n{{- .Values.serviceAccount.name -}}\n{{- else -}}\n{{- if .Values.serviceAccount.create -}}\n{{- include \"common.names.fullname\" . -}}\n{{- else -}}\ndefault\n{{- end -}}\n{{- end -}}\n{{- end }}\n\n{{/*\nPod labels\n*/}}\n{{- define \"agent.podLabels\" -}}\n{{ with .Values.podLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{- define \"agent.image\" -}}\n{{- if .Values.image.registry -}}\n{{ .Values.image.registry}}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- else -}}\n{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"agent.podAnnotations\" -}}\n{{- range $key, $value := .Values.podAnnotations }}\n{{ $key }}: {{ tpl $value $ | quote }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional init containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"agent.additionalInitContainers\" -}}\n{{- with .Values.additionalInitContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"agent.additionalContainers\" -}}\n{{- with .Values.additionalContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional ports here instead of in values.yaml to allow template overrides\n*/}}\n{{- define \"agent.additionalPorts\" -}}\n{{- with .Values.agent.additionalPorts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"agent.additionalEnvironmentVariables\" -}}\n{{- with .Values.agent.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional hosts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"agent.additionalHosts\" -}}\n{{- with .Values.additionalHosts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional volumes here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"agent.additionalVolumes\" -}}\n{{- with .Values.volumes.additional }}\n{{- toYaml . | nindent 0 }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional volume mounts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"agent.additionalVolumeMounts\" -}}\n{{- with .Values.agent.additionalVolumeMounts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bamboo-agent/templates/config-jvm.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jvm-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  max_heap: {{ .Values.agent.resources.jvm.maxHeap }}\n  min_heap: {{ .Values.agent.resources.jvm.minHeap }}"
  },
  {
    "path": "src/main/charts/bamboo-agent/templates/deployment-agent.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n  {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/config-jvm.yaml\") . | sha256sum }}\n        {{- include \"agent.podAnnotations\" . | nindent 8 }}\n      labels:\n        {{- include \"common.labels.selectorLabels\" . | nindent 8 }}\n        {{- include \"agent.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"agent.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.agent.shutdown.terminationGracePeriodSeconds }}\n      hostAliases:\n        {{- include \"agent.additionalHosts\" . | nindent 8 }}\n      {{- if .Values.openshift.runWithRestrictedSCC }}\n      {{- else }}\n      {{- if .Values.agent.securityContextEnabled }}\n      {{- with .Values.agent.securityContext }}\n      securityContext:\n        {{ toYaml . | nindent 8 }}\n        {{- $securityContext := . | default dict}}\n        {{- if not $securityContext.fsGroup }}\n        fsGroup: 2005\n        {{- end }}\n      {{- end }}\n      {{- end }}\n      {{- end }}\n      initContainers:\n        {{- include \"agent.additionalInitContainers\" . | nindent 8 }}\n      containers:\n        - name: {{ .Chart.Name }}\n          image: {{ include \"agent.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          env:\n            {{ with .Values.agent.securityToken.secretName }}\n            - name: SECURITY_TOKEN\n              valueFrom:\n                secretKeyRef:\n                  name: {{ . }}\n                  key: {{ $.Values.agent.securityToken.secretKey }}\n            {{ end }}\n            - name: BAMBOO_SERVER\n              value: {{ include \"agent.bambooServerServiceDns\" . }}\n            - name: WRAPPER_JAVA_INITMEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: WRAPPER_JAVA_MAXMEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            {{- include \"agent.additionalEnvironmentVariables\" . | nindent 12 }}\n\n          startupProbe:\n            exec:\n              command: [\"sh\", \"-c\", {{ .Values.agent.startupProbe.command | quote }}]\n            initialDelaySeconds: {{ .Values.agent.startupProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.agent.startupProbe.periodSeconds }}\n            failureThreshold: {{ .Values.agent.startupProbe.failureThreshold }}\n\n          readinessProbe:\n            exec:\n              command: [\"sh\", \"-c\", {{ .Values.agent.readinessProbe.command | quote }}]\n            initialDelaySeconds: {{ .Values.agent.readinessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.agent.readinessProbe.periodSeconds }}\n            failureThreshold: {{ .Values.agent.readinessProbe.failureThreshold }}\n\n          {{- with .Values.agent.containerSecurityContext}}\n          securityContext:\n          {{- toYaml . | nindent 12}}\n          {{- end}}\n\n          {{- with .Values.agent.resources.container }}\n          resources:\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          volumeMounts:\n            {{- include \"agent.additionalVolumeMounts\" . | nindent 12 }}\n            {{- range $i, $n := .Values.additionalFiles }}\n            - name: {{ .name }}-{{$i}}\n              mountPath: {{ .mountPath }}/{{ .key }}\n              subPath: {{ .key }}\n            {{ end }}\n          {{ if .Values.agent.additionalPorts }}\n          ports:\n          {{- include \"agent.additionalPorts\" . | nindent 12 }}\n          {{- end }}\n          {{- if .Values.agent.shutdown.command }}\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", {{ .Values.agent.shutdown.command | quote }}]\n          {{- end }}\n      {{- include \"agent.additionalContainers\" . | nindent 8 }}\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.agent.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.schedulerName }}\n      schedulerName: {{ .Values.schedulerName  | quote }}\n      {{- end }}\n      {{- if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n      {{- end }}\n      volumes:\n        {{ include \"agent.additionalVolumes\" . | nindent 8 }}\n        {{- range $i, $n := .Values.additionalFiles }}\n        - name: {{ .name }}-{{$i}}\n          {{ .type }}:\n            {{ if hasPrefix .type \"secret\" }}{{ .type}}Name{{ else }}name{{ end }}: {{ .name }}\n            items:\n              - key: {{ .key }}\n                path: {{ .key }}\n        {{ end }}\n"
  },
  {
    "path": "src/main/charts/bamboo-agent/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"agent.serviceAccountName\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- with .Values.serviceAccount.imagePullSecrets }}\nimagePullSecrets:\n  {{- toYaml . | nindent 2 }}\n{{- end -}}\n{{- end -}}"
  },
  {
    "path": "src/main/charts/bamboo-agent/values.yaml",
    "content": "## Atlassian Bamboo Data Center remote agent Helm values\n#\n# HEADS UP!\n#\n# A running and configured Bamboo server instance is a prerequisite for agent deployment!\n# Ensure that a valid security token and Bamboo server base URL have been supplied for the\n# relevant properties below i.e:\n# - agent.securityToken\n# - agent.server\n#\n# Additionally, the Bamboo server must have; \"Remote agent authentication\" *disabled* and\n# \"Security token verification\" *enabled*. Details on these features and how to enable\n# and disable them here:\n# https://confluence.atlassian.com/bamboo/agent-authentication-289277196.html\n##\n\n# -- The initial number of Bamboo agent pods that should be started at deployment time.\n#\nreplicaCount: 1\n\n# Image configuration\n#\nimage:\n\n  # -- The Bamboo agent Docker image to use\n  # https://hub.docker.com/r/atlassian/bamboo-agent-base\n  #\n  repository: atlassian/bamboo-agent-base\n\n  # -- Image pull policy\n  #\n  pullPolicy: IfNotPresent\n\n  # -- The docker image tag to be used - defaults to the Chart appVersion\n  #\n  tag: \"\"\n\n# K8s ServiceAccount configuration. Give fine-grained identity and authorization\n# to Pods\n#\nserviceAccount:\n\n  # -- Set to 'true' if a ServiceAccount should be created, or 'false' if it\n  # already exists.\n  #\n  create: true\n\n  # -- The name of the ServiceAccount to be used by the pods. If not specified, but\n  # the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name\n  # will be auto-generated, otherwise the 'default' ServiceAccount will be used.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server\n  #\n  name:\n\n  # -- For Docker images hosted in private registries, define the list of image pull\n  # secrets that should be utilized by the created ServiceAccount\n  # https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod\n  #\n  imagePullSecrets: []\n  # - name: secretName\n\n  # -- Annotations to add to the ServiceAccount (if created)\n  #\n  annotations: {}\n\n# Bamboo agent configuration\n#\nagent:\n\n  # The security token with which the agent will authenticate to the Bamboo server\n  # Additional details here:\n  # https://confluence.atlassian.com/bamboo/agent-authentication-289277196.html#Agentauthentication-SecuritytokenverificationSecuritytokenverification\n  #\n  securityToken:\n\n    # -- The name of the K8s Secret that contains the security token. When specified the token\n    # will be automatically utilised on agent boot. An Example of creating a K8s secret for the\n    # secret below:\n    # 'kubectl create secret generic <secret-name> --from-literal=security-token=<security token>'\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    secretKey: security-token\n\n  # The K8s DNS record for the Bamboo server service. Should be of the form, <service_name>.<namespace>.svc.cluster.local\n  # for example: \"bamboo-server.bamboo.svc.cluster.local\"\n  #\n  server:\n\n  # -- The network protocol used for accessing the Bamboo server. Valid values are \"http\" for unencrypted connections\n  # or \"https\" for encrypted connections using TLS/SSL.\n  #\n  serverProtocol: http\n\n  # Standard K8s field that holds pod-level security attributes and common container settings.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  # Do not populate when deploying to OpenShift, unless anyuid policy is attached to a service account.\n\n  # -- Whether to apply security context to pod.\n  #\n  securityContextEnabled: true\n\n  securityContext:\n\n    # -- The GID used by the Bamboo docker image\n    # GID will default to 2005 if not supplied and securityContextEnabled is set to true.\n    # This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Bamboo container.\n    # However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260\n    #\n    fsGroup: 2005\n\n    # -- fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod.\n    # This field only applies to volume types that support fsGroup controlled ownership and permissions.\n    # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods\n    #\n    fsGroupChangePolicy: \"OnRootMismatch\"\n\n  # -- Standard K8s field that holds security configurations that will be applied to a container.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  #\n  containerSecurityContext: { }\n\n  # Confirm that the Bamboo agent is up and running with a startupProbe\n  # and readinessProbe. The startupProbe waits until the wrapper and agent\n  # are running, and the readinessProbes checks for it's continuing availability.\n  # See: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/\n  #\n  # Currently the startup and readiness probes work in the same\n  # manner, however having a separate startup probe allows us to spin\n  # fast on startup, and then scale back for ongoing availability.\n  startupProbe:\n\n    # -- Command to use to check the startup status. This is provided by the agent image.\n    #\n    command: \"/probe-startup.sh\"\n\n    # -- The initial delay (in seconds) for the Bamboo agent container startup probe,\n    # after which the probe will start running.\n    #\n    initialDelaySeconds: 1\n\n    # -- How often (in seconds) the Bamboo agent container startup probe will run\n    #\n    periodSeconds: 1\n\n    # -- The number of consecutive failures of the Bamboo agent container startup probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 120\n\n  readinessProbe:\n\n    # -- Command to use to check the readiness status. This is provided by the agent image.\n    #\n    command: \"/probe-readiness.sh\"\n\n    # -- The initial delay (in seconds) for the Bamboo agent container\n    # readiness probe, after which the probe will start running. When\n    # used in conjunction with a startupProbe this can be short.\n    #\n    initialDelaySeconds: 1\n\n    # -- How often (in seconds) the Bamboo agent container readiness probe will run\n    #\n    periodSeconds: 5\n\n    # -- The number of consecutive failures of the Bamboo agent container readiness probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 30\n\n  shutdown:\n\n    # -- The termination grace period for pods during shutdown. This\n    # should be set to the internal grace period, plus a small buffer\n    # to allow the JVM to fully terminate.\n    #\n    terminationGracePeriodSeconds: 30\n\n    # -- Custom command for a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/).\n    # Undefined by default which means no pre-stop hook is being executed when an agent container needs to be stopped and deleted\n    #\n    command:\n\n  # Pod resource requests\n  #\n  resources:\n\n    # JVM Memory / Heap Size definitions. These values below are based on the\n    # defaults defined for the Bamboo agent docker container.\n    # https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base\n    #\n    jvm:\n\n      # -- The maximum amount of heap memory that will be used by the Bamboo agent JVM\n      #\n      maxHeap: \"512m\"\n\n      # -- The minimum amount of heap memory that will be used by the Bamboo agent JVM\n      #\n      minHeap: \"256m\"\n\n    # Specifies the standard K8s resource requests and/or limits for the Bamboo agent\n    # container. It is important that if the memory resources are specified here,\n    # they must allow for the size of the Bamboo agent JVM. That means the maximum heap\n    # size, plus other JVM overheads, must be accommodated.\n    # Allowing for (maxHeap)*1.5 would be an example.\n    #\n    container:\n\n      requests:\n\n        # -- Initial CPU request by Bamboo agent pod\n        #\n        cpu: \"1\" # If changing the cpu value update 'ActiveProcessorCount' below\n\n        # -- Initial Memory request by Bamboo agent pod\n        #\n        memory: \"2G\"\n      #  limits:\n      #    cpu: \"2\"\n      #    memory: \"2G\"\n\n  # -- Defines any additional environment variables to be passed to the Bamboo agent\n  # container. See https://bitbucket.org/atlassian-docker/docker-bamboo-agent-base for\n  # supported variables.\n  #\n  additionalEnvironmentVariables: []\n\n  # -- Defines any additional ports for the Bamboo agent container.\n  #\n  additionalPorts: []\n  #  - name: jmx\n  #    containerPort: 5555\n  #    protocol: TCP\n\n  # -- Defines any additional volume mounts for the Bamboo agent container. These\n  # can refer to existing volumes, or new volumes can be defined via\n  # 'volumes.additional'.\n  #\n  additionalVolumeMounts: {}\n\n  # -- Defines topology spread constraints for Bamboo agent pods. See details:\n  # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n  #\n  topologySpreadConstraints: []\n    # - maxSkew: 1\n    #   topologyKey: kubernetes.io/hostname\n    #   whenUnsatisfiable: ScheduleAnyway\n    #   labelSelector:\n    #     matchLabels:\n\n\n# -- Custom annotations that will be applied to all Bamboo agent pods\n#\npodAnnotations: {}\n#  name: <value>\n\n# -- Custom labels that will be applied to all Bamboo agent pods\n#\npodLabels: {}\n#  name: <value>\n\n# -- Standard K8s node-selectors that will be applied to all Bamboo agent pods\n#\nnodeSelector: {}\n#  name: <value>\n\n# -- Standard K8s tolerations that will be applied to all Bamboo agent pods\n#\ntolerations: []\n# - effect: <name>\n#   operator: <operator>\n#   key: <key>\n\n# -- Standard K8s affinities that will be applied to all Bamboo agent pods\n#\naffinity: {}\n#  name: <value>\n\n# -- Standard K8s schedulerName that will be applied to all Bamboo agent pods.\n# Check Kubernetes documentation on how to configure multiple schedulers:\n# https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n#\nschedulerName:\n\n# -- Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster.\n# For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n#\npriorityClassName:\n\n# -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n#\nhostNamespaces: {}\n\n# -- Defines additional volumes that should be applied to all Bamboo agent pods.\n# Note that this will not create any corresponding volume mounts\n# which need to be defined in bamboo.additionalVolumeMounts\n#\nvolumes:\n  additional:\n\n# -- Additional container definitions that will be added to all Bamboo agent pods\n#\nadditionalContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional initContainer definitions that will be added to all Bamboo agent pods\n#\nadditionalInitContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional labels that should be applied to all resources\n#\nadditionalLabels: {}\n#  name: <value>\n\n# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be\n# mounted into service container. Configuration details below (camelCase is important!):\n  # 'name'      - References existing ConfigMap or Secret name.\n  # 'type'      - 'configMap' or 'secret'\n  # 'key'       - The file name.\n  # 'mountPath' - The destination directory in a container.\n# VolumeMount and Volumes are added with this name and index position, for example;\n# custom-config-0, keystore-2\n#\nadditionalFiles: []\n#  - name: custom-config\n#    type: configMap\n#    key: log4j.properties\n#    mountPath:  /var/atlassian\n#  - name: custom-config\n#    type: configMap\n#    key: web.xml\n#    mountPath: /var/atlassian\n#  - name: keystore\n#    type: secret\n#    key: keystore.jks\n#    mountPath: /var/ssl\n\n# -- Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file.\n# https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\nadditionalHosts: []\n#  - ip: \"127.0.0.1\"\n#    hostnames:\n#    - \"foo.local\"\n#    - \"bar.local\"\n\nopenshift:\n\n  # -- When set to true, the containers will run with a restricted Security Context Constraint (SCC).\n  # See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html\n  # This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server\n  # configuration files as ConfigMaps.\n  #\n  runWithRestrictedSCC: false\n"
  },
  {
    "path": "src/main/charts/bitbucket/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n# Ignore non-template files from symlinked common_templates\ntemplates/common_templates/*.md\n"
  },
  {
    "path": "src/main/charts/bitbucket/Changelog.md",
    "content": "# Change Log\n\n## 2.0.13\n\n**Release date:** 2026-5-6\n\n![AppVersion: 10.2.2](https://img.shields.io/static/v1?label=AppVersion&message=10.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1114)\n\n## 2.0.12\n\n**Release date:** 2026-4-9\n\n![AppVersion: 10.2.1](https://img.shields.io/static/v1?label=AppVersion&message=10.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.11\n\n**Release date:** 2026-4-7\n\n![AppVersion: 10.2.1](https://img.shields.io/static/v1?label=AppVersion&message=10.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.10\n\n**Release date:** 2026-4-3\n\n![AppVersion: 10.2.1](https://img.shields.io/static/v1?label=AppVersion&message=10.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DEVPROD-3580: Add gateway api support (#1084)\n* Update appVersions for DC apps (#1100)\n\n## 2.0.9\n\n**Release date:** 2026-2-1\n\n![AppVersion: 9.4.16](https://img.shields.io/static/v1?label=AppVersion&message=9.4.16&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix nodeport svc (#1076)\n* Update appVersions for DC apps (#1075)\n\n## 2.0.8\n\n**Release date:** 2025-12-29\n\n![AppVersion: 9.4.15](https://img.shields.io/static/v1?label=AppVersion&message=9.4.15&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1071)\n* feat: Added scrape timeout configuration on servicemonitor (#1067)\n\n## 2.0.7\n\n**Release date:** 2025-11-7\n\n![AppVersion: 9.4.12](https://img.shields.io/static/v1?label=AppVersion&message=9.4.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.6\n\n**Release date:** 2025-11-3\n\n![AppVersion: 9.4.12](https://img.shields.io/static/v1?label=AppVersion&message=9.4.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\n\n## 2.0.5\n\n**Release date:** 2025-11-1\n\n![AppVersion: 9.4.12](https://img.shields.io/static/v1?label=AppVersion&message=9.4.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1049)\n\n## 2.0.4\n\n**Release date:** 2025-8-27\n\n![AppVersion: 9.4.8](https://img.shields.io/static/v1?label=AppVersion&message=9.4.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Update Bitnami image references due to deprecation notice (#1037)\n\n## 2.0.3\n\n**Release date:** 2025-8-1\n\n![AppVersion: 9.4.8](https://img.shields.io/static/v1?label=AppVersion&message=9.4.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1022)\n\n## 2.0.2\n\n**Release date:** 2025-6-16\n\n![AppVersion: 9.4.7](https://img.shields.io/static/v1?label=AppVersion&message=9.4.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1015)\n* Make linter happy (#1011)\n\n## 2.0.1\n\n**Release date:** 2025-5-15\n\n![AppVersion: 9.4.6](https://img.shields.io/static/v1?label=AppVersion&message=9.4.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1006)\n\n## 2.0.0\n\nThis release includes breaking changes. See [Breaking Changes](https://github.com/atlassian/data-center-helm-charts/blob/main/BREAKING_CHANGES.md)\n\n**Release date:** 2025-4-29\n\n![AppVersion: 9.4.5](https://img.shields.io/static/v1?label=AppVersion&message=9.4.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Remove condition to support legacy securityContext format (#1000)\n\n## 1.22.9\n\n**Release date:** 2025-4-22\n\n![AppVersion: 9.4.5](https://img.shields.io/static/v1?label=AppVersion&message=9.4.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to declare additional ingress paths (#991)\n* Bring changelog in order (#990)\n\n## 1.22.8\n\n**Release date:** 2025-4-17\n\n![AppVersion: 9.4.5](https://img.shields.io/static/v1?label=AppVersion&message=9.4.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\n* Update appVersions for DC apps (#983)\n\n## 1.22.7\n\n**Release date:** 2025-4-1\n\n![AppVersion: 9.4.4](https://img.shields.io/static/v1?label=AppVersion&message=9.4.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update documentation related to Bitbucket shared home requirements (#974)\n\n## 1.22.6\n\n**Release date:** 2025-3-19\n\n![AppVersion: 9.4.3](https://img.shields.io/static/v1?label=AppVersion&message=9.4.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.22.5\n\n**Release date:** 2025-2-18\n\n![AppVersion: 9.4.3](https://img.shields.io/static/v1?label=AppVersion&message=9.4.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#959)\n* Add tunnel config for Jira, hostNamespaces in all charts (#958)\n* Allow setting subPath for local-home volumes (#947)\n\n## 1.22.4\n\n**Release date:** 2025-1-30\n\n![AppVersion: 9.4.2](https://img.shields.io/static/v1?label=AppVersion&message=9.4.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Round up fractional cpu values for ActiveProcessorsCount (#944)\n\n## 1.22.3\n\n**Release date:** 2025-1-13\n\n![AppVersion: 9.4.1](https://img.shields.io/static/v1?label=AppVersion&message=9.4.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set custom securityContext for import-certs init container. Make affinity independent for Synchrony (#938)\n\n## 1.22.2\n\n**Release date:** 2024-12-16\n\n![AppVersion: 9.4.1](https://img.shields.io/static/v1?label=AppVersion&message=9.4.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#933)\n* Make it possible to set nodePort in services (#931)\n\n## 1.22.1\n\n**Release date:** 2024-12-3\n\n![AppVersion: 9.4.0](https://img.shields.io/static/v1?label=AppVersion&message=9.4.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Bitbucket and Confluence LTS versions (#924)\n* Update Grafana dashboards for DC apps (#915)\n\n## 1.22.0\n\n**Release date:** 2024-11-15\n\n![AppVersion: 8.19.11](https://img.shields.io/static/v1?label=AppVersion&message=8.19.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#905)\n* Updated pod labels for all products (#901)\n* Unset IDs for all the Grafana dashboards (#889)\n\n## 1.21.4\n\n**Release date:** 2024-10-1\n\n![AppVersion: 8.19.9](https://img.shields.io/static/v1?label=AppVersion&message=8.19.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#881)\n\n## 1.21.3\n\n**Release date:** 2024-9-10\n\n![AppVersion: 8.19.8](https://img.shields.io/static/v1?label=AppVersion&message=8.19.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update common dependency version (#878)\n\n## 1.21.2\n\n**Release date:** 2024-8-26\n\n![AppVersion: 8.19.7](https://img.shields.io/static/v1?label=AppVersion&message=8.19.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#869)\n\n## 1.21.1\n\n**Release date:** 2024-8-22\n\n![AppVersion: 8.19.7](https://img.shields.io/static/v1?label=AppVersion&message=8.19.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#865)\n\n## 1.21.0\n\n**Release date:** 2024-8-13\n\n![AppVersion: 8.19.6](https://img.shields.io/static/v1?label=AppVersion&message=8.19.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Added annotations to the StatefulSets (#857)\n* Update appVersions for DC apps (#858)\n* Make shared home pvc access mode configurable (#855)\n* Allow referencing multiple secrets in additionalCertificates (#852)\n* Make it possible to define resources for import-certs init container (#851)\n* Move update strategy to root level (#849)\n* Add helm value for custom jmx jar location when using other jmx init container images (#846)\n* feat: add appProtocol for service meshes (#847)\n* Make StatefulSet updateStrategy configurable (#845)\n\n## 1.20.1\n\n**Release date:** 2024-7-7\n\n![AppVersion: 8.19.5](https://img.shields.io/static/v1?label=AppVersion&message=8.19.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#823)\n\n## 1.20.0\n\n**Release date:** 2024-5-13\n\n![AppVersion: 8.19.3](https://img.shields.io/static/v1?label=AppVersion&message=8.19.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Optionally install OpenSearch helm chart with Bitbucket (#804)\n\n## 1.19.0\n\n**Release date:** 2024-4-22\n\n![AppVersion: 8.19.1](https://img.shields.io/static/v1?label=AppVersion&message=8.19.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make cacerts writable for user and group (#790)\n\n## 1.18.1\n\n**Release date:** 2024-3-26\n\n![AppVersion: 8.19.0](https://img.shields.io/static/v1?label=AppVersion&message=8.19.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Get rid of server repo references (#777)\n\n## 1.18.0\n\n**Release date:** 2024-2-27\n\n![AppVersion: 8.9.10](https://img.shields.io/static/v1?label=AppVersion&message=8.9.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Openshift analytics (#763)\n* Update appVersions for DC apps (#765)\n* OpenShift Support (#752)\n* Use testPods values for test images and container resources (#761)\n* Relabel instance name on jmx service monitor (#757)\n* Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\n\n## 1.17.2\n\n**Release date:** 2023-12-18\n\n![AppVersion: 8.9.8](https://img.shields.io/static/v1?label=AppVersion&message=8.9.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* StatefulSet PVC auto deletion (#736)\n* Update appVersions for DC apps (#738)\n* Add optional postStart hook (#735)\n\n## 1.17.1\n\n**Release date:** 2023-12-11\n\n![AppVersion: 8.9.7](https://img.shields.io/static/v1?label=AppVersion&message=8.9.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make liveness probe configurable (#732)\n\n## 1.17.0\n\n**Release date:** 2023-12-7\n\n![AppVersion: 8.9.7](https://img.shields.io/static/v1?label=AppVersion&message=8.9.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make test pod metadata and spec configurable (#727)\n* Optional analytics/support ConfigMap (#721)\n* Fix ingress annotations comment (#720)\n\n## 1.16.6\n\n**Release date:** 2023-10-30\n\n![AppVersion: 8.9.6](https://img.shields.io/static/v1?label=AppVersion&message=8.9.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* JMX container resources (#707)\n\n## 1.16.5\n\n**Release date:** 2023-10-24\n\n![AppVersion: 8.9.6](https://img.shields.io/static/v1?label=AppVersion&message=8.9.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix custom jmx config (#699)\n* Fix jmx init container for Bitbucket mirror (#695)\n* Copy cacerts first, then import certs (#696)\n\n## 1.16.4\n\n**Release date:** 2023-10-11\n\n![AppVersion: 8.9.5](https://img.shields.io/static/v1?label=AppVersion&message=8.9.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix hazelcast svc type (#689)\n\n## 1.16.3\n\n**Release date:** 2023-10-11\n\n![AppVersion: 8.9.5](https://img.shields.io/static/v1?label=AppVersion&message=8.9.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to create a dedicated hazelcast svc (#686)\n\n## 1.16.2\n\n**Release date:** 2023-10-8\n\n![AppVersion: 8.9.5](https://img.shields.io/static/v1?label=AppVersion&message=8.9.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add quote to podAnnotation templating (#678)\n\n## 1.16.1\n\n**Release date:** 2023-9-20\n\n![AppVersion: 8.9.5](https://img.shields.io/static/v1?label=AppVersion&message=8.9.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to use one Bitbucket svc for http and ssh without an ingress (#675)\n\n## 1.16.0\n\n**Release date:** 2023-9-18\n\n![AppVersion: 8.9.5](https://img.shields.io/static/v1?label=AppVersion&message=8.9.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Allow templating of pod annotations (#662)\n* Make securityContext configurable for jmx exporter init container (#670)\n* Add user provided certificates to the default Java truststore (#663)\n\n## 1.15.3\n\n**Release date:** 2023-8-28\n\n![AppVersion: 8.9.4](https://img.shields.io/static/v1?label=AppVersion&message=8.9.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Decouple server and jmx annotations (#654)\n* Disable startup probes by default (#653)\n\n## 1.15.2\n\n**Release date:** 2023-8-22\n\n![AppVersion: 8.9.4](https://img.shields.io/static/v1?label=AppVersion&message=8.9.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add defaultMode to additionalConfigMaps (#647)\n\n## 1.15.1\n\n**Release date:** 2023-8-17\n\n![AppVersion: 8.9.4](https://img.shields.io/static/v1?label=AppVersion&message=8.9.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make startup probes optional (#646)\n\n## 1.15.0\n\n**Release date:** 2023-8-7\n\n![AppVersion: 8.9.3](https://img.shields.io/static/v1?label=AppVersion&message=8.9.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\n* Add annotations to Grafana dashboards ConfigMaps (#637)\n* Add additional ConfigMaps to Helm Charts (#635)\n\n## 1.14.1\n\n**Release date:** 2023-7-26\n\n![AppVersion: 8.9.3](https://img.shields.io/static/v1?label=AppVersion&message=8.9.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Disable liveness probes by default, make timeoutSeconds configurable (#630)\n\n## 1.14.0\n\n**Release date:** 2023-7-25\n\n![AppVersion: 8.9.3](https://img.shields.io/static/v1?label=AppVersion&message=8.9.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add liveness probes, make readinessProbes configurable (#626)\n* make sharedHome.permissionFix.command helper to be per-product (#622)\n\n## 1.13.1\n\n**Release date:** 2023-6-28\n\n![AppVersion: 8.9.2](https://img.shields.io/static/v1?label=AppVersion&message=8.9.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\n\n## 1.13.0\n\n**Release date:** 2023-6-13\n\n![AppVersion: 8.9.1](https://img.shields.io/static/v1?label=AppVersion&message=8.9.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#599)\n* Bamboo dashboard (#588)\n* Update Grafana dashboards for Bitbucket (#586)\n* Add Bitbucket Mesh Grafana dashboards (#583)\n* Add Bitbucket server dashboards to Helm chart (#585)\n* Pass javaagent to mesh JVM (#584)\n* Make sessionAffinity configurable in service spec (#582)\n* Add optional ServiceMonitors to DC Helm Charts (#573)\n* Expose JMX beans on http endpoint (#562)\n\n## 1.12.0\n\n**Release date:** 2023-4-18\n\n![AppVersion: 8.9.0](https://img.shields.io/static/v1?label=AppVersion&message=8.9.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add priorityClassName to pod spec (#557)\n* Add hostAliases for all DC products (#556)\n* Update appVersions for DC apps (#558)\n\n## 1.11.0\n\n**Release date:** 2023-3-22\n\n![AppVersion: 7.21.10](https://img.shields.io/static/v1?label=AppVersion&message=7.21.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#531)\n\n## 1.10.0\n\n**Release date:** 2023-2-20\n\n![AppVersion: 7.21.10](https://img.shields.io/static/v1?label=AppVersion&message=7.21.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Bitbucket Mesh to Bitbucket Helm chart (#501)\n\n## 1.9.1\n\n**Release date:** 2023-2-16\n\n![AppVersion: 7.21.10](https://img.shields.io/static/v1?label=AppVersion&message=7.21.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifact hub annotation yaml\n\n## 1.9.0\n\n**Release date:** 2023-2-15\n\n![AppVersion: 7.21.10](https://img.shields.io/static/v1?label=AppVersion&message=7.21.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersion to the latest LTS (#515)\n\n## 1.8.1\n\n**Release date:** 2022-12-12\n\n![AppVersion: 7.21.7](https://img.shields.io/static/v1?label=AppVersion&message=7.21.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifacthub.io annotations\n\n## 1.8.0\n\n**Release date:** 2022-12-9\n\n![AppVersion: 7.21.7](https://img.shields.io/static/v1?label=AppVersion&message=7.21.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* CLIP-1644: Stop supporting 1.19-1.20 k8s (#486)\n* CLIP-1702: Create Role instead of ClusterRole for Hazelcast Kube client in Confluence and Bitbucket Helm charts (#470)\n* Update appVersion to 7.21.7\n* Use `ingress.https` flag to enable tls in ingress (#487)\n* Replace deprecated `ELASTICSEARCH_ENABLED` with `SEARCH_ENABLED` env var (#488)\n\n## 1.7.1\n\n**Release date:** 2022-10-26\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Patch release to fix Artifacthub metadata\n\n## 1.7.0\n\n**Release date:** 2022-10-25\n\n![AppVersion: 7.21.5](https://img.shields.io/static/v1?label=AppVersion&message=7.21.5&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Pin Python version to 3.9.14 (#468)\n* Update Bitbucket ingress testing values (#466)\n* Ingress Class Name is moved under spec field. (#451)\n* Make ATL_FORCE_CFG_UPDATE configurable in values.yaml (#454)\n* Add osquery related env vars for Terraform (#462)\n* AWS cleanup and log colletion from k8s (#461)\n\n## 1.6.0\n\n**Release date:** 2022-10-12\n\n![AppVersion: 7.21.5](https://img.shields.io/static/v1?label=AppVersion&message=7.21.5&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Bitbucket version to 7.21.5 (#455)\n* Improved documentation (#448, #440)\n\n\n## 1.5.0\n\n**Release date:** 2022-07-14\n\n![AppVersion: 7.21.2](https://img.shields.io/static/v1?label=AppVersion&message=7.21.2&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix: Use the custom ports for Bitbucket service (#419)\n* Update Bitbucket version to 7.21.2 (#430)\n\n## 1.4.0\n\n**Release date:** 2022-05-25\n\n![AppVersion: 7.21.1](https://img.shields.io/static/v1?label=AppVersion&message=7.21.1&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Remove emptyDir from Bitbucket shared home volume options (#386)\n* Make pod securityContext optional (#389)\n* Support for configuring ingress proxy settings via values.yaml (#402)\n* Update Bitbucket version to 7.21.1 (#412)\n\n## 1.3.0\n\n**Release date:** 2022-03-24\n\n![AppVersion: 7.21.0](https://img.shields.io/static/v1?label=AppVersion&message=7.21.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Update Bitbucket version to 7.21.0 (#396)\n\n## 1.2.0\n\n**Release date:** 2022-02-14\n\n![AppVersion: 7.17.5-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.17.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Use volumeName only if explicitly defined (#372)\n* Fixed templating of PLUGIN_SSH_BASEURL with custom port (#371)\n* DCD-1452: Updated appVersion to the latest product LTS version. (#378)\n* Improvements on [documentation](https://github.com/atlassian/data-center-helm-charts/) (#370, #357)\n* Updated Atlassian charts to use common definitions (#303)\n* Added service account annotation (#363)\n* Added new feature additionalVolumeClaimTemplates and provided example in documentation (#334, #368)\n* Added new feature podLabels (#364)\n* Added new feature to define loadBalancerIP (#365)\n* Define podAnnotations as template to allow overrides (#341)\n* DCKUBE-738: Added topologySpreadConstraints to products (#351)\n* Set ActiveProcessorCount automatically based on Values.<product>.resources.container.requests.cpu (#352)\n* Added new feature additionalPorts (for jmx-monitoring) (#353)\n\n\n## 1.1.0\n\n**Release date:** 2021-11-03\n\n![AppVersion: 7.17.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.17.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-721: Update version in Chart.yaml files\n* DCKUBE-733: Update the product versions (#345)\n* DCKUBE-731: Stabilize CI (#344)\n* DCKUBE-731: Fix shared home default (#342)\n* BAMBK8S-117: Documentation updates for Bamboo on K8s (#336)\n* DCKUBE-739: Fix typos (#337)\n* DCKUBE-739: Make securityContext changes backward compatible (#332)\n* DCKUBE-552 Mirror support. (#265)\n* Roll Statefulset Pods if ConfigMap changes (#315)\n* DCKUBE-677: Make security context more flexible (#321)\n* DCKUBE-634: Bitbucket - set context path (#314)\n* DCKUBE-722: Enable configuring ingress.class name (#313)\n* DCKUBE-678: Add schedulerName to StatefulSet (#301)\n\n\n## 1.0.0\n\nThis is the first officially supported version of the Helm chart.\n\n![AppVersion: 7.15.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.15.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-621: Improvements to graceful shutdown (#282)\n* Improved [documentation](https://github.com/atlassian/data-center-helm-charts/) (#275, #276, #277, #279, #280, #284, #285, #289, #290, #291, #293. #295)\n\n\n## 0.16.0\n\n![AppVersion: 7.15.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.15.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-598: Enable NFS permission fixer by default (#241)\n* DCKUBE-581: Enable configuration for SET_PERMISSIONS docker image variable (#261)\n* DCKUBE-613: Configurable grace periods (#249)\n* Update the Bitbucket image name, as the '-server' suffix is now deprecated (#259)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/) (#236, #243, #245, #252, #253, #256, #258, #260, #268, #270, #272)\n\n\n## 0.15.0\n\n![AppVersion: 7.15.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.15.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n\n* DCKUBE-435: Renamed the 'master' branch to 'main' (#232)\n* DCKUBE-453: Add support for providing a custom fluentd start command (#218)\n* DCKUBE-534: Make some deployment params configurable (#226)\n* DCKUBE-596: Update Bitbucket version to 7.15.1-jdk11 (#238)\n* Update EKS cluster yaml example (#227)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/) (#206, #222, #223, #228, #229, #231, #233, #235)\n\n\n## 0.14.0\n\n![AppVersion: 7.14.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.14.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-529: Update Bitbucket version to 7.14.1-jdk11 (#212)\n\n\n## 0.13.0\n\n![AppVersion: 7.12.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-436: Bitbucket NFS server chart. (#205)\n* DCKUBE-54: Volume docs updates (#188)\n\n\n## 0.12.0\n\n![AppVersion: 7.12.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-437: Wording improvement for warning in NOTES when PV is not used (#199)\n* DCKUBE-410: fix additional injections (#186)\n* DCKUBE-390: Improve readability of Jira values.yaml file (#179)\n* DCKUBE-391: Improve readability of Bitbucket values.yaml file (#182)\n* Defining the following values in the helpers template for each chart, to allow template overrides: (#173)\n\n### Default value changes\n\nThere has been major improvement in the documentation for the keys in `values.yaml` file but there isn't any functional\nchange.\n\n## 0.11.0\n\n**Release date:** 2021-06-09\n\n![AppVersion: 7.12.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-348: Warning of absent persistent volume (#169)\n* DCKUBE-307: Do not print logs when testing helm installation. (#168)\n* DCKUBE-308: Print service URL after installing helm chart (#157)\n* DCKUBE-282: Update icons to SVG (#164)\n* DCKUBE-302: Add Bitbucket SSH service and custom annotations. (#152)\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/bitbucket/values.yaml b/src/main/charts/bitbucket/values.yaml\nindex d3342d2..786d343 100644\n--- a/src/main/charts/bitbucket/values.yaml\n+++ b/src/main/charts/bitbucket/values.yaml\n@@ -52,6 +52,17 @@ bitbucket:\n     port: 80\n     # -- The type of Kubernetes service to use for Bitbucket\n     type: ClusterIP\n+    annotations: {}\n+  # -- Enable or disable an additional service for exposing SSH for external access.\n+  # Disable when the SSH service is exposed through the ingress controller, or enable if the ingress controller does\n+  # not support TCP.\n+  sshService:\n+    enabled: false\n+    # -- Port to expose the SSH service on.\n+    port: 22\n+    type: LoadBalancer\n+    # -- Annotations for the SSH service. Useful if a load balancer controller needs extra annotations.\n+    annotations: {}\n   # -- Enable or disable security context in StatefulSet template spec. Enabled by default with UID 2003.\n   # -- Disable when deploying to OpenShift, unless anyuid policy is attached to service account\n   securityContext:\n```\n\n## 0.10.0\n\n**Release date:** 2021-06-01\n\n![AppVersion: 7.12.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Version 0.10.0\n* DCKUBE-332: Update the minimal supported kubernetes version v1.19 (#154)\n\n### Default value changes\n\n```diff\n# No changes in this release\n```\n\n## 0.9.0\n\n**Release date:** 2021-05-25\n\n![AppVersion: 7.12.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Version 0.9.0\n* initial commit - changed the max-body-size of request to 250MB for all products and documented in CONFIG.md (#140)\n* Update values.yaml (#139)\n* Merge branch 'master' into dckube-267-define-minimum-compute-resources\n* README update for 0.8.0\n* Merge branch 'dckube-267-define-minimum-compute-resources' of github.com:https://github.com/atlassian/data-center-helm-charts/data-center-helm-charts into dckube-267-define-minimum-compute-resources\n* DCKUBE-267: Update cpu request sizes\n* Merge branch 'master' into dckube-267-define-minimum-compute-resources\n* Merge branch 'dckube-267-define-minimum-compute-resources' of github.com:https://github.com/atlassian/data-center-helm-charts/data-center-helm-charts into dckube-267-define-minimum-compute-resources\n* DCKUBE-267: Update cpu request sizes\n* Added ingress.host into values.yaml with corresponding value injection in ingress.yaml for all apps. Defaults to / (#134)\n* Merge branch 'master' into dckube-267-define-minimum-compute-resources\n* DCKUBE-267: Wording updates\n* DCKUBE-267: Initial commit\n* DCKUBE-51 Application upgrade (#122)\n* Add Crowd as a tested product (#128)\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/bitbucket/values.yaml b/src/main/charts/bitbucket/values.yaml\nindex bb7a568..d3342d2 100644\n--- a/src/main/charts/bitbucket/values.yaml\n+++ b/src/main/charts/bitbucket/values.yaml\n@@ -9,7 +9,7 @@ image:\n\n serviceAccount:\n   # -- Specifies the name of the ServiceAccount to be used by the pods.\n-  # If not specified, but the the \"serviceAccount.create\" flag is set, then the ServiceAccount name will be auto-generated,\n+  # If not specified, but the \"serviceAccount.create\" flag is set, then the ServiceAccount name will be auto-generated,\n   # otherwise the 'default' ServiceAccount will be used.\n   name:\n   # -- true if a ServiceAccount should be created, or false if it already exists\n@@ -31,10 +31,10 @@ serviceAccount:\n\n database:\n   # -- The JDBC URL of the database to be used by Bitbucket, e.g. jdbc:postgresql://host:port/database\n-  # If not specified, then it will need to be provided via browser during initial startup.\n+  # If not specified, then it will need to be provided via the browser during initial startup.\n   url:\n   # -- The Java class name of the JDBC driver to be used, e.g. org.postgresql.Driver\n-  # If not specified, then it will need to be provided via browser during initial startup.\n+  # If not specified, then it will need to be provided via the browser during initial startup.\n   driver:\n   credentials:\n     # -- The name of the Kubernetes Secret that contains the database login credentials.\n@@ -64,25 +64,25 @@ bitbucket:\n     hazelcast: 5701\n\n   license:\n-    # -- The name of the Kubernetes Secret which contains the Bitbucket license key.\n+    # -- The name of the Kubernetes Secret that contains the Bitbucket license key.\n     # If specified, then the license will be automatically populated during Bitbucket setup.\n     # Otherwise, it will need to be provided via the browser after initial startup.\n     secretName:\n-    # -- The key in the Kubernetes Secret which contains the Bitbucket license key\n+    # -- The key in the Kubernetes Secret that contains the Bitbucket license key\n     secretKey: license-key\n\n   sysadminCredentials:\n-    # -- The name of the Kubernetes Secret which contains the Bitbucket sysadmin credentials\n+    # -- The name of the Kubernetes Secret that contains the Bitbucket sysadmin credentials\n     # If specified, then these will be automatically populated during Bitbucket setup.\n     # Otherwise, they will need to be provided via the browser after initial startup.\n     secretName:\n-    # -- The key in the Kubernetes Secret which contains the sysadmin username\n+    # -- The key in the Kubernetes Secret that contains the sysadmin username\n     usernameSecretKey: username\n-    # -- The key in the Kubernetes Secret which contains the sysadmin password\n+    # -- The key in the Kubernetes Secret that contains the sysadmin password\n     passwordSecretKey: password\n-    # -- The key in the Kubernetes Secret which contains the sysadmin display name\n+    # -- The key in the Kubernetes Secret that contains the sysadmin display name\n     displayNameSecretKey: displayName\n-    # -- The key in the Kubernetes Secret which contains the sysadmin email address\n+    # -- The key in the Kubernetes Secret that contains the sysadmin email address\n     emailAddressSecretKey: emailAddress\n\n   clustering:\n@@ -104,30 +104,34 @@ bitbucket:\n\n   resources:\n     jvm:\n-      # -- The maximum amount of heap memory that will be used by the Bitbucket JVM. The same value will be used by the ElasticSearch JVM.\n+      # -- JVM memory arguments below are based on the defaults defined for the Bitbucket docker container, see:\n+      # https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/src/master/\n+      #\n+      # -- The maximum amount of heap memory that will be used by the Bitbucket JVM. The same value will be used by the Elasticsearch JVM.\n       maxHeap: \"1g\"\n-      # -- The minimum amount of heap memory that will be used by the Bitbucket JVM. The same value will be used by the ElasticSearch JVM.\n-      minHeap: \"1g\"\n+      # -- The minimum amount of heap memory that will be used by the Bitbucket JVM. The same value will be used by the Elasticsearch JVM.\n+      minHeap: \"512m\"\n\n     # -- Specifies the standard Kubernetes resource requests and/or limits for the Bitbucket container.\n     # It is important that if the memory resources are specified here, they must allow for the size of the Bitbucket JVM.\n     # That means the maximum heap size, the reserved code cache size, plus other JVM overheads, must be accommodated.\n-    # Allowing for (maxHeap+codeCache)*1.5 would be an example.\n-    container: {}\n+    # Allowing for maxHeap * 1.5 would be an example.\n+    container:\n     #  limits:\n-    #    cpu: \"4\"\n-    #    memory: \"2G\"\n-    #  requests:\n-    #    cpu: \"4\"\n+    #    cpu: \"1\"\n     #    memory: \"2G\"\n+      requests:\n+        cpu: \"2\" # -- If changing the cpu value update additional JVM arg 'ActiveProcessorCount' below\n+        memory: \"2G\"\n\n   # -- Specifies a list of additional arguments that can be passed to the Bitbucket JVM, e.g. system properties\n   additionalJvmArgs:\n-  #    - -Dfoo=bar\n-  #    - -Dfruit=lemon\n+    # -- The value defined for ActiveProcessorCount should correspond to that provided for 'container.requests.cpu'\n+    # see: https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE\n+    - -XX:ActiveProcessorCount=2\n\n   # -- Specifies a list of additional Java libraries that should be added to the Bitbucket container.\n-  # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n+  # Each item in the list should specify the name of the volume that contains the library, as well as the name of the\n   # library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which\n   # directory in the volume contains the library file.\n   additionalLibraries: []\n@@ -163,9 +167,11 @@ ingress:\n   # -- The max body size to allow. Requests exceeding this size will result\n   # in an 413 error being returned to the client.\n   # https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size\n-  maxBodySize: 10m\n+  maxBodySize: 250m\n   # -- The fully-qualified hostname of the Ingress Resource.\n   host:\n+  # -- The base path for the ingress rule.\n+  path: \"/\"\n   # -- The custom annotations that should be applied to the Ingress\n   # Resource when not using the Kubernetes ingress-nginx controller.\n   annotations: {}\n@@ -176,9 +182,9 @@ ingress:\n   tlsSecretName:\n\n fluentd:\n-  # -- True if the fluentd sidecar should be added to each pod\n+  # -- True if the Fluentd sidecar should be added to each pod\n   enabled: false\n-  # -- True if a custom config should be used for fluentd\n+  # -- True if a custom config should be used for Fluentd\n   customConfigFile: false\n   # -- Custom fluent.conf file\n   # fluent.conf: |\n@@ -195,14 +201,14 @@ fluentd:\n   #     tag bitbucket-access-logs\n   #   </source>\n\n-  # -- The name of the image containing the fluentd sidecar\n+  # -- The name of the image containing the Fluentd sidecar\n   imageName: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.2\n   elasticsearch:\n-    # -- True if fluentd should send all log events to an elasticsearch service.\n+    # -- True if Fluentd should send all log events to an Elasticsearch service.\n     enabled: true\n-    # -- The hostname of the Elasticsearch service that fluentd should send logs to.\n+    # -- The hostname of the Elasticsearch service that Fluentd should send logs to.\n     hostname: elasticsearch\n-  # -- pecify custom volumes to be added to fluentd container (e.g. more log sources)\n+  # -- Specify custom volumes to be added to Fluentd container (e.g. more log sources)\n   extraVolumes: []\n   # - name: local-home\n   #   mountPath: application-data/logs\n@@ -225,7 +231,7 @@ volumes:\n         requests:\n           storage: 1Gi\n     # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n-    # volume which will be used for the local-home volumes. If not defined, then defaults to an emptyDir volume.\n+    # volume, which will be used for the local-home volumes. If not defined, then defaults to an emptyDir volume.\n     customVolume: {}\n     mountPath: \"/var/atlassian/application-data/bitbucket\"\n   sharedHome:\n@@ -251,11 +257,11 @@ volumes:\n         requests:\n           storage: 1Gi\n     # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n-    # volume which will be used for the shared-home volume. If not defined, then defaults to an emptyDir (i.e. unshared) volume.\n+    # volume, which will be used for the shared-home volume. If not defined, then defaults to an emptyDir (i.e. unshared) volume.\n     customVolume: {}\n     # -- Specifies the path in the Bitbucket container to which the shared-home volume will be mounted.\n     mountPath: \"/var/atlassian/application-data/shared-home\"\n-    # -- Specifies the sub-directory of the shared-home volume which will be mounted in to the Bitbucket container.\n+    # -- Specifies the sub-directory of the shared-home volume that will be mounted in to the Bitbucket container.\n     subPath:\n     nfsPermissionFixer:\n       # -- If enabled, this will alter the shared-home volume's root directory so that Bitbucket can write to it.\n@@ -269,7 +275,7 @@ volumes:\n       command:\n   # -- Defines additional volumes that should be applied to all Bitbucket pods.\n   # Note that this will not create any corresponding volume mounts;\n-  # those needs to be defined in bitbucket.additionalVolumeMounts\n+  # those need to be defined in bitbucket.additionalVolumeMounts\n   additional: []\n\n # -- Standard Kubernetes node-selectors that will be applied to all Bitbucket pods\n@@ -281,12 +287,12 @@ tolerations: []\n # -- Standard Kubernetes affinities that will be applied to all Bitbucket pods\n # Due to the performance requirements it is highly recommended to run all Bitbucket pods\n # in the same availability zone as your dedicated NFS server. To achieve this, you\n-# able to define `affinity` and podAffinity` rules that will place all pods into the same zone\n+# can define `affinity` and `podAffinity` rules that will place all pods into the same zone,\n # and therefore minimise the real distance between the application pods and the shared storage.\n-# More specific documentation can be found official Affinity and Anti-affinity documentation\n+# More specific documentation can be found in the official Affinity and Anti-affinity documentation:\n #  https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity\n #\n-# This is an example how to ensure the pods are in the same zone as NFS server that is labeled with `role=nfs-server`:\n+# This is an example on how to ensure the pods are in the same zone as NFS server that is labeled with `role=nfs-server`:\n #\n #   podAffinity:\n #    requiredDuringSchedulingIgnoredDuringExecution:\n@@ -308,11 +314,11 @@ additionalInitContainers: []\n # -- Additional labels that should be applied to all resources\n additionalLabels: {}\n\n-# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into server container\n+# -- Additional existing ConfigMaps and Secrets not managed by Helm, which should be mounted into server container\n # configMap and secret are two available types (camelCase is important!)\n-# mountPath is a destination directory in a container and key is file name\n-# name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name + index position,\n-# for example custom-config-0, keystore-2\n+# mountPath is a destination directory in a container, and key is the file name\n+# name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name and the index position,\n+# for example, custom-config-0, keystore-2\n additionalFiles: []\n #  - name: custom-config\n #    type: configMap\n```\n\n## 0.7.0\n\n**Release date:** 2021-05-07\n\n![AppVersion: 7.12.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Release 0.7.0 (#123)\n* Update charts descriptors (#121)\n* feat (fluentd) extra fluentd customization to (jira / confluence) helm charts (#95)\n* Update application versions (#116)\n* Rename Bitbucket\n* DCKUBE-272: Expose Ehcache ports via statefulset\n* Update documentation for 0.6.0 release\n* DCKUBE-30: Example implementation for NFS Server (Bitbucket)\n* DCKUBE-231: Max body size should be configurable\n* DCKUBE-90: Additional details relating to the Ingress controller\n* Introducing an easier way to mount secrets and configmaps (#102)\n* Merge branch 'master' into dckube-131-nfs-fixer-removal\n* DCKUBE-131: fix for initContainer being synthesized twice\n* Merge branch 'master' into dckube-131-nfs-fixer-removal\n* DCKUBE-131: Updates to template formatting and readme wording\n* Merge pull request #98 from https://github.com/atlassian/data-center-helm-charts/dckube-131-nfs-fixer-removal\n* DCKUBE-131: Alter NFS permissions via init container\n* feat(range): Fix support for multiple plugins\n* Update READMEs for 0.5.0 release\n* Merge pull request #59 from https://github.com/atlassian/data-center-helm-charts/minor-cleanup-and-Azure-related-fixes\n* DCNG-976 add fluentd sidecar to bitbucket chart\n* Fix gid value\n* OpenShift support (#56)\n* DCNG-783 minor cleanup and Azure related fixes\n* DCNG-926 setup NFSv3 server with lock support\n* DCNG-945 Set up an NFS server with the Bitbucket server test\n* DCNG-925 support for BYO NFS server\n* default customVolume chart value to empty map , to avoid helm warning\n* Add optional TLS to ingress spec\n* DCNG-892 simplify config of https/http\n* DCNG-892 update docs\n* Merge remote-tracking branch 'origin/master' into DCNG-892\n* DCNG-892 Configure the created ingress as nginx by default\n* DCNG-892 Move ingress value structure up to top level\n* DCNG-906 Set ELASTICSEARCH_ENABLED=false if ES base URL is defined\n* DCNG-892 Add Ingress template to the Helm charts, and activate it for EKS testing\n* DCNG-906 Add support for declaring ElasticSearch baseUrl and credentials in the bitbucket chart\n* DCNG-927 Tweak doco for clarity\n* DCNG-927 Allow Tomcat ingress https/secure config to be changed for Jira/Confluence, and make consistent with Bitbucket\n* DCNG-921 add doco for enabling clustering\n* DCNG-921 disable clustering by defaault\n* DCNG-918 Make bitbucket sysadmin credentials secret optional\n* DCNG-918 Make bitbucket.proxy.fqdn an optional value\n* DCNG-913 Make bitbucket/confluence license secret optional\n* DCNG-914 make jira/confluence DB config values fully optional\n* DCNG-914 make bitbucket DB config values fully optional\n* DCNG-893 move emptyDir volume defaults back into the templates\n* DCNG-893 Make localHome/sharedHome configuration more consistent by adding an optional shared-home PVC to the chart\n* rename localHome.persistentVolumeClaim.enabled to .create\n* DCNG-893 update documentation\n* DCNG-893 rework how volumes are customised in the Bitbucket chart\n* DCNG-893 disable PVs by default on Bitbucket and Confluence\n* DCNG-898 add a series of unit tests for the serviceAccount and image config rendering\n* DCNG-899 Added service account to db-connectivity-test\n* DCNG-897 Use \"before-hook-creation,hook-succeeded\" deletion policy\n* Merge remote-tracking branch 'origin/master' into DCNG-897\n* DCNG-894 Add a ServiceAccount, ClusterRole and ClusterRoleBinding to the Bitbucket chart\n* DCNG-897 Add hook-delete-policy to chart tests and nfs-fixer job\n* DCNG-880 Added support for custom builds in kubeVersion\n* DCNG-853 Fixed kubeVersion\n* DCNG-853 Updated products' charts\n* DCNG-856 add -n to each command in NOTES.txt\n* DCNG-856 Add NOTES.txt\n* DCNG-849 avoid incorrect rendering for empty  additionalEnvironmentVariables\n* DCNG-849 check for the presense of additionalLabels so we don't render an empty {}\n* Merge pull request #6 from https://github.com/atlassian/data-center-helm-charts/DCNG-849\n* DCNG-850 add extension point for additional environment variables\n* DCNG-848 add extension point for additional labels\n* Merge pull request #2 from https://github.com/atlassian/data-center-helm-charts/DCNG-867\n* Merge pull request #3 from https://github.com/atlassian/data-center-helm-charts/DCNG-848\n* DCNG-866 Replace hardcoded image pull policy with value placeholder\n* DCNG-848 Add support for additional volumes and volume mounts\n* DCNG-867 Document the presense of  bitbucket.additionalJvmArgs\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/bitbucket/values.yaml b/src/main/charts/bitbucket/values.yaml\nindex 1df2526..bb7a568 100644\n--- a/src/main/charts/bitbucket/values.yaml\n+++ b/src/main/charts/bitbucket/values.yaml\n@@ -7,17 +7,40 @@ image:\n   # -- The docker image tag to be used. Defaults to the Chart appVersion.\n   tag: \"\"\n\n-# -- Specifies which serviceAccount to use for the pods. If not specified, the kubernetes default will be used.\n-serviceAccountName:\n+serviceAccount:\n+  # -- Specifies the name of the ServiceAccount to be used by the pods.\n+  # If not specified, but the the \"serviceAccount.create\" flag is set, then the ServiceAccount name will be auto-generated,\n+  # otherwise the 'default' ServiceAccount will be used.\n+  name:\n+  # -- true if a ServiceAccount should be created, or false if it already exists\n+  create: true\n+  # -- The list of image pull secrets that should be added to the created ServiceAccount\n+  imagePullSecrets: []\n+  clusterRole:\n+    # -- Specifies the name of the ClusterRole that will be created if the \"serviceAccount.clusterRole.create\" flag is set.\n+    # If not specified, a name will be auto-generated.\n+    name:\n+    # -- true if a ClusterRole should be created, or false if it already exists\n+    create: true\n+  clusterRoleBinding:\n+    # -- Specifies the name of the ClusterRoleBinding that will be created if the \"serviceAccount.clusterRoleBinding.create\" flag is set\n+    # If not specified, a name will be auto-generated.\n+    name:\n+    # -- true if a ClusterRoleBinding should be created, or false if it already exists\n+    create: true\n\n database:\n   # -- The JDBC URL of the database to be used by Bitbucket, e.g. jdbc:postgresql://host:port/database\n+  # If not specified, then it will need to be provided via browser during initial startup.\n   url:\n   # -- The Java class name of the JDBC driver to be used, e.g. org.postgresql.Driver\n+  # If not specified, then it will need to be provided via browser during initial startup.\n   driver:\n   credentials:\n     # -- The name of the Kubernetes Secret that contains the database login credentials.\n-    secretName: bitbucket-database-credentials\n+    # If specified, then the credentials will be automatically populated during Bitbucket setup.\n+    # Otherwise, they will need to be provided via the browser after initial startup.\n+    secretName:\n     # -- The key in the Secret used to store the database login username\n     usernameSecretKey: username\n     # -- The key in the Secret used to store the database login password\n@@ -25,26 +48,34 @@ database:\n\n bitbucket:\n   service:\n-    # -- The port on which the Jira Kubernetes service will listen\n+    # -- The port on which the Bitbucket Kubernetes service will listen\n     port: 80\n-    # -- The type of Kubernetes service to use for Jira\n+    # -- The type of Kubernetes service to use for Bitbucket\n     type: ClusterIP\n-  # -- The GID used by the Bitbucket docker image\n-  gid: \"2003\"\n+  # -- Enable or disable security context in StatefulSet template spec. Enabled by default with UID 2003.\n+  # -- Disable when deploying to OpenShift, unless anyuid policy is attached to service account\n+  securityContext:\n+    enabled: true\n+    # -- The GID used by the Bitbucket docker image\n+    gid: \"2003\"\n   ports:\n     http: 7990\n     ssh: 7999\n     hazelcast: 5701\n\n   license:\n-    # -- The name of the Kubernetes Secret which contains the Bitbucket license key\n-    secretName: bitbucket-license\n+    # -- The name of the Kubernetes Secret which contains the Bitbucket license key.\n+    # If specified, then the license will be automatically populated during Bitbucket setup.\n+    # Otherwise, it will need to be provided via the browser after initial startup.\n+    secretName:\n     # -- The key in the Kubernetes Secret which contains the Bitbucket license key\n     secretKey: license-key\n\n   sysadminCredentials:\n     # -- The name of the Kubernetes Secret which contains the Bitbucket sysadmin credentials\n-    secretName: bitbucket-sysadmin-credentials\n+    # If specified, then these will be automatically populated during Bitbucket setup.\n+    # Otherwise, they will need to be provided via the browser after initial startup.\n+    secretName:\n     # -- The key in the Kubernetes Secret which contains the sysadmin username\n     usernameSecretKey: username\n     # -- The key in the Kubernetes Secret which contains the sysadmin password\n@@ -54,20 +85,28 @@ bitbucket:\n     # -- The key in the Kubernetes Secret which contains the sysadmin email address\n     emailAddressSecretKey: emailAddress\n\n-  proxy:\n-    # -- The fully-qualified domain name of the ingress\n-    fqdn:\n-    # -- The port number of the ingress\n-    port: 443\n-    # -- note that, if present, the value of x-forwarded-proto header will trump this setting\n-    scheme: https\n-    secure: true\n+  clustering:\n+    # -- Set to true if Data Center clustering should be enabled\n+    # This will automatically configure cluster peer discovery between cluster nodes.\n+    enabled: false\n+\n+  elasticSearch:\n+    # -- The base URL of the external ElasticSearch instance to be used.\n+    # If this is defined, then Bitbucket will disable its internal ElasticSearch instance.\n+    baseUrl:\n+    credentials:\n+      # -- The name of the Kubernetes Secret that contains the ElasticSearch credentials.\n+      secretName:\n+      # -- The key in the the Kubernetes Secret that contains the ElasticSearch username.\n+      usernameSecreyKey: username\n+      # -- The key in the the Kubernetes Secret that contains the ElasticSearch password.\n+      passwordSecretKey: password\n\n   resources:\n     jvm:\n-      # -- The maximum amount of heap memory that will be used by the Bitbucket JVM\n+      # -- The maximum amount of heap memory that will be used by the Bitbucket JVM. The same value will be used by the ElasticSearch JVM.\n       maxHeap: \"1g\"\n-      # -- The minimum amount of heap memory that will be used by the Bitbucket JVM\n+      # -- The minimum amount of heap memory that will be used by the Bitbucket JVM. The same value will be used by the ElasticSearch JVM.\n       minHeap: \"1g\"\n\n     # -- Specifies the standard Kubernetes resource requests and/or limits for the Bitbucket container.\n@@ -82,6 +121,11 @@ bitbucket:\n     #    cpu: \"4\"\n     #    memory: \"2G\"\n\n+  # -- Specifies a list of additional arguments that can be passed to the Bitbucket JVM, e.g. system properties\n+  additionalJvmArgs:\n+  #    - -Dfoo=bar\n+  #    - -Dfruit=lemon\n+\n   # -- Specifies a list of additional Java libraries that should be added to the Bitbucket container.\n   # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n   # library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which\n@@ -99,36 +143,134 @@ bitbucket:\n   #    subDirectory:\n   #    fileName:\n\n+  # -- Defines any additional volumes mounts for the Bitbucket container.\n+  # These can refer to existing volumes, or new volumes can be defined in volumes.additional.\n+  additionalVolumeMounts: []\n+\n+  # -- Defines any additional environment variables to be passed to the Bitbucket container.\n+  # See https://hub.docker.com/r/atlassian/bitbucket-server for supported variables.\n+  additionalEnvironmentVariables: []\n+\n+ingress:\n+  # -- True if an Ingress Resource should be created.\n+  create: false\n+  # -- True if the created Ingress Resource is to use the Kubernetes ingress-nginx controller:\n+  # https://kubernetes.github.io/ingress-nginx/\n+  # This will populate the Ingress Resource with annotations for the Kubernetes ingress-nginx controller.\n+  # Set to false if a different controller is to be used, in which case the appropriate annotations for that\n+  # controller need to be specified.\n+  nginx: true\n+  # -- The max body size to allow. Requests exceeding this size will result\n+  # in an 413 error being returned to the client.\n+  # https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size\n+  maxBodySize: 10m\n+  # -- The fully-qualified hostname of the Ingress Resource.\n+  host:\n+  # -- The custom annotations that should be applied to the Ingress\n+  # Resource when not using the Kubernetes ingress-nginx controller.\n+  annotations: {}\n+  # -- True if the browser communicates with the application over HTTPS.\n+  https: true\n+  # -- Secret that contains a TLS private key and certificate.\n+  # Optional if Ingress Controller is configured to use one secret for all ingresses\n+  tlsSecretName:\n+\n+fluentd:\n+  # -- True if the fluentd sidecar should be added to each pod\n+  enabled: false\n+  # -- True if a custom config should be used for fluentd\n+  customConfigFile: false\n+  # -- Custom fluent.conf file\n+  # fluent.conf: |\n+  fluentdCustomConfig: {}\n+  # fluent.conf: |\n+  #   <source>\n+  #     @type tail\n+  #     <parse>\n+  #     @type multiline\n+  #     format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n+  #     </parse>\n+  #     path /application-data/logs/atlassian-bitbucket-access.log*\n+  #     pos_file /tmp/bitbucketlog.pos\n+  #     tag bitbucket-access-logs\n+  #   </source>\n+\n+  # -- The name of the image containing the fluentd sidecar\n+  imageName: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.2\n+  elasticsearch:\n+    # -- True if fluentd should send all log events to an elasticsearch service.\n+    enabled: true\n+    # -- The hostname of the Elasticsearch service that fluentd should send logs to.\n+    hostname: elasticsearch\n+  # -- pecify custom volumes to be added to fluentd container (e.g. more log sources)\n+  extraVolumes: []\n+  # - name: local-home\n+  #   mountPath: application-data/logs\n+  #   subPath: log\n+  #   readOnly: true\n+\n # -- Specify custom annotations to be added to all Bitbucket pods\n podAnnotations: {}\n #  \"name\": \"value\"\n\n volumes:\n   localHome:\n-    # -- Specifies the name of the storage class that should be used for the Bitbucket local-home volume\n-    storageClassName:\n-    # -- Specifies the standard Kubernetes resource requests and/or limits for the Bitbucket local-home volume.\n-    resources:\n-      requests:\n-        storage: 1Gi\n+    persistentVolumeClaim:\n+      # -- If true, then a PersistentVolumeClaim will be created for each local-home volume.\n+      create: false\n+      # -- Specifies the name of the storage class that should be used for the local-home volume claim.\n+      storageClassName:\n+      # -- Specifies the standard Kubernetes resource requests and/or limits for the local-home volume claims.\n+      resources:\n+        requests:\n+          storage: 1Gi\n+    # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n+    # volume which will be used for the local-home volumes. If not defined, then defaults to an emptyDir volume.\n+    customVolume: {}\n     mountPath: \"/var/atlassian/application-data/bitbucket\"\n   sharedHome:\n+    persistentVolume:\n+      # -- If true, then a PersistentVolume will be created for the shared-home volume.\n+      create: false\n+      # -- Addtional options used when mounting the volume\n+      mountOptions: []\n+      nfs:\n+        # -- The address of the NFS server. It needs to be resolveable by the kubelet, so consider using an IP address.\n+        server: \"\"\n+        # -- Specifies the path exported by the NFS server, used in the mount command\n+        path: \"\"\n+    persistentVolumeClaim:\n+      # -- If true, then a PersistentVolumeClaim will be created for the shared-home volume.\n+      create: false\n+      # -- Specifies the name of the storage class that should be used for the shared-home volume claim.\n+      storageClassName:\n+      # -- Specifies the name of the persistent volume to claim\n+      volumeName:\n+      # -- Specifies the standard Kubernetes resource requests and/or limits for the shared-home volume claims.\n+      resources:\n+        requests:\n+          storage: 1Gi\n+    # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n+    # volume which will be used for the shared-home volume. If not defined, then defaults to an emptyDir (i.e. unshared) volume.\n+    customVolume: {}\n     # -- Specifies the path in the Bitbucket container to which the shared-home volume will be mounted.\n     mountPath: \"/var/atlassian/application-data/shared-home\"\n     # -- Specifies the sub-directory of the shared-home volume which will be mounted in to the Bitbucket container.\n     subPath:\n-    # -- The name of the PersistentVolumeClaim which will be used for the shared-home volume\n-    volumeClaimName: bitbucket-shared-home\n     nfsPermissionFixer:\n       # -- If enabled, this will alter the shared-home volume's root directory so that Bitbucket can write to it.\n       # This is a workaround for a Kubernetes bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260\n-      enabled: true\n+      enabled: false\n       # -- The path in the initContainer where the shared-home volume will be mounted\n       mountPath: /shared-home\n       # -- By default, the fixer will change the group ownership of the volume's root directory to match the Bitbucket\n       # container's GID (2003), and then ensures the directory is group-writeable. If this is not the desired behaviour,\n       # command used can be specified here.\n       command:\n+  # -- Defines additional volumes that should be applied to all Bitbucket pods.\n+  # Note that this will not create any corresponding volume mounts;\n+  # those needs to be defined in bitbucket.additionalVolumeMounts\n+  additional: []\n\n # -- Standard Kubernetes node-selectors that will be applied to all Bitbucket pods\n nodeSelector: {}\n@@ -137,6 +279,24 @@ nodeSelector: {}\n tolerations: []\n\n # -- Standard Kubernetes affinities that will be applied to all Bitbucket pods\n+# Due to the performance requirements it is highly recommended to run all Bitbucket pods\n+# in the same availability zone as your dedicated NFS server. To achieve this, you\n+# able to define `affinity` and podAffinity` rules that will place all pods into the same zone\n+# and therefore minimise the real distance between the application pods and the shared storage.\n+# More specific documentation can be found official Affinity and Anti-affinity documentation\n+#  https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity\n+#\n+# This is an example how to ensure the pods are in the same zone as NFS server that is labeled with `role=nfs-server`:\n+#\n+#   podAffinity:\n+#    requiredDuringSchedulingIgnoredDuringExecution:\n+#      - labelSelector:\n+#          matchExpressions:\n+#            - key: role\n+#              operator: In\n+#              values:\n+#                - nfs-server # needs to be the same value as NFS server deployment\n+#        topologyKey: topology.kubernetes.io/zone\n affinity: {}\n\n # -- Additional container definitions that will be added to all Bitbucket pods\n@@ -144,3 +304,26 @@ additionalContainers: []\n\n # -- Additional initContainer definitions that will be added to all Bitbucket pods\n additionalInitContainers: []\n+\n+# -- Additional labels that should be applied to all resources\n+additionalLabels: {}\n+\n+# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into server container\n+# configMap and secret are two available types (camelCase is important!)\n+# mountPath is a destination directory in a container and key is file name\n+# name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name + index position,\n+# for example custom-config-0, keystore-2\n+additionalFiles: []\n+#  - name: custom-config\n+#    type: configMap\n+#    key: log4j.properties\n+#    mountPath:  /var/atlassian\n+#  - name: custom-config\n+#    type: configMap\n+#    key: web.xml\n+#    mountPath: /var/atlassian\n+#  - name: keystore\n+#    type: secret\n+#    key: keystore.jks\n+#    mountPath: /var/ssl\n+\n```\n\n## 0.1.0\n\n**Release date:** 2020-11-04\n\n![AppVersion: 7.7.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.7.0-jdk11&color=success&logo=)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* OSR-523 Snapshot of helm charts and test code from internal repo\n\n### Default value changes\n\n```diff\n# -- The initial number of pods that should be started at deployment of Bitbucket.\nreplicaCount: 1\n\nimage:\n  repository: atlassian/bitbucket-server\n  pullPolicy: IfNotPresent\n  # -- The docker image tag to be used. Defaults to the Chart appVersion.\n  tag: \"\"\n\n# -- Specifies which serviceAccount to use for the pods. If not specified, the kubernetes default will be used.\nserviceAccountName:\n\ndatabase:\n  # -- The JDBC URL of the database to be used by Bitbucket, e.g. jdbc:postgresql://host:port/database\n  url:\n  # -- The Java class name of the JDBC driver to be used, e.g. org.postgresql.Driver\n  driver:\n  credentials:\n    # -- The name of the Kubernetes Secret that contains the database login credentials.\n    secretName: bitbucket-database-credentials\n    # -- The key in the Secret used to store the database login username\n    usernameSecretKey: username\n    # -- The key in the Secret used to store the database login password\n    passwordSecretKey: password\n\nbitbucket:\n  service:\n    # -- The port on which the Jira Kubernetes service will listen\n    port: 80\n    # -- The type of Kubernetes service to use for Jira\n    type: ClusterIP\n  # -- The GID used by the Bitbucket docker image\n  gid: \"2003\"\n  ports:\n    http: 7990\n    ssh: 7999\n    hazelcast: 5701\n\n  license:\n    # -- The name of the Kubernetes Secret which contains the Bitbucket license key\n    secretName: bitbucket-license\n    # -- The key in the Kubernetes Secret which contains the Bitbucket license key\n    secretKey: license-key\n\n  sysadminCredentials:\n    # -- The name of the Kubernetes Secret which contains the Bitbucket sysadmin credentials\n    secretName: bitbucket-sysadmin-credentials\n    # -- The key in the Kubernetes Secret which contains the sysadmin username\n    usernameSecretKey: username\n    # -- The key in the Kubernetes Secret which contains the sysadmin password\n    passwordSecretKey: password\n    # -- The key in the Kubernetes Secret which contains the sysadmin display name\n    displayNameSecretKey: displayName\n    # -- The key in the Kubernetes Secret which contains the sysadmin email address\n    emailAddressSecretKey: emailAddress\n\n  proxy:\n    # -- The fully-qualified domain name of the ingress\n    fqdn:\n    # -- The port number of the ingress\n    port: 443\n    # -- note that, if present, the value of x-forwarded-proto header will trump this setting\n    scheme: https\n    secure: true\n\n  resources:\n    jvm:\n      # -- The maximum amount of heap memory that will be used by the Bitbucket JVM\n      maxHeap: \"1g\"\n      # -- The minimum amount of heap memory that will be used by the Bitbucket JVM\n      minHeap: \"1g\"\n\n    # -- Specifies the standard Kubernetes resource requests and/or limits for the Bitbucket container.\n    # It is important that if the memory resources are specified here, they must allow for the size of the Bitbucket JVM.\n    # That means the maximum heap size, the reserved code cache size, plus other JVM overheads, must be accommodated.\n    # Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    container: {}\n    #  limits:\n    #    cpu: \"4\"\n    #    memory: \"2G\"\n    #  requests:\n    #    cpu: \"4\"\n    #    memory: \"2G\"\n\n  # -- Specifies a list of additional Java libraries that should be added to the Bitbucket container.\n  # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n  # library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which\n  # directory in the volume contains the library file.\n  additionalLibraries: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n  # -- Specifies a list of additional Bitbucket plugins that should be added to the Bitbucket container.\n  # These are specified in the same manner as the additionalLibraries field, but the files will be loaded\n  # as bundled plugins rather than as libraries.\n  additionalBundledPlugins: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n# -- Specify custom annotations to be added to all Bitbucket pods\npodAnnotations: {}\n#  \"name\": \"value\"\n\nvolumes:\n  localHome:\n    # -- Specifies the name of the storage class that should be used for the Bitbucket local-home volume\n    storageClassName:\n    # -- Specifies the standard Kubernetes resource requests and/or limits for the Bitbucket local-home volume.\n    resources:\n      requests:\n        storage: 1Gi\n    mountPath: \"/var/atlassian/application-data/bitbucket\"\n  sharedHome:\n    # -- Specifies the path in the Bitbucket container to which the shared-home volume will be mounted.\n    mountPath: \"/var/atlassian/application-data/shared-home\"\n    # -- Specifies the sub-directory of the shared-home volume which will be mounted in to the Bitbucket container.\n    subPath:\n    # -- The name of the PersistentVolumeClaim which will be used for the shared-home volume\n    volumeClaimName: bitbucket-shared-home\n    nfsPermissionFixer:\n      # -- If enabled, this will alter the shared-home volume's root directory so that Bitbucket can write to it.\n      # This is a workaround for a Kubernetes bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260\n      enabled: true\n      # -- The path in the initContainer where the shared-home volume will be mounted\n      mountPath: /shared-home\n      # -- By default, the fixer will change the group ownership of the volume's root directory to match the Bitbucket\n      # container's GID (2003), and then ensures the directory is group-writeable. If this is not the desired behaviour,\n      # command used can be specified here.\n      command:\n\n# -- Standard Kubernetes node-selectors that will be applied to all Bitbucket pods\nnodeSelector: {}\n\n# -- Standard Kubernetes tolerations that will be applied to all Bitbucket pods\ntolerations: []\n\n# -- Standard Kubernetes affinities that will be applied to all Bitbucket pods\naffinity: {}\n\n# -- Additional container definitions that will be added to all Bitbucket pods\nadditionalContainers: []\n\n# -- Additional initContainer definitions that will be added to all Bitbucket pods\nadditionalInitContainers: []\n```\n\n---\nAutogenerated from Helm Chart and git history using [helm-changelog](https://github.com/mogensen/helm-changelog)\n"
  },
  {
    "path": "src/main/charts/bitbucket/Chart.yaml",
    "content": "apiVersion: v2\nname: bitbucket\ndescription: A chart for installing Bitbucket Data Center on Kubernetes\ntype: application\nversion: '2.0.13'\nappVersion: 10.2.3\nkubeVersion: \">=1.21.x-0\"\nkeywords:\n- Bitbucket\n- Bitbucket Server\n- Bitbucket Data Center\n- Bitbucket DC\n- Atlassian\nhome: https://atlassian.github.io/data-center-helm-charts/\nicon: https://atlassian.github.io/data-center-helm-charts/icons/bitbucket.svg\nsources:\n- https://github.com/atlassian/data-center-helm-charts\n- https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/\ndeprecated: false\nannotations:\n  artifacthub.io/containsSecurityUpdates: \"false\"\n  artifacthub.io/changes: |-\n    - \"Update appVersions for DC apps (#1114)\"\n\ndependencies:\n- name: common\n  version: 1.2.7\n  repository: https://atlassian.github.io/data-center-helm-charts\n- name: opensearch\n  version: 2.19.0\n  repository: https://opensearch-project.github.io/helm-charts\n  condition: opensearch.install\n"
  },
  {
    "path": "src/main/charts/bitbucket/README.md",
    "content": "# bitbucket\n\n![Version: 2.0.13](https://img.shields.io/badge/Version-2.0.13-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 10.2.3](https://img.shields.io/badge/AppVersion-10.2.3-informational?style=flat-square)\n\nA chart for installing Bitbucket Data Center on Kubernetes\n\n**Homepage:** <https://atlassian.github.io/data-center-helm-charts/>\n\n## Source Code\n\n* <https://github.com/atlassian/data-center-helm-charts>\n* <https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/>\n\n## Requirements\n\nKubernetes: `>=1.21.x-0`\n\n| Repository | Name | Version |\n|------------|------|---------|\n| https://atlassian.github.io/data-center-helm-charts | common | 1.2.7 |\n| https://opensearch-project.github.io/helm-charts | opensearch | 2.19.0 |\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| additionalConfigMaps | list | `[]` | Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix for a ConfigMap name, fileName is used as subPath  |\n| additionalContainers | list | `[]` | Additional container definitions that will be added to all Bitbucket pods  |\n| additionalFiles | list | `[]` | Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into service container. Configuration details below (camelCase is important!): 'name'      - References existing ConfigMap or secret name. 'type'      - 'configMap' or 'secret' 'key'       - The file name. 'mountPath' - The destination directory in a container. VolumeMount and Volumes are added with this name and index position, for example; custom-config-0, keystore-2  |\n| additionalHosts | list | `[]` | Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file. https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ |\n| additionalInitContainers | list | `[]` | Additional initContainer definitions that will be added to all Bitbucket pods  |\n| additionalLabels | object | `{}` | Additional labels that should be applied to all resources  |\n| affinity | object | `{}` | Standard Kubernetes affinities that will be applied to all Bitbucket pods Due to the performance requirements it is highly recommended running all Bitbucket pods in the same availability zone as your dedicated NFS server. To achieve this, you can define `affinity` and `podAffinity` rules that will place all pods into the same zone, and therefore minimise the real distance between the application pods and the shared storage. More specific documentation can be found in the official Affinity and Anti-affinity documentation:  https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity  This is an example on how to ensure the pods are in the same zone as NFS server that is labeled with `role=nfs-server`:    podAffinity:    requiredDuringSchedulingIgnoredDuringExecution:      - labelSelector:          matchExpressions:            - key: role              operator: In              values:                - nfs-server # needs to be the same value as NFS server deployment        topologyKey: topology.kubernetes.io/zone |\n| atlassianAnalyticsAndSupport.analytics.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a JSON which DC products will read and send analytics events to Atlassian data pipelines  |\n| atlassianAnalyticsAndSupport.helmValues.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a YAML file which can be optionally including to support.zip  |\n| bitbucket.additionalAnnotations | object | `{}` | Defines additional annotations to the Bitbucket StateFulSet. This might be required when deploying using a GitOps approach |\n| bitbucket.additionalBundledPlugins | list | `[]` | Specifies a list of additional Bitbucket plugins that should be added to the Bitbucket container. Note plugins installed via this method will appear as bundled plugins rather than user plugins. These should be specified in the same manner as the 'additionalLibraries' property. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  NOTE: only .jar files can be loaded using this approach. OBR's can be extracted (unzipped) to access the associated .jar  An alternative to this method is to install the plugins via \"Manage Apps\" in the product system administration UI.  |\n| bitbucket.additionalCertificates | object | `{\"customCmd\":null,\"initContainer\":{\"resources\":{},\"securityContext\":{}},\"secretList\":[],\"secretName\":null}` | Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates  |\n| bitbucket.additionalCertificates.customCmd | string | `nil` | Custom command to be executed in the init container to import certificates  |\n| bitbucket.additionalCertificates.initContainer.resources | object | `{}` | Resources allocated to the import-certs init container  |\n| bitbucket.additionalCertificates.initContainer.securityContext | object | `{}` | Custom SecurityContext for the import-certs init container  |\n| bitbucket.additionalCertificates.secretList | list | `[]` | A list of secrets with their respective keys holding certificates to be added to the Java truststore. It is mandatory to specify which keys from secret data need to be mounted as files to the init container.  |\n| bitbucket.additionalCertificates.secretName | string | `nil` | Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.  |\n| bitbucket.additionalEnvironmentVariables | list | `[]` | Defines any additional environment variables to be passed to the Bitbucket container. See https://hub.docker.com/r/atlassian/bitbucket for supported variables.  |\n| bitbucket.additionalJvmArgs | list | `[]` | Specifies a list of additional arguments that can be passed to the Bitbucket JVM, e.g. system properties.  |\n| bitbucket.additionalLibraries | list | `[]` | Specifies a list of additional Java libraries that should be added to the Bitbucket container. Each item in the list should specify the name of the volume that contains the library, as well as the name of the library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which directory in the volume contains the library file. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  |\n| bitbucket.additionalPorts | list | `[]` | Defines any additional ports for the Bitbucket container.  |\n| bitbucket.additionalVolumeClaimTemplates | list | `[]` | Defines additional volumeClaimTemplates that should be applied to the Bitbucket pod. Note that this will not create any corresponding volume mounts; those needs to be defined in bitbucket.additionalVolumeMounts  |\n| bitbucket.additionalVolumeMounts | list | `[]` | Defines any additional volumes mounts for the Bitbucket container. These can refer to existing volumes, or new volumes can be defined via 'volumes.additional'.  |\n| bitbucket.applicationMode | string | `\"default\"` | Application Mode  This can be either 'default' or 'mirror'  |\n| bitbucket.clustering.enabled | bool | `false` | Set to 'true' if Data Center clustering should be enabled This will automatically configure cluster peer discovery between cluster nodes.  |\n| bitbucket.clustering.group.nameSecretKey | string | `\"name\"` | The key in the Kubernetes Secret that contains the Hazelcast group name.  |\n| bitbucket.clustering.group.passwordSecretKey | string | `\"password\"` | The key in the Kubernetes Secret that contains the Hazelcast group password.  |\n| bitbucket.clustering.group.secretName | string | `nil` | from-literal=password=<password>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  If no secret is specified, a default group name will be used and a random password will be generated during installation.  |\n| bitbucket.containerSecurityContext | object | `{}` | Standard K8s field that holds security configurations that will be applied to a container. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/  |\n| bitbucket.displayName | string | `nil` | Set the display name of the Bitbucket instance. Note that this value is only used during installation and changing the value during an upgrade has no effect.  |\n| bitbucket.elasticSearch.baseUrl | string | `nil` | The base URL of the external Elasticsearch instance to be used, for example: http://elasticsearch-master.<namespace>.svc.cluster.local:9200 If this is defined, then Bitbucket will disable its internal Elasticsearch instance.  |\n| bitbucket.elasticSearch.credentials.passwordSecretKey | string | `\"password\"` | The key in the Kubernetes Secret that contains the Elasticsearch password.  |\n| bitbucket.elasticSearch.credentials.secretName | string | `nil` | from-literal=password=<password>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| bitbucket.elasticSearch.credentials.usernameSecretKey | string | `\"username\"` | The key in the Kubernetes Secret that contains the Elasticsearch username.  |\n| bitbucket.hazelcastService.annotations | object | `{}` | Additional annotations to apply to the Hazelcast Service  |\n| bitbucket.hazelcastService.enabled | bool | `false` | Enable or disable an additional Hazelcast service that Bitbucket nodes can use to join a cluster. It is recommended to create a separate Hazelcast service if the Bitbucket service uses a LoadBalancer type (e.g., NLB), ensuring that the Hazelcast port is not exposed at all. |\n| bitbucket.hazelcastService.port | int | `5701` | The port on which the Bitbucket K8s Hazelcast Service will listen  |\n| bitbucket.hazelcastService.type | string | `\"ClusterIP\"` | The type of the Hazelcast K8s service to use for Bitbucket  |\n| bitbucket.license.secretKey | string | `\"license-key\"` | The key in the K8s Secret that contains the Bitbucket license key  |\n| bitbucket.license.secretName | string | `nil` | The name of the K8s Secret that contains the Bitbucket license key. If specified, then the license will be automatically populated during Bitbucket setup. Otherwise, it will need to be provided via the browser after initial startup. An Example of creating a K8s secret for the license below: 'kubectl create secret generic <secret-name> --from-literal=license-key=<license> https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| bitbucket.livenessProbe.customProbe | object | `{}` | Custom livenessProbe to override the default tcpSocket probe  |\n| bitbucket.livenessProbe.enabled | bool | `false` | Whether to apply the livenessProbe check to pod.  |\n| bitbucket.livenessProbe.failureThreshold | int | `12` | The number of consecutive failures of the Bitbucket container liveness probe before the pod fails liveness checks.  |\n| bitbucket.livenessProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| bitbucket.livenessProbe.periodSeconds | int | `5` | How often (in seconds) the Bitbucket container liveness probe will run  |\n| bitbucket.livenessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| bitbucket.mesh.additionalAnnotations | object | `{}` | Defines additional annotations to the Bitbucket Mesh StateFulSet. This might be required when deploying using a GitOps approach |\n| bitbucket.mesh.additionalCertificates | object | `{\"customCmd\":null,\"initContainer\":{\"resources\":{},\"securityContext\":{}},\"secretList\":[],\"secretName\":null}` | Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates  |\n| bitbucket.mesh.additionalCertificates.customCmd | string | `nil` | Custom command to be executed in the init container to import certificates  |\n| bitbucket.mesh.additionalCertificates.initContainer.resources | object | `{}` | Resources allocated to the import-certs init container  |\n| bitbucket.mesh.additionalCertificates.initContainer.securityContext | object | `{}` | Custom SecurityContext for the import-certs init container  |\n| bitbucket.mesh.additionalCertificates.secretList | list | `[]` | A list of secrets with their respective keys holding certificates to be added to the Java truststore. It is mandatory to specify which keys from secret data need to be mounted as files to the init container.  |\n| bitbucket.mesh.additionalCertificates.secretName | string | `nil` | Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.  |\n| bitbucket.mesh.additionalEnvironmentVariables | object | `{}` | Defines any additional environment variables to be passed to the Bitbucket mesh containers.  |\n| bitbucket.mesh.additionalFiles | string | `nil` | Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into service container  |\n| bitbucket.mesh.additionalInitContainers | object | `{}` | Additional initContainer definitions that will be added to all Bitbucket pods  |\n| bitbucket.mesh.additionalJvmArgs | list | `[]` | Specifies a list of additional arguments that can be passed to the Bitbucket Mesh JVM, e.g. system properties.  |\n| bitbucket.mesh.affinity | object | `{}` | Standard Kubernetes affinities that will be applied to all Bitbucket mesh pods  |\n| bitbucket.mesh.enabled | bool | `false` | Enable Bitbucket Mesh. See: https://confluence.atlassian.com/bitbucketserver/bitbucket-mesh-1128304351.html  |\n| bitbucket.mesh.hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| bitbucket.mesh.image | object | `{\"pullPolicy\":\"IfNotPresent\",\"repository\":\"atlassian/bitbucket-mesh\",\"tag\":\"4.2.0\"}` | The Bitbucket Mesh image to use https://hub.docker.com/r/atlassian/bitbucket-mesh  |\n| bitbucket.mesh.image.pullPolicy | string | `\"IfNotPresent\"` | Image pull policy  |\n| bitbucket.mesh.image.repository | string | `\"atlassian/bitbucket-mesh\"` | The Bitbucket Mesh image repository https://hub.docker.com/r/atlassian/bitbucket-mesh  |\n| bitbucket.mesh.image.tag | string | `\"4.2.0\"` | The docker image tag to be used  |\n| bitbucket.mesh.nodeAutoRegistration | bool | `false` | Experimental! Automatically register Bitbucket mesh nodes with the Bitbucket server. `bitbucket.sysadminCredentials.secretName` needs to be defined to provide credentials to post-install node registration jobs that are created only for new Helm chart installations. It is recommended to manually register Mesh nodes in Butbucket UI.  |\n| bitbucket.mesh.nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Bitbucket Mesh pods  |\n| bitbucket.mesh.podAnnotations | object | `{}` | Custom annotations that will be applied to all Bitbucket Mesh pods  |\n| bitbucket.mesh.podLabels | object | `{}` | Custom labels that will be applied to all Bitbucket Mesh pods  |\n| bitbucket.mesh.podManagementPolicy | string | `\"OrderedReady\"` |  |\n| bitbucket.mesh.priorityClassName | string | `nil` | Pod PriorityClassName https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| bitbucket.mesh.replicaCount | int | `3` | Number of Bitbucket Mesh nodes. Do not change it. Currently, only the quorum of 3 mesh nodes is supported. Reducing the number of replicas will result in mesh degradation while increasing the number of Mesh nodes will result in new nodes being unused by the Bitbucket server.  |\n| bitbucket.mesh.resources | object | `{\"container\":{\"limits\":{\"cpu\":\"2\",\"memory\":\"2G\"},\"requests\":{\"cpu\":\"1\",\"memory\":\"2G\"}},\"jvm\":{\"maxHeap\":\"1g\",\"minHeap\":\"512m\"}}` | Bitbucket Mesh resources requests and limits  |\n| bitbucket.mesh.resources.container | object | `{\"limits\":{\"cpu\":\"2\",\"memory\":\"2G\"},\"requests\":{\"cpu\":\"1\",\"memory\":\"2G\"}}` | Bitbucket Mesh container cpu/mem requests and limits  |\n| bitbucket.mesh.resources.jvm | object | `{\"maxHeap\":\"1g\",\"minHeap\":\"512m\"}` | Bitbucket Mesh JVM heap settings  |\n| bitbucket.mesh.schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Bitbucket pods. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| bitbucket.mesh.service.annotations | object | `{}` | Bitbucket mesh service annotations  |\n| bitbucket.mesh.service.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| bitbucket.mesh.service.port | int | `7777` | Bitbucket Mesh port  |\n| bitbucket.mesh.service.type | string | `\"ClusterIP\"` | The type of K8s service to use for Bitbucket mesh service  |\n| bitbucket.mesh.setByDefault | bool | `false` | Experimental! Automatically create all new repositories on Bitbucket mesh nodes. `bitbucket.sysadminCredentials.secretName` needs to be defined to provide credentials to node post-install job. It is recommended to manually configure it in Bitbucket UI.  |\n| bitbucket.mesh.shutdown.terminationGracePeriodSeconds | int | `35` | The termination grace period for pods during shutdown. This should be set to the Bitbucket internal grace period (default 30 seconds), plus a small buffer to allow the JVM to fully terminate.  |\n| bitbucket.mesh.tolerations | object | `{}` | Standard K8s tolerations that will be applied to all Bitbucket Mesh pods  |\n| bitbucket.mesh.topologySpreadConstraints | object | `{}` | Defines topology spread constraints for Bitbucket Mesh pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| bitbucket.mesh.volume | object | `{\"create\":true,\"mountPath\":\"/var/atlassian/application-data/mesh\",\"persistentVolumeClaimRetentionPolicy\":{\"whenDeleted\":null,\"whenScaled\":null},\"resources\":{\"requests\":{\"storage\":\"1Gi\"}},\"storageClass\":null}` | Mesh home volume settings. Disabling persistence results in data loss!  |\n| bitbucket.mirror.upstreamUrl | string | `nil` | Specifies the URL of the upstream Bitbucket server for this mirror.  |\n| bitbucket.podManagementStrategy | string | `\"OrderedReady\"` | Pod management strategy. Bitbucket Data Center requires the \"OrderedReady\" value but for Bitbucket Mirrors you can use the \"Parallel\" option. To learn more, visit https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies  |\n| bitbucket.ports.hazelcast | int | `5701` | The port on which the Hazelcast listens for client traffic  |\n| bitbucket.ports.http | int | `7990` | The port on which the Bitbucket container listens for HTTP traffic  |\n| bitbucket.ports.ssh | int | `7999` | The port on which the Bitbucket SSH service will listen on. Must be within 1024-65535 range  |\n| bitbucket.postStart | object | `{\"command\":null}` | PostStart is executed immediately after a container is created. However, there is no guarantee that the hook will execute before the container ENTRYPOINT. See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks  |\n| bitbucket.readinessProbe.customProbe | object | `{}` | Custom readinessProbe to override the default /status httpGet  |\n| bitbucket.readinessProbe.enabled | bool | `true` | Whether to apply the readinessProbe check to pod.  |\n| bitbucket.readinessProbe.failureThreshold | int | `60` | The number of consecutive failures of the Bitbucket container readiness probe before the pod fails readiness checks.  |\n| bitbucket.readinessProbe.initialDelaySeconds | int | `10` | The initial delay (in seconds) for the Bitbucket container readiness probe, after which the probe will start running.  |\n| bitbucket.readinessProbe.periodSeconds | int | `5` | How often (in seconds) the Bitbucket container readiness probe will run  |\n| bitbucket.readinessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| bitbucket.resources.container.requests.cpu | string | `\"2\"` | Initial CPU request by Bitbucket pod  |\n| bitbucket.resources.container.requests.memory | string | `\"2G\"` | Initial Memory request by Bitbucket pod  |\n| bitbucket.resources.jvm.maxHeap | string | `\"1g\"` | The maximum amount of heap memory that will be used by the Bitbucket JVM The same value will be used by the Elasticsearch JVM. |\n| bitbucket.resources.jvm.minHeap | string | `\"512m\"` | The minimum amount of heap memory that will be used by the Bitbucket JVM The same value will be used by the Elasticsearch JVM. |\n| bitbucket.securityContext.fsGroup | int | `2003` | The GID used by the Bitbucket docker image GID will default to 2003 if not supplied and securityContextEnabled is set to true. This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Bitbucket container. However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260  |\n| bitbucket.securityContext.fsGroupChangePolicy | string | `\"OnRootMismatch\"` | fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod. This field only applies to volume types that support fsGroup controlled ownership and permissions. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods  |\n| bitbucket.securityContextEnabled | bool | `true` | Whether to apply security context to pod.  |\n| bitbucket.service.annotations | object | `{}` | Additional annotations to apply to the Service  |\n| bitbucket.service.contextPath | string | `nil` | The context path that Bitbucket will use.  |\n| bitbucket.service.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| bitbucket.service.nodePort | string | `nil` | Only applicable if service.type is NodePort. NodePort for Bitbucket service  |\n| bitbucket.service.port | int | `80` | The port on which the Bitbucket K8s HTTP Service will listen  |\n| bitbucket.service.sessionAffinity | string | `\"None\"` | Session affinity type. If you want to make sure that connections from a particular client are passed to the same pod each time, set sessionAffinity to ClientIP. See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity  |\n| bitbucket.service.sessionAffinityConfig | object | `{\"clientIP\":{\"timeoutSeconds\":null}}` | Session affinity configuration  |\n| bitbucket.service.sessionAffinityConfig.clientIP.timeoutSeconds | string | `nil` | Specifies the seconds of ClientIP type session sticky time. The value must be > 0 && <= 86400 (for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).  |\n| bitbucket.service.sshNodePort | string | `nil` | SSH  Only applicable if service.type is NodePort. NodePort for Bitbucket service  |\n| bitbucket.service.sshPort | int | `7999` | The port on which the Bitbucket K8s SSH Service will listen  |\n| bitbucket.service.type | string | `\"ClusterIP\"` | The type of K8s service to use for Bitbucket  |\n| bitbucket.setPermissions | bool | `true` | Boolean to define whether to set local home directory permissions on startup of Bitbucket container. Set to 'false' to disable this behaviour.  |\n| bitbucket.shutdown.command | string | `\"/shutdown-wait.sh\"` | By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/), using a script supplied by the Docker image. If any other shutdown behaviour is needed it can be achieved by overriding this value. Note that the shutdown command needs to wait for the application shutdown completely before exiting; see [the default command](https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/src/master/shutdown-wait.sh) for details.  |\n| bitbucket.shutdown.terminationGracePeriodSeconds | int | `35` | The termination grace period for pods during shutdown. This should be set to the Bitbucket internal grace period (default 30 seconds), plus a small buffer to allow the JVM to fully terminate.  |\n| bitbucket.sshService | object | `{\"annotations\":{},\"enabled\":false,\"host\":null,\"loadBalancerIP\":null,\"nodePort\":null,\"port\":22,\"type\":\"LoadBalancer\"}` | Enable or disable an additional service for exposing SSH for external access. Disable when the SSH service is exposed through the ingress controller, or enable if the ingress controller does not support TCP.  |\n| bitbucket.sshService.annotations | object | `{}` | Annotations for the SSH service. Useful if a load balancer controller needs extra annotations.  |\n| bitbucket.sshService.enabled | bool | `false` | Set to 'true' if an additional SSH Service should be created  |\n| bitbucket.sshService.host | string | `nil` | The hostname of the SSH service. If set, it'll be used to configure the SSH base URL for the application.  |\n| bitbucket.sshService.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| bitbucket.sshService.nodePort | string | `nil` | Only applicable if service.type is NodePort. NodePort for Bitbucket ssh service  |\n| bitbucket.sshService.port | int | `22` | Port to expose the SSH service on.  |\n| bitbucket.sshService.type | string | `\"LoadBalancer\"` | SSH Service type  |\n| bitbucket.startupProbe.enabled | bool | `false` | Whether to apply the startupProbe check to pod.  |\n| bitbucket.startupProbe.failureThreshold | int | `120` | The number of consecutive failures of the Bitbucket container startup probe before the pod fails startup checks.  |\n| bitbucket.startupProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| bitbucket.startupProbe.periodSeconds | int | `5` | How often (in seconds) the Bitbucket container startup probe will run  |\n| bitbucket.sysadminCredentials.displayNameSecretKey | string | `\"displayName\"` | The key in the Kubernetes Secret that contains the sysadmin display name  |\n| bitbucket.sysadminCredentials.emailAddressSecretKey | string | `\"emailAddress\"` | The key in the Kubernetes Secret that contains the sysadmin email address  |\n| bitbucket.sysadminCredentials.passwordSecretKey | string | `\"password\"` | The key in the Kubernetes Secret that contains the sysadmin password  |\n| bitbucket.sysadminCredentials.secretName | string | `nil` | The name of the Kubernetes Secret that contains the Bitbucket sysadmin credentials If specified, then these will be automatically populated during Bitbucket setup. Otherwise, they will need to be provided via the browser after initial startup.  |\n| bitbucket.sysadminCredentials.usernameSecretKey | string | `\"username\"` | The key in the Kubernetes Secret that contains the sysadmin username  |\n| bitbucket.topologySpreadConstraints | list | `[]` | Defines topology spread constraints for Bitbucket pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| bitbucket.useHelmReleaseNameAsContainerName | bool | `false` | Whether the main container should acquire helm release name. By default the container name is `bitbucket` which corresponds to the name of the Helm Chart.  |\n| database.credentials.passwordSecretKey | string | `\"password\"` | The key ('password') in the Secret used to store the database login password  |\n| database.credentials.secretName | string | `nil` | from-literal=password=<password>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| database.credentials.usernameSecretKey | string | `\"username\"` | The key ('username') in the Secret used to store the database login username  |\n| database.driver | string | `nil` | The Java class name of the JDBC driver to be used. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Valid drivers are: * 'org.postgresql.Driver' * 'com.mysql.jdbc.Driver' * 'oracle.jdbc.OracleDriver' * 'com.microsoft.sqlserver.jdbc.SQLServerDriver' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasedriver:  |\n| database.url | string | `nil` | The jdbc URL of the database. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Example URLs include: * 'jdbc:postgresql://<dbhost>:5432/<dbname>' * 'jdbc:mysql://<dbhost>/<dbname>' * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>' * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl  |\n| fluentd.command | string | `nil` | The command used to start Fluentd. If not supplied the default command will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"  Note: The custom command can be free-form, however pay particular attention to the process that should ultimately be left running in the container. This process should be invoked with 'exec' so that signals are appropriately propagated to it, for instance SIGTERM. An example of how such a command may look is: \"<command 1> && <command 2> && exec <primary command>\" |\n| fluentd.customConfigFile | bool | `false` | Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default) should be used for Fluentd. If enabled this config must be supplied via the 'fluentdCustomConfig' property below.  |\n| fluentd.elasticsearch.enabled | bool | `true` | Set to 'true' if Fluentd should send all log events to an Elasticsearch service.  |\n| fluentd.elasticsearch.hostname | string | `\"elasticsearch\"` | The hostname of the Elasticsearch service that Fluentd should send logs to.  |\n| fluentd.enabled | bool | `false` | Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod  |\n| fluentd.extraVolumes | list | `[]` | Specify custom volumes to be added to Fluentd container (e.g. more log sources)  |\n| fluentd.fluentdCustomConfig | object | `{}` | Custom fluent.conf file  |\n| fluentd.imageRepo | string | `\"fluent/fluentd-kubernetes-daemonset\"` | The Fluentd sidecar image repository  |\n| fluentd.imageTag | string | `\"v1.11.5-debian-elasticsearch7-1.2\"` | The Fluentd sidecar image tag  |\n| fluentd.resources | object | `{}` | Resources requests and limits for fluentd sidecar container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| gateway.additionalRules | list | `[]` | Advanced routing rules. Use this for complex routing scenarios like header-based routing, traffic splitting, or multiple backends. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule  |\n| gateway.annotations | object | `{}` | Annotations to add to the HTTPRoute resource.  |\n| gateway.create | bool | `false` | Set to 'true' if an HTTPRoute Resource should be created. This depends on a pre-provisioned Gateway API controller being available and a Gateway resource. Cannot be enabled if ingress.create is true.  |\n| gateway.filters | list | `[]` | HTTP filters to apply to requests. Can be used to add/remove headers, perform redirects, or rewrite URLs. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter  |\n| gateway.hostnames | list | `[]` | The hostnames that should be routed to Bitbucket. At least one hostname is required when gateway.create is true. Setting hostnames activates gateway mode for product configuration even when gateway.create is false, allowing use with a pre-existing Gateway or external proxy. The first entry is used as the canonical hostname for base URL, proxy settings, and NOTES output — list the primary/public hostname first.  |\n| gateway.https | bool | `true` | Whether users access the application over HTTPS. This does not configure TLS on the Gateway or load balancer — it must match how traffic is actually routed to the application.  |\n| gateway.labels | object | `{}` | Labels to add to the HTTPRoute resource.  |\n| gateway.parentRefs | list | `[]` | Reference to the parent Gateway resource. Supports any standard parentRef fields (name, namespace, sectionName, etc.). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference  |\n| gateway.path | string | `nil` | The base path for routing. When empty, falls back to the product's service.contextPath (same behavior as ingress). Set explicitly to override, e.g. \"/bitbucket\".  |\n| gateway.pathType | string | `\"PathPrefix\"` | Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\". PathPrefix is recommended for most use cases.  |\n| gateway.timeouts | object | `{\"backendRequest\":\"60s\",\"request\":\"60s\"}` | Timeout configuration for HTTPRoute rules. Note: when migrating from Ingress, these replace proxyReadTimeout and proxySendTimeout. There is no Gateway API equivalent for proxyConnectTimeout or maxBodySize — those require controller-specific policies (e.g. Envoy Gateway BackendTrafficPolicy). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts  |\n| hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| image | object | `{\"pullPolicy\":\"IfNotPresent\",\"repository\":\"atlassian/bitbucket\",\"tag\":\"\"}` | Image configuration  |\n| image.pullPolicy | string | `\"IfNotPresent\"` | Image pull policy  |\n| image.repository | string | `\"atlassian/bitbucket\"` | The Bitbucket Docker image to use https://hub.docker.com/r/atlassian/bitbucket  |\n| image.tag | string | `\"\"` | The docker image tag to be used - defaults to the Chart appVersion  |\n| ingress.additionalPaths | list | `[]` | Additional paths to be added to the Ingress resource to point to different backend services  |\n| ingress.annotations | object | `{}` | The custom annotations that should be applied to the Ingress Resource. If using an ingress-nginx controller be sure that the annotations you add here are compatible with those already defined in the 'ingess.yaml' template  |\n| ingress.className | string | `\"nginx\"` | The class name used by the ingress controller if it's being used.  Please follow documentation of your ingress controller. If the cluster contains multiple ingress controllers, this setting allows you to control which of them is used for Atlassian application traffic.  |\n| ingress.create | bool | `false` | Set to 'true' if an Ingress Resource should be created. This depends on a pre-provisioned Ingress Controller being available.  |\n| ingress.host | string | `nil` | The fully-qualified hostname (FQDN) of the Bitbucket instance. This value is used to configure the product's proxy settings and, when ingress.create is true, the Ingress resource routing rules.  |\n| ingress.https | bool | `true` | Whether users access the application over HTTPS. Set to 'false' if not using TLS, e.g. when reaching the service via localhost port-forwarding.  |\n| ingress.maxBodySize | string | `\"250m\"` | The max body size to allow. Requests exceeding this size will result in an HTTP 413 error being returned to the client.  |\n| ingress.nginx | bool | `true` | Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx' controller. https://kubernetes.github.io/ingress-nginx/  This will populate the Ingress Resource with annotations that are specific to the K8s ingress-nginx controller. Set to 'false' if a different controller is to be used, in which case the appropriate annotations for that controller must be specified below under 'ingress.annotations'.  |\n| ingress.openShiftRoute | bool | `false` | Set to true if you want to create an OpenShift Route instead of an Ingress  |\n| ingress.path | string | `nil` | The base path for the application, e.g. '/bitbucket'. Defaults to 'bitbucket.service.contextPath'.  |\n| ingress.proxyConnectTimeout | int | `60` | Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.  |\n| ingress.proxyReadTimeout | int | `60` | Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.  |\n| ingress.proxySendTimeout | int | `60` | Sets a timeout for transmitting a request to the proxied server. The timeout is set only between two successive write operations, not for the transmission of the whole request. If the proxied server does not receive anything within this time, the connection is closed.  |\n| ingress.routeHttpHeaders | object | `{}` | routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only  |\n| ingress.tlsSecretName | string | `nil` | The name of the K8s Secret that contains the TLS private key and corresponding certificate. When utilised, TLS termination occurs at the ingress point where traffic to the Service, and it's Pods is in plaintext.  Usage is optional and depends on your use case. The Ingress Controller itself can also be configured with a TLS secret for all Ingress Resources. https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets https://kubernetes.io/docs/concepts/services-networking/ingress/#tls  |\n| monitoring.exposeJmxMetrics | bool | `false` | Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter  |\n| monitoring.fetchJmxExporterJar | bool | `true` | Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar to shared home and provide an absolute path in jmxExporterCustomJarLocation  |\n| monitoring.grafana.createDashboards | bool | `false` | Create ConfigMaps with Grafana dashboards  |\n| monitoring.grafana.dashboardAnnotations | object | `{}` | Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage  |\n| monitoring.grafana.dashboardLabels | object | `{}` | Label selector for Grafana dashboard importer sidecar  |\n| monitoring.jmxExporterCustomConfig | object | `{}` | Custom JMX config with the rules  |\n| monitoring.jmxExporterCustomJarLocation | string | `nil` | Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home  |\n| monitoring.jmxExporterImageRepo | string | `\"bitnamilegacy/jmx-exporter\"` | Image repository with jmx_exporter jar  |\n| monitoring.jmxExporterImageTag | string | `\"0.18.0\"` |  |\n| monitoring.jmxExporterInitContainer | object | `{\"customSecurityContext\":{},\"jmxJarLocation\":null,\"resources\":{},\"runAsRoot\":true}` | JMX exporter init container configuration  |\n| monitoring.jmxExporterInitContainer.customSecurityContext | object | `{}` | Custom SecurityContext for the jmx exporter init container  |\n| monitoring.jmxExporterInitContainer.jmxJarLocation | string | `nil` | The location of the JMX exporter jarfile in the JMX exporter image Leave blank for default bitnami image  |\n| monitoring.jmxExporterInitContainer.resources | object | `{}` | Resources requests and limits for the JMX exporter init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| monitoring.jmxExporterInitContainer.runAsRoot | bool | `true` | Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume. Set to false if running containers as root is not allowed in the cluster.  |\n| monitoring.jmxExporterPort | int | `9999` | Port number on which metrics will be available  |\n| monitoring.jmxExporterPortType | string | `\"ClusterIP\"` | JMX exporter port type  |\n| monitoring.jmxServiceAnnotations | object | `{}` | Annotations added to the jmx service  |\n| monitoring.serviceMonitor.create | bool | `false` | Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.  |\n| monitoring.serviceMonitor.prometheusLabelSelector | object | `{}` | ServiceMonitorSelector of the prometheus instance.  |\n| monitoring.serviceMonitor.scrapeIntervalSeconds | int | `30` | Scrape interval for the JMX service.  |\n| monitoring.serviceMonitor.scrapeTimeoutSeconds | int | `20` | How long until a scrape request times out. It cannot be greater than the scrape interval.  |\n| nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Bitbucket pods  |\n| opensearch | object | `{\"baseUrl\":null,\"credentials\":{\"passwordSecretKey\":\"password\",\"secretName\":null,\"usernameSecretKey\":\"username\"},\"envFrom\":[{\"secretRef\":{\"name\":\"opensearch-initial-password\"}}],\"extraEnvs\":[{\"name\":\"plugins.security.ssl.http.enabled\",\"value\":\"false\"}],\"install\":false,\"persistence\":{\"size\":\"10Gi\"},\"resources\":{\"requests\":{\"cpu\":1,\"memory\":\"1Gi\"}},\"securityConfig\":{\"internalUsersSecret\":null},\"singleNode\":true}` | OpenSearch config. See: https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch for all available Helm values. Example OpenSearch configurations can be found at https://confluence.atlassian.com/bitbucketserver/install-and-configure-a-remote-opensearch-server-1115664379.html  |\n| opensearch.baseUrl | string | `nil` | The base URL of the external OpenSearch instance to be used, for example: http://opensearch-master.<namespace>.svc.cluster.local:9200 If this is defined and opensearch.install is set to false, then Bitbucket will disable its internal OpenSearch instance.  |\n| opensearch.credentials.passwordSecretKey | string | `\"password\"` | The key in the Kubernetes Secret that contains the OpenSearch password.  |\n| opensearch.credentials.secretName | string | `nil` | from-literal=password=<password>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets When undefined and opensearch.install is set to true, a random password for admin user will be generated and saved to 'opensearch-initial-password' secret. |\n| opensearch.credentials.usernameSecretKey | string | `\"username\"` | The key in the Kubernetes Secret that contains the OpenSearch username.  |\n| opensearch.install | bool | `false` | Deploy OpenSearch Helm chart and automatically configure Bitbucket to use it as a search platform. When set to true, Bitbucket will disable its internal OpenSearch instance  |\n| opensearch.securityConfig.internalUsersSecret | string | `nil` | Secret with pre-defined internal_users.yml. When undefined, Bitbucket will use initial admin user credentials to create indexes in OpenSearch. See: https://atlassian.github.io/data-center-helm-charts/examples/bitbucket/BITBUCKET_OPENSEARCH/ |\n| openshift.runWithRestrictedSCC | bool | `false` | When set to true, the containers will run with a restricted Security Context Constraint (SCC). See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server configuration files as ConfigMaps.  |\n| ordinals | object | `{\"enabled\":false,\"start\":0}` | Set a custom start ordinal number for the K8s stateful set. Note that this depends on the StatefulSetStartOrdinal K8s feature gate, which has entered beta state with K8s version 1.27.  |\n| ordinals.enabled | bool | `false` | Enable only if StatefulSetStartOrdinal K8s feature gate is available.  |\n| ordinals.start | int | `0` | Set start ordinal to a positive integer, defaulting to 0.  |\n| podAnnotations | object | `{}` | Custom annotations that will be applied to all Bitbucket pods  |\n| podDisruptionBudget | object | `{\"annotations\":{},\"enabled\":false,\"labels\":{},\"maxUnavailable\":null,\"minAvailable\":null}` | PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.  |\n| podLabels | object | `{}` | Custom labels that will be applied to all Bitbucket pods  |\n| priorityClassName | string | `nil` | Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster. For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| replicaCount | int | `1` | The initial number of Bitbucket pods that should be started at deployment time. Note that if Bitbucket is fully configured (see above) during initial deployment a 'replicaCount' greater than 1 can be supplied.  |\n| schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Bitbucket pods. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| serviceAccount.annotations | object | `{}` | Annotations to add to the ServiceAccount (if created)  |\n| serviceAccount.clusterRole.create | bool | `false` | Set to 'true' if a ClusterRole should be created, or 'false' if it already exists.  |\n| serviceAccount.clusterRole.name | string | `nil` | The name of the ClusterRole to be used. If not specified, but the \"serviceAccount.clusterRole.create\" flag is set to 'true', then the ClusterRole name will be auto-generated.  |\n| serviceAccount.clusterRoleBinding.create | bool | `false` | Set to 'true' if a ClusterRoleBinding should be created, or 'false' if it already exists.  |\n| serviceAccount.clusterRoleBinding.name | string | `nil` | The name of the ClusterRoleBinding to be created. If not specified, but the \"serviceAccount.clusterRoleBinding.create\" flag is set to 'true', then the ClusterRoleBinding name will be auto-generated.  |\n| serviceAccount.create | bool | `true` | Set to 'true' if a ServiceAccount should be created, or 'false' if it already exists.  |\n| serviceAccount.imagePullSecrets | list | `[]` | For Docker images hosted in private registries, define the list of image pull secrets that should be utilized by the created ServiceAccount https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod  |\n| serviceAccount.name | string | `nil` | The name of the ServiceAccount to be used by the pods. If not specified, but the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name will be auto-generated, otherwise the 'default' ServiceAccount will be used. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server  |\n| serviceAccount.role.create | bool | `true` | Create a role for Hazelcast client with privileges to get and list pods and endpoints in the namespace. Set to false if you need to create a Role and RoleBinding manually  |\n| serviceAccount.roleBinding | object | `{\"create\":true}` | Grant permissions defined in Role (list and get pods and endpoints) to a service account.  |\n| testPods | object | `{\"affinity\":{},\"annotations\":{},\"image\":{\"permissionsTestContainer\":\"debian:stable-slim\",\"statusTestContainer\":\"alpine:latest\"},\"labels\":{},\"nodeSelector\":{},\"resources\":{},\"schedulerName\":null,\"tolerations\":[]}` | Metadata and pod spec for pods started in Helm tests  |\n| tolerations | list | `[]` | Standard K8s tolerations that will be applied to all Bitbucket pods  |\n| updateStrategy | object | `{}` | StatefulSet update strategy. When unset defaults to Rolling update. See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets  |\n| volumes.additional | list | `[]` | Defines additional volumes that should be applied to all Bitbucket pods. Note that this will not create any corresponding volume mounts; those need to be defined in bitbucket.additionalVolumeMounts  |\n| volumes.localHome.customVolume | object | `{}` | Static provisioning of local-home using K8s PVs and PVCs  NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for pods is not recommended. Dynamic provisioning described above is the prescribed approach.  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the local-home volume(s). If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static  |\n| volumes.localHome.mountPath | string | `\"/var/atlassian/application-data/bitbucket\"` | Specifies the path in the Bitbucket container to which the local-home volume will be mounted.  |\n| volumes.localHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically created for each pod based on the 'StorageClassName' supplied below.  |\n| volumes.localHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the local-home volume claims.  |\n| volumes.localHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the local-home volume claim.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted | string | `nil` | Configures the volume retention behavior that applies when the StatefulSet is deleted.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled | string | `nil` | Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.  |\n| volumes.localHome.subPath | string | `nil` | Specifies the sub-directory of the local-home volume that will be mounted in to the Bitbucket container.  |\n| volumes.sharedHome.customVolume | object | `{}` | Static provisioning of shared-home using K8s PVs and PVCs  When 'persistentVolume.create' and 'persistentVolumeClaim.create' are 'false', then this property can be used to define a custom volume that will be used for shared-home If not defined, then an 'emptyDir' volume is utilised.  Having manually provisioned a 'PersistentVolume' with corresponding 'PersistentVolumeClaim' specify the bound claim name below https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/  |\n| volumes.sharedHome.mountPath | string | `\"/var/atlassian/application-data/shared-home\"` | Specifies the path in the Bitbucket container to which the shared-home volume will be mounted.  |\n| volumes.sharedHome.nfsPermissionFixer.command | string | `nil` | By default, the fixer will change the group ownership of the volume's root directory to match the Bitbucket container's GID (2003), and then ensures the directory is group-writeable. If this is not the desired behaviour, command used can be specified here.  |\n| volumes.sharedHome.nfsPermissionFixer.enabled | bool | `true` | If 'true', this will alter the shared-home volume's root directory so that Bitbucket can write to it. This is a workaround for a K8s bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260  |\n| volumes.sharedHome.nfsPermissionFixer.imageRepo | string | `\"alpine\"` | Image repository for the permission fixer init container. Defaults to alpine  |\n| volumes.sharedHome.nfsPermissionFixer.imageTag | string | `\"latest\"` | Image tag for the permission fixer init container. Defaults to latest  |\n| volumes.sharedHome.nfsPermissionFixer.mountPath | string | `\"/shared-home\"` | The path in the K8s initContainer where the shared-home volume will be mounted  |\n| volumes.sharedHome.nfsPermissionFixer.resources | object | `{}` | Resources requests and limits for nfsPermissionFixer init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| volumes.sharedHome.persistentVolume.create | bool | `false` | If 'true' then a 'PersistentVolume' will be created for the NFS server  |\n| volumes.sharedHome.persistentVolume.mountOptions | list | `[]` | Additional options to be used when mounting the NFS volume  |\n| volumes.sharedHome.persistentVolume.nfs.path | string | `\"\"` | Specifies NFS directory share. This will be mounted into the Pod(s) using the 'volumes.sharedHome.mountPath'  |\n| volumes.sharedHome.persistentVolume.nfs.server | string | `\"\"` | The address of the NFS server. It needs to be resolvable by the kubelet, so consider using an IP address.  |\n| volumes.sharedHome.persistentVolumeClaim.accessMode | string | `\"ReadWriteMany\"` | Specifies the access mode of the volume to claim  |\n| volumes.sharedHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolumeClaim' will be created for the 'PersistentVolume'  |\n| volumes.sharedHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the shared-home volume claims.  |\n| volumes.sharedHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used  If set to non-empty string value, this will specify the storage class to be used. If left without value, the default Storage Class will be utilised. Alternatively, can be set to the empty string \"\", to indicate that no Storage Class should be used here. |\n| volumes.sharedHome.persistentVolumeClaim.volumeName | string | `nil` | If persistentVolume.create and persistentVolumeClaim.create are both true then any value supplied here is ignored and the default used. A custom value here is useful when bringing your own 'PersistentVolume' i.e. 'persistentVolume.create' is false.  |\n| volumes.sharedHome.subPath | string | `nil` | Specifies the sub-directory of the shared-home volume that will be mounted in to the Bitbucket container.  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/bitbucket-mesh/mesh-grpc.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 34,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"calls\\\",name=\\\"total\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Calls\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 35,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"calls\\\",name=\\\"running\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Running Calls\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 36,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"calls\\\",name=\\\"successful\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Successful Calls\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 37,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"calls\\\",name=\\\"failed\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Failed Calls\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"decbytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"memoryPool\\\", name=\\\"used\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"MemoryPool Bytes Used\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"decbytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 16\n      },\n      \"id\": 40,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"memoryPool\\\", name=\\\"committed\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"MemoryPool Bytes Committed\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 41,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"memoryPool\\\", name=\\\"allocations\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{size}} (instance)\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Allocations\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"id\": 39,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_grpc_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"memoryPool\\\", name=\\\"deallocations\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{size}} (instance)\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Deallocations\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket-mesh\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Mesh gRPC\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/bitbucket-mesh/mesh-overview.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"DOWN\"\n                }\n              },\n              \"type\": \"special\"\n            },\n            {\n              \"options\": {\n                \"from\": 1,\n                \"result\": {\n                  \"index\": 1,\n                  \"text\": \"UP\"\n                },\n                \"to\": 9999999\n              },\n              \"type\": \"range\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 1\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 22,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Pid{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Status\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 2,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 21,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Uptime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}/1000\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"dateTimeAsIso\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 2,\n        \"x\": 5,\n        \"y\": 0\n      },\n      \"id\": 23,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_StartTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Start time\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 2,\n        \"x\": 7,\n        \"y\": 0\n      },\n      \"id\": 24,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"java_lang_OperatingSystem_AvailableProcessors{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Available CPU Cores\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 0\n      },\n      \"id\": 18,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"jvm_threads_state{namespace=\\\"$namespace\\\", service=\\\"$service\\\", state=\\\"BLOCKED\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ state }} ({{ pod }})\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Blocked Threads\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"100*(jvm_memory_bytes_used{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\",}/jvm_memory_bytes_max{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\",})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Used {{ area }} ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Heap Used %\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 40\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(java_lang_OperatingSystem_ProcessCpuLoad{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} * 100)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"cpu load ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"CPU\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 7\n      },\n      \"id\": 34,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 8,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 15\n      },\n      \"id\": 33,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"60s\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 15\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_mesh_IdleConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"idle ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_mesh_ActiveConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"active ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_mesh_ThreadsAwaitingConnection{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"awaiting ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_mesh_TotalConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"total ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Hikari Pool\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket-mesh\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Mesh Overview\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/bitbucket-mesh/mesh-repair.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Total time taken for repair operations\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 34,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_operation_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", operation=\\\"repair\\\",name=\\\"Total\\\",}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Repair Time 99th Percentile\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Duration of the ref comparison phase of repair.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 35,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_operation_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", operation=\\\"repair\\\",name=\\\"CompareRefs\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CompareRefs 99th Percentile\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Duration of the fetch objects phase of repair.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 36,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_operation_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", operation=\\\"repair\\\",name=\\\"FetchObjects\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"FetchObjects 99th Percentile\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Duration of the ref comparison phase of repair.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 37,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_operation_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", operation=\\\"repair\\\",name=\\\"CompareReflogs\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CompareReflogs 99th Percentile\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of repair operations since start\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_operation_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", operation=\\\"repair\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Repair Calls Count by Type\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of repair operations since start\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 16\n      },\n      \"id\": 39,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_repair_Number{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"calls\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Repair Calls Count by Status\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket-mesh\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Mesh Repair\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/bitbucket-mesh/mesh-tickets.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Limits the number of SCM hosting operations, meaning pushes and pulls, which may be running concurrently. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 40,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"tickets\\\", throttledResource=\\\"scm-hosting\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Hosting Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"LFS tickets: Limits the number of Git LFS file transfer operations that may be running concurrently. This is primarily intended to prevent Git LFS requests from consuming all available connections, thereby degrading Git hosting operations.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 41,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"tickets\\\", throttledResource=\\\"git-lfs\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Git LFS Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Limits the number of SCM Ref Advertisement operations that may be running concurrently. These are throttled separately from hosting operations as they are much more lightweight and much shorter, so many more of them can run concurrently.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 43,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"tickets\\\", throttledResource=\\\"scm-refs\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Ref Advertisement Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Limits the number of SCM commands, such as: git diff, git blame, or git rev-list, which may be running concurrently.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 42,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"tickets\\\", throttledResource=\\\"scm-command\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Command Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of tickets currently available for use.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"tickets\\\" ,name=\\\"available\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{throttledResource}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tickets Available by Type\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of tickets currently in use.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 16\n      },\n      \"id\": 39,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", section=\\\"tickets\\\" ,name=\\\"used\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{throttledResource}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tickets Used by Type\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket-mesh\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"metrics_grpc_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"metrics_grpc_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Mesh Hosting Tickets\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/build-actions-thread-pool-stats.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Details relating to Threads that handle Integrated CI/CD build actions\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The current number of threads in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_BuildActionsThreadPool_PoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Current pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate number of threads that are actively executing tasks\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_BuildActionsThreadPool_ActiveCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Active threads ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active thread count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The number of tasks awaiting execution by the thread pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_BuildActionsThreadPool_QueueLength{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current queue length ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Queue length\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate total number of tasks that have completed execution. Because the states of tasks and threads may change dynamically during computation, the returned value is only an approximation, but one that does not ever decrease across successive calls\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 12\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_BuildActionsThreadPool_CompletedTaskCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Completed tasks ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Completed task count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The largest number of threads that have ever been simultaneously in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_BuildActionsThreadPool_LargestPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Largest thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Largest pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The maximum allowed number of threads\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_BuildActionsThreadPool_MaximumPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Max pool size ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max pool size\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Build actions thread pool stats\",\n  \"version\": 10,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/db-ops.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Active Connections (in use)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_zaxxer_hikari_Pool_bitbucket_ActiveConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Active connections ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Idle Connection count\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_zaxxer_hikari_Pool_bitbucket_IdleConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Idle connections ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Idle connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The number of threads waiting for a connection (when all available connections are in use)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_zaxxer_hikari_Pool_bitbucket_ThreadsAwaitingConnection{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Threads awaiting connections ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Threads awaiting connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total Connections\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_zaxxer_hikari_Pool_bitbucket_TotalConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Total connections ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total connections \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Global number of cached queries successfully retrieved from cache\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 17\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(org_hibernate_core_bitbucket_core_QueryCacheHitCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Query cache hit ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Hibernate query cache hit count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Global number of cacheable entities/collections successfully retrieved from the cache\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 17\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(org_hibernate_core_bitbucket_core_SecondLevelCacheHitCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} Second level query cache hit ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Hibernate second level query cache hit count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Global number of cached queries not found in cache\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 26\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(org_hibernate_core_bitbucket_core_QueryCacheMissCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Query cache miss ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Hibernate query cache miss count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Global number of cacheable entities/collections not found in the cache and loaded from the database\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 26\n      },\n      \"id\": 9,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(org_hibernate_core_bitbucket_core_SecondLevelCacheMissCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} Second level query cache miss ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Hibernate second level query cache miss count\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket DB Ops\",\n  \"version\": 2,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/event-thread-pool-stats.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Details relating to Threads that dispatch events to @EventListenermethods\\t\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The current number of threads in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_EventThreadPool_PoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Current pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate number of threads that are actively executing tasks\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_EventThreadPool_ActiveCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Active threads ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active thread count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The number of tasks awaiting execution by the thread pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_EventThreadPool_QueueLength{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current queue length ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Queue length\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate total number of tasks that have completed execution. Because the states of tasks and threads may change dynamically during computation, the returned value is only an approximation, but one that does not ever decrease across successive calls\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 12\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_EventThreadPool_CompletedTaskCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Completed tasks ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Completed task count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The largest number of threads that have ever been simultaneously in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_EventThreadPool_LargestPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Largest thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Largest pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The maximum allowed number of threads\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_EventThreadPool_MaximumPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Max pool size ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max pool size\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Event thread pool stats\",\n  \"version\": 3,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/git-ops.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of clone requests served over HTTP and SSH\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_CloneRequestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} HTTP ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_CloneRequestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Clone request count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Bytes read from clients during clone operations\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10000000000000000\n              }\n            ]\n          },\n          \"unit\": \"decbytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 15,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_CloneBytesRead{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"legendFormat\": \"{{name}} HTTP bytes read ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_CloneBytesRead{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH bytes read ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_CloneBytesWritten{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} HTTP bytes written ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_CloneBytesWritten{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH bytes written ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Cloned bytes read & written to clients \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Total number of requests served\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 19,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_RequestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} HTTP ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_RequestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Total number of requests served\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Total bytes read and written\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"decbytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 10\n      },\n      \"id\": 18,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_TotalBytesRead{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"HTTP bytes read ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_TotalBytesRead{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"SSH bytes read ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_TotalBytesWritten{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"HTTP bytes written ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_TotalBytesWritten{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"SSH bytes written ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Total bytes read & written to clients\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"HTTP and SSH Clone requests that could not be served from the scm-cache\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 14,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_CloneCacheMiss{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} HTTP miss ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_CloneCacheMiss{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH miss ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_CloneCacheHit{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} HTTP hit ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_CloneCacheHit{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH hit ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"D\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_atlassian_bitbucket_HttpHostingStatistics_CloneCacheBypass\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} HTTP bypass ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"E\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_atlassian_bitbucket_SshHostingStatistics_CloneCacheBypass\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH bypass ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"F\"\n        }\n      ],\n      \"title\": \"Clone cache hit, miss & bypass count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of fetch requests served\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10000000000000000\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 28\n      },\n      \"id\": 16,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_FetchRequestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"legendFormat\": \"{{name}} HTTP ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_FetchRequestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Fetch request count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Bytes read and written from clients during fetch operations\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10000000000000000\n              }\n            ]\n          },\n          \"unit\": \"decbytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 28\n      },\n      \"id\": 20,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_FetchBytesRead{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"legendFormat\": \"{{name}} HTTP bytes read ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_FetchBytesRead{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH bytes read ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_HttpHostingStatistics_FetchBytesWritten{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} HTTP bytes written ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshHostingStatistics_FetchBytesWritten{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} SSH bytes written ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Fetched bytes read and written to clients\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Git Operations\",\n  \"version\": 31,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/io-pump-thread-pool-stats.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Details relating to Threads that handle blocking process I/O\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The current number of threads in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_IoPumpThreadPool_PoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Current pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate number of threads that are actively executing tasks\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_IoPumpThreadPool_ActiveCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Active threads ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active thread count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The number of tasks awaiting execution by the thread pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_IoPumpThreadPool_QueueLength{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current queue length ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Queue length\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate total number of tasks that have completed execution. Because the states of tasks and threads may change dynamically during computation, the returned value is only an approximation, but one that does not ever decrease across successive calls\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 12\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_IoPumpThreadPool_CompletedTaskCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Completed tasks ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Completed task count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The largest number of threads that have ever been simultaneously in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_IoPumpThreadPool_LargestPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Largest thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Largest pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The maximum allowed number of threads\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_IoPumpThreadPool_MaximumPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Max pool size ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max pool size\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket IO pump thread pool stats\",\n  \"version\": 3,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/nio-pump-thread-pool-stats.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Details relating to Threads that handle nonblocking process I/O\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The current number of threads in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_NioPumpThreadPool_PoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Current pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate number of threads that are actively executing tasks\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_NioPumpThreadPool_ActiveCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Active threads ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active thread count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The number of tasks awaiting execution by the thread pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_NioPumpThreadPool_QueueLength{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current queue length ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Queue length\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate total number of tasks that have completed execution. Because the states of tasks and threads may change dynamically during computation, the returned value is only an approximation, but one that does not ever decrease across successive calls\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 12\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_NioPumpThreadPool_CompletedTaskCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Completed tasks ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Completed task count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The largest number of threads that have ever been simultaneously in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_NioPumpThreadPool_LargestPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Largest thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Largest pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The maximum allowed number of threads\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_NioPumpThreadPool_MaximumPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Max pool size ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max pool size\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket NIO pump thread pool stats\",\n  \"version\": 3,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/overview.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"DOWN\"\n                }\n              },\n              \"type\": \"special\"\n            },\n            {\n              \"options\": {\n                \"from\": 1,\n                \"result\": {\n                  \"index\": 1,\n                  \"text\": \"UP\"\n                },\n                \"to\": 9999999\n              },\n              \"type\": \"range\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 1\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 22,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Pid{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Status\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 2,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 21,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Uptime{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}/1000\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"dateTimeAsIso\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 2,\n        \"x\": 5,\n        \"y\": 0\n      },\n      \"id\": 23,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_StartTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Start time\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 2,\n        \"x\": 7,\n        \"y\": 0\n      },\n      \"id\": 24,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"java_lang_OperatingSystem_AvailableProcessors{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Available CPU Cores\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 0\n      },\n      \"id\": 18,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"jvm_threads_state{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", state=\\\"BLOCKED\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ state }} ({{ pod }})\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Blocked Threads\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Count Number of repositories currently configured across all projects.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 5,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 41,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"topk(1, com_atlassian_bitbucket_Repositories_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"})\",\n          \"legendFormat\": \"Repositories\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Repositories Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Pulls and pushes increase over 5 min\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 14,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 0\n      },\n      \"id\": 43,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(increase(com_atlassian_bitbucket_ScmStatistics_Pulls{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m]))\",\n          \"hide\": false,\n          \"legendFormat\": \"Pulls\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(increase(com_atlassian_bitbucket_ScmStatistics_Pushes{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m]))\",\n          \"hide\": false,\n          \"legendFormat\": \"Pushes\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Scm Statistics\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 40\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(java_lang_OperatingSystem_ProcessCpuLoad{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"} * 100)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"cpu load ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"CPU\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 11,\n        \"x\": 6,\n        \"y\": 7\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"100*(jvm_memory_bytes_used{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", area=\\\"heap\\\",}/jvm_memory_bytes_max{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", area=\\\"heap\\\",})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Used {{ area }} ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Heap Used %\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 11,\n        \"x\": 0,\n        \"y\": 14\n      },\n      \"id\": 34,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 8,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 13,\n        \"x\": 11,\n        \"y\": 14\n      },\n      \"id\": 33,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"60s\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Rest request processing time by plugin, method and path\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 22\n      },\n      \"id\": 25,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_bitbucket_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", category00=\\\"http\\\",category01=\\\"rest\\\",name=\\\"request\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ tag_action }}: {{tag_fromPluginKey}} on {{ tag_path }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Request Processing Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 9,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_IdleConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}\",\n          \"legendFormat\": \"idle ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_ActiveConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"active ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_ThreadsAwaitingConnection{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"awaiting ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_bitbucket_TotalConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"total ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Hikari Pool\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Global number of cached queries successfully retrieved or missed from cache\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 8,\n        \"x\": 9,\n        \"y\": 32\n      },\n      \"id\": 36,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"org_hibernate_core_bitbucket_core_QueryCacheHitCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", serviceRole=\\\"org.hibernate.stat.Statistics\\\",serviceType=\\\"org.hibernate.stat.internal.StatisticsImpl\\\",}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"retrieved from cache ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"org_hibernate_core_bitbucket_core_QueryCacheMissCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", serviceRole=\\\"org.hibernate.stat.Statistics\\\",serviceType=\\\"org.hibernate.stat.internal.StatisticsImpl\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"not found in cache ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Hibernate Cached Requests\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Global number of cacheable entities/collections successfully retrieved from the cache or not found in cache and loaded from the database\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 32\n      },\n      \"id\": 39,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"org_hibernate_core_bitbucket_core_SecondLevelCacheHitCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", serviceRole=\\\"org.hibernate.stat.Statistics\\\",serviceType=\\\"org.hibernate.stat.internal.StatisticsImpl\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"retrieved from cache ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"org_hibernate_core_bitbucket_core_SecondLevelCacheMissCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\", serviceRole=\\\"org.hibernate.stat.Statistics\\\",serviceType=\\\"org.hibernate.stat.internal.StatisticsImpl\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"not found in cache ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Hibernate Cached Entities\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Overview\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/scheduled-thread-pool-stats.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Details relating to Thread pool that takes care of several miscellaneous scheduled tasks\\t\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The current number of threads in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_ScheduledThreadPool_PoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Current pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate number of threads that are actively executing tasks\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_ScheduledThreadPool_ActiveCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Active threads ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active thread count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The number of tasks awaiting execution by the thread pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_ScheduledThreadPool_QueueLength{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Current queue length ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Queue length\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The approximate total number of tasks that have completed execution. Because the states of tasks and threads may change dynamically during computation, the returned value is only an approximation, but one that does not ever decrease across successive calls\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 12\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_ScheduledThreadPool_CompletedTaskCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Completed tasks ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Completed task count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The largest number of threads that have ever been simultaneously in the pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_ScheduledThreadPool_LargestPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Largest thread count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Largest pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The maximum allowed number of threads\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_thread_pools_ScheduledThreadPool_MaximumPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Max pool size ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max pool size\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Scheduled thread pool stats\",\n  \"version\": 3,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/ssh-session-stats.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Bitbucket uses 'tickets' as a mechanism for creating back-pressure to prevent the system from being overloaded with requests. There are two types of tickets, hosting tickets and command tickets. \",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Number of currently active SSH session\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshSessions_ActiveSessionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Active session count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active session count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Highest number of concurrently active SSH sessions since the last startup\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshSessions_MaxActiveSessionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Max session count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max active session count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of SSH sessions that have been created since the last startup\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshSessions_SessionCreatedCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Session created count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Session created count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of SSH sessions that have been closed since the last startup\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshSessions_SessionClosedCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} Session closed count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Session closed count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of SSH sessions that have been terminated because an exception was thrown from the SSH command run\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 27\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_bitbucket_SshSessions_SessionExceptionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx\\\"}[5m])\",\n          \"hide\": false,\n          \"legendFormat\": \"{{name}} Session exception count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Session exception count\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket SSH statistics\",\n  \"version\": 7,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/ticket-status.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Limits the number of SCM hosting operations, meaning pushes and pulls, which may be running concurrently. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 40,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\", section=\\\"tickets\\\", throttledResource=\\\"scm-hosting\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Hosting Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"LFS tickets: Limits the number of Git LFS file transfer operations that may be running concurrently. This is primarily intended to prevent Git LFS requests from consuming all available connections, thereby degrading Git hosting operations.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 41,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\", section=\\\"tickets\\\", throttledResource=\\\"git-lfs\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Git LFS Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Limits the number of SCM Ref Advertisement operations that may be running concurrently. These are throttled separately from hosting operations as they are much more lightweight and much shorter, so many more of them can run concurrently.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 43,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\", section=\\\"tickets\\\", throttledResource=\\\"scm-refs\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Ref Advertisement Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Limits the number of SCM commands, such as: git diff, git blame, or git rev-list, which may be running concurrently.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 42,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\", section=\\\"tickets\\\", throttledResource=\\\"scm-command\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Command Tickets by Status\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of tickets currently available for use.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\", section=\\\"tickets\\\" ,name=\\\"available\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{throttledResource}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tickets Available by Type\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of tickets currently in use.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 16\n      },\n      \"id\": 39,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"metrics_throttling_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\", section=\\\"tickets\\\" ,name=\\\"used\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{throttledResource}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tickets Used by Type\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Hosting Tickets\",\n  \"version\": 2,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/grafana-dashboards/webhooks-stats.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Details relating to Webhooks stats\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"A count of the total number of events that could trigger webhooks\\n(A publish may create many dispatches)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_PublishCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Publish count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Publish count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of webhooks to fire successfully with a successful HTTP response(A publish may create many dispatches)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_DispatchSuccessCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Success count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Dispatch success count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"A count of the number of webhook dispatches that were rejected for execution\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_DispatchRejectedCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Rejected count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Dispatch rejected count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"The last time a webhook was rejected, either from circuit breaking, or due to too many webhooks being in flight\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 12\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_DispatchLastRejectedTimestamp{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Last rejection ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Dispatch last rejected timestamp\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of dispatches that have been triggered and are awaiting resolution\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_DispatchInFlightCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} In-flight count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Dispatch in-flight count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of webhooks that fired successfully, but the HTTP response indicates a failure\\n(non 2xx code)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"id\": 9,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_DispatchFailureCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Failure count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Dispatch failure count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of webhooks to have had an error while they were being dispatched(non 2xx code)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 36\n      },\n      \"id\": 10,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_DispatchErrorCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Error count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Dispatch error count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"Total number of webhooks to have been dispatched\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 36\n      },\n      \"id\": 11,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"increase(com_atlassian_webhooks_Webhooks_DispatchCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\", endpoint=\\\"jmx-mesh-sidecar\\\"}[5m])\",\n          \"legendFormat\": \"{{name}} Dispatch count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Dispatch count\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"bitbucket\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_bitbucket_Repositories_Count\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_bitbucket_Repositories_Count\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Bitbucket Webhooks stats\",\n  \"version\": 3,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/bitbucket/templates/NOTES.txt",
    "content": "Thank you for installing {{ title .Chart.Name }}.\n\nYour release is named {{ .Release.Name }}, and resides in namespace {{ .Release.Namespace }}.\n\nPlease run sanity tests against the release to verify it's healthy:\n\n  $ helm test {{ .Release.Name }} -n {{ .Release.Namespace }}\n\nIf the Kubernetes resources in the release are still starting up, then the tests may fail, so it\nis advisable to wait for the tests to pass before continuing.\n\nTo see the custom values you used for this release:\n\n  $ helm get values {{ .Release.Name }} -n {{ .Release.Namespace }}\n\n{{ if eq (include \"common.gateway.isConfigured\" .) \"true\" -}}\n{{ title .Chart.Name }} service URL: {{ include \"common.gateway.origin\" . }}{{ include \"bitbucket.path\" . }}\n{{- else }}\nGet the {{ title .Chart.Name }} URL by running these commands in the same shell:\n{{- if contains \"NodePort\" .Values.bitbucket.service.type }}\n  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ .Release.Name }}-{{ .Chart.Name }})\n  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n  echo http://$NODE_IP:$NODE_PORT\n{{- else if contains \"LoadBalancer\" .Values.bitbucket.service.type }}\n  NOTE: It may take a few minutes for the LoadBalancer hostname to be available.\n        You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ .Release.Name }}-{{ .Chart.Name }}'\n\n  export SERVICE_HOSTNAME=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ .Release.Name }}-{{ .Chart.Name }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n  echo http://$SERVICE_HOSTNAME:{{ .Values.bitbucket.service.port }}\n{{- else if contains \"ClusterIP\" .Values.bitbucket.service.type }}\n  Step 1: Get the pod name\n    $ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"app.kubernetes.io/instance={{ .Release.Name }}\" -o jsonpath=\"{.items[0].metadata.name}\")\n  Step 2 (Optional): Check if the pod name has been exported successfully and the pod status\n    $ echo POD_NAME: $POD_NAME && echo POD_STATUS: $(kubectl get pod $POD_NAME -o jsonpath='{.status.phase}')\n  Step 3: Wait for pods up and running, then forward pod port to localhost\n    $ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME {{ .Values.bitbucket.ports.http }}\n  Step 4: Access {{ title .Chart.Name }} on localhost:\n    http://localhost:{{ .Values.bitbucket.ports.http }}\n{{- end }}\n{{- end }}\n{{- if not ( or .Values.volumes.localHome.persistentVolumeClaim.create .Values.volumes.localHome.customVolume ) }}\n\n#################################################################################\n#####       WARNING: Persistent volume is not used for Local Home!!!        #####\n#####             Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{/* Mirrors don't need a shared home - only show warning if clustering is enabled and no shared home volume is created */}}\n{{/* the default can be removed in v2.0.0 */}}\n{{- if and ( not ( or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume)) ( and .Values.bitbucket.clustering.enabled ( eq (default \"\" .Values.bitbucket.applicationMode) \"default\")) }}\n\n#################################################################################\n#####  WARNING: Clustering is enabled but Shared Home is not configured!!!  #####\n#####            Nodes will not be able to form a cluster.                  #####\n#################################################################################\n{{- end }}\n{{- if ( or .Values.bitbucket.securityContext.enabled .Values.bitbucket.securityContext.gid ) }}\n\n#################################################################################\n######     DEPRECATION WARNING: bitbucket.securityContext deprecation       #####\n######   Update your values to the new bitbucket.securityContext format     #####\n#################################################################################\n{{- end}}\n\n{{- if and (.Values.bitbucket.mesh.enabled) (not .Values.bitbucket.mesh.nodeAutoRegistration)}}\n\nBitbucket Mesh deployed. You can register Mesh nodes at {{ if eq (include \"common.gateway.isConfigured\" .) \"true\" }}{{ include \"common.gateway.origin\" . }}{{ include \"bitbucket.path\" . }}{{ else }}${BITBUCKET_URL}{{ end }}/admin/git/mesh using the following URLs:\n\n{{- range $index := until (.Values.bitbucket.mesh.replicaCount | int) }}\n{{- with $ }}\n  * http://{{ include \"common.names.fullname\" . }}-mesh-{{ $index }}:{{ .Values.bitbucket.mesh.service.port }}\n{{- end }}\n{{- end }}\n\n{{ if eq .Values.bitbucket.mesh.service.type \"LoadBalancer\" }}\nYou may use LoadBalancer URLs to register Mesh nodes with Bitbucket server. Get LoadBalancer hostnames:\n\n  $ for service in {0..2}; do kubectl get svc --namespace {{ .Release.Namespace }} {{ include \"common.names.fullname\" . }}-mesh-$service -o jsonpath='{.status.loadBalancer.ingress[0].hostname}; done\n{{- end }}\n{{- end }}\n\nFor further documentation, see https://atlassian.github.io/data-center-helm-charts/"
  },
  {
    "path": "src/main/charts/bitbucket/templates/_fluentd_templates.tpl",
    "content": "{{- define \"fluentd.container\" -}}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd\n  image: {{ .Values.fluentd.imageRepo }}:{{ .Values.fluentd.imageTag }}\n  command: [\"sh\", \"-c\", {{ include \"fluentd.start.command\" . | quote }}]\n{{- if .Values.fluentd.resources }}\n  resources:\n  {{- with .Values.fluentd.resources }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- end }}\n  volumeMounts:\n    - name: local-home\n      mountPath: /application-data/logs\n      subPath: log\n      readOnly: true\n    - name: fluentd-config\n      mountPath: /fluentd/etc\n      readOnly: true\n{{- if .Values.fluentd.extraVolumes }}\n  {{ toYaml .Values.fluentd.extraVolumes | nindent 4}}\n{{- end }}\n  env:\n    - name: POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: POD_NAMESPACE\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.namespace\n    - name: POD_IP\n      valueFrom:\n        fieldRef:\n          fieldPath: status.podIP\n    - name: HELM_RELEASE_NAME\n      value: {{ include \"common.names.fullname\" . }}\n{{ end }}\n{{ end }}\n\n{{- define \"fluentd.config.volume\" }}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd-config\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-fluentd-config\n{{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/_helpers.tpl",
    "content": "{{/*This file contains template snippets used by the other files in this directory.*/}}\n{{/*Most of them were generated by the \"helm chart create\" tool, and then some others added.*/}}\n\n{{/* vim: set filetype=mustache: */}}\n\n{{/* Define a sanitized list of additionalEnvironmentVariables */}}\n{{- define \"bitbucket.sanitizedAdditionalEnvVars\" -}}\n{{- range .Values.bitbucket.additionalEnvironmentVariables }}\n- name: {{ .name }}\n  value: {{ if regexMatch \"(?i)(secret|token|password)\" .name }}\"Sanitized by Support Utility\"{{ else}}{{ .value }}{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define a sanitized list of additionalJvmArgs */}}\n{{- define \"bitbucket.sanitizedAdditionalJvmArgs\" -}}\n{{- range .Values.bitbucket.additionalJvmArgs }}\n {{- $jvmArgs := regexSplit \"=\" . -1 }}\n   {{- if regexMatch \"(?i)(secret|token|password).*$\" (first $jvmArgs) }}\n-  {{ first $jvmArgs }}=Sanitized by Support Utility{{ else}}\n-  {{ . }}\n{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define sanitized Helm values */}}\n{{- define \"bitbucket.sanitizedValues\" -}}\n{{- $sanitizedAdditionalEnvs := dict .Chart.Name (dict \"additionalEnvironmentVariables\" (include \"bitbucket.sanitizedAdditionalEnvVars\" .)) }}\n{{- $sanitizedAdditionalJvmArgs := dict .Chart.Name (dict \"additionalJvmArgs\" (include \"bitbucket.sanitizedAdditionalJvmArgs\" .)) }}\n{{- $mergedValues := merge $sanitizedAdditionalEnvs $sanitizedAdditionalJvmArgs .Values }}\n{{- toYaml $mergedValues | replace \" |2-\" \"\" | replace \" |-\" \"\" |  replace \"|2\" \"\" | nindent 4 }}\n{{- end }}\n\n{{- define \"bitbucket.analyticsJson\" }}\n{\n  \"imageTag\": {{ if or (eq .Values.image.tag \"\") (eq .Values.image.tag nil) }}{{ .Chart.AppVersion | quote }}{{ else }}{{ regexSplit \"-\" .Values.image.tag -1 | first |  quote }}{{ end }},\n  \"replicas\": {{ .Values.replicaCount }},\n  \"isJmxEnabled\": {{ .Values.monitoring.exposeJmxMetrics }},\n  \"ingressType\": {{ if not .Values.ingress.create }}\"NONE\"{{ else }}{{ if .Values.ingress.nginx }}\"NGINX\"{{ else }}\"OTHER\"{{ end }}{{ end }},\n{{- $sanitizedMinorVersion := regexReplaceAll \"[^0-9]\" .Capabilities.KubeVersion.Minor \"\" }}\n  \"k8sVersion\": \"{{ .Capabilities.KubeVersion.Major }}.{{ $sanitizedMinorVersion }}\",\n  \"serviceType\": {{ if regexMatch \"^(ClusterIP|NodePort|LoadBalancer|ExternalName)$\" .Values.bitbucket.service.type }}{{ snakecase .Values.bitbucket.service.type | upper | quote }}{{ else }}\"UNKNOWN\"{{ end }},\n{{- if eq .Values.database.driver nil }}\n  \"dbType\": \"UNKNOWN\",\n{{- else }}\n{{- $databaseTypeMap := dict \"postgres\" \"POSTGRES\" \"sqlserver\" \"MSSQL\" \"oracle\" \"ORACLE\" \"mysql\" \"MYSQL\" }}\n{{- $dbTypeInValues := .Values.database.driver }}\n{{- $dbType := \"UNKNOWN\" | quote }}\n{{- range $key, $value := $databaseTypeMap }}\n{{- if regexMatch (printf \"(?i)%s\" $key) $dbTypeInValues }}\n  {{- $dbType = $value | quote }}\n{{- end }}\n{{- end }}\n  \"dbType\": {{ $dbType }},\n{{- end }}\n  \"isClusteringEnabled\": {{ .Values.bitbucket.clustering.enabled }},\n  \"isSharedHomePVCCreated\": {{ .Values.volumes.sharedHome.persistentVolumeClaim.create }},\n  \"isServiceMonitorCreated\": {{ .Values.monitoring.serviceMonitor.create }},\n  \"isGrafanaDashboardsCreated\": {{ .Values.monitoring.grafana.createDashboards }},\n  \"isBitbucketMeshEnabled\": {{ .Values.bitbucket.mesh.enabled }},\n  \"isRunOnOpenshift\": {{ .Capabilities.APIVersions.Has \"route.openshift.io/v1/Route\" }},\n  \"isRunWithRestrictedSCC\": {{ .Values.openshift.runWithRestrictedSCC }},\n  \"isOpenshiftRouteCreated\": {{ .Values.ingress.openShiftRoute}}\n}\n{{- end }}\n\n{{/*\nThe name of the service account to be used.\nIf the name is defined in the chart values, then use that,\nelse if we're creating a new service account then use the name of the Helm release,\nelse just use the \"default\" service account.\n*/}}\n{{- define \"bitbucket.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.name -}}\n{{- .Values.serviceAccount.name -}}\n{{- else -}}\n{{- if .Values.serviceAccount.create -}}\n{{- include \"common.names.fullname\" . -}}\n{{- else -}}\ndefault\n{{- end -}}\n{{- end -}}\n{{- end }}\n\n{{/*\nThe name of the ClusterRole that will be created.\nIf the name is defined in the chart values, then use that,\nelse use the name of the Helm release.\n*/}}\n{{- define \"bitbucket.clusterRoleName\" -}}\n{{- if and .Values.serviceAccount.clusterRole.name .Values.serviceAccount.clusterRole.create }}\n{{- .Values.serviceAccount.clusterRole.name }}\n{{- else }}\n{{- include \"common.names.fullname\" . -}}\n{{- end }}\n{{- end }}\n\n{{/*\nThe name of the ClusterRoleBinding that will be created.\nIf the name is defined in the chart values, then use that,\nelse use the name of the ClusterRole.\n*/}}\n{{- define \"bitbucket.clusterRoleBindingName\" -}}\n{{- if and .Values.serviceAccount.clusterRoleBinding.name .Values.serviceAccount.clusterRoleBinding.create }}\n{{- .Values.serviceAccount.clusterRoleBinding.name }}\n{{- else }}\n{{- include \"bitbucket.clusterRoleName\" . -}}\n{{- end }}\n{{- end }}\n\n{{/*\nPod labels\n*/}}\n{{- define \"bitbucket.podLabels\" -}}\n{{ with .Values.podLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nMesh Pod labels\n*/}}\n{{- define \"bitbucket.mesh.podLabels\" -}}\n{{ with .Values.bitbucket.mesh.podLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nCreate default value for the service path.\n*/}}\n{{- define \"bitbucket.path\" -}}\n{{- include \"common.gateway.path\" (dict\n  \"useGatewayMode\" (include \"common.gateway.useGatewayMode\" .)\n  \"gatewayPath\"   .Values.gateway.path\n  \"ingressPath\"   .Values.ingress.path\n  \"contextPath\"   .Values.bitbucket.service.contextPath\n) -}}\n{{- end }}\n\n{{/*\nAlias for backward compatibility with ingress templates.\n*/}}\n{{- define \"bitbucket.ingressPath\" -}}\n{{- include \"bitbucket.path\" . -}}\n{{- end }}\n\n{{/*\nThe command that should be run by the nfs-fixer init container to correct the permissions of the shared-home root directory.\n*/}}\n{{- define \"bitbucket.sharedHome.permissionFix.command\" -}}\n{{- $securityContext := .Values.bitbucket.securityContext }}\n{{- with .Values.volumes.sharedHome.nfsPermissionFixer }}\n    {{- if .command }}\n        {{ .command }}\n    {{- else }}\n        {{- if and $securityContext.gid $securityContext.enabled }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.gid .mountPath .mountPath }}\n        {{- else if $securityContext.fsGroup }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.fsGroup .mountPath .mountPath }}\n        {{- else }}\n            {{- printf \"(chgrp 2001 %s; chmod g+w %s)\" .mountPath .mountPath }}\n        {{- end }}\n    {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe command that should be run to start the fluentd service\n*/}}\n{{- define \"fluentd.start.command\" -}}\n{{- if .Values.fluentd.command }}\n{{ .Values.fluentd.command }}\n{{- else }}\n{{- print \"exec fluentd -c /fluentd/etc/fluent.conf -v\" }}\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.image\" -}}\n{{- if .Values.image.registry -}}\n{{ .Values.image.registry}}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- else -}}\n{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.podAnnotations\" -}}\n{{- range $key, $value := .Values.podAnnotations }}\n{{ $key }}: {{ tpl $value $ | quote }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.mesh.podAnnotations\" -}}\n{{- with .Values.bitbucket.mesh.podAnnotations }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional init containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.additionalInitContainers\" -}}\n{{- with .Values.additionalInitContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional init containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.mesh.additionalInitContainers\" -}}\n{{- with .Values.bitbucket.mesh.additionalInitContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.additionalContainers\" -}}\n{{- with .Values.additionalContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional ports here instead of in values.yaml to allow template overrides\n*/}}\n{{- define \"bitbucket.additionalPorts\" -}}\n{{- with .Values.bitbucket.additionalPorts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional volume mounts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.additionalVolumeMounts\" -}}\n{{- with .Values.bitbucket.additionalVolumeMounts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.additionalEnvironmentVariables\" -}}\n{{- with .Values.bitbucket.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.mesh.additionalEnvironmentVariables\" -}}\n{{- with .Values.bitbucket.mesh.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional library declared, generate a volume mount that injects that library into the Bitbucket lib directory\n*/}}\n{{- define \"bitbucket.additionalLibraries\" -}}\n{{- range .Values.bitbucket.additionalLibraries }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/bitbucket/app/WEB-INF/lib/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional plugin declared, generate a volume mount that injects that library into the Bitbucket plugins directory\n*/}}\n{{- define \"bitbucket.additionalBundledPlugins\" -}}\n{{- range .Values.bitbucket.additionalBundledPlugins }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/bitbucket/app/WEB-INF/atlassian-bundled-plugins/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n\n{{/*\nDefine additional hosts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"bitbucket.additionalHosts\" -}}\n{{- with .Values.additionalHosts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.volumes\" -}}\n{{ if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n{{ include \"bitbucket.volumes.localHome\" . }}\n{{- end }}\n{{ include \"bitbucket.volumes.sharedHome\" . }}\n{{- with .Values.volumes.additional }}\n{{- toYaml . | nindent 0 }}\n{{- end }}\n{{- if or .Values.bitbucket.additionalCertificates.secretName .Values.bitbucket.additionalCertificates.secretList }}\n- name: keystore\n  emptyDir: {}\n{{- if .Values.bitbucket.additionalCertificates.secretName }}\n- name: certs\n  secret:\n    secretName: {{ .Values.bitbucket.additionalCertificates.secretName }}\n{{- else }}\n{{- range .Values.bitbucket.additionalCertificates.secretList }}\n- name: {{ .name }}\n  secret:\n    secretName: {{ .name }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-helm-values\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.volumes.localHome\" -}}\n{{- if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n- name: local-home\n{{ if .Values.volumes.localHome.customVolume }}\n{{- toYaml .Values.volumes.localHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.volumes.sharedHome\" -}}\n{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\n- name: shared-home\n  persistentVolumeClaim:\n    claimName: {{ include \"common.names.fullname\" . }}-shared-home\n{{ else if .Values.volumes.sharedHome.customVolume }}\n- name: shared-home\n{{- toYaml .Values.volumes.sharedHome.customVolume | nindent 2 }}\n{{- else if and (eq .Values.bitbucket.applicationMode \"mirror\") .Values.monitoring.exposeJmxMetrics }}\n- name: shared-home\n  emptyDir: {}\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.volume.sharedHome.name\" -}}\n{{ include \"common.names.fullname\" . }}-shared-home-pv\n{{- end }}\n\n{{- define \"bitbucket.volumeClaimTemplates\" -}}\n{{- if or .Values.volumes.localHome.persistentVolumeClaim.create .Values.bitbucket.additionalVolumeClaimTemplates }}\n{{- if and .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled }}\npersistentVolumeClaimRetentionPolicy:\n    whenDeleted: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted}}\n    whenScaled: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled}}\n{{- end}}\nvolumeClaimTemplates:\n{{- if .Values.volumes.localHome.persistentVolumeClaim.create }}\n- apiVersion: v1\n  kind: PersistentVolumeClaim\n  metadata:\n    name: local-home\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .Values.volumes.localHome.persistentVolumeClaim.storageClassName }}\n    storageClassName: {{ .Values.volumes.localHome.persistentVolumeClaim.storageClassName | quote }}\n    {{- end }}\n    {{- with .Values.volumes.localHome.persistentVolumeClaim.resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- range .Values.bitbucket.additionalVolumeClaimTemplates }}\n- metadata:\n    name: {{ .name }}\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .storageClassName }}\n    storageClassName: {{ .storageClassName | quote }}\n    {{- end }}\n    {{- with .resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.mesh.volumeClaimTemplates\" -}}\n{{- if .Values.bitbucket.mesh.volume.create }}\n{{- if and .Values.bitbucket.mesh.volume.persistentVolumeClaimRetentionPolicy.whenDeleted .Values.bitbucket.mesh.volume.persistentVolumeClaimRetentionPolicy.whenScaled }}\npersistentVolumeClaimRetentionPolicy:\n    whenDeleted: {{.Values.bitbucket.mesh.volume.persistentVolumeClaimRetentionPolicy.whenDeleted}}\n    whenScaled: {{.Values.bitbucket.mesh.volume.persistentVolumeClaimRetentionPolicy.whenScaled}}\n{{- end}}\nvolumeClaimTemplates:\n- metadata:\n    name: mesh-home\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .Values.bitbucket.mesh.volume.storageClass }}\n    storageClassName: {{ .Values.bitbucket.mesh.volume.storageClass | quote }}\n    {{- end }}\n    {{- with .Values.bitbucket.mesh.volume.resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.databaseEnvVars\" -}}\n{{ with .Values.database.driver }}\n- name: JDBC_DRIVER\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.url }}\n- name: JDBC_URL\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.credentials.secretName }}\n- name: JDBC_USER\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.usernameSecretKey }}\n- name: JDBC_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.passwordSecretKey }}\n{{ end }}\n{{ end }}\n\n{{- define \"bitbucket.sysadminEnvVars\" -}}\n{{ with .Values.bitbucket.sysadminCredentials }}\n{{ if .secretName }}\n- name: SETUP_SYSADMIN_USERNAME\n  valueFrom:\n    secretKeyRef:\n      name: {{ .secretName }}\n      key: {{ .usernameSecretKey }}\n- name: SETUP_SYSADMIN_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ .secretName }}\n      key: {{ .passwordSecretKey }}\n- name: SETUP_SYSADMIN_DISPLAYNAME\n  valueFrom:\n    secretKeyRef:\n      name: {{ .secretName }}\n      key: {{ .displayNameSecretKey }}\n- name: SETUP_SYSADMIN_EMAILADDRESS\n  valueFrom:\n    secretKeyRef:\n      name: {{ .secretName }}\n      key: {{ .emailAddressSecretKey }}\n{{ end }}\n{{ end }}\n{{ end }}\n\n{{- define \"bitbucket.clusteringEnvVars\" -}}\n{{ if .Values.bitbucket.clustering.enabled }}\n- name: KUBERNETES_NAMESPACE\n  valueFrom:\n    fieldRef:\n      fieldPath: metadata.namespace\n- name: HAZELCAST_KUBERNETES_SERVICE_NAME\n  value: {{ include \"common.names.fullname\" . | quote }}\n- name: HAZELCAST_NETWORK_KUBERNETES\n  value: \"true\"\n- name: HAZELCAST_PORT\n  value: {{ .Values.bitbucket.ports.hazelcast | quote }}\n{{- include \"bitbucket.hazelcastGroupEnvVars\" . }}\n{{ end }}\n{{ end }}\n\n{{- define \"bitbucket.hazelcastGroupSecretName\" -}}\n{{- .Values.bitbucket.clustering.group.secretName | default (printf \"%s-clustering\" (include \"common.names.fullname\" .)) -}}\n{{- end }}\n\n{{- define \"bitbucket.hazelcastGroupEnvVars\" }}\n- name: HAZELCAST_GROUP_NAME\n  valueFrom:\n    secretKeyRef:\n      name: {{ include \"bitbucket.hazelcastGroupSecretName\" . | quote }}\n      key: {{ .Values.bitbucket.clustering.group.nameSecretKey | quote }}\n- name: HAZELCAST_GROUP_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ include \"bitbucket.hazelcastGroupSecretName\" . | quote }}\n      key: {{ .Values.bitbucket.clustering.group.passwordSecretKey | quote }}\n{{- end }}\n\n{{- define \"bitbucket.elasticSearchEnvVars\" -}}\n{{- if or .Values.bitbucket.elasticSearch.baseUrl .Values.bitbucket.clustering.enabled }}\n- name: SEARCH_ENABLED\n  value: \"false\"\n{{- end }}\n{{ with .Values.bitbucket.elasticSearch.baseUrl }}\n- name: PLUGIN_SEARCH_ELASTICSEARCH_BASEURL\n  value: {{ . | quote }}\n{{ end }}\n{{ if .Values.bitbucket.elasticSearch.credentials.secretName }}\n- name: PLUGIN_SEARCH_ELASTICSEARCH_USERNAME\n  valueFrom:\n    secretKeyRef:\n      name: {{ .Values.bitbucket.elasticSearch.credentials.secretName | quote }}\n      # this is for backward compatability with 1.0.0\n      key: {{ coalesce .Values.bitbucket.elasticSearch.credentials.usernameSecretKey .Values.bitbucket.elasticSearch.credentials.usernameSecreyKey | quote }}\n- name: PLUGIN_SEARCH_ELASTICSEARCH_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ .Values.bitbucket.elasticSearch.credentials.secretName | quote }}\n      key: {{ .Values.bitbucket.elasticSearch.credentials.passwordSecretKey | quote }}\n{{ end }}\n{{ end }}\n\n{{- define \"bitbucket.openSearchEnvVars\" -}}\n{{- if and .Values.bitbucket.clustering.enabled (or .Values.opensearch.install .Values.opensearch.baseUrl) }}\n- name: SEARCH_ENABLED\n  value: \"false\"\n- name: PLUGIN_SEARCH_CONFIG_BASEURL\n  value: {{ if .Values.opensearch.baseUrl }}{{ .Values.opensearch.baseUrl }}{{ else if .Values.opensearch.install }}http://opensearch-cluster-master:9200{{ else }}{{ .Values.opensearch.baseUrl }}{{ end }}\n- name: PLUGIN_SEARCH_CONFIG_USERNAME\n{{- if .Values.opensearch.credentials.secretName }}\n  valueFrom:\n    secretKeyRef:\n      name: {{ .Values.opensearch.credentials.secretName | quote }}\n      key: {{ .Values.opensearch.credentials.usernameSecretKey | quote }}\n{{- else }}\n  value: \"admin\"\n{{- end }}\n- name: PLUGIN_SEARCH_CONFIG_PASSWORD\n  valueFrom:\n    secretKeyRef:\n{{- if .Values.opensearch.credentials.secretName }}\n      name: {{ .Values.opensearch.credentials.secretName | quote }}\n      key: {{ .Values.opensearch.credentials.passwordSecretKey | quote }}\n{{- else }}\n      name: opensearch-initial-password\n      key: OPENSEARCH_INITIAL_ADMIN_PASSWORD\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucket.generate.static.password.b64enc\" -}}\n{{- if not (index .Release \"temp_vars\") -}}\n{{-   $_ := set .Release \"temp_vars\" dict -}}\n{{- end -}}\n{{- $key := printf \"%s_%s\" .Release.Name \"password\" -}}\n{{- if not (index .Release.temp_vars $key) -}}\n{{-   $_ := set .Release.temp_vars $key (randAlphaNum 40 | b64enc ) -}}\n{{- end -}}\n{{- index .Release.temp_vars $key -}}\n{{- end -}}\n\n{{- define \"bitbucket.opensearch.initial.admin.password\" }}\n{{- $defaultSecretName := \"opensearch-initial-password\" }}\n{{- $secretName := default $defaultSecretName .Values.opensearch.credentials.secretName }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace $secretName) }}\n{{- if $secretData.data }}\n{{- index $secretData.data \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\" }}\n{{- else }}\n{{ include \"bitbucket.generate.static.password.b64enc\" . }}\n{{- end }}\n{{- end }}\n\n\n{{- define \"flooredCPU\" -}}\n    {{- if hasSuffix \"m\" (. | toString) }}\n    {{- div (trimSuffix \"m\" .) 1000 | default 1 }}\n    {{- else }}\n    {{- . }}\n    {{- end }}\n{{- end}}\n\n{{- define \"bitbucket.addCrtToKeystoreCmd\" }}\n{{- if .Values.bitbucket.additionalCertificates.customCmd}}\n{{ .Values.bitbucket.additionalCertificates.customCmd}}\n{{- else }}\nset -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \"Adding $crt to keystore\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\n{{- end }}\n{{- end }}\n\n{{- define \"bitbucketMesh.addCrtToKeystoreCmd\" }}\n{{- if .Values.bitbucket.mesh.additionalCertificates.customCmd}}\n{{ .Values.bitbucket.mesh.additionalCertificates.customCmd}}\n{{- else }}\nset -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \"Adding $crt to keystore\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\n{{- end }}\n{{- end }}\n\n\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/config-jvm-mesh.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jvm-config-mesh\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  additional_jvm_args: >-\n    {{- range .Values.bitbucket.mesh.additionalJvmArgs }}\n    {{ . }}\n    {{- end }}\n    -XX:ActiveProcessorCount={{ include \"flooredCPU\" .Values.bitbucket.mesh.resources.container.requests.cpu }}\n    {{- if .Values.monitoring.exposeJmxMetrics }}\n    -javaagent:{{ .Values.monitoring.jmxExporterCustomJarLocation | default (printf \"%s/jmx_prometheus_javaagent.jar\" ( .Values.bitbucket.mesh.volume.mountPath)) }}={{ .Values.monitoring.jmxExporterPort}}:/opt/atlassian/jmx/jmx-config.yaml\n    {{- end }}\n    {{- if or .Values.bitbucket.mesh.additionalCertificates.secretName .Values.bitbucket.mesh.additionalCertificates.secretList }}\n    -Djavax.net.ssl.trustStore=/var/ssl/cacerts\n    {{- end }}\n  max_heap: {{ .Values.bitbucket.mesh.resources.jvm.maxHeap }}\n  min_heap: {{ .Values.bitbucket.mesh.resources.jvm.minHeap }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/config-jvm.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jvm-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  additional_jvm_args: >-\n    {{- range .Values.bitbucket.additionalJvmArgs }}\n    {{ . }}\n    {{- end }}\n    -XX:ActiveProcessorCount={{ max 1 (include \"flooredCPU\" .Values.bitbucket.resources.container.requests.cpu | float64  | int) }}\n    {{ include \"common.jmx.javaagent\" . | indent 4 | trim }}\n    {{- if .Values.monitoring.exposeJmxMetrics }}\n    -Dplugin.bitbucket-git.mesh.sidecar.jvmArgs=-javaagent:{{ .Values.monitoring.jmxExporterCustomJarLocation | default (printf \"%s/jmx_prometheus_javaagent.jar\"  .Values.volumes.sharedHome.mountPath) }}=9998:/opt/atlassian/jmx/jmx-config.yaml\n    {{- end }}\n    {{- if or .Values.bitbucket.additionalCertificates.secretName .Values.bitbucket.additionalCertificates.secretList }}\n    -Djavax.net.ssl.trustStore=/var/ssl/cacerts\n    {{- end }}\n  max_heap: {{ .Values.bitbucket.resources.jvm.maxHeap }}\n  min_heap: {{ .Values.bitbucket.resources.jvm.minHeap }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/configmap-additional-config.yaml",
    "content": "{{- range $i, $key := .Values.additionalConfigMaps -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-{{ $key.name }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- range $key.keys }}\n  {{ .fileName -}}: |\n{{  .content | trim | indent 4 }}\n{{- end }}\n---\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/configmap-fluentd.yaml",
    "content": "{{ if .Values.fluentd.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-fluentd-config\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{ if .Values.fluentd.customConfigFile }}\n{{- range $key, $value := .Values.fluentd.fluentdCustomConfig }}\n  {{ $key }}: |\n{{ $value | indent 4 }}\n  {{- end }}\n  {{ else }}\n  fluent.conf: |\n    <source>\n      @type tail\n      path /application-data/logs/atlassian-bitbucket.log*\n      read_from_head true\n      tag bitbucket.log\n      <parse>\n        @type regexp\n        expression /^(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}) (?<message>.*)$/\n      </parse>\n    </source>\n    {{- if .Values.bitbucket.mesh.enabled }}\n    <source>\n      @type tail\n      path /application-data/logs/atlassian-mesh.log*\n      read_from_head true\n      tag mesh.log\n      <parse>\n        @type regexp\n        expression /^(?<time>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}) (?<message>.*)$/\n      </parse>\n    </source>\n    {{- end }}\n\n    <filter **>\n      @type record_transformer\n      <record>\n        podname \"#{ENV['POD_NAME']}\"\n        podnamespace \"#{ENV['POD_NAMESPACE']}\"\n        podip \"#{ENV['POD_IP']}\"\n        helmrelease \"#{ENV['HELM_RELEASE_NAME']}\"\n      </record>\n    </filter>\n\n    <filter **>\n      @type stdout\n    </filter>\n\n    <match **>\n      @type elasticsearch\n      host {{ .Values.fluentd.elasticsearch.hostname }}\n      logstash_format true\n    </match>\n    {{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/configmap-jmx-config.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{- if .Values.monitoring.jmxExporterCustomConfig }}\n  jmx-config.yaml: |\n  {{- with .Values.monitoring.jmxExporterCustomConfig }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- else }}\n  jmx-config.yaml: |\n    rules:\n    - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n      name: java_lang_$2_$3\n    - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n      name: java_lang_Memory_HeapMemoryUsage_$1\n    - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n      name: java_lang_G1_$1_Generation_$2\n    - pattern: '.*'\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/configmap-mesh-grafana-dashboards.yaml",
    "content": "{{- if and .Values.monitoring.grafana.createDashboards .Values.bitbucket.mesh.enabled }}\n{{- $grafanaDashboards := .Files.Glob \"grafana-dashboards/bitbucket-mesh/*.json\" -}}\n{{- range $index, $grafanaDashboard := $grafanaDashboards -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n{{- $fileName := split \"/\" $index }}\n  name: {{ include \"common.names.fullname\" . }}-{{ $fileName._2 | trimSuffix \".json\" }}-dashboard\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.monitoring.grafana.dashboardLabels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- if .Values.monitoring.grafana.dashboardAnnotations }}\n  annotations:\n    {{- with .Values.monitoring.grafana.dashboardAnnotations}}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- end }}\ndata:\n  {{ include \"common.names.fullname\" . }}-{{ .Release.Namespace}}-{{ $fileName._2}}: |\n{{ .Files.Get $index | indent 4 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}"
  },
  {
    "path": "src/main/charts/bitbucket/templates/configmap-mesh-scripts.yaml",
    "content": "{{- if and .Values.bitbucket.sysadminCredentials.secretName .Values.bitbucket.mesh.enabled -}}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-mesh-scripts\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  register-mesh-node.sh: |\n    #!/bin/sh\n    {{ if and (.Values.bitbucket.service.contextPath) (ne .Values.bitbucket.service.contextPath \"/\") }}\n    BITBUCKET_URL=http://{{ include \"common.names.fullname\" . }}:{{ .Values.bitbucket.service.port }}{{ .Values.bitbucket.service.contextPath }}\n    {{ else }}\n    BITBUCKET_URL=http://{{ include \"common.names.fullname\" . }}:{{ .Values.bitbucket.service.port }}\n    {{ end }}\n\n    echo \"[INFO]: Registering mesh node bitbucket-mesh-$1 with ${BITBUCKET_URL}\"\n    response=$(curl -s -o /tmp/response.txt -w \"%{http_code}\" -XPOST -d \"{\\\"name\\\":\\\"bitbucket-mesh-$1\\\",\\\"rpcUrl\\\":\\\"http://{{ include \"common.names.fullname\" . }}-mesh-$1:{{.Values.bitbucket.mesh.service.port}}\\\"}\" -H \"Content-Type: application/json\" -u $SYSADMIN_USERNAME:$SYSADMIN_PASSWORD ${BITBUCKET_URL}/rest/api/latest/admin/git/mesh/nodes)\n    if [ ${response} == \"200\" ]; then\n      echo \"[INFO]: Successfully registered mesh node bitbucket-mesh-$1\"\n      cat /tmp/response.txt\n    else\n      echo \"[ERROR]: Failed to register mesh node. Response code: ${response}\"\n      cat /tmp/response.txt\n      exit 1\n    fi\n  configure-mesh.sh: |\n    #!/bin/sh\n    {{ if and (.Values.bitbucket.service.contextPath) (ne .Values.bitbucket.service.contextPath \"/\") }}\n    BITBUCKET_URL=http://{{ include \"common.names.fullname\" . }}:{{ .Values.bitbucket.service.port }}{{ .Values.bitbucket.service.contextPath }}\n    {{ else }}\n    BITBUCKET_URL=http://{{ include \"common.names.fullname\" . }}:{{ .Values.bitbucket.service.port }}\n    {{ end }}\n    \n    echo \"[INFO]: Making Bitbucket Mesh default for all new repositories\"\n    response=$(curl -s -o /tmp/response.txt -w \"%{http_code}\" -XPUT -d '{\"isRefreshing\":false,\"repositoryCreationEnabled\":{{ .Values.bitbucket.mesh.setByDefault }}}' -H \"Content-Type: application/json\" -u $SYSADMIN_USERNAME:$SYSADMIN_PASSWORD ${BITBUCKET_URL}/rest/ui/latest/admin/git/mesh/settings)\n    if [ ${response} == \"200\" ]; then\n      echo \"[INFO]: Successfully enabled mesh for all new repositories\"\n      cat /tmp/response.txt\n    else\n      echo \"[ERROR]: Rest API call failed. Response code: ${response}\"\n      cat /tmp/response.txt\n      exit 1\n    fi\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/configmap-values-analytics.yaml",
    "content": "{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-helm-values\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n  values.yaml: |\n  {{- include \"bitbucket.sanitizedValues\" . }}\n{{- end }}\n{{- if .Values.atlassianAnalyticsAndSupport.analytics.enabled }}\n  analytics.json: |\n  {{- include \"bitbucket.analyticsJson\" . | nindent 4 }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/configmaps-grafana-dashboards.yaml",
    "content": "{{- if .Values.monitoring.grafana.createDashboards }}\n{{- $grafanaDashboards := .Files.Glob \"grafana-dashboards/*.json\" -}}\n{{- range $index, $grafanaDashboard := $grafanaDashboards -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n{{- $fileName := split \"/\" $index }}\n  name: {{ include \"common.names.fullname\" . }}-{{ $fileName._1 | trimSuffix \".json\" }}-dashboard\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.monitoring.grafana.dashboardLabels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- if .Values.monitoring.grafana.dashboardAnnotations }}\n  annotations:\n    {{- with .Values.monitoring.grafana.dashboardAnnotations}}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- end }}\ndata:\n  {{ include \"common.names.fullname\" . }}-{{ .Release.Namespace}}-{{ $fileName._1}}: |\n{{ .Files.Get $index | indent 4 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/httproute.yaml",
    "content": "{{- if .Values.gateway.create }}\n{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: gateway.networking.k8s.io/v1\nkind: HTTPRoute\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.gateway.labels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.gateway.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  # Reference to the Gateway\n  parentRefs:\n  {{- toYaml .Values.gateway.parentRefs | nindent 2 }}\n  \n  # Hostnames to match\n  hostnames:\n  {{- range .Values.gateway.hostnames }}\n  - {{ . | quote }}\n  {{- end }}\n  \n  # Routing rules\n  rules:\n  # Default rule - routes to Bitbucket service\n  - matches:\n    - path:\n        type: {{ .Values.gateway.pathType }}\n        value: {{ include \"bitbucket.path\" . }}\n    {{- with .Values.gateway.timeouts }}\n    timeouts:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n    {{- with .Values.gateway.filters }}\n    filters:\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n    backendRefs:\n    - name: {{ include \"common.names.fullname\" . }}\n      port: {{ .Values.bitbucket.service.port }}\n      weight: 100\n  \n  {{- with .Values.gateway.additionalRules }}\n  {{- toYaml . | nindent 2 }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/ingress.yaml",
    "content": "{{- if and .Values.ingress.create (not .Values.ingress.openShiftRoute) }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{ if .Values.ingress.nginx }}\n    \"nginx.ingress.kubernetes.io/affinity\": \"cookie\"\n    \"nginx.ingress.kubernetes.io/affinity-mode\": \"persistent\"\n    \"nginx.ingress.kubernetes.io/proxy-body-size\": {{ .Values.ingress.maxBodySize }}\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": {{ .Values.ingress.proxyConnectTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": {{ .Values.ingress.proxyReadTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": {{ .Values.ingress.proxySendTimeout|quote }}\n  {{- end }}\n  {{- with .Values.ingress.annotations }}\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{ if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n    - hosts:\n        - {{ .Values.ingress.host }}\n      {{ if .Values.ingress.tlsSecretName }}\n      secretName: {{ .Values.ingress.tlsSecretName }}\n      {{ end }}\n{{ end }}\n  ingressClassName: {{ default \"nginx\" .Values.ingress.className }}\n  rules:\n    - host: {{ .Values.ingress.host }}\n      http:\n        paths:\n          - path: {{ include \"bitbucket.ingressPath\" . }}\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"common.names.fullname\" $ }}\n                port:\n                  number: {{ $.Values.bitbucket.service.port }}\n         {{- range $path := .Values.ingress.additionalPaths }}\n          - path: {{ $path.path }}\n            pathType: {{ $path.pathType | default \"Prefix\" }}\n            backend:\n              service:\n                name: {{ $path.service }}\n                port:\n                  number: {{ $path.portNumber }}\n         {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/job-mesh-add-nodes.yaml",
    "content": "{{- if and .Values.bitbucket.sysadminCredentials.secretName .Values.bitbucket.mesh.enabled .Values.bitbucket.mesh.nodeAutoRegistration -}}\n{{- range $index := until (.Values.bitbucket.mesh.replicaCount | int) }}\n{{- with $ }}\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-mesh-register-job-{{ $index }}\n  labels:\n    app.kubernetes.io/name: {{ include \"common.names.name\" . }}-mesh-job\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    \"helm.sh/hook\": post-install\n    \"helm.sh/hook-weight\": \"-10\"\n    \"helm.sh/hook-delete-policy\": hook-succeeded\nspec:\n  template:\n    metadata:\n      annotations:\n        {{- include \"bitbucket.mesh.podAnnotations\" . | nindent 8 }}\n      labels:\n        app.kubernetes.io/name: {{ include \"common.names.name\" . }}-mesh-job\n        app.kubernetes.io/instance: {{ .Release.Name }}\n        {{- include \"bitbucket.mesh.podLabels\" . | nindent 8 }}\n    spec:\n      containers:\n        - name: bitbucket-mesh-register-services\n          image: curlimages/curl\n          command: [\"/scripts/register-mesh-node.sh\"]\n          args: [\"{{ $index }}\"]\n          env:\n            {{ with .Values.bitbucket.sysadminCredentials }}\n            - name: SYSADMIN_USERNAME\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .secretName }}\n                  key: {{ .usernameSecretKey }}\n            - name: SYSADMIN_PASSWORD\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .secretName }}\n                  key: {{ .passwordSecretKey }}\n              {{ end }}\n          volumeMounts:\n          - name: register-mesh-node\n            mountPath: /scripts\n      volumes:\n      - name: register-mesh-node\n        configMap:\n          name: {{ include \"common.names.fullname\" . }}-mesh-scripts\n          items:\n            - key: register-mesh-node.sh\n              path: register-mesh-node.sh\n          defaultMode: 0777\n      restartPolicy: Never\n      {{- with .Values.bitbucket.mesh.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.bitbucket.mesh.schedulerName }}\n      schedulerName: {{ .Values.bitbucket.mesh.schedulerName  | quote }}\n      {{- end }}\n  backoffLimit: 4\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/job-mesh-configure.yaml",
    "content": "{{- if and .Values.bitbucket.sysadminCredentials.secretName .Values.bitbucket.mesh.enabled .Values.bitbucket.mesh.setByDefault -}}\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-mesh-configure-job\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    \"helm.sh/hook\": post-install\n    \"helm.sh/hook-weight\": \"-5\"\n    \"helm.sh/hook-delete-policy\": hook-succeeded\nspec:\n  template:\n    metadata:\n      annotations:\n        {{- include \"bitbucket.mesh.podAnnotations\" . | nindent 8 }}\n      labels:\n        app.kubernetes.io/name: {{ include \"common.names.name\" . }}-mesh-job\n        app.kubernetes.io/instance: {{ .Release.Name }}\n        {{- include \"bitbucket.mesh.podLabels\" . | nindent 8 }}\n    spec:\n      containers:\n        - name: bitbucket-mesh-configure-services\n          image: curlimages/curl\n          command: [\"/scripts/configure-mesh.sh\"]\n          env:\n            {{ with .Values.bitbucket.sysadminCredentials }}\n            - name: SYSADMIN_USERNAME\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .secretName }}\n                  key: {{ .usernameSecretKey }}\n            - name: SYSADMIN_PASSWORD\n              valueFrom:\n                secretKeyRef:\n                  name: {{ .secretName }}\n                  key: {{ .passwordSecretKey }}\n              {{ end }}\n          volumeMounts:\n            - name: configure-mesh\n              mountPath: /scripts\n      restartPolicy: Never\n      volumes:\n            - name: configure-mesh\n              configMap:\n                name: {{ include \"common.names.fullname\" . }}-mesh-scripts\n                items:\n                  - key: configure-mesh.sh\n                    path: configure-mesh.sh\n                defaultMode: 0777\n      {{- with .Values.bitbucket.mesh.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.bitbucket.mesh.schedulerName }}\n      schedulerName: {{ .Values.bitbucket.mesh.schedulerName  | quote }}\n      {{- end }}\n  backoffLimit: 4\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/pdb.yaml",
    "content": "{{- if .Values.podDisruptionBudget.enabled }}\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.podDisruptionBudget.labels }}\n      {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.podDisruptionBudget.annotations }}\n  annotations:\n    {{- range $key, $value := . }}\n    {{ $key }}: {{ $value | quote }}\n    {{- end }}\n  {{- end }}\nspec:\n  {{- with .Values.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ . }}\n  {{- else }}\n  minAvailable: {{ .Values.podDisruptionBudget.minAvailable | default 0 }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/rbac.yaml",
    "content": "{{- if and (.Values.bitbucket.clustering.enabled) (or .Values.serviceAccount.clusterRole.create .Values.serviceAccount.role.create) }}\napiVersion: rbac.authorization.k8s.io/v1\n{{- if .Values.serviceAccount.clusterRole.create }}\nkind: ClusterRole\n{{- else }}\nkind: Role\n{{- end }}\nmetadata:\n{{- if .Values.serviceAccount.clusterRole.create }}\n  name: {{ template \"bitbucket.clusterRoleName\" . }}\n{{- else }}\n  name: {{ include \"common.names.fullname\" . }}\n{{- end }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nrules:\n  - apiGroups:\n      - \"\"\n    resources:\n      - endpoints\n      - pods\n{{- if .Values.serviceAccount.clusterRole.create }}\n      - nodes\n{{- end }}\n    verbs:\n      - get\n      - list\n{{- end }}\n---\n{{- if and (.Values.bitbucket.clustering.enabled) (or .Values.serviceAccount.clusterRoleBinding.create .Values.serviceAccount.roleBinding.create) }}\napiVersion: rbac.authorization.k8s.io/v1\n{{- if .Values.serviceAccount.clusterRoleBinding.create }}\nkind: ClusterRoleBinding\n{{- else }}\nkind: RoleBinding\n{{- end }}\nmetadata:\n{{- if .Values.serviceAccount.clusterRoleBinding.create }}\n  name: {{ include \"bitbucket.clusterRoleBindingName\" . }}\n{{- else }}\n  name: {{ include \"common.names.fullname\" . }}\n{{- end }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n{{- if .Values.serviceAccount.clusterRoleBinding.create }}\n  kind: ClusterRole\n{{- else }}\n  kind: Role\n{{- end }}\n  name: {{ include \"bitbucket.clusterRoleName\" . }}\nsubjects:\n  - kind: ServiceAccount\n    name: {{ include \"bitbucket.serviceAccountName\" . }}\n    namespace: {{ .Release.Namespace }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/route.yaml",
    "content": "{{- if and .Values.ingress.create .Values.ingress.openShiftRoute }}\nkind: Route\napiVersion: route.openshift.io/v1\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{- if .Values.ingress.routeHttpHeaders }}\n  httpHeaders:\n{{- with .Values.ingress.routeHttpHeaders }}\n{{- toYaml . | nindent 4 }}\n{{- end }}\n{{- end }}\n  host: {{ .Values.ingress.host }}\n  path: {{ include \"bitbucket.ingressPath\" . }}\n  to:\n    kind: Service\n    name: {{ include \"common.names.fullname\" . }}\n    weight: 100\n  port:\n    targetPort: http\n{{- if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n{{- if .Values.ingress.tlsSecretName }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace .Values.ingress.tlsSecretName) }}\n{{- if $secretData }}\n{{- if hasKey $secretData.data \"tls.crt\" }}\n    certificate: |\n      {{- index $secretData.data \"tls.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"tls.key\" }}\n    key: |\n      {{- index $secretData.data \"tls.key\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"ca.crt\" }}\n    caCertificate: |\n      {{- index $secretData.data \"ca.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- end }}\n{{- end }}\n    termination: edge\n    insecureEdgeTerminationPolicy: Redirect\n  wildcardPolicy: None\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/secret-clustering.yaml",
    "content": "{{/* the default can be removed in v2.0.0 */}}\n{{- $clusterGroup := default dict .Values.bitbucket.clustering.group }}\n{{- if and .Values.bitbucket.clustering.enabled (empty $clusterGroup.secretName) }}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: {{ include \"bitbucket.hazelcastGroupSecretName\" . | quote }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ntype: Opaque\ndata:\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace (include \"bitbucket.hazelcastGroupSecretName\" .)) }}\n{{- if $secretData.data }}\n  # Using existing data\n  {{ .Values.bitbucket.clustering.group.nameSecretKey }}: {{ index $secretData.data .Values.bitbucket.clustering.group.nameSecretKey | quote }}\n  {{ .Values.bitbucket.clustering.group.passwordSecretKey }}: {{ index $secretData.data .Values.bitbucket.clustering.group.passwordSecretKey | quote }}\n{{- else }}\n  # Creating new secret\n  {{ .Values.bitbucket.clustering.group.nameSecretKey }}: {{ include \"common.names.fullname\" . | trunc 31 | trimSuffix \"-\" | b64enc | quote }}\n  {{ .Values.bitbucket.clustering.group.passwordSecretKey }}: {{ randAlphaNum 64 | b64enc | quote }}\n{{- end }}\n{{- end }}"
  },
  {
    "path": "src/main/charts/bitbucket/templates/secret-opensearch.yaml",
    "content": "{{- if and .Values.opensearch.install .Values.opensearch.envFrom }}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: opensearch-initial-password\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ntype: Opaque\ndata:\n  OPENSEARCH_INITIAL_ADMIN_PASSWORD: {{- include \"bitbucket.opensearch.initial.admin.password\" . | indent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/service-hazelcast.yaml",
    "content": "{{ if .Values.bitbucket.hazelcastService.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-hazelcast\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.bitbucket.hazelcastService.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.bitbucket.hazelcastService.type }}\n  ports:\n    - port: {{ .Values.bitbucket.ports.hazelcast }}\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  selector:\n    {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/service-jmx.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{- with .Values.monitoring.jmxServiceAnnotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  type: {{ .Values.monitoring.jmxExporterPortType }}\n  ports:\n    - port: {{ .Values.monitoring.jmxExporterPort}}\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n    - port: 9998\n      targetPort: 9998\n      name: jmx-mesh-sidecar\n  selector:\n  {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/service-mesh.yaml",
    "content": "{{- if .Values.bitbucket.mesh.enabled }}\n{{- range $index := until (.Values.bitbucket.mesh.replicaCount | int) }}\n{{- with $ }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-mesh-{{ $index }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.bitbucket.mesh.service.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.bitbucket.mesh.service.type }}\n  ports:\n    - port: {{ .Values.bitbucket.mesh.service.port }}\n      targetPort: mesh\n      protocol: TCP\n      name: mesh\n    {{- if .Values.monitoring.exposeJmxMetrics}}\n    - port: {{ .Values.monitoring.jmxExporterPort}}\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n    {{- end }}\n  selector:\n    statefulset.kubernetes.io/pod-name: {{ include \"common.names.fullname\" . }}-mesh-{{ $index }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/service-monitor-mesh.yaml",
    "content": "{{- if and .Values.bitbucket.mesh.enabled .Values.monitoring.serviceMonitor.create }}\n{{- range $index := until (.Values.bitbucket.mesh.replicaCount | int) }}\n{{- with $ }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-mesh-{{ $index }}-service-monitor\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.monitoring.serviceMonitor.prometheusLabelSelector }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  endpoints:\n  - interval: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeIntervalSeconds }}\n    path: /metrics\n    port: jmx\n    scheme: http\n  selector:\n    matchLabels:\n      statefulset.kubernetes.io/pod-name: {{ include \"common.names.fullname\" . }}-mesh-{{ $index }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/service-monitor.yaml",
    "content": "{{- if .Values.monitoring.serviceMonitor.create }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-service-monitor\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.monitoring.serviceMonitor.prometheusLabelSelector }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  endpoints:\n  - interval: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeIntervalSeconds }}\n    path: /metrics\n    port: jmx\n    scheme: http\n    relabelings:\n      - action: replace\n        sourceLabels:\n          - __meta_kubernetes_pod_name\n        targetLabel: instance\n    scrapeTimeout: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeTimeoutSeconds }}\n\n  - interval: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeIntervalSeconds }}\n    path: /metrics\n    port: jmx-mesh-sidecar\n    scheme: http\n    relabelings:\n      - action: replace\n        sourceLabels:\n          - __meta_kubernetes_pod_name\n        targetLabel: instance\n    scrapeTimeout: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeTimeoutSeconds }}\n  selector:\n    matchLabels:\n    {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/service-ssh.yaml",
    "content": "{{/* This describes a K8s service for communicating with the ssh port on Bitbucket */}}\n{{- if .Values.bitbucket.sshService.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-ssh\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.bitbucket.sshService.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.bitbucket.sshService.type }}\n  {{- if and (eq .Values.bitbucket.sshService.type \"LoadBalancer\") (not (empty .Values.bitbucket.sshService.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.bitbucket.sshService.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.bitbucket.sshService.port }}\n      {{- if and (eq .Values.bitbucket.sshService.type \"NodePort\") .Values.bitbucket.sshService.nodePort}}\n      nodePort: {{ .Values.bitbucket.sshService.nodePort }}\n      {{- end }}\n      targetPort: ssh\n      protocol: TCP\n      name: ssh\n  selector:\n    {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/service.yaml",
    "content": "{{/*This describes a K8s service for comunicating with the statefulset*/}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.bitbucket.service.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.bitbucket.service.type }}\n  sessionAffinity: {{ .Values.bitbucket.service.sessionAffinity }}\n  {{- if .Values.bitbucket.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  sessionAffinityConfig:\n    clientIP:\n      timeoutSeconds: {{ .Values.bitbucket.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  {{- end }}\n  {{- if and (eq .Values.bitbucket.service.type \"LoadBalancer\") (not (empty .Values.bitbucket.service.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.bitbucket.service.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.bitbucket.service.port }}\n      targetPort: http\n      protocol: TCP\n      name: http\n      {{- if and (eq .Values.bitbucket.service.type \"NodePort\") .Values.bitbucket.service.nodePort}}\n      nodePort: {{ .Values.bitbucket.service.nodePort }}\n      {{- end }}\n    - port: {{ .Values.bitbucket.service.sshPort }}\n      targetPort: ssh\n      protocol: TCP\n      name: ssh\n      {{- if and (eq .Values.bitbucket.service.type \"NodePort\") .Values.bitbucket.service.sshNodePort}}\n      nodePort: {{ .Values.bitbucket.service.sshNodePort }}\n      {{- end }}\n  {{- if not .Values.bitbucket.hazelcastService.enabled }}\n    - port: {{ .Values.bitbucket.ports.hazelcast }}\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  {{- end }}\n  selector:\n    {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"bitbucket.serviceAccountName\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- with .Values.serviceAccount.imagePullSecrets }}\nimagePullSecrets:\n  {{- toYaml . | nindent 2 }}\n{{- end -}}\n{{- end -}}"
  },
  {
    "path": "src/main/charts/bitbucket/templates/shared-home-pv.yaml",
    "content": "{{- if .Values.volumes.sharedHome.persistentVolume.create }}\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: {{ include \"bitbucket.volume.sharedHome.name\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  mountOptions:\n  {{- with .Values.volumes.sharedHome.persistentVolume.mountOptions }}\n    {{- toYaml . | nindent 4 }}\n  {{- else }}\n    - rw\n    - nfsvers=3\n    - lookupcache=pos\n    - noatime\n    - intr\n    - rsize=32768\n    - wsize=32768\n    - _netdev\n  {{- end }}\n  {{- with .Values.volumes.sharedHome.persistentVolume.nfs }}\n  nfs:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/shared-home-pvc.yaml",
    "content": "{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-shared-home\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nspec:\n  accessModes:\n    - {{ .Values.volumes.sharedHome.persistentVolumeClaim.accessMode }}\n  {{- if not (kindIs \"invalid\" .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName) }}\n  storageClassName: {{ .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName | quote }}\n  {{- end }}\n  {{- if .Values.volumes.sharedHome.persistentVolume.create }}\n  volumeName: {{ include \"bitbucket.volume.sharedHome.name\" . }}\n  {{- else if .Values.volumes.sharedHome.persistentVolumeClaim.volumeName }}\n  volumeName: {{ .Values.volumes.sharedHome.persistentVolumeClaim.volumeName | quote }}\n  {{- end }}\n  {{- with .Values.volumes.sharedHome.persistentVolumeClaim.resources }}\n  resources:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/statefulset-mesh.yaml",
    "content": "{{ if .Values.bitbucket.mesh.enabled }}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-mesh\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.bitbucket.mesh.additionalAnnotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  {{- if .Values.updateStrategy }}\n  {{- with .Values.updateStrategy }}\n  updateStrategy:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{ if .Values.ordinals.enabled }}\n  ordinals:\n    start: {{ .Values.ordinals.start }}\n  {{ end }}\n  replicas: {{ .Values.bitbucket.mesh.replicaCount }}\n  podManagementPolicy: {{ default \"OrderedReady\" .Values.bitbucket.mesh.podManagementPolicy }}\n  serviceName: {{ include \"common.names.fullname\" . }}-mesh\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: {{ include \"common.names.name\" . }}-mesh\n      app.kubernetes.io/instance: {{ .Release.Name }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/config-jvm-mesh.yaml\") . | sha256sum }}\n        {{- if .Values.fluentd.enabled }}\n        checksum/config-fluentd: {{ include (print $.Template.BasePath \"/configmap-fluentd.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- include \"bitbucket.mesh.podAnnotations\" . | nindent 8 }}\n      labels:\n        app.kubernetes.io/name: {{ include \"common.names.name\" . }}-mesh\n        app.kubernetes.io/instance: {{ .Release.Name }}\n        {{- include \"bitbucket.mesh.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.bitbucket.mesh.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"bitbucket.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.bitbucket.mesh.shutdown.terminationGracePeriodSeconds }}\n      hostAliases:\n        {{- include \"bitbucket.additionalHosts\" . | nindent 8 }}\n      initContainers:\n        {{- include \"bitbucket.mesh.additionalInitContainers\" . | nindent 8 }}\n        {{- if and .Values.monitoring.exposeJmxMetrics .Values.monitoring.fetchJmxExporterJar }}\n        - name: fetch-jmx-exporter\n          image: {{ .Values.monitoring.jmxExporterImageRepo}}:{{ .Values.monitoring.jmxExporterImageTag}}\n          command: [\"cp\"]\n          args: [\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\", \"{{ .Values.bitbucket.mesh.volume.mountPath }}\"]\n          volumeMounts:\n            - mountPath: {{ .Values.bitbucket.mesh.volume.mountPath | quote }}\n              name: mesh-home\n          {{- if .Values.openshift.runWithRestrictedSCC }}\n          {{- else}}\n          {{- if .Values.monitoring.jmxExporterInitContainer.runAsRoot }}\n          securityContext:\n            runAsUser: 0\n          {{- else if .Values.monitoring.jmxExporterInitContainer.customSecurityContext }}\n          securityContext:\n          {{- with .Values.monitoring.jmxExporterInitContainer.customSecurityContext }}\n          {{- toYaml .  | nindent 4 }}\n          {{- end }}\n          {{- end }}\n          {{- end }}\n        {{- end }}\n        {{- if or .Values.bitbucket.mesh.additionalCertificates.secretName .Values.bitbucket.mesh.additionalCertificates.secretList }}\n        - name: import-certs\n          image: {{ .Values.bitbucket.mesh.image.repository }}:{{ .Values.bitbucket.mesh.image.tag }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          volumeMounts:\n            - name: keystore\n              mountPath: /var/ssl\n          {{- if.Values.bitbucket.mesh.additionalCertificates.secretName }}\n            - name: certs\n              mountPath: /tmp/crt\n          {{- else }}\n          {{- range .Values.bitbucket.mesh.additionalCertificates.secretList }}\n            {{- $secretName := .name }}\n            {{- range .keys }}\n            - name: {{ $secretName }}\n              mountPath: /tmp/crt/{{$secretName}}-{{ . }}\n              subPath: {{ . }}\n            {{- end }}\n          {{- end }}\n          {{- end }}\n          command: [\"/bin/bash\"]\n          args: [\"-c\", {{ include \"bitbucketMesh.addCrtToKeystoreCmd\" . }}]\n          resources:\n          {{- with .Values.bitbucket.mesh.additionalCertificates.initContainer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          securityContext:\n          {{- with .Values.bitbucket.mesh.additionalCertificates.initContainer.securityContext }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n        {{- end }}\n      containers:\n        - name: {{ if .Values.bitbucket.useHelmReleaseNameAsContainerName}}{{ include \"common.names.fullname\" . }}-mesh{{ else }}{{ .Chart.Name }}-mesh{{ end }}\n          image: {{ .Values.bitbucket.mesh.image.repository }}:{{ .Values.bitbucket.mesh.image.tag }}\n          imagePullPolicy: {{ .Values.bitbucket.mesh.image.pullPolicy }}\n          ports:\n            - name: mesh\n              containerPort: {{ .Values.bitbucket.mesh.service.port }}\n              protocol: TCP\n            {{- include \"common.jmx.port\" . | nindent 12 }}\n          readinessProbe:\n            tcpSocket:\n              port: {{ .Values.bitbucket.mesh.service.port }}\n            periodSeconds: 5\n            failureThreshold: 60\n            initialDelaySeconds: 10\n          {{- with .Values.bitbucket.containerSecurityContext}}\n          securityContext:\n            {{- toYaml . | nindent 12}}\n          {{- end}}\n          volumeMounts:\n            - name: mesh-home\n              mountPath: {{ .Values.bitbucket.mesh.volume.mountPath | quote }}\n            {{- range $i, $n := .Values.bitbucket.mesh.additionalFiles }}\n            - name: {{ .name }}-{{$i}}\n              mountPath: {{ .mountPath }}/{{ .key }}\n              subPath: {{ .key }}\n            {{ end }}\n            {{- if or .Values.bitbucket.mesh.additionalCertificates.secretName .Values.bitbucket.mesh.additionalCertificates.secretList }}\n            - name: keystore\n              mountPath: /var/ssl\n            {{- end }}\n            {{- include \"common.jmx.config.volumeMounts\" . | nindent 12 }}\n          {{- with .Values.bitbucket.mesh.resources.container }}\n          resources:\n            {{- toYaml . | nindent 12 }}\n          {{- end }}\n          env:\n            - name: GRPC_SERVER_PORT\n              value: {{ .Values.bitbucket.mesh.service.port | quote }}\n            - name: MESH_HOME\n              value: {{ .Values.bitbucket.mesh.volume.mountPath }}\n            - name: KUBE_POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: JAVA_OPTS\n              value: \"-Dcluster.node.name=$(KUBE_POD_NAME)\"\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config-mesh\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config-mesh\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config-mesh\n            {{- if .Values.monitoring.exposeJmxMetrics }}\n            - name: JMX_ENABLED\n              value: \"true\"\n            {{ end }}\n            {{- include \"bitbucket.mesh.additionalEnvironmentVariables\" . | nindent 12 }}\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", {{ .Values.bitbucket.shutdown.command | quote }}]\n        {{- include \"fluentd.container\" . | nindent 8 }}\n      {{- with .Values.bitbucket.mesh.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.mesh.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.bitbucket.mesh.schedulerName }}\n      schedulerName: {{ .Values.bitbucket.mesh.schedulerName  | quote }}\n      {{- end }}\n      {{- if .Values.bitbucket.mesh.priorityClassName }}\n      priorityClassName: {{ .Values.bitbucket.mesh.priorityClassName }}\n      {{- end }}\n      volumes:\n        {{ include \"fluentd.config.volume\" . | nindent 8 }}\n        {{- range $i, $n := .Values.bitbucket.mesh.additionalFiles }}\n        - name: {{ .name }}-{{$i}}\n          {{ .type }}:\n            {{ if hasPrefix .type \"secret\" }}{{ .type}}Name{{ else }}name{{ end }}: {{ .name }}\n            items:\n              - key: {{ .key }}\n                path: {{ .key }}\n        {{ end }}\n        {{- if or .Values.bitbucket.mesh.additionalCertificates.secretName .Values.bitbucket.mesh.additionalCertificates.secretList }}\n        - name: keystore\n          emptyDir: {}\n        {{- if .Values.bitbucket.mesh.additionalCertificates.secretName }}\n        - name: certs\n          secret:\n            secretName: {{ .Values.bitbucket.mesh.additionalCertificates.secretName }}\n        {{- else }}\n        {{- range .Values.bitbucket.mesh.additionalCertificates.secretList }}\n        - name: {{ .name }}\n          secret:\n            secretName: {{ .name }}\n        {{- end }}\n        {{- end }}\n        {{- end }}\n        {{ include \"common.jmx.config.volume\" . | nindent 8 }}\n  {{ include \"bitbucket.mesh.volumeClaimTemplates\" . | nindent 2 }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/statefulset.yaml",
    "content": "{{/* This describes a k8s StatefulSet for deploying Bitbucket for testing */}}\n{{/* the default can be removed in v2.0.0 */}}\n{{- $mirror := default dict .Values.bitbucket.mirror }}\n{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.bitbucket.additionalAnnotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  {{- if .Values.updateStrategy }}\n  {{- with .Values.updateStrategy }}\n  updateStrategy:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{ if .Values.ordinals.enabled }}\n  ordinals:\n    start: {{ .Values.ordinals.start }}\n  {{ end }}\n  replicas: {{ .Values.replicaCount }}\n  podManagementPolicy: {{ default \"OrderedReady\" .Values.bitbucket.podManagementStrategy }}\n  serviceName: {{ include \"common.names.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/config-jvm.yaml\") . | sha256sum }}\n        {{- if .Values.additionalConfigMaps }}\n        checksum/config-additional: {{ include (print $.Template.BasePath \"/configmap-additional-config.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- if .Values.fluentd.enabled }}\n        checksum/config-fluentd: {{ include (print $.Template.BasePath \"/configmap-fluentd.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- include \"bitbucket.podAnnotations\" . | nindent 8 }}\n      labels:\n        {{- include \"common.labels.commonLabels\" . | nindent 8 }}\n        {{- include \"bitbucket.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"bitbucket.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.bitbucket.shutdown.terminationGracePeriodSeconds }}\n      hostAliases:\n        {{- include \"bitbucket.additionalHosts\" . | nindent 8 }}\n      {{- if .Values.openshift.runWithRestrictedSCC }}\n      {{- else }}\n      {{- if .Values.bitbucket.securityContextEnabled }}\n      {{- with .Values.bitbucket.securityContext }}\n      securityContext:\n        {{ toYaml . | nindent 8 }}\n        {{- if not .fsGroup }}\n        fsGroup: 2003\n        {{- end }}\n        {{- end }}\n      {{- end }}\n      {{- end }}\n      initContainers:\n        {{- include \"bitbucket.additionalInitContainers\" . | nindent 8 }}\n        {{- if .Values.openshift.runWithRestrictedSCC }}\n        {{- else}}\n        {{- if and .Values.volumes.sharedHome.nfsPermissionFixer.enabled (or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume) }}\n        - name: nfs-permission-fixer\n          image: {{ .Values.volumes.sharedHome.nfsPermissionFixer.imageRepo }}:{{ .Values.volumes.sharedHome.nfsPermissionFixer.imageTag }}\n          imagePullPolicy: IfNotPresent\n          {{- if .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          resources:\n          {{- with .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- end }}\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: {{ .Values.volumes.sharedHome.nfsPermissionFixer.mountPath | quote }}\n              {{- if .Values.volumes.sharedHome.subPath }}\n              subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n              {{- end }}\n          command: [\"sh\", \"-c\", {{ include \"bitbucket.sharedHome.permissionFix.command\" . | quote }}]\n        {{- end }}\n        {{- end }}\n        {{- include \"common.jmx.initContainer\" . | nindent 8 }}\n        {{- if or .Values.bitbucket.additionalCertificates.secretName .Values.bitbucket.additionalCertificates.secretList }}\n        - name: import-certs\n          image: {{ include \"bitbucket.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          volumeMounts:\n            - name: keystore\n              mountPath: /var/ssl\n          {{- if.Values.bitbucket.additionalCertificates.secretName }}\n            - name: certs\n              mountPath: /tmp/crt\n          {{- else }}\n          {{- range .Values.bitbucket.additionalCertificates.secretList }}\n            {{- $secretName := .name }}\n            {{- range .keys }}\n            - name: {{ $secretName }}\n              mountPath: /tmp/crt/{{$secretName}}-{{ . }}\n              subPath: {{ . }}\n            {{- end }}\n          {{- end }}\n          {{- end }}\n          command: [\"/bin/bash\"]\n          args: [\"-c\", {{ include \"bitbucket.addCrtToKeystoreCmd\" . }}]\n          resources:\n          {{- with .Values.bitbucket.additionalCertificates.initContainer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          securityContext:\n          {{- with .Values.bitbucket.additionalCertificates.initContainer.securityContext }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n        {{- end }}\n      containers:\n        - name: {{ if .Values.bitbucket.useHelmReleaseNameAsContainerName}}{{ include \"common.names.fullname\" . }}{{ else }}{{ .Chart.Name }}{{ end }}\n          image: {{ include \"bitbucket.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          ports:\n            - name: http\n              containerPort: {{ .Values.bitbucket.ports.http }}\n              protocol: TCP\n            - name: ssh\n              containerPort: {{ .Values.bitbucket.ports.ssh }}\n              protocol: TCP\n            - name: hazelcast\n              containerPort: {{ .Values.bitbucket.ports.hazelcast }}\n              protocol: TCP\n            {{- include \"bitbucket.additionalPorts\" . | nindent 12 }}\n            {{- include \"common.jmx.port\" . | nindent 12 }}\n          {{- if .Values.bitbucket.readinessProbe.enabled }}\n          readinessProbe:\n            {{- if .Values.bitbucket.readinessProbe.customProbe}}\n            {{- with .Values.bitbucket.readinessProbe.customProbe }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n            {{- else }}\n            httpGet:\n              port: {{ .Values.bitbucket.ports.http }}\n              path: {{ .Values.bitbucket.service.contextPath }}/status\n            initialDelaySeconds: {{ .Values.bitbucket.readinessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.bitbucket.readinessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.bitbucket.readinessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.bitbucket.readinessProbe.failureThreshold }}\n            {{- end }}\n          {{- end }}\n          {{- if .Values.bitbucket.startupProbe.enabled }}\n          startupProbe:\n            tcpSocket:\n              port: {{ .Values.bitbucket.ports.http }}\n            initialDelaySeconds: {{ .Values.bitbucket.startupProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.bitbucket.startupProbe.periodSeconds }}\n            failureThreshold: {{ .Values.bitbucket.startupProbe.failureThreshold }}\n          {{- end }}\n          {{- if .Values.bitbucket.livenessProbe.enabled }}\n          livenessProbe:\n          {{- if .Values.bitbucket.livenessProbe.customProbe}}\n          {{- with .Values.bitbucket.livenessProbe.customProbe }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- else }}\n            tcpSocket:\n              port: {{ .Values.bitbucket.ports.http }}\n            initialDelaySeconds: {{ .Values.bitbucket.livenessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.bitbucket.livenessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.bitbucket.livenessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.bitbucket.livenessProbe.failureThreshold }}\n          {{- end }}\n          {{- end }}\n          {{- with .Values.bitbucket.containerSecurityContext}}\n          securityContext:\n            {{- toYaml . | nindent 12}}\n          {{- end}}\n          volumeMounts:\n            - name: local-home\n              mountPath: {{ .Values.volumes.localHome.mountPath | quote }}\n              {{- if .Values.volumes.localHome.subPath }}\n              subPath: {{ .Values.volumes.localHome.subPath | quote }}\n              {{- end }}\n            {{/* jmxExporter is saved to shared home but mirrors don't have one, so we need at least emptyDir */}}\n            {{- if or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume\n               (and (eq .Values.bitbucket.applicationMode \"mirror\") .Values.monitoring.exposeJmxMetrics) }}\n            - name: shared-home\n              mountPath: {{ .Values.volumes.sharedHome.mountPath | quote }}\n              {{- if .Values.volumes.sharedHome.subPath }}\n              subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n              {{- end }}\n            {{- end }}\n            {{- if or .Values.bitbucket.additionalCertificates.secretName .Values.bitbucket.additionalCertificates.secretList }}\n            - name: keystore\n              mountPath: /var/ssl\n            {{- end }}\n            {{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n            - name: helm-values\n              mountPath: /opt/atlassian/helm\n            {{- end }}\n            {{- include \"bitbucket.additionalVolumeMounts\" . | nindent 12 }}\n            {{- include \"common.jmx.config.volumeMounts\" . | nindent 12 }}\n            {{- include \"bitbucket.additionalLibraries\" . | nindent 12 }}\n            {{- include \"bitbucket.additionalBundledPlugins\" . | nindent 12 }}\n            {{- range $i, $n := .Values.additionalFiles }}\n            - name: {{ .name }}-{{$i}}\n              mountPath: {{ .mountPath }}/{{ .key }}\n              subPath: {{ .key }}\n            {{ end }}\n            {{- range $i, $n := .Values.additionalConfigMaps }}\n            {{- range .keys }}\n            - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n              mountPath: {{ .mountPath }}/{{ .fileName }}\n              subPath: {{ .fileName }}\n            {{ end }}\n            {{- end }}\n          {{- with .Values.bitbucket.resources.container }}\n          resources:\n            {{- toYaml . | nindent 12 }}\n          {{- end }}\n          env:\n            - name: KUBE_POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: JAVA_OPTS\n              value: \"-Dcluster.node.name=$(KUBE_POD_NAME)\"\n            {{- include \"bitbucket.clusteringEnvVars\" . | nindent 12 }}\n            {{- include \"bitbucket.databaseEnvVars\" . | nindent 12 }}\n            {{- include \"bitbucket.sysadminEnvVars\" . | nindent 12 }}\n            {{- if .Values.bitbucket.elasticSearch.baseUrl }}\n            {{- include \"bitbucket.elasticSearchEnvVars\" . | nindent 12 }}\n            {{- else }}\n            {{- include \"bitbucket.openSearchEnvVars\" . | nindent 12 }}\n            {{- end }}\n            - name: PLUGIN_SSH_PORT\n              value: {{ .Values.bitbucket.ports.ssh | quote }}\n            {{ if eq (include \"common.gateway.isConfigured\" .) \"true\" }}\n            - name: SERVER_PROXY_NAME\n              value: {{ include \"common.gateway.hostname\" . | quote }}\n            - name: SERVER_PROXY_PORT\n              value: {{ include \"common.gateway.externalPort\" . | quote }}\n            - name: SETUP_BASEURL\n              value: {{ include \"common.gateway.origin\" . | quote }}\n            {{- with .Values.bitbucket.displayName }}\n            - name: SETUP_DISPLAYNAME\n              value: {{ . | quote }}\n            {{- end }}\n            {{- if and .Values.bitbucket.sshService.enabled (not (empty .Values.bitbucket.sshService.host)) }}\n            - name: PLUGIN_SSH_BASEURL\n              value: ssh://{{ .Values.bitbucket.sshService.host }}{{ if ne (int .Values.bitbucket.sshService.port) 22 }}:{{ .Values.bitbucket.sshService.port }}{{ end }}/\n            {{- end }}\n            {{ end }}\n            - name: SERVER_CONTEXT_PATH\n              value: {{ include \"bitbucket.path\" . | quote }}\n            - name: SERVER_PORT\n              value: {{ .Values.bitbucket.ports.http | quote }}\n            {{ if eq (include \"common.gateway.https\" .) \"true\" }}\n            - name: SERVER_SCHEME\n              value: \"https\"\n            - name: SERVER_SECURE\n              value: \"true\"\n            {{ end }}\n            - name: SET_PERMISSIONS\n              value: {{ .Values.bitbucket.setPermissions | quote }}\n            {{- if or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume }}\n            - name: BITBUCKET_SHARED_HOME\n              value: {{ .Values.volumes.sharedHome.mountPath | quote }}\n            {{- end }}\n            {{ with .Values.bitbucket.license.secretName }}\n            - name: SETUP_LICENSE\n              valueFrom:\n                secretKeyRef:\n                  name: {{ . }}\n                  key: {{ $.Values.bitbucket.license.secretKey }}\n            {{ end }}\n            {{- with $mirror.upstreamUrl }}\n            - name: PLUGIN_MIRRORING_UPSTREAM_URL\n              value: {{ . | quote }}\n            - name: PLUGIN_MIRRORING_UPSTREAM_TYPE\n              value: \"server\"\n            {{- end }}\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: APPLICATION_MODE\n              value: {{ .Values.bitbucket.applicationMode | default \"default\" | quote }}\n            {{- if .Values.monitoring.exposeJmxMetrics }}\n            - name: JMX_ENABLED\n              value: \"true\"\n            {{ end }}\n            {{- include \"bitbucket.additionalEnvironmentVariables\" . | nindent 12 }}\n          lifecycle:\n          {{- if .Values.bitbucket.postStart.command }}\n            postStart:\n              exec:\n                command: [\"/bin/sh\", \"-c\", {{- .Values.bitbucket.postStart.command | quote }}]\n          {{- end }}\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", {{ .Values.bitbucket.shutdown.command | quote }}]\n        {{- include \"fluentd.container\" . | nindent 8 }}\n        {{- include \"bitbucket.additionalContainers\" . | nindent 8 }}\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.bitbucket.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.schedulerName }}\n      schedulerName: {{ .Values.schedulerName  | quote }}\n      {{- end }}\n      {{- if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n      {{- end }}\n      volumes:\n        {{- range $i, $n := .Values.additionalFiles }}\n        - name: {{ .name }}-{{$i}}\n          {{ .type }}:\n            {{ if hasPrefix .type \"secret\" }}{{ .type}}Name{{ else }}name{{ end }}: {{ .name }}\n            items:\n              - key: {{ .key }}\n                path: {{ .key }}\n        {{ end }}\n        {{- range $i, $key := .Values.additionalConfigMaps }}\n        {{- with $ }}\n        {{- range $key.keys }}\n        - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n          configMap:\n            name: {{ include \"common.names.fullname\" $ }}-{{ $key.name }}\n            {{- if .defaultMode }}\n            defaultMode: {{ .defaultMode }}\n            {{- end }}\n            items:\n              - key: {{ .fileName }}\n                path: {{ .fileName }}\n            {{- end }}\n        {{ end }}\n        {{- end }}\n        {{ include \"bitbucket.volumes\" . | nindent 8 }}\n        {{ include \"fluentd.config.volume\" . | nindent 8 }}\n        {{ include \"common.jmx.config.volume\" . | nindent 8 }}\n  {{ include \"bitbucket.volumeClaimTemplates\" . | nindent 2 }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/tests/test-application-status.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"bitbucket.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.statusTestContainer }}\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: STATUS_URL\n          value: \"http://{{ include \"common.names.fullname\" . }}:{{ .Values.bitbucket.service.port }}/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/tests/test-database-connectivity.yaml",
    "content": "{{ if .Values.database.credentials.secretName }}\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-db-connectivity-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"bitbucket.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  serviceAccountName: {{ include \"bitbucket.serviceAccountName\" . }}\n  containers:\n    - name: test\n      image: {{ include \"bitbucket.image\" . | quote }}\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: JDBC_DRIVER\n          value: {{ .Values.database.driver | quote }}\n        - name: JDBC_URL\n          value: {{ .Values.database.url | quote }}\n        - name: JDBC_USER\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.usernameSecretKey }}\n        - name: JDBC_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.passwordSecretKey }}\n        - name: CLASSPATH\n          value: \"/opt/atlassian/bitbucket/app/WEB-INF/lib/*\"\n      command:\n        - /bin/bash\n        - -ec\n        - |\n          cat <<EOF | jshell - > output.txt\n          var jdbcDriver = System.getenv(\"JDBC_DRIVER\");\n          var jdbcUrl = System.getenv(\"JDBC_URL\");\n          var jdbcUsername = System.getenv(\"JDBC_USER\");\n          var jdbcPassword = System.getenv(\"JDBC_PASSWORD\");\n\n          System.out.println(\"Loading driver \" + jdbcDriver);\n          Class.forName(jdbcDriver);\n\n          System.out.println(\"Establishing connection to \" + jdbcUrl);\n          try (var c = java.sql.DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)) {\n             System.out.println(\"Connection established OK, \" + c.getClass());\n          }\n          EOF\n          cat output.txt\n          grep -q \"Connection established OK\" output.txt\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/templates/tests/test-shared-home-permissions.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"bitbucket.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.permissionsTestContainer }}\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        {{- with .Values.bitbucket.securityContext }}\n        {{- if and .enabled .gid }}\n        runAsUser: {{ .gid }}\n        runAsGroup: {{ .gid }}\n        {{- else if .fsGroup }}\n        runAsUser: {{ .fsGroup }}\n        runAsGroup: {{ .fsGroup }}\n        {{- else }}\n        runAsUser: {{ 2003 }}\n        runAsGroup: {{ 2003 }}\n        {{- end }}\n        {{- end }}\n      volumeMounts:\n        {{- if or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume }}\n        - name: shared-home\n          mountPath: /shared-home\n          {{- if .Values.volumes.sharedHome.subPath }}\n          subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n          {{- end }}\n        {{- else }}\n        - name: local-home\n          mountPath: /shared-home\n          subPath: shared\n        {{- end }}\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  volumes:\n    {{- if or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume }}\n    {{ include \"bitbucket.volumes.sharedHome\" . | nindent 4 }}\n    {{- else }}\n    {{ include \"bitbucket.volumes.localHome\" . | nindent 4 }}\n    {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/bitbucket/values.yaml",
    "content": "## Atlassian Bitbucket Data Center Helm values\n#\n# HEADS UP!\n#\n# Data loss will occur if sections declared as 'REQUIRED' are not configured appropriately!\n# These sections are:\n# - database\n# - volumes\n#\n# Additional details on pre-provisioning these required resources can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#3-configure-database\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#5-configure-persistent-storage\n#\n# To manage external access to the Bitbucket instance, a Gateway API HTTPRoute or an Ingress\n# resource can be configured under the 'gateway' or 'ingress' stanza respectively.\n# This requires a pre-provisioned gateway/ingress controller to be present.\n#\n# Additional details on configuring external access can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#4-configure-ingress\n#\n# Unlike the other products, Bitbucket has the added advantage that it can be fully\n# configured at deployment. For a fully configured Bitbucket instance that does not\n# require manual configuration post deployment the following sections should all be\n# configured:\n# - database\n# - volumes\n# - bitbucket.license\n# - bitbucket.sysadminCredentials\n# - bitbucket.elasticSearch\n#\n##\n\n\n# -- The initial number of Bitbucket pods that should be started at deployment time.\n# Note that if Bitbucket is fully configured (see above) during initial deployment\n# a 'replicaCount' greater than 1 can be supplied.\n#\nreplicaCount: 1\n\n# -- Set a custom start ordinal number for the K8s stateful set.\n# Note that this depends on the StatefulSetStartOrdinal K8s feature gate,\n# which has entered beta state with K8s version 1.27.\n#\nordinals:\n\n  # -- Enable only if StatefulSetStartOrdinal K8s feature gate is available.\n  #\n  enabled: false\n\n  # -- Set start ordinal to a positive integer, defaulting to 0.\n  #\n  start: 0\n\n# -- StatefulSet update strategy. When unset defaults to Rolling update.\n# See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets\n#\nupdateStrategy: {}\n  # type: OnDelete\n\n# -- Image configuration\n#\nimage:\n\n  # -- The Bitbucket Docker image to use\n  # https://hub.docker.com/r/atlassian/bitbucket\n  #\n  repository: atlassian/bitbucket\n\n  # -- Image pull policy\n  #\n  pullPolicy: IfNotPresent\n\n  # -- The docker image tag to be used - defaults to the Chart appVersion\n  #\n  tag: \"\"\n\n# K8s ServiceAccount configuration. Give fine-grained identity and authorization\n# to Pods\n#\nserviceAccount:\n\n  # -- Set to 'true' if a ServiceAccount should be created, or 'false' if it\n  # already exists.\n  #\n  create: true\n\n  # -- The name of the ServiceAccount to be used by the pods. If not specified, but\n  # the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name\n  # will be auto-generated, otherwise the 'default' ServiceAccount will be used.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server\n  #\n  name:\n\n  # -- For Docker images hosted in private registries, define the list of image pull\n  # secrets that should be utilized by the created ServiceAccount\n  # https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod\n  #\n  imagePullSecrets: []\n  # - name: secretName\n\n  # -- Annotations to add to the ServiceAccount (if created)\n  #\n  annotations: {}\n\n  role:\n    # -- Create a role for Hazelcast client with privileges to get and list pods and endpoints in the namespace.\n    # Set to false if you need to create a Role and RoleBinding manually\n    #\n    create: true\n\n  # Define permissions\n  # https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole\n  #\n  clusterRole:\n\n    # -- Set to 'true' if a ClusterRole should be created, or 'false' if it\n    # already exists.\n    #\n    create: false\n\n    # -- The name of the ClusterRole to be used. If not specified, but\n    # the \"serviceAccount.clusterRole.create\" flag is set to 'true',\n    # then the ClusterRole name will be auto-generated.\n    #\n    name:\n\n  # -- Grant permissions defined in Role (list and get pods and endpoints) to a service account.\n  #\n  roleBinding:\n\n    # Set to false if you need to create a Role and RoleBinding manually\n    #\n    create: true\n\n  # Grant permissions defined in ClusterRole\n  # https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding\n  #\n  clusterRoleBinding:\n\n    # -- Set to 'true' if a ClusterRoleBinding should be created, or 'false' if it\n    # already exists.\n    #\n    create: false\n\n    # -- The name of the ClusterRoleBinding to be created. If not specified, but\n    # the \"serviceAccount.clusterRoleBinding.create\" flag is set to 'true',\n    # then the ClusterRoleBinding name will be auto-generated.\n    #\n    name:\n\n# REQUIRED - Database configuration\n#\n# Bitbucket requires a backend database. The configuration below can be used to define the\n# database to use and its connection details.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#database-connectivity\n#\ndatabase:\n\n  # -- The jdbc URL of the database. If not specified, then it will need to be provided\n  # via the browser during manual configuration post deployment. Example URLs include:\n   # * 'jdbc:postgresql://<dbhost>:5432/<dbname>'\n   # * 'jdbc:mysql://<dbhost>/<dbname>'\n   # * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>'\n   # * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl\n  #\n  url:\n\n  # -- The Java class name of the JDBC driver to be used. If not specified, then it will\n  # need to be provided via the browser during manual configuration post deployment.\n  # Valid drivers are:\n   # * 'org.postgresql.Driver'\n   # * 'com.mysql.jdbc.Driver'\n   # * 'oracle.jdbc.OracleDriver'\n   # * 'com.microsoft.sqlserver.jdbc.SQLServerDriver'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasedriver:\n  #\n  driver:\n\n  # JDBC connection credentials\n  #\n  credentials:\n\n    # -- The name of the K8s Secret that contains the database login credentials.\n    # If the secret is specified, then the credentials will be automatically utilised on\n    # Bitbucket startup. If the secret is not provided, then the credentials will need\n    # to be provided via the browser during manual configuration post deployment.\n    #\n    # Example of creating a database credentials K8s secret below:\n    # 'kubectl create secret generic <secret-name> --from-literal=username=<username> \\\n    # --from-literal=password=<password>'\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    # -- The key ('username') in the Secret used to store the database login username\n    #\n    usernameSecretKey: username\n\n    # -- The key ('password') in the Secret used to store the database login password\n    #\n    passwordSecretKey: password\n\n# REQUIRED - Volume configuration\n#\n# By default, the charts will configure the local-home and shared-home as ephemeral\n# volumes i.e. 'emptyDir: {}'. This is fine for evaluation purposes but for production\n# deployments this is not ideal and so local-home and shared-home should both be configured\n# appropriately.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#volumes\n#\nvolumes:\n\n  # Each pod requires its own volume for 'local-home'. This is needed for key data\n  # that help define how Bitbucket works.\n  # https://confluence.atlassian.com/bitbucketserver/set-the-home-directory-776640890.html\n  #\n  localHome:\n\n    # Dynamic provisioning of local-home using the K8s Storage Classes\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/LOCAL_STORAGE/\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically\n      # created for each pod based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the name of the 'StorageClass' that should be used for the local-home\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests and/or limits for the local-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # This field controls if and how PVCs are deleted during the lifecycle of a StatefulSet.\n    # Only configure the below two attributes when your Kubernetes version is 1.27+, and\n    # feature gate StatefulSetAutoDeletePVC is enabled.\n    #\n    # For each policy that you can configure, you can set the value to either Delete or Retain.\n    #\n    # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention\n    #\n    persistentVolumeClaimRetentionPolicy:\n\n      # -- Configures the volume retention behavior that applies when the StatefulSet is deleted.\n      #\n      whenDeleted:\n\n      # -- Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.\n      #\n      whenScaled:\n\n    # -- Static provisioning of local-home using K8s PVs and PVCs\n    #\n    # NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for\n    # pods is not recommended. Dynamic provisioning described above is the prescribed\n    # approach.\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the local-home volume(s). If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Bitbucket container to which the local-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/bitbucket\"\n\n    # -- Specifies the sub-directory of the local-home volume that will be mounted in to the\n    # Bitbucket container.\n    #\n    subPath:\n\n  # When storing git data on shared home (i.e. not using Mesh), an NFS volume for 'shared-home'\n  # is required by Bitbucket to effectively operate in multi-node environment.\n  #\n  # Details on how an NFS should be stood up for Bitbucket can be found here:\n  # https://confluence.atlassian.com/bitbucketserver/install-bitbucket-data-center-872139817.html#InstallBitbucketDataCenter-nfs\n  #\n  # Additional information on utilizing an NFS with the Helm charts can be found here:\n  # https://atlassian.github.io/data-center-helm-charts/examples/storage/nfs/NFS/\n  #\n  sharedHome:\n\n    # Provision a PersistentVolume for an existing NFS server\n    #\n    persistentVolume:\n\n      # -- If 'true' then a 'PersistentVolume' will be created for the NFS server\n      #\n      create: false\n\n      # NFS server details for which the PersistentVolume should be created.\n      #\n      nfs:\n\n        # -- The address of the NFS server. It needs to be resolvable by the kubelet,\n        # so consider using an IP address.\n        #\n        server: \"\"\n\n        # -- Specifies NFS directory share. This will be mounted into the Pod(s) using the\n        # 'volumes.sharedHome.mountPath'\n        #\n        path: \"\"\n\n      # -- Additional options to be used when mounting the NFS volume\n      #\n      mountOptions: []\n\n    # Create a claim for the NFS PersistentVolume\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolumeClaim' will be created for the 'PersistentVolume'\n      #\n      create: false\n\n      # -- Specify the name of the 'StorageClass' that should be used\n      #\n      # If set to non-empty string value, this will specify the storage class to be used.\n      # If left without value, the default Storage Class will be utilised. Alternatively,\n      # can be set to the empty string \"\", to indicate that no Storage Class should be used here.\n      storageClassName:\n\n      # -- If persistentVolume.create and persistentVolumeClaim.create are both true then any\n      # value supplied here is ignored and the default used. A custom value here is useful\n      # when bringing your own 'PersistentVolume' i.e. 'persistentVolume.create' is false.\n      #\n      volumeName:\n\n      # -- Specifies the access mode of the volume to claim\n      #\n      accessMode: ReadWriteMany\n\n      # -- Specifies the standard K8s resource requests and/or limits for the shared-home\n      #volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # -- Static provisioning of shared-home using K8s PVs and PVCs\n    #\n    # When 'persistentVolume.create' and 'persistentVolumeClaim.create' are 'false', then\n    # this property can be used to define a custom volume that will be used for shared-home\n    # If not defined, then an 'emptyDir' volume is utilised.\n    #\n    # Having manually provisioned a 'PersistentVolume' with corresponding 'PersistentVolumeClaim'\n    # specify the bound claim name below\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Bitbucket container to which the shared-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/shared-home\"\n\n    # -- Specifies the sub-directory of the shared-home volume that will be mounted in to the\n    # Bitbucket container.\n    #\n    subPath:\n\n    # Modify permissions on shared-home\n    #\n    nfsPermissionFixer:\n\n      # -- If 'true', this will alter the shared-home volume's root directory so that Bitbucket\n      # can write to it. This is a workaround for a K8s bug affecting NFS volumes:\n      # https://github.com/kubernetes/examples/issues/260\n      #\n      enabled: true\n\n      # -- The path in the K8s initContainer where the shared-home volume will be mounted\n      #\n      mountPath: \"/shared-home\"\n\n      # -- Image repository for the permission fixer init container. Defaults to alpine\n      #\n      imageRepo: alpine\n\n      # -- Image tag for the permission fixer init container. Defaults to latest\n      #\n      imageTag: latest\n\n      # -- Resources requests and limits for nfsPermissionFixer init container\n      # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n      #\n      resources: {}\n      #  requests:\n      #    cpu: \"1m\"\n      #    memory: \"20Mi\"\n      #  limits:\n      #    cpu: \"1\"\n      #    memory: \"1G\"\n\n      # -- By default, the fixer will change the group ownership of the volume's root directory\n      # to match the Bitbucket container's GID (2003), and then ensures the directory is\n      # group-writeable. If this is not the desired behaviour, command used can be specified\n      # here.\n      #\n      command:\n\n  # -- Defines additional volumes that should be applied to all Bitbucket pods.\n  # Note that this will not create any corresponding volume mounts;\n  # those need to be defined in bitbucket.additionalVolumeMounts\n  #\n  additional: []\n\n# Ingress configuration\n#\n# Use this section when routing external traffic to Bitbucket via a Kubernetes Ingress\n# resource (K8s Ingress API). Requires a pre-provisioned Ingress Controller.\n# If using the Gateway API instead, see the 'gateway' section below.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#ingress\n#\ningress:\n\n  # -- Set to 'true' if an Ingress Resource should be created. This depends on a\n  # pre-provisioned Ingress Controller being available.\n  #\n  create: false\n\n  # -- The fully-qualified hostname (FQDN) of the Bitbucket instance. This value is used\n  # to configure the product's proxy settings and, when ingress.create is true,\n  # the Ingress resource routing rules.\n  #\n  host:\n\n  # -- Whether users access the application over HTTPS. Set to 'false' if not\n  # using TLS, e.g. when reaching the service via localhost port-forwarding.\n  #\n  https: true\n\n  # -- The base path for the application, e.g. '/bitbucket'.\n  # Defaults to 'bitbucket.service.contextPath'.\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when ingress.create is true.\n  # They configure the Ingress resource itself and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Set to true if you want to create an OpenShift Route instead of an Ingress\n  #\n  openShiftRoute: false\n\n  # -- routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only\n  #\n  routeHttpHeaders: {}\n\n  # -- The class name used by the ingress controller if it's being used.\n  #\n  # Please follow documentation of your ingress controller. If the cluster\n  # contains multiple ingress controllers, this setting allows you to control\n  # which of them is used for Atlassian application traffic.\n  #\n  className: \"nginx\"\n\n  # -- Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx'\n  # controller.\n  # https://kubernetes.github.io/ingress-nginx/\n  #\n  # This will populate the Ingress Resource with annotations that are specific to\n  # the K8s ingress-nginx controller. Set to 'false' if a different controller is\n  # to be used, in which case the appropriate annotations for that controller must\n  # be specified below under 'ingress.annotations'.\n  #\n  nginx: true\n\n  # -- The max body size to allow. Requests exceeding this size will result\n  # in an HTTP 413 error being returned to the client.\n  #\n  maxBodySize: 250m\n\n  # -- Defines a timeout for establishing a connection with a proxied server. It should\n  # be noted that this timeout cannot usually exceed 75 seconds.\n  #\n  proxyConnectTimeout: 60\n\n  # -- Defines a timeout for reading a response from the proxied server. The timeout is\n  # set only between two successive read operations, not for the transmission of the\n  # whole response. If the proxied server does not transmit anything within this time,\n  # the connection is closed.\n  #\n  proxyReadTimeout: 60\n\n  # -- Sets a timeout for transmitting a request to the proxied server. The timeout is set\n  # only between two successive write operations, not for the transmission of the whole\n  # request. If the proxied server does not receive anything within this time, the\n  # connection is closed.\n  #\n  proxySendTimeout: 60\n\n  # -- The custom annotations that should be applied to the Ingress Resource.\n  # If using an ingress-nginx controller be sure that the annotations you add\n  # here are compatible with those already defined in the 'ingess.yaml' template\n  #\n  annotations: {}\n\n  # -- The name of the K8s Secret that contains the TLS private key and corresponding\n  # certificate. When utilised, TLS termination occurs at the ingress point where\n  # traffic to the Service, and it's Pods is in plaintext.\n  #\n  # Usage is optional and depends on your use case. The Ingress Controller itself\n  # can also be configured with a TLS secret for all Ingress Resources.\n  # https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets\n  # https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n  #\n  tlsSecretName:\n\n  # -- Additional paths to be added to the Ingress resource to point to different backend services\n  #\n  additionalPaths: []\n    #- path: /static-content\n    #  pathType: Prefix\n    #  service: static-content-svc\n    #  portNumber: 80\n\n# Gateway API configuration\n#\n# Use this section when routing external traffic to Bitbucket via the Kubernetes\n# Gateway API, or when using an external proxy/load balancer without creating\n# any K8s routing resource. Only one of 'ingress' or 'gateway' should be used.\n# https://gateway-api.sigs.k8s.io/\n#\ngateway:\n\n  # -- Set to 'true' if an HTTPRoute Resource should be created. This depends on a\n  # pre-provisioned Gateway API controller being available and a Gateway resource.\n  # Cannot be enabled if ingress.create is true.\n  #\n  create: false\n\n  # -- The hostnames that should be routed to Bitbucket. At least one hostname\n  # is required when gateway.create is true. Setting hostnames activates gateway\n  # mode for product configuration even when gateway.create is false, allowing\n  # use with a pre-existing Gateway or external proxy.\n  # The first entry is used as the canonical hostname for base URL, proxy\n  # settings, and NOTES output — list the primary/public hostname first.\n  #\n  hostnames: []\n  # - bitbucket.example.com\n  # - bb.example.com\n\n  # -- Whether users access the application over HTTPS.\n  # This does not configure TLS on the Gateway or load balancer — it must match\n  # how traffic is actually routed to the application.\n  #\n  https: true\n\n  # -- The port users connect on. Defaults to 443 (https) or 80 (http).\n  # This does not change the Gateway or load balancer port — it must match\n  # the port that is actually used. Only set for non-standard ports.\n  #\n  # externalPort:\n\n  # -- The base path for routing. When empty, falls back to the product's\n  # service.contextPath (same behavior as ingress). Set explicitly to\n  # override, e.g. \"/bitbucket\".\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when gateway.create is true.\n  # They configure the HTTPRoute resource and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Reference to the parent Gateway resource. Supports any standard\n  # parentRef fields (name, namespace, sectionName, etc.).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference\n  #\n  parentRefs: []\n    # - name: example-gateway\n    #   namespace: example-gateway-namespace\n    #   sectionName: https\n\n  # -- Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\".\n  # PathPrefix is recommended for most use cases.\n  #\n  pathType: \"PathPrefix\"\n\n  # -- Annotations to add to the HTTPRoute resource.\n  #\n  annotations: {}\n  # kubernetes.io/ingress.class: gateway\n  # cert-manager.io/cluster-issuer: letsencrypt\n\n  # -- Labels to add to the HTTPRoute resource.\n  #\n  labels: {}\n  # environment: production\n  # team: platform\n\n  # -- HTTP filters to apply to requests. Can be used to add/remove headers,\n  # perform redirects, or rewrite URLs.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter\n  #\n  filters: []\n  # - type: RequestHeaderModifier\n  #   requestHeaderModifier:\n  #     add:\n  #     - name: X-Forwarded-Proto\n  #       value: https\n\n  # -- Advanced routing rules. Use this for complex routing scenarios like\n  # header-based routing, traffic splitting, or multiple backends.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule\n  #\n  additionalRules: []\n  # - matches:\n  #   - path:\n  #       type: PathPrefix\n  #       value: /api\n  #   backendRefs:\n  #   - name: bitbucket-api-v2\n  #     port: 8080\n  #     weight: 100\n\n  # -- Session affinity (sticky sessions) is required for Atlassian DC products but\n  # is not part of the standard Gateway API HTTPRoute spec. It must be configured\n  # separately through your Gateway implementation's own policy resources.\n  # See docs/docs/examples/ingress/GATEWAY_API_SESSION_AFFINITY.md for working examples.\n\n  # -- Timeout configuration for HTTPRoute rules.\n  # Note: when migrating from Ingress, these replace proxyReadTimeout and\n  # proxySendTimeout. There is no Gateway API equivalent for\n  # proxyConnectTimeout or maxBodySize — those require controller-specific\n  # policies (e.g. Envoy Gateway BackendTrafficPolicy).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts\n  #\n  timeouts:\n    request: \"60s\"\n    backendRequest: \"60s\"\n\n# Bitbucket configuration\n#\nbitbucket:\n\n  # -- Whether the main container should acquire helm release name. By default the container name is `bitbucket` which corresponds to the name of the Helm Chart.\n  #\n  useHelmReleaseNameAsContainerName: false\n\n  # K8s Service configuration\n  #\n  service:\n\n    # -- The port on which the Bitbucket K8s HTTP Service will listen\n    #\n    port: 80\n\n    # -- The port on which the Bitbucket K8s SSH Service will listen\n    #\n    sshPort: 7999\n\n    # -- The type of K8s service to use for Bitbucket\n    #\n    type: ClusterIP\n\n    # --  Only applicable if service.type is NodePort. NodePort for Bitbucket service\n    #\n    nodePort:\n\n    # -- SSH  Only applicable if service.type is NodePort. NodePort for Bitbucket service\n    #\n    sshNodePort:\n\n    # -- Session affinity type. If you want to make sure that connections from a particular client\n    # are passed to the same pod each time, set sessionAffinity to ClientIP.\n    # See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity\n    #\n    sessionAffinity: None\n\n    # -- Session affinity configuration\n    #\n    sessionAffinityConfig:\n\n      clientIP:\n\n        # -- Specifies the seconds of ClientIP type session sticky time.\n        # The value must be > 0 && <= 86400 (for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).\n        #\n        timeoutSeconds:\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- The context path that Bitbucket will use.\n    #\n    contextPath:\n\n    # -- Additional annotations to apply to the Service\n    #\n    annotations: {}\n\n  # -- Enable or disable an additional service for exposing SSH for external access.\n  # Disable when the SSH service is exposed through the ingress controller, or\n  # enable if the ingress controller does not support TCP.\n  #\n  sshService:\n\n    # -- Set to 'true' if an additional SSH Service should be created\n    #\n    enabled: false\n\n    # -- Port to expose the SSH service on.\n    #\n    port: 22\n\n    # -- The hostname of the SSH service. If set, it'll be used to configure the SSH base URL for the application.\n    #\n    host:\n\n    # -- SSH Service type\n    #\n    type: LoadBalancer\n\n    # --  Only applicable if service.type is NodePort. NodePort for Bitbucket ssh service\n    #\n    nodePort:\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- Annotations for the SSH service. Useful if a load balancer controller\n    # needs extra annotations.\n    #\n    annotations: {}\n\n  hazelcastService:\n\n    # -- Enable or disable an additional Hazelcast service that Bitbucket nodes can use to join a cluster.\n    # It is recommended to create a separate Hazelcast service if the Bitbucket service\n    # uses a LoadBalancer type (e.g., NLB), ensuring that the Hazelcast port is not exposed at all.\n    enabled: false\n\n    # -- The port on which the Bitbucket K8s Hazelcast Service will listen\n    #\n    port: 5701\n\n    # -- The type of the Hazelcast K8s service to use for Bitbucket\n    #\n    type: ClusterIP\n\n    # -- Additional annotations to apply to the Hazelcast Service\n    #\n    annotations: {}\n\n  # Standard K8s field that holds pod-level security attributes and common container settings.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  # Do not populate when deploying to OpenShift, unless anyuid policy is attached to a service account.\n  #\n\n  # -- Whether to apply security context to pod.\n  #\n  securityContextEnabled: true\n\n  securityContext:\n\n    # -- The GID used by the Bitbucket docker image\n    # GID will default to 2003 if not supplied and securityContextEnabled is set to true.\n    # This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Bitbucket container.\n    # However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260\n    #\n    fsGroup: 2003\n\n    # -- fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod.\n    # This field only applies to volume types that support fsGroup controlled ownership and permissions.\n    # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods\n    #\n    fsGroupChangePolicy: \"OnRootMismatch\"\n\n  # -- Standard K8s field that holds security configurations that will be applied to a container.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  #\n  containerSecurityContext: {}\n\n  # -- Boolean to define whether to set local home directory permissions on startup\n  # of Bitbucket container. Set to 'false' to disable this behaviour.\n  #\n  setPermissions: true\n\n  # Port definitions\n  #\n  ports:\n\n    # -- The port on which the Bitbucket container listens for HTTP traffic\n    #\n    http: 7990\n\n    # -- The port on which the Bitbucket SSH service will listen on. Must be within 1024-65535 range\n    #\n    ssh: 7999\n\n    # -- The port on which the Hazelcast listens for client traffic\n    #\n    hazelcast: 5701\n\n  # Bitbucket licensing details\n  #\n  license:\n\n    # -- The name of the K8s Secret that contains the Bitbucket license key. If specified, then\n    # the license will be automatically populated during Bitbucket setup. Otherwise, it will\n    # need to be provided via the browser after initial startup. An Example of creating\n    # a K8s secret for the license below:\n    # 'kubectl create secret generic <secret-name> --from-literal=license-key=<license>\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    # -- The key in the K8s Secret that contains the Bitbucket license key\n    #\n    secretKey: license-key\n\n  # Bitbucket system administrator credential config\n  # https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/?h=sysad#7-configure-license\n  #\n  sysadminCredentials:\n\n    # -- The name of the Kubernetes Secret that contains the Bitbucket sysadmin credentials\n    # If specified, then these will be automatically populated during Bitbucket setup.\n    # Otherwise, they will need to be provided via the browser after initial startup.\n    #\n    secretName:\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin username\n    #\n    usernameSecretKey: username\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin password\n    #\n    passwordSecretKey: password\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin display name\n    #\n    displayNameSecretKey: displayName\n\n    # -- The key in the Kubernetes Secret that contains the sysadmin email address\n    #\n    emailAddressSecretKey: emailAddress\n\n  # -- Set the display name of the Bitbucket instance. Note that this value is only used during installation and\n  # changing the value during an upgrade has no effect.\n  #\n  displayName:\n\n  # Data Center clustering\n  #\n  clustering:\n\n    # -- Set to 'true' if Data Center clustering should be enabled\n    # This will automatically configure cluster peer discovery between cluster nodes.\n    #\n    enabled: false\n\n    # Hazelcast group configuration secrets. If left unchanged, a default group name and a random password will be\n    # generated on installation.\n    #\n    group:\n      # -- The name of the Kubernetes Secret that contains the Hazelcast group credentials.\n      # Example of creating a credentials K8s secret below:\n      # 'kubectl create secret generic <secret-name> --from-literal=name=<name> \\\n      # --from-literal=password=<password>'\n      # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n      #\n      # If no secret is specified, a default group name will be used and a random password will be generated during\n      # installation.\n      #\n      secretName:\n\n      # -- The key in the Kubernetes Secret that contains the Hazelcast group name.\n      #\n      nameSecretKey: name\n\n      # -- The key in the Kubernetes Secret that contains the Hazelcast group password.\n      #\n      passwordSecretKey: password\n\n  readinessProbe:\n    # -- Whether to apply the readinessProbe check to pod.\n    #\n    enabled: true\n\n    # -- The initial delay (in seconds) for the Bitbucket container readiness probe,\n    # after which the probe will start running.\n    #\n    initialDelaySeconds: 10\n\n    # -- How often (in seconds) the Bitbucket container readiness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Bitbucket container readiness probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 60\n\n    # -- Custom readinessProbe to override the default /status httpGet\n    #\n    customProbe: {}\n#      tcpSocket:\n#        port: 8080\n#      periodSeconds: 5\n#      failureThreshold: 120\n\n  # Confirm that Bitbucket is up and running with a StartupProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-startup-probes\n  #\n  startupProbe:\n\n    # -- Whether to apply the startupProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Bitbucket container startup probe will run\n    #\n    periodSeconds: 5\n\n    # -- The number of consecutive failures of the Bitbucket container startup probe\n    # before the pod fails startup checks.\n    #\n    failureThreshold: 120\n\n  # Ensure that the server responds with a LivenessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-tcp-liveness-probe\n  #\n  livenessProbe:\n\n    # -- Whether to apply the livenessProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Bitbucket container liveness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Bitbucket container liveness probe\n    # before the pod fails liveness checks.\n    #\n    failureThreshold: 12\n\n    # -- Custom livenessProbe to override the default tcpSocket probe\n    #\n    customProbe: {}\n\n  # Elasticsearch config. Unsupported from 9.0 onwards. Use OpenSearch instead\n  #\n  elasticSearch:\n\n    # -- The base URL of the external Elasticsearch instance to be used, for example:\n    # http://elasticsearch-master.<namespace>.svc.cluster.local:9200\n    # If this is defined, then Bitbucket will disable its internal Elasticsearch instance.\n    #\n    baseUrl:\n\n    # Elasticsearch's connection details\n    #\n    credentials:\n\n      # -- The name of the Kubernetes Secret that contains the Elasticsearch credentials.\n      # Example of creating a credentials K8s secret below:\n      # 'kubectl create secret generic <secret-name> --from-literal=username=<username> \\\n      # --from-literal=password=<password>'\n      # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n      #\n      secretName:\n\n      # -- The key in the Kubernetes Secret that contains the Elasticsearch username.\n      #\n      usernameSecretKey: username\n\n      # -- The key in the Kubernetes Secret that contains the Elasticsearch password.\n      #\n      passwordSecretKey: password\n\n  shutdown:\n\n    # -- The termination grace period for pods during shutdown. This\n    # should be set to the Bitbucket internal grace period (default 30\n    # seconds), plus a small buffer to allow the JVM to fully terminate.\n    #\n    terminationGracePeriodSeconds: 35\n\n    # -- By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/),\n    # using a script supplied by the Docker image. If any other\n    # shutdown behaviour is needed it can be achieved by overriding\n    # this value. Note that the shutdown command needs to wait for the\n    # application shutdown completely before exiting; see [the default\n    # command](https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/src/master/shutdown-wait.sh)\n    # for details.\n    #\n    command: \"/shutdown-wait.sh\"\n\n  # -- PostStart is executed immediately after a container is created.\n  # However, there is no guarantee that the hook will execute before the container ENTRYPOINT.\n  # See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n  #\n  postStart:\n    command:\n\n  # -- Pod management strategy. Bitbucket Data Center requires the \"OrderedReady\" value but for Bitbucket Mirrors you\n  # can use the \"Parallel\" option.\n  # To learn more, visit https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies\n  #\n  podManagementStrategy: OrderedReady\n\n  # Pod resource requests\n  #\n  resources:\n\n    # JVM Memory / Heap Size definitions. These values below are based on the\n    # defaults defined for the Bitbucket docker container.\n    # https://bitbucket.org/atlassian-docker/docker-atlassian-bitbucket-server/src/master/\n    #\n    jvm:\n\n      # -- The maximum amount of heap memory that will be used by the Bitbucket JVM\n      # The same value will be used by the Elasticsearch JVM.\n      maxHeap: \"1g\"\n\n      # -- The minimum amount of heap memory that will be used by the Bitbucket JVM\n      # The same value will be used by the Elasticsearch JVM.\n      minHeap: \"512m\"\n\n    # Specifies the standard K8s resource requests and/or limits for the Bitbucket\n    # container. It is important that if the memory resources are specified here,\n    # they must allow for the size of the Bitbucket JVM. That means the maximum heap\n    # size, the reserved code cache size, plus other JVM overheads, must be\n    # accommodated. Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    #\n    container:\n\n      requests:\n\n        # -- Initial CPU request by Bitbucket pod\n        #\n        cpu: \"2\"\n\n        # -- Initial Memory request by Bitbucket pod\n        #\n        memory: \"2G\"\n      #  limits:\n      #    cpu: \"2\"\n      #    memory: \"2G\"\n\n\n  # -- Application Mode\n  #\n  # This can be either 'default' or 'mirror'\n  #\n  applicationMode: \"default\"\n\n  # Mirror Configuration\n  #\n  mirror:\n\n    # -- Specifies the URL of the upstream Bitbucket server for this mirror.\n    #\n    upstreamUrl:\n\n  # Mesh configuration\n  mesh:\n\n    # -- Enable Bitbucket Mesh. See: https://confluence.atlassian.com/bitbucketserver/bitbucket-mesh-1128304351.html\n    #\n    enabled: false\n\n    # -- Experimental! Automatically register Bitbucket mesh nodes with the Bitbucket server.\n    # `bitbucket.sysadminCredentials.secretName` needs to be defined to provide credentials\n    # to post-install node registration jobs that are created only for new Helm chart installations.\n    # It is recommended to manually register Mesh nodes in Butbucket UI.\n    #\n    nodeAutoRegistration: false\n\n    # -- Experimental! Automatically create all new repositories on Bitbucket mesh nodes.\n    # `bitbucket.sysadminCredentials.secretName` needs to be defined to provide credentials\n    # to node post-install job. It is recommended to manually configure it in Bitbucket UI.\n    #\n    setByDefault: false\n\n    # -- The Bitbucket Mesh image to use\n    # https://hub.docker.com/r/atlassian/bitbucket-mesh\n    #\n    image:\n\n      # -- The Bitbucket Mesh image repository\n      # https://hub.docker.com/r/atlassian/bitbucket-mesh\n      #\n      repository: atlassian/bitbucket-mesh\n\n      # -- Image pull policy\n      #\n      pullPolicy: IfNotPresent\n\n      # -- The docker image tag to be used\n      #\n      tag: \"4.2.0\"\n\n    # -- Number of Bitbucket Mesh nodes. Do not change it. Currently, only the quorum of 3 mesh nodes is supported.\n    # Reducing the number of replicas will result in mesh degradation while increasing the number of Mesh nodes\n    # will result in new nodes being unused by the Bitbucket server.\n    #\n    replicaCount: 3\n\n    service:\n\n      # -- Bitbucket Mesh port\n      #\n      port: 7777\n\n      # -- The type of K8s service to use for Bitbucket mesh service\n      #\n      type: ClusterIP\n\n      # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n      #\n      loadBalancerIP:\n\n      # -- Bitbucket mesh service annotations\n      #\n      annotations: {}\n\n\n    # -- Custom annotations that will be applied to all Bitbucket Mesh pods\n    #\n    podAnnotations: {}\n    #  name: <value>\n\n    # -- Custom labels that will be applied to all Bitbucket Mesh pods\n    #\n    podLabels: {}\n    #  name: <value>\n\n    # -- Bitbucket Mesh resources requests and limits\n    #\n    resources:\n\n      # -- Bitbucket Mesh JVM heap settings\n      #\n      jvm:\n        maxHeap: \"1g\"\n        minHeap: \"512m\"\n\n      # -- Bitbucket Mesh container cpu/mem requests and limits\n      #\n      container:\n        requests:\n          cpu: \"1\"\n          memory: \"2G\"\n        limits:\n          cpu: \"2\"\n          memory: \"2G\"\n\n    # -- Mesh home volume settings. Disabling persistence results in data loss!\n    #\n    volume:\n      create: true\n      resources:\n        requests:\n          storage: 1Gi\n      storageClass:\n      mountPath: \"/var/atlassian/application-data/mesh\"\n      persistentVolumeClaimRetentionPolicy:\n        whenDeleted:\n        whenScaled:\n\n    # -- Defines any additional environment variables to be passed to the Bitbucket mesh containers.\n    #\n    additionalEnvironmentVariables: {}\n\n    # -- Specifies a list of additional arguments that can be passed to the Bitbucket Mesh JVM, e.g.\n    # system properties.\n    #\n    additionalJvmArgs: []\n\n    # -- Additional initContainer definitions that will be added to all Bitbucket pods\n    #\n    additionalInitContainers: {}\n    #  - name: <name>\n    #    image: <image>:<tag>\n\n    # -- Additional existing ConfigMaps and Secrets not managed by Helm that should be\n    # mounted into service container\n    #\n    additionalFiles:\n    # Example:\n    # - name: keystore\n    #   type: secret\n    #   key: keystore.jks\n    #   mountPath: /var/ssl\n\n    # -- Defines additional annotations to the Bitbucket Mesh StateFulSet. This might be required when deploying using a GitOps approach\n    additionalAnnotations: {}\n    #  argocd.argoproj.io/sync-wave: \"10\"\n\n    # -- Standard K8s node-selectors that will be applied to all Bitbucket Mesh pods\n    #\n    nodeSelector: {}\n    #  name: <value>\n\n    # -- Standard Kubernetes affinities that will be applied to all Bitbucket mesh pods\n    #\n    affinity: {}\n\n    # -- Standard K8s tolerations that will be applied to all Bitbucket Mesh pods\n    #\n    tolerations: {}\n    # - effect: <name>\n    #   operator: <operator>\n    #   key: <key>\n\n    # -- Defines topology spread constraints for Bitbucket Mesh pods. See details:\n    # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n    #\n    topologySpreadConstraints: {}\n    # - maxSkew: 1\n    #   topologyKey: kubernetes.io/hostname\n    #   whenUnsatisfiable: ScheduleAnyway\n    #   labelSelector:\n    #     matchLabels:\n\n    # -- Standard K8s schedulerName that will be applied to all Bitbucket pods.\n    # Check Kubernetes documentation on how to configure multiple schedulers:\n    # https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n    #\n    schedulerName:\n\n    # -- Pod PriorityClassName\n    # https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n    #\n    priorityClassName:\n\n    # -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n    #\n    hostNamespaces: {}\n\n    # See: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies\n    #\n    podManagementPolicy: OrderedReady\n\n    shutdown:\n\n      # -- The termination grace period for pods during shutdown. This\n      # should be set to the Bitbucket internal grace period (default 30\n      # seconds), plus a small buffer to allow the JVM to fully terminate.\n      #\n      terminationGracePeriodSeconds: 35\n\n    # -- Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates\n    #\n    additionalCertificates:\n      # -- Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data\n      # will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.\n      #\n      secretName:\n      # -- A list of secrets with their respective keys holding certificates to be added to the Java truststore.\n      # It is mandatory to specify which keys from secret data need to be mounted as files to the init container.\n      #\n      secretList: []\n      #- name: self-signed-ca\n      #  keys:\n      #    - ca.crt\n      #    - intermediate.crt\n      #- name: stg-intermediate\n      #  keys:\n      #    - stg.crt\n\n      # -- Custom command to be executed in the init container to import certificates\n      #\n      customCmd:\n\n      initContainer:\n        # -- Resources allocated to the import-certs init container\n        #\n\n        resources: {}\n        # -- Custom SecurityContext for the import-certs init container\n        #\n        securityContext: {}\n  # -- Specifies a list of additional arguments that can be passed to the Bitbucket JVM, e.g.\n  # system properties.\n  #\n  additionalJvmArgs: []\n\n  # -- Specifies a list of additional Java libraries that should be added to the\n  # Bitbucket container. Each item in the list should specify the name of the volume\n  # that contains the library, as well as the name of the library file within that\n  # volume's root directory. Optionally, a subDirectory field can be included to\n  # specify which directory in the volume contains the library file. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  additionalLibraries: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n  # -- Specifies a list of additional Bitbucket plugins that should be added to the\n  # Bitbucket container. Note plugins installed via this method will appear as\n  # bundled plugins rather than user plugins. These should be specified in the same\n  # manner as the 'additionalLibraries' property. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  # NOTE: only .jar files can be loaded using this approach. OBR's can be extracted\n  # (unzipped) to access the associated .jar\n  #\n  # An alternative to this method is to install the plugins via \"Manage Apps\" in the\n  # product system administration UI.\n  #\n  additionalBundledPlugins: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n  # -- Defines any additional volumes mounts for the Bitbucket container. These\n  # can refer to existing volumes, or new volumes can be defined via\n  # 'volumes.additional'.\n  #\n  additionalVolumeMounts: []\n\n  # -- Defines any additional environment variables to be passed to the Bitbucket\n  # container. See https://hub.docker.com/r/atlassian/bitbucket for\n  # supported variables.\n  #\n  additionalEnvironmentVariables: []\n\n  # -- Defines any additional ports for the Bitbucket container.\n  #\n  additionalPorts: []\n  #  - name: jmx\n  #    containerPort: 5555\n  #    protocol: TCP\n\n  # -- Defines additional volumeClaimTemplates that should be applied to the Bitbucket pod.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in bitbucket.additionalVolumeMounts\n  #\n  additionalVolumeClaimTemplates: []\n  #  - name: myadditionalvolumeclaim\n  #    storageClassName:\n  #    resources:\n  #      requests:\n  #        storage: 1Gi\n\n  # -- Defines additional annotations to the Bitbucket StateFulSet. This might be required when deploying using a GitOps approach\n  additionalAnnotations: {}\n  #  argocd.argoproj.io/sync-wave: \"10\"\n\n  # -- Defines topology spread constraints for Bitbucket pods. See details:\n  # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n  #\n  topologySpreadConstraints: []\n  # - maxSkew: 1\n  #   topologyKey: kubernetes.io/hostname\n  #   whenUnsatisfiable: ScheduleAnyway\n  #   labelSelector:\n  #     matchLabels:\n\n  # -- Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates\n  #\n  additionalCertificates:\n    # -- Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data\n    # will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.\n    #\n    secretName:\n    # -- A list of secrets with their respective keys holding certificates to be added to the Java truststore.\n    # It is mandatory to specify which keys from secret data need to be mounted as files to the init container.\n    #\n    secretList: []\n    #- name: self-signed-ca\n    #  keys:\n    #    - ca.crt\n    #    - intermediate.crt\n    #- name: stg-intermediate\n    #  keys:\n    #    - stg.crt\n\n    # -- Custom command to be executed in the init container to import certificates\n    #\n    customCmd:\n\n    initContainer:\n      # -- Resources allocated to the import-certs init container\n      #\n\n      resources: {}\n      # -- Custom SecurityContext for the import-certs init container\n      #\n      securityContext: {}\n\n# Monitoring\n#\nmonitoring:\n\n  # -- Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter\n  #\n  exposeJmxMetrics: false\n\n  # --  JMX exporter init container configuration\n  #\n  jmxExporterInitContainer:\n\n    # -- The location of the JMX exporter jarfile in the JMX exporter image\n    # Leave blank for default bitnami image\n    #\n    jmxJarLocation:\n\n    # -- Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume.\n    # Set to false if running containers as root is not allowed in the cluster.\n    #\n    runAsRoot: true\n\n    # -- Custom SecurityContext for the jmx exporter init container\n    #\n    customSecurityContext: {}\n\n    # -- Resources requests and limits for the JMX exporter init container\n    # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n    #\n    resources: {}\n    #  requests:\n    #    cpu: \"1m\"\n    #    memory: \"20Mi\"\n    #  limits:\n    #    cpu: \"1\"\n    #    memory: \"1G\"\n\n  # -- Annotations added to the jmx service\n  #\n  jmxServiceAnnotations: {}\n\n  # -- Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar\n  # to shared home and provide an absolute path in jmxExporterCustomJarLocation\n  #\n  fetchJmxExporterJar: true\n\n  # -- Image repository with jmx_exporter jar\n  #\n  jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n  jmxExporterImageTag: 0.18.0\n\n  # -- Port number on which metrics will be available\n  #\n  jmxExporterPort: 9999\n\n  # -- JMX exporter port type\n  #\n  jmxExporterPortType: ClusterIP\n\n  # -- Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home\n  #\n  jmxExporterCustomJarLocation:\n\n  # -- Custom JMX config with the rules\n  #\n  jmxExporterCustomConfig: {}\n  #  rules:\n  #   - pattern: \".*\"\n\n  serviceMonitor:\n\n    # -- Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.\n    #\n    create: false\n\n    # -- ServiceMonitorSelector of the prometheus instance.\n    #\n    prometheusLabelSelector: {}\n      # release: prometheus\n\n    # -- Scrape interval for the JMX service.\n    #\n    scrapeIntervalSeconds: 30\n\n    # -- How long until a scrape request times out. It cannot be greater than the scrape interval.\n    #\n    scrapeTimeoutSeconds: 20\n\n  grafana:\n\n    # -- Create ConfigMaps with Grafana dashboards\n    #\n    createDashboards: false\n\n    # -- Label selector for Grafana dashboard importer sidecar\n    #\n    dashboardLabels: {}\n      # grafana_dashboard: dc_monitoring\n\n    # -- Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage\n    #\n    dashboardAnnotations: {}\n      # k8s-sidecar-target-directory: /tmp/dashboards/example-folder\n\n# Fluentd configuration\n#\n# Bitbucket log collection and aggregation can be enabled using Flunetd. This config\n# assumes an existing ELK stack has been stood up and is available.\n# https://www.fluentd.org/\n#\nfluentd:\n\n  # -- Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod\n  #\n  enabled: false\n\n  # -- The Fluentd sidecar image repository\n  #\n  imageRepo: fluent/fluentd-kubernetes-daemonset\n\n  # -- The Fluentd sidecar image tag\n  #\n  imageTag: v1.11.5-debian-elasticsearch7-1.2\n\n  # -- Resources requests and limits for fluentd sidecar container\n  # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n  #\n  resources: {}\n  #  requests:\n  #    cpu: \"1m\"\n  #    memory: \"20Mi\"\n  #  limits:\n  #    cpu: \"1\"\n  #    memory: \"1G\"\n\n  # -- The command used to start Fluentd. If not supplied the default command\n  # will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"\n  #\n  # Note: The custom command can be free-form, however pay particular attention to\n  # the process that should ultimately be left running in the container. This process\n  # should be invoked with 'exec' so that signals are appropriately propagated to it,\n  # for instance SIGTERM. An example of how such a command may look is:\n  # \"<command 1> && <command 2> && exec <primary command>\"\n  command:\n\n  # -- Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default)\n  # should be used for Fluentd. If enabled this config must be supplied via the\n  # 'fluentdCustomConfig' property below.\n  #\n  customConfigFile: false\n\n  # -- Custom fluent.conf file\n  #\n  fluentdCustomConfig: {}\n  # fluent.conf: |\n  #   <source>\n  #     @type tail\n  #     <parse>\n  #     @type multiline\n  #     format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n  #     </parse>\n  #     path /application-data/logs/atlassian-bitbucket-access.log*\n  #     pos_file /tmp/bitbucketlog.pos\n  #     tag bitbucket-access-logs\n  #   </source>\n\n  # Elasticsearch config based on your ELK stack\n  #\n  elasticsearch:\n\n    # -- Set to 'true' if Fluentd should send all log events to an Elasticsearch service.\n    #\n    enabled: true\n\n    # -- The hostname of the Elasticsearch service that Fluentd should send logs to.\n    #\n    hostname: elasticsearch\n\n  # -- Specify custom volumes to be added to Fluentd container (e.g. more log sources)\n  #\n  extraVolumes: []\n  # - name: local-home\n  #   mountPath: application-data/logs\n  #   subPath: log\n  #   readOnly: true\n\n# -- Custom annotations that will be applied to all Bitbucket pods\n#\npodAnnotations: {}\n#  name: <value>\n\n# -- Custom labels that will be applied to all Bitbucket pods\n#\npodLabels: {}\n#  name: <value>\n\n# -- Standard K8s node-selectors that will be applied to all Bitbucket pods\n#\nnodeSelector: {}\n#  name: <value>\n\n# -- Standard K8s tolerations that will be applied to all Bitbucket pods\n#\ntolerations: []\n# - effect: <name>\n#   operator: <operator>\n#   key: <key>\n\n# -- Standard Kubernetes affinities that will be applied to all Bitbucket pods\n# Due to the performance requirements it is highly recommended running all Bitbucket pods\n# in the same availability zone as your dedicated NFS server. To achieve this, you\n# can define `affinity` and `podAffinity` rules that will place all pods into the same zone,\n# and therefore minimise the real distance between the application pods and the shared storage.\n# More specific documentation can be found in the official Affinity and Anti-affinity documentation:\n#  https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity\n#\n# This is an example on how to ensure the pods are in the same zone as NFS server that is labeled with `role=nfs-server`:\n#\n#   podAffinity:\n#    requiredDuringSchedulingIgnoredDuringExecution:\n#      - labelSelector:\n#          matchExpressions:\n#            - key: role\n#              operator: In\n#              values:\n#                - nfs-server # needs to be the same value as NFS server deployment\n#        topologyKey: topology.kubernetes.io/zone\naffinity: {}\n\n# -- Standard K8s schedulerName that will be applied to all Bitbucket pods.\n# Check Kubernetes documentation on how to configure multiple schedulers:\n# https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n#\nschedulerName:\n\n# -- Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster.\n# For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n#\npriorityClassName:\n\n# -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n#\nhostNamespaces: {}\n\n# -- Additional container definitions that will be added to all Bitbucket pods\n#\nadditionalContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional initContainer definitions that will be added to all Bitbucket pods\n#\nadditionalInitContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional labels that should be applied to all resources\n#\nadditionalLabels: {}\n#  name: <value>\n\n# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be\n# mounted into service container. Configuration details below (camelCase is important!):\n  # 'name'      - References existing ConfigMap or secret name.\n  # 'type'      - 'configMap' or 'secret'\n  # 'key'       - The file name.\n  # 'mountPath' - The destination directory in a container.\n# VolumeMount and Volumes are added with this name and index position, for example;\n# custom-config-0, keystore-2\n#\nadditionalFiles: []\n# Examples:\n#  - name: custom-config\n#    type: configMap\n#    key: log4j.properties\n#    mountPath:  /var/atlassian\n#  - name: custom-config\n#    type: configMap\n#    key: web.xml\n#    mountPath: /var/atlassian\n#  - name: keystore\n#    type: secret\n#    key: keystore.jks\n#    mountPath: /var/ssl\n\n# -- Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file.\n# https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\nadditionalHosts: []\n#  - ip: \"127.0.0.1\"\n#    hostnames:\n#    - \"foo.local\"\n#    - \"bar.local\"\n\n# -- PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/\n# You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.\n#\npodDisruptionBudget:\n  enabled: false\n  labels: {}\n  annotations: {}\n  minAvailable:\n  maxUnavailable:\n\n# -- Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix\n# for a ConfigMap name, fileName is used as subPath\n#\nadditionalConfigMaps: []\n#  - name: extra-configmap\n#    keys:\n#      - fileName: hello.properties\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        defaultMode:\n#        content: |\n#          foo=bar\n#          hello=world\n#      - fileName: hello.xml\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        content: |\n#          <xml>\n#          </xml>\n\natlassianAnalyticsAndSupport:\n\n  analytics:\n\n    # -- Mount ConfigMap with selected Helm chart values as a JSON\n    # which DC products will read and send analytics events to Atlassian data pipelines\n    #\n    enabled: true\n\n  helmValues:\n\n    # -- Mount ConfigMap with selected Helm chart values as a YAML file\n    # which can be optionally including to support.zip\n    #\n    enabled: true\n\n# -- Metadata and pod spec for pods started in Helm tests\n#\ntestPods:\n  resources: {}\n  labels: {}\n  annotations: {}\n  nodeSelector: {}\n  tolerations: []\n  affinity: {}\n  schedulerName:\n  image:\n    permissionsTestContainer: debian:stable-slim\n    statusTestContainer: alpine:latest\n\nopenshift:\n\n  # -- When set to true, the containers will run with a restricted Security Context Constraint (SCC).\n  # See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html\n  # This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server\n  # configuration files as ConfigMaps.\n  #\n  runWithRestrictedSCC: false\n\n# -- OpenSearch config. See: https://github.com/opensearch-project/helm-charts/tree/main/charts/opensearch for all available Helm values.\n# Example OpenSearch configurations can be found at https://confluence.atlassian.com/bitbucketserver/install-and-configure-a-remote-opensearch-server-1115664379.html\n#\nopensearch:\n\n  # -- Deploy OpenSearch Helm chart and automatically\n  # configure Bitbucket to use it as a search platform.\n  # When set to true, Bitbucket will disable its internal OpenSearch instance\n  #\n  install: false\n\n  # -- The base URL of the external OpenSearch instance to be used, for example:\n  # http://opensearch-master.<namespace>.svc.cluster.local:9200\n  # If this is defined and opensearch.install is set to false,\n  # then Bitbucket will disable its internal OpenSearch instance.\n  #\n  baseUrl:\n\n  # OpenSearch connection details\n  #\n  credentials:\n\n    # -- The name of the Kubernetes Secret that contains the OpenSearch credentials.\n    # Example of creating a credentials K8s secret below:\n    # 'kubectl create secret generic <secret-name> --from-literal=username=<username> \\\n    # --from-literal=password=<password>'\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    # When undefined and opensearch.install is set to true, a random password\n    # for admin user will be generated and saved to 'opensearch-initial-password' secret.\n    secretName: # opensearch-internal-users\n\n    # -- The key in the Kubernetes Secret that contains the OpenSearch username.\n    #\n    usernameSecretKey: username\n\n    # -- The key in the Kubernetes Secret that contains the OpenSearch password.\n    #\n    passwordSecretKey: password\n\n  singleNode: true\n  resources:\n    requests:\n      cpu: 1\n      memory: 1Gi\n  persistence:\n    size: 10Gi\n  extraEnvs:\n    - name: plugins.security.ssl.http.enabled\n      value: \"false\"\n  envFrom:\n    - secretRef:\n         name: opensearch-initial-password\n  securityConfig:\n    # -- Secret with pre-defined internal_users.yml. When undefined, Bitbucket will use initial admin user credentials\n    # to create indexes in OpenSearch. See: https://atlassian.github.io/data-center-helm-charts/examples/bitbucket/BITBUCKET_OPENSEARCH/\n    internalUsersSecret: # opensearch-internal-users\n"
  },
  {
    "path": "src/main/charts/common/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "src/main/charts/common/Changelog.md",
    "content": "# Change Log\n\n## 1.0.0\n\n**Release date:** 2021-12-17\n\n![AppVersion: 1.0.0](https://img.shields.io/static/v1?label=AppVersion&message=1.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\nInitial release"
  },
  {
    "path": "src/main/charts/common/Chart.yaml",
    "content": "apiVersion: v2\nname: common\ndescription: A Library Helm Chart for grouping common logic between Atlassian charts. This chart is not deployable by itself.\ntype: library\nversion: 1.2.7\n# Please make sure that version and appVersion are always the same.\nappVersion: 1.2.7\nkeywords:\n  - common\n  - helper\n  - template\n  - function\n  - Atlassian\nhome: https://atlassian.github.io/data-center-helm-charts/\nicon: https://atlassian.github.io/data-center-helm-charts/icons/atlassian.svg\nsources:\n  - https://github.com/atlassian/data-center-helm-charts\n"
  },
  {
    "path": "src/main/charts/common/README.md",
    "content": "# Atlassian Common Library Chart\n\nA [Helm Library Chart](https://helm.sh/docs/topics/library_charts/#helm) for grouping common logic between Atlassian charts.\n\n## TL;DR\n\n### Chart.yaml\n\n```yaml\ndependencies:\n  - name: common\n    version: 1.x.x # picks up any non-breaking version within 1.x.y line\n    repository: https://atlassian.github.io/data-center-helm-charts\n```\n\n### Local development\n\n```bash\nhelm dependency update\n```\n\n### Product usage\n\n```yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\ndata:\n  myvalue: \"Hello World\"\n```\n\n## Introduction\n\nThis chart provides a common template helpers which can be used to develop new charts using [Helm](https://helm.sh) package manager.\n\nAtlassian charts are used for installing Atlassian's [Jira Data Center](https://www.atlassian.com/enterprise/data-center/jira), [Confluence Data Center](https://www.atlassian.com/enterprise/data-center/confluence), and [Bitbucket Data Center](https://www.atlassian.com/enterprise/data-center/bitbucket) on Kubernetes.\n\n## Prerequisites\n\n- Kubernetes `>=1.19.x-0`\n- Helm 3.3+\n\n## Parameters\n\nThe following table lists the helpers available in the library which are scoped in different sections.\n\n### Labels\n\n| Helper identifier           | Description                                          | Expected Input    |\n|-----------------------------|------------------------------------------------------|-------------------|\n| `common.labels.commonLabels`    | Return Kubernetes standard labels                    | `.` Chart context |\n| `common.labels.selectorLabels` | Return the selector labels | `.` Chart context |\n\n### Names\n\n| Helper identifier       | Description                                                | Expected Input   |\n|-------------------------|------------------------------------------------------------|-------------------|\n| `common.names.chart`    | Chart name plus version                                    | `.` Chart context |\n| `common.names.name`     | Expand the name of the chart or use `.Values.nameOverride` | `.` Chart context |\n| `common.names.fullname` | Create a default fully qualified app name                 | `.` Chart context |\n"
  },
  {
    "path": "src/main/charts/common/templates/_jmx.tpl",
    "content": "{{/*\nJmx config volume\n*/}}\n{{- define \"common.jmx.config.volume\" -}}\n{{- if .Values.monitoring.exposeJmxMetrics }}\n- name: jmx-config\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-jmx-config\n{{- end }}\n{{- end }}\n\n{{/*\nJmx config volume mount\n*/}}\n\n{{- define \"common.jmx.config.volumeMounts\" -}}\n{{- if .Values.monitoring.exposeJmxMetrics }}\n- name: jmx-config\n  mountPath: /opt/atlassian/jmx\n{{- end }}\n{{- end }}\n\n\n{{/*\nJmx init container\n*/}}\n{{- define \"common.jmx.initContainer\" -}}\n{{- if and .Values.monitoring.exposeJmxMetrics .Values.monitoring.fetchJmxExporterJar }}\n- name: fetch-jmx-exporter\n  image: {{ .Values.monitoring.jmxExporterImageRepo}}:{{ .Values.monitoring.jmxExporterImageTag}}\n  command: [\"cp\"]\n  args: [\"{{ .Values.monitoring.jmxExporterInitContainer.jmxJarLocation | default \"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\" }}\", \"{{ .Values.volumes.sharedHome.mountPath }}\"]\n  {{- if .Values.monitoring.jmxExporterInitContainer.resources }}\n  resources:\n  {{- with .Values.monitoring.jmxExporterInitContainer.resources }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{- if .Values.openshift.runWithRestrictedSCC }}\n  {{- else}}\n  {{- if .Values.monitoring.jmxExporterInitContainer.runAsRoot }}\n  securityContext:\n    runAsUser: 0\n  {{- else if .Values.monitoring.jmxExporterInitContainer.customSecurityContext }}\n  securityContext:\n  {{- with .Values.monitoring.jmxExporterInitContainer.customSecurityContext }}\n  {{- toYaml .  | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{- end }}\n  volumeMounts:\n    - mountPath: {{ .Values.volumes.sharedHome.mountPath | quote }}\n      name: shared-home\n      {{- if .Values.volumes.sharedHome.subPath }}\n      subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n      {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nJmx port\n*/}}\n{{- define \"common.jmx.port\" -}}\n{{- if .Values.monitoring.exposeJmxMetrics }}\n- name: jmx\n  containerPort: {{ .Values.monitoring.jmxExporterPort }}\n  protocol: TCP\n{{- end }}\n{{- end }}\n\n{{/*\nJmx javaagent\n*/}}\n{{- define \"common.jmx.javaagent\" -}}\n{{- if .Values.monitoring.exposeJmxMetrics }}\n-javaagent:{{ .Values.monitoring.jmxExporterCustomJarLocation | default (printf \"%s/jmx_prometheus_javaagent.jar\"  .Values.volumes.sharedHome.mountPath) }}={{ .Values.monitoring.jmxExporterPort}}:/opt/atlassian/jmx/jmx-config.yaml\n{{- end }}\n{{- end }}\n\n{{/*\nJmx configuration yaml\n*/}}\n{{- define \"common.jmx.config\" -}}\n{{ if .Values.monitoring.jmxExporterCustomConfig }}\n{{- range $key, $value := .Values.monitoring.jmxExporterCustomConfig }}\n{{ $key }}: |\n{{ $value | indent 2 }}\n{{- end }}\n{{ else }}\njmx-config.yaml: |\n  lowercaseOutputLabelNames: true\n  lowercaseOutputName: true\n  rules:\n    - pattern: \".*\"\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/common/templates/_labels.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nCommon labels\n*/}}\n{{- define \"common.labels.commonLabels\" -}}\nhelm.sh/chart: {{ include \"common.names.chart\" . }}\n{{ include \"common.labels.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{ with .Values.additionalLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nSelector labels\n*/}}\n{{- define \"common.labels.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"common.names.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/common/templates/_names.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"common.names.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"common.names.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\nIf release name contains chart name it will be used as a full name.\n*/}}\n{{- define \"common.names.fullname\" -}}\n{{- if .Values.fullnameOverride }}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- $name := default .Chart.Name .Values.nameOverride }}\n{{- if contains $name .Release.Name }}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n# Ignore non-template files from symlinked common_templates\ntemplates/common_templates/*.md\n"
  },
  {
    "path": "src/main/charts/confluence/Changelog.md",
    "content": "# Change Log\n\n## 2.0.13\n\n**Release date:** 2026-5-6\n\n![AppVersion: 10.2.10](https://img.shields.io/static/v1?label=AppVersion&message=10.2.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1113)\n\n## 2.0.12\n\n**Release date:** 2026-4-9\n\n![AppVersion: 10.2.8](https://img.shields.io/static/v1?label=AppVersion&message=10.2.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.11\n\n**Release date:** 2026-4-7\n\n![AppVersion: 10.2.8](https://img.shields.io/static/v1?label=AppVersion&message=10.2.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1107)\n\n## 2.0.10\n\n**Release date:** 2026-4-3\n\n![AppVersion: 10.2.7](https://img.shields.io/static/v1?label=AppVersion&message=10.2.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DEVPROD-3580: Add gateway api support (#1084)\n* DCDORA-2747 Use OpenSearch 3.5.0 for Confluence (#1092)\n\n## 2.0.9\n\n**Release date:** 2026-2-1\n\n![AppVersion: 10.2.2](https://img.shields.io/static/v1?label=AppVersion&message=10.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.8\n\n**Release date:** 2025-12-29\n\n![AppVersion: 10.2.2](https://img.shields.io/static/v1?label=AppVersion&message=10.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1071)\n* feat: Added scrape timeout configuration on servicemonitor (#1067)\n\n## 2.0.7\n\n**Release date:** 2025-11-7\n\n![AppVersion: 9.2.10](https://img.shields.io/static/v1?label=AppVersion&message=9.2.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1058)\n* Synchrony: support additional env vars (#1057)\n* fix: move ErrorReportValve to the correct line (#1055)\n\n## 2.0.6\n\n**Release date:** 2025-11-3\n\n![AppVersion: 9.2.9](https://img.shields.io/static/v1?label=AppVersion&message=9.2.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Add missing ErrorReportValve to default server.xml #1047 (#1047)\n* fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\n\n## 2.0.5\n\n**Release date:** 2025-11-1\n\n![AppVersion: 9.2.9](https://img.shields.io/static/v1?label=AppVersion&message=9.2.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1049)\n\n## 2.0.4\n\n**Release date:** 2025-8-27\n\n![AppVersion: 9.2.7](https://img.shields.io/static/v1?label=AppVersion&message=9.2.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Update Bitnami image references due to deprecation notice (#1037)\n* Update appVersions for DC apps (#1029)\n\n## 2.0.3\n\n**Release date:** 2025-8-1\n\n![AppVersion: 9.2.6](https://img.shields.io/static/v1?label=AppVersion&message=9.2.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix Confluence UID (#1024)\n* Update appVersions for DC apps (#1021)\n\n## 2.0.2\n\n**Release date:** 2025-6-16\n\n![AppVersion: 9.2.5](https://img.shields.io/static/v1?label=AppVersion&message=9.2.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1014)\n* Make linter happy (#1011)\n* Quote int in session vars (#1009)\n\n## 2.0.1\n\n**Release date:** 2025-5-15\n\n![AppVersion: 9.2.4](https://img.shields.io/static/v1?label=AppVersion&message=9.2.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1004)\n\n## 2.0.0\n\nThis release includes breaking changes. See [Breaking Changes](https://github.com/atlassian/data-center-helm-charts/blob/main/BREAKING_CHANGES.md)\n\n**Release date:** 2025-4-29\n\n![AppVersion: 9.2.3](https://img.shields.io/static/v1?label=AppVersion&message=9.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Pass OpenSearch details as env vars (#999)\n* Remove condition to support legacy securityContext format (#1000)\n\n## 1.22.9\n\n**Release date:** 2025-4-22\n\n![AppVersion: 9.2.3](https://img.shields.io/static/v1?label=AppVersion&message=9.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make session and autologin configurable for Jira and Confluence (#992)\n* Make it possible to declare additional ingress paths (#991)\n* Bring changelog in order (#990)\n\n## 1.22.8\n\n**Release date:** 2025-4-17\n\n![AppVersion: 9.2.3](https://img.shields.io/static/v1?label=AppVersion&message=9.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\n* Update appVersions for DC apps (#981)\n\n## 1.22.7\n\n**Release date:** 2025-4-1\n\n![AppVersion: 9.2.2](https://img.shields.io/static/v1?label=AppVersion&message=9.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.22.6\n\n**Release date:** 2025-3-19\n\n![AppVersion: 9.2.2](https://img.shields.io/static/v1?label=AppVersion&message=9.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#969)\n* Added synchrony.service.url option (#965)\n\n## 1.22.5\n\n**Release date:** 2025-2-18\n\n![AppVersion: 9.2.1](https://img.shields.io/static/v1?label=AppVersion&message=9.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make access log pattern configurable for Jira and Confluence when running as non root (#961)\n* Add tunnel config for Jira, hostNamespaces in all charts (#958)\n* Make it possible to enable tunneliing (#954)\n* Allow setting subPath for local-home volumes (#947)\n\n## 1.22.4\n\n**Release date:** 2025-1-30\n\n![AppVersion: 9.2.0](https://img.shields.io/static/v1?label=AppVersion&message=9.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Round up fractional cpu values for ActiveProcessorsCount (#944)\n\n## 1.22.3\n\n**Release date:** 2025-1-13\n\n![AppVersion: 9.2.0](https://img.shields.io/static/v1?label=AppVersion&message=9.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set custom securityContext for import-certs init container. Make affinity independent for Synchrony (#938)\n\n## 1.22.2\n\n**Release date:** 2024-12-16\n\n![AppVersion: 9.2.0](https://img.shields.io/static/v1?label=AppVersion&message=9.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#933)\n* Make it possible to set nodePort in services (#931)\n* Make access log attributes configurable (#932)\n\n## 1.22.1\n\n**Release date:** 2024-12-3\n\n![AppVersion: 8.5.18](https://img.shields.io/static/v1?label=AppVersion&message=8.5.18&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Bitbucket and Confluence LTS versions (#924)\n* Make make stuckthreaddetectionvalve configurable (#921)\n* Update Grafana dashboards for DC apps (#915)\n\n## 1.22.0\n\n**Release date:** 2024-11-15\n\n![AppVersion: 8.5.17](https://img.shields.io/static/v1?label=AppVersion&message=8.5.17&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#905)\n* Updated pod labels for all products (#901)\n* Fix shutdown with jmx javaagent enabled (#899)\n* Unset IDs for all the Grafana dashboards (#889)\n\n## 1.21.4\n\n**Release date:** 2024-10-1\n\n![AppVersion: 8.5.15](https://img.shields.io/static/v1?label=AppVersion&message=8.5.15&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Create a dedicated Synchrony ingress (#883)\n\n## 1.21.3\n\n**Release date:** 2024-9-10\n\n![AppVersion: 8.5.15](https://img.shields.io/static/v1?label=AppVersion&message=8.5.15&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update common dependency version (#878)\n\n## 1.21.2\n\n**Release date:** 2024-8-26\n\n![AppVersion: 8.5.14](https://img.shields.io/static/v1?label=AppVersion&message=8.5.14&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#869)\n\n## 1.21.1\n\n**Release date:** 2024-8-22\n\n![AppVersion: 8.5.14](https://img.shields.io/static/v1?label=AppVersion&message=8.5.14&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Sanitize jdbc url for Confluence and Synchrony (#866)\n\n## 1.21.0\n\n**Release date:** 2024-8-13\n\n![AppVersion: 8.5.14](https://img.shields.io/static/v1?label=AppVersion&message=8.5.14&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Added annotations to the StatefulSets (#857)\n* Update appVersions for DC apps (#858)\n* Make shared home pvc access mode configurable (#855)\n* Allow referencing multiple secrets in additionalCertificates (#852)\n* Make it possible to define resources for import-certs init container (#851)\n* Move update strategy to root level (#849)\n* Add helm value for custom jmx jar location when using other jmx init container images (#846)\n* feat: add appProtocol for service meshes (#847)\n* Make StatefulSet updateStrategy configurable (#845)\n* Fix default for acceptCount (#832)\n\n## 1.20.1\n\n**Release date:** 2024-7-7\n\n![AppVersion: 8.5.12](https://img.shields.io/static/v1?label=AppVersion&message=8.5.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#825)\n* Make it possible to override proxy settings (#822)\n\n## 1.20.0\n\n**Release date:** 2024-5-13\n\n![AppVersion: 8.5.9](https://img.shields.io/static/v1?label=AppVersion&message=8.5.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#803)\n* Set atlassian.logging.cloud.enabled system property to false if a custom FluentD config is used (#796)\n\n## 1.19.0\n\n**Release date:** 2024-4-22\n\n![AppVersion: 8.5.8](https://img.shields.io/static/v1?label=AppVersion&message=8.5.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make cacerts writable for user and group (#790)\n* Optionally deploy OpenSearch Helm Chart With Confluence (#788)\n\n## 1.18.1\n\n**Release date:** 2024-3-26\n\n![AppVersion: 8.5.7](https://img.shields.io/static/v1?label=AppVersion&message=8.5.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Include shared home for synchrony when additional libs are defined (#779)\n* Get rid of server repo references (#777)\n\n## 1.18.0\n\n**Release date:** 2024-2-27\n\n![AppVersion: 8.5.6](https://img.shields.io/static/v1?label=AppVersion&message=8.5.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Openshift analytics (#763)\n* Update appVersions for DC apps (#765)\n* Removed unused Confluence shared home volume from Synchrony volume. (#764)\n* OpenShift Support (#752)\n* Use testPods values for test images and container resources (#761)\n* Relabel instance name on jmx service monitor (#757)\n* Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\n\n## 1.17.2\n\n**Release date:** 2023-12-18\n\n![AppVersion: 8.5.4](https://img.shields.io/static/v1?label=AppVersion&message=8.5.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* StatefulSet PVC auto deletion (#736)\n* Add optional postStart hook (#735)\n\n## 1.17.1\n\n**Release date:** 2023-12-11\n\n![AppVersion: 8.5.4](https://img.shields.io/static/v1?label=AppVersion&message=8.5.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make liveness probe configurable (#732)\n\n## 1.17.0\n\n**Release date:** 2023-12-7\n\n![AppVersion: 8.5.4](https://img.shields.io/static/v1?label=AppVersion&message=8.5.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make test pod metadata and spec configurable (#727)\n* Update default Confluence version (#729)\n* Optional analytics/support ConfigMap (#721)\n* Fix ingress annotations comment (#720)\n* Apply securityContext only if it is explicitly enabled (#717)\n\n## 1.16.6\n\n**Release date:** 2023-10-30\n\n![AppVersion: 8.5.2](https://img.shields.io/static/v1?label=AppVersion&message=8.5.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* JMX container resources (#707)\n\n## 1.16.5\n\n**Release date:** 2023-10-24\n\n![AppVersion: 8.5.2](https://img.shields.io/static/v1?label=AppVersion&message=8.5.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix custom jmx config (#699)\n* Copy cacerts first, then import certs (#696)\n* Fix config-jvm template to avoid wrong new line (#694)\n\n## 1.16.4\n\n**Release date:** 2023-10-11\n\n![AppVersion: 8.5.2](https://img.shields.io/static/v1?label=AppVersion&message=8.5.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix hazelcast svc type (#689)\n\n## 1.16.3\n\n**Release date:** 2023-10-11\n\n![AppVersion: 8.5.2](https://img.shields.io/static/v1?label=AppVersion&message=8.5.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to create a dedicated hazelcast svc (#686)\n\n## 1.16.2\n\n**Release date:** 2023-10-8\n\n![AppVersion: 8.5.2](https://img.shields.io/static/v1?label=AppVersion&message=8.5.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#683)\n* Add quote to podAnnotation templating (#678)\n\n## 1.16.1\n\n**Release date:** 2023-9-20\n\n![AppVersion: 8.5.1](https://img.shields.io/static/v1?label=AppVersion&message=8.5.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.0\n\n**Release date:** 2023-9-18\n\n![AppVersion: 8.5.1](https://img.shields.io/static/v1?label=AppVersion&message=8.5.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Allow templating of pod annotations (#662)\n* Make securityContext configurable for jmx exporter init container (#670)\n* Add user provided certificates to the default Java truststore (#663)\n\n## 1.15.3\n\n**Release date:** 2023-8-28\n\n![AppVersion: 8.5.0](https://img.shields.io/static/v1?label=AppVersion&message=8.5.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Decouple server and jmx annotations (#654)\n* Update appVersions for DC apps (#655)\n* Disable startup probes by default (#653)\n\n## 1.15.2\n\n**Release date:** 2023-8-22\n\n![AppVersion: 7.19.12](https://img.shields.io/static/v1?label=AppVersion&message=7.19.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Allow small cpu requests for Synchrony container (#650)\n* Add defaultMode to additionalConfigMaps (#647)\n\n## 1.15.1\n\n**Release date:** 2023-8-17\n\n![AppVersion: 7.19.12](https://img.shields.io/static/v1?label=AppVersion&message=7.19.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make startup probes optional (#646)\n\n## 1.15.0\n\n**Release date:** 2023-8-7\n\n![AppVersion: 7.19.12](https://img.shields.io/static/v1?label=AppVersion&message=7.19.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\n* Add annotations to Grafana dashboards ConfigMaps (#637)\n* Add additional ConfigMaps to Helm Charts (#635)\n* Update appVersions for DC apps (#638)\n\n## 1.14.1\n\n**Release date:** 2023-7-26\n\n![AppVersion: 7.19.11](https://img.shields.io/static/v1?label=AppVersion&message=7.19.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Disable liveness probes by default, make timeoutSeconds configurable (#630)\n\n## 1.14.0\n\n**Release date:** 2023-7-25\n\n![AppVersion: 7.19.11](https://img.shields.io/static/v1?label=AppVersion&message=7.19.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add liveness probes, make readinessProbes configurable (#626)\n* Support running Jira and Confluence containers as non root (incl running in OpenShift) (#623)\n* make sharedHome.permissionFix.command helper to be per-product (#622)\n* Unset default limits for Confluence (#616)\n* Synchrony missing container limits (#615)\n\n## 1.13.1\n\n**Release date:** 2023-6-28\n\n![AppVersion: 7.19.10](https://img.shields.io/static/v1?label=AppVersion&message=7.19.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\n* Swap ingress paths for priority based rules (#602)\n\n## 1.13.0\n\n**Release date:** 2023-6-13\n\n![AppVersion: 7.19.9](https://img.shields.io/static/v1?label=AppVersion&message=7.19.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#599)\n* Bamboo dashboard (#588)\n* Make sessionAffinity configurable in service spec (#582)\n* Cleanup dashboards\n* Add Confluence Grafana dashboards (#575)\n* Add optional ServiceMonitors to DC Helm Charts (#573)\n* Expose JMX beans on http endpoint (#562)\n\n## 1.12.0\n\n**Release date:** 2023-4-18\n\n![AppVersion: 7.19.7](https://img.shields.io/static/v1?label=AppVersion&message=7.19.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add priorityClassName to pod spec (#557)\n\n## 1.11.0\n\n**Release date:** 2023-3-22\n\n![AppVersion: 7.19.6](https://img.shields.io/static/v1?label=AppVersion&message=7.19.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#531)\n\n## 1.10.0\n\n**Release date:** 2023-2-20\n\n![AppVersion: 7.19.5](https://img.shields.io/static/v1?label=AppVersion&message=7.19.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Bitbucket Mesh to Bitbucket Helm chart (#501)\n\n## 1.9.1\n\n**Release date:** 2023-2-16\n\n![AppVersion: 7.19.5](https://img.shields.io/static/v1?label=AppVersion&message=7.19.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* CLIP-1767: Replica count for Synchrony; defaultMode made configurable in volumes (#509)\n* DCCLIP-270: Confluence S3 storage support (#493)\n* DCCLIP-322: Add S3 docs examples (#494)\n\n## 1.9.0\n\n**Release date:** 2023-2-15\n\n![AppVersion: 7.19.5](https://img.shields.io/static/v1?label=AppVersion&message=7.19.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DCCLIP-270: Confluence S3 storage support (#493)\n* DCCLIP-322: Add S3 docs examples (#494)\n\n## 1.8.1\n\n**Release date:** 2022-12-12\n\n![AppVersion: 7.19.4](https://img.shields.io/static/v1?label=AppVersion&message=7.19.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifacthub.io annotations\n\n## 1.8.0\n\n**Release date:** 2022-12-9\n\n![AppVersion: 7.19.4](https://img.shields.io/static/v1?label=AppVersion&message=7.19.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* CLIP-1644: Stop supporting 1.19-1.20 k8s (#486)\n* CLIP-1702: Create Role instead of ClusterRole for Hazelcast Kube client in Confluence and Bitbucket Helm charts (#470)\n* CLIP-1567: Make synchrony pod and service annotations configurable (#464)\n* Set `HAZELCAST_KUBERNETES_SERVICE_PORT` env var for Confluence and Synchrony #484\n* Use `ingress.https` flag to enable tls in ingress (#487)\n* Update appVersion to 7.19.4\n\n## 1.7.1\n\n**Release date:** 2022-10-26\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Patch release to fix Artifacthub metadata\n\n## 1.7.0\n\n**Release date:** 2022-10-25\n\n![AppVersion: 7.19.2](https://img.shields.io/static/v1?label=AppVersion&message=7.19.2&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Pin Python version to 3.9.14 (#468)\n* Update Bitbucket ingress testing values (#466)\n* Ingress Class Name is moved under spec field. (#451)\n* Make ATL_FORCE_CFG_UPDATE configurable in values.yaml (#454)\n* Add osquery related env vars for Terraform (#462)\n* AWS cleanup and log colletion from k8s (#461)\n\n## 1.6.0\n\n**Release date:** 2022-10-12\n\n![AppVersion: 7.19.2](https://img.shields.io/static/v1?label=AppVersion&message=7.19.2&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update the default Confluence version to 7.19.2 (#455)\n* Improved documentation (#448, #440)\n\n\n## 1.5.1\n\n**Release date:** 2022-08-24\n\n![AppVersion: 7.19.0](https://img.shields.io/static/v1?label=AppVersion&message=7.19.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix [SCALE-76](https://jira.atlassian.com/browse/SCALE-76): Fixed Confluence when Synchrony is enabled (#443)\n* Update the default Confluence version to 7.19.0 (#445)\n\n\n## 1.5.0\n\n**Release date:** 2022-07-14\n\n![AppVersion: 7.13.8](https://img.shields.io/static/v1?label=AppVersion&message=7.13.8&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix [SCALE-68](https://jira.atlassian.com/browse/SCALE-68): Use the custom ports for Confluence service (#419)\n* Fix [SCALE-69](https://jira.atlassian.com/browse/SCALE-69): Use the custom ports for Synchrony service (#419)\n* Fix [ISSUE-225](https://github.com/atlassian/data-center-helm-charts/issues/225): Fixed Synchrony ingress path (#429)\n* Update the default Confluence version to 7.13.8 (#430)\n\n## 1.4.1\n\n**Release date:** 2022-06-09\n\n![AppVersion: 7.13.7](https://img.shields.io/static/v1?label=AppVersion&message=7.13.7&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update the default Confluence version to 7.13.7 (#417) - Mitigate [CVE-2022-26134](https://confluence.atlassian.com/doc/confluence-security-advisory-2022-06-02-1130377146.html)\n\n\n## 1.4.0\n\n**Release date:** 2022-05-25\n\n![AppVersion: 7.13.6](https://img.shields.io/static/v1?label=AppVersion&message=7.13.6&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make pod securityContext optional (#389)\n* Fixed additionalHosts (#392)\n* Support for configuring ingress proxy settings via values.yaml (#402)\n* Add ATL_PROXY_NAME and ATL_PROXY_PORT to Confluence (#407)\n* Update Confluence version to 7.13.6 (#412)\n\n\n## 1.3.0\n\n**Release date:** 2022-03-24\n\n![AppVersion: 7.13.5](https://img.shields.io/static/v1?label=AppVersion&message=7.13.5&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCD-1471: Add support for separate Synchrony volumes (#390)\n* Update Confluence version to 7.13.5 (#396)\n\n## 1.2.0\n\n**Release date:** 2022-02-14\n\n![AppVersion: 7.13.4-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.13.2-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCD-1452: Updated appVersion to the latest product LTS version. (#378)\n* Improvements on [documentation](https://github.com/atlassian/data-center-helm-charts/) (#370, #357)\n* Updated Atlassian charts to use common definitions (#303)\n* Added service account annotation (#363)\n* Added new feature additionalVolumeClaimTemplates and provided example in documentation (#334, #368)\n* Added new feature podLabels (#364)\n* Added new feature to define loadBalancerIP (#365)\n* Define podAnnotations as template to allow overrides (#341)\n* DCKUBE-738: Added topologySpreadConstraints to products (#351)\n* Set ActiveProcessorCount automatically based on Values.<product>.resources.container.requests.cpu (#352)\n* Added new feature additionalPorts (for jmx-monitoring) (#353)\n\n\n## 1.1.0\n\n**Release date:** 2021-11-03\n\n![AppVersion: 7.13.2-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.13.2-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-721: Update version in Chart.yaml files\n* DCKUBE-733: Update the product versions (#345)\n* DCKUBE-739: Fix typos (#337)\n* DCKUBE-739: Make securityContext changes backward compatible (#332)\n* Roll Statefulset Pods if ConfigMap changes (#315)\n* DCKUBE-677: Make security context more flexible (#321)\n* DCKUBE-722: Enable configuring ingress.class name (#313)\n* DCKUBE-678: Add schedulerName to StatefulSet (#301)\n* DCKUBE-686: Decrease Confluence failover time (#299)\n\n\n## 1.0.0\n\nThis is the first officially supported version of the Helm chart.\n\n![AppVersion: 7.13.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.13.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-670: Fix Synchrony ingress path (#281)\n* DCKUBE-621: Improvements to graceful shutdown (#282)\n* DCKUBE-654: Make synchrony configurable (#283)\n* Improved [documentation](https://github.com/atlassian/data-center-helm-charts/) (#275, #276, #277, #279, #280, #284, #285, #289, #290, #291, #293. #295)\n\n\n## 0.16.0\n\n![AppVersion: 7.13.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.13.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-598: Enable NFS permission fixer by default (#241)\n* DCKUBE-581: Enable configuration for SET_PERMISSIONS docker image variable (#261)\n* DCKUBE-613: Configurable grace periods (#249)\n* DCKUBE-614: Upgrade Confluence to 7.13.0 LTS version (#257)\n* DCKUBE-612: Improve Confluence shutdown procedure (#250)\n* DCKUBE-620: Set ContextPath as default for singress path (#263)\n* DCKUBE-635: Fix spacing of the jvm args for debug flag (#266)\n* Update the Confluence image name, as the '-server' suffix is deprecated (#259)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/)  (#236, #243, #245, #252, #253, #256, #258, #260, #263, #268, #270, #272)\n\n\n## 0.15.0\n\n![AppVersion: 7.12.4-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.4-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Add Service annotations (#209)\n* DCKUBE-435: Renamed the 'master' branch to 'main' and set it as default (#232)\n* DCKUBE-453: Add support for providing a custom fluentd start command (#218)\n* DCKUBE-596: Update Confluence version to 7.12.4-jdk11 (#238)\n* Update EKS cluster yaml example (#227)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/) (#206, #222, #223, #228, #229, #231, #233, #235)\n\n\n## 0.14.0\n\n![AppVersion: 7.12.3-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.3-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DCKUBE-529: Update Confluence version to 7.12.3-jdk11 (#212)\n\n\n## 0.13.0\n\n![AppVersion: 7.12.2-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.2-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-527: Fix Synchrony resource requests and limits (#210)\n* DCKUBE-54: Volume docs updates (#188)\n\n\n## 0.12.0\n\n![AppVersion: 7.12.2-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.2-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-437: Wording improvement for warning in NOTES when PV is not used (#199)\n* DCKUBE-438: Increase the timeout for /bootstrap endpoints in the same way as for /setup to avoid the ingress timeout (#194)\n* DCKUBE-392: Improve readability of Confluence values.yaml file (#183)\n* Defining the following values in the helpers template for each chart, to allow template overrides: (#173)\n\n### Default value changes\n\nThere has been major improvement in the documentation for the keys in `values.yaml` file but there isn't any functional\nchange.\n\n## 0.11.0\n\n**Release date:** 2021-06-09\n\n![AppVersion: 7.12.2-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.2-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-348: Warning of absent persistent volume (#169)\n* DCKUBE-307: Do not print logs when testing helm installation. (#168)\n* DCKUBE-308: Print service URL after installing helm chart (#157)\n* DCKUBE-331: Mount additional libraries in DB connectivity pod. (#162)\n* DCKUBE-282: Update icons to SVG (#164)\n* DCKUBE-322: Revert previous enabling of Synchrony by default for now … (#160)\n* DCKUBE-322: Add resources stanza for Synchrony and inject values into startup (#151)\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/confluence/values.yaml b/src/main/charts/confluence/values.yaml\nindex a39d4ae..8e148f3 100644\n--- a/src/main/charts/confluence/values.yaml\n+++ b/src/main/charts/confluence/values.yaml\n@@ -183,6 +183,18 @@ synchrony:\n     periodSeconds: 1\n     # -- The number of consecutive failures of the Synchrony container readiness probe before the pod fails readiness checks\n     failureThreshold: 30\n+  resources:\n+    jvm:\n+      # -- The minimum amount of heap memory that will be used by the Synchrony JVM\n+      minHeap: \"1g\"\n+      # -- The maximum amount of heap memory that will be used by the Synchrony JVM\n+      maxHeap: \"2g\"\n+      # -- The memory allocated for the Synchrony stack\n+      stackSize: \"2048k\"\n+    container:\n+      requests:\n+        cpu: \"2\"\n+        memory: \"2.5G\"\n   # -- The base URL of the Synchrony service.\n   # This will be the URL that users' browsers will be given to communicate with Synchrony, as well as the URL that the\n   # Confluence service will use to communicate directly with Synchrony, so the URL must be resovable both from inside and\n```\n\n## 0.10.0\n\n**Release date:** 2021-06-01\n\n![AppVersion: 7.12.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Version 0.10.0\n* DCKUBE-332: Update the minimal supported kubernetes version v1.19 (#154)\n\n### Default value changes\n\n```diff\n# No changes in this release\n```\n\n## 0.9.0\n\n**Release date:** 2021-05-25\n\n![AppVersion: 7.12.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Version 0.9.0\n* Merge branch 'master' into DCKUBE-317-additional-libraries-for-synchron\n* DCKUBE-317: Fix new line remover\n* initial commit - changed the max-body-size of request to 250MB for all products and documented in CONFIG.md (#140)\n* DCKUBE-317: Fix comment for Synchrony additional library\n* DCKUBE-317: Allow additional volumes mounted to Synchrony\n* DCKUBE-292: fix the problem with empty ingress URL in Confluence\n* DCKUBE-317: Added additional libraries for synchrony\n* Update values.yaml (#139)\n* Merge branch 'master' into dckube-267-define-minimum-compute-resources\n* README update for 0.8.0\n* Merge branch 'dckube-267-define-minimum-compute-resources' of github.com:https://github.com/atlassian/data-center-helm-charts/data-center-helm-charts into dckube-267-define-minimum-compute-resources\n* DCKUBE-267: Update cpu request sizes\n* Merge branch 'master' into dckube-267-define-minimum-compute-resources\n* DCKUBE-267: Update cpu request sizes\n* Add Ingress path to Confluence setup ingress and add tests (#136)\n* Added ingress.host into values.yaml with corresponding value injection in ingress.yaml for all apps. Defaults to / (#134)\n* DCKUBE-267: Wording updates\n* DCKUBE-267: Initial commit\n* DCKUBE-205: fix a provisioning a problem when debug flag is false\n* Merge remote-tracking branch 'origin/issue-712/DCKUBE-205-make-possible-to-run-k8s-tests-in-local-cluster' into issue-712/DCKUBE-205-make-possible-to-run-k8s-tests-in-local-cluster\n* Revert \"DCKUBE-205: define the ingress template as a library\"\n* Revert \"DCKUBE-205: use diffent ingress name for setup ingress\"\n* Revert \"DCKUBE-205: fix a typo for ingress definitions\"\n* Merge branch 'master' into issue-712/DCKUBE-205-make-possible-to-run-k8s-tests-in-local-cluster\n* Add Crowd as a tested product (#128)\n* DCKUBE-205: address review comments\n* DCKUBE-205: fix a typo for ingress definitions\n* DCKUBE-205: use diffent ingress name for setup ingress\n* DCKUBE-205: define the ingress template as a library\n* DCKUBE-205: more docs\n* DCKUBE-205: fix the unit tests\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/confluence/values.yaml b/src/main/charts/confluence/values.yaml\nindex da3a956..a39d4ae 100644\n--- a/src/main/charts/confluence/values.yaml\n+++ b/src/main/charts/confluence/values.yaml\n@@ -11,7 +11,7 @@ image:\n\n serviceAccount:\n   # -- Specifies the name of the ServiceAccount to be used by the pods.\n-  # If not specified, but the the \"serviceAccount.create\" flag is set, then the ServiceAccount name will be auto-generated,\n+  # If not specified, but the \"serviceAccount.create\" flag is set, then the ServiceAccount name will be auto-generated,\n   # otherwise the 'default' ServiceAccount will be used.\n   name:\n   # -- true if a ServiceAccount should be created, or false if it already exists\n@@ -34,10 +34,10 @@ serviceAccount:\n database:\n   # -- The type of database being used.\n   # Valid values include 'postgresql', 'mysql', 'oracle', 'mssql'.\n-  # If not specified, then it will need to be provided via browser during initial startup.\n+  # If not specified, then it will need to be provided via the browser during initial startup.\n   type:\n   # -- The JDBC URL of the database to be used by Confluence and Synchrony, e.g. jdbc:postgresql://host:port/database\n-  # If not specified, then it will need to be provided via browser during initial startup.\n+  # If not specified, then it will need to be provided via the browser during initial startup.\n   url:\n   credentials:\n     # -- The name of the Kubernetes Secret that contains the database login credentials.\n@@ -74,16 +74,16 @@ confluence:\n     # -- The port on which the Confluence container listens for Hazelcast traffic\n     hazelcast: 5701\n   license:\n-    # -- The name of the Kubernetes Secret which contains the Confluence license key.\n+    # -- The name of the Kubernetes Secret that contains the Confluence license key.\n     # If specified, then the license will be automatically populated during Confluence setup.\n     # Otherwise, it will need to be provided via the browser after initial startup.\n     secretName:\n-    # -- The key in the Kubernetes Secret which contains the Confluence license key\n+    # -- The key in the Kubernetes Secret that contains the Confluence license key\n     secretKey: license-key\n   readinessProbe:\n     # -- The initial delay (in seconds) for the Confluence container readiness probe, after which the probe will start running\n     initialDelaySeconds: 10\n-    # -- How often (in seconds) the Confluence container readiness robe will run\n+    # -- How often (in seconds) the Confluence container readiness probe will run\n     periodSeconds: 5\n     # -- The number of consecutive failures of the Confluence container readiness probe before the pod fails readiness checks\n     failureThreshold: 30\n@@ -105,31 +105,35 @@ confluence:\n\n   resources:\n     jvm:\n+      # -- JVM memory arguments below are based on the defaults defined for the Confluence docker container, see:\n+      # https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/src/master/#markdown-header-memory-heap-size\n+      #\n       # -- The maximum amount of heap memory that will be used by the Confluence JVM\n       maxHeap: \"1g\"\n       # -- The minimum amount of heap memory that will be used by the Confluence JVM\n       minHeap: \"1g\"\n       # -- The memory reserved for the Confluence JVM code cache\n-      reservedCodeCache: \"512m\"\n+      reservedCodeCache: \"256m\"\n     # -- Specifies the standard Kubernetes resource requests and/or limits for the Confluence container.\n     # It is important that if the memory resources are specified here, they must allow for the size of the Confluence JVM.\n     # That means the maximum heap size, the reserved code cache size, plus other JVM overheads, must be accommodated.\n     # Allowing for (maxHeap+codeCache)*1.5 would be an example.\n-    container: {}\n+    container:\n     #  limits:\n-    #    cpu: \"4\"\n-    #    memory: \"2G\"\n-    #  requests:\n-    #    cpu: \"4\"\n+    #    cpu: \"1\"\n     #    memory: \"2G\"\n+      requests:\n+        cpu: \"2\" # -- If changing the cpu value update additional JVM arg 'ActiveProcessorCount' below\n+        memory: \"2G\"\n\n   # -- Specifies a list of additional arguments that can be passed to the Confluence JVM, e.g. system properties\n-  additionalJvmArgs: []\n-#    - -Dfoo=bar\n-#    - -Dfruit=lemon\n+  additionalJvmArgs:\n+    # -- The value defined for ActiveProcessorCount should correspond to that provided for 'container.requests.cpu'\n+    # see: https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE\n+    - -XX:ActiveProcessorCount=2\n\n   # -- Specifies a list of additional Java libraries that should be added to the Confluence container.\n-  # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n+  # Each item in the list should specify the name of the volume that contains the library, as well as the name of the\n   # library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which\n   # directory in the volume contains the library file.\n   additionalLibraries: []\n@@ -153,10 +157,14 @@ confluence:\n   # See https://hub.docker.com/r/atlassian/confluence-server for supported variables.\n   additionalEnvironmentVariables: []\n\n+  jvmDebug:\n+    # -- If set to true, Confluence JVM will be started with debugging port 5005 open.\n+    enabled: false\n+\n synchrony:\n-  # -- True if Synchrony (i.e. Collaborative Editing) should be enabled.\n+  # -- True if Synchrony (i.e. collaborative editing) should be enabled.\n   # This will result in a separate StatefulSet and Service to be created for Synchrony.\n-  # If disabled, then Collaborative Editing will be disabled in Confluence.\n+  # If disabled, then collaborative editing will be disabled in Confluence.\n   enabled: false\n   service:\n     # -- The port on which the Synchrony Kubernetes service will listen\n@@ -171,7 +179,7 @@ synchrony:\n   readinessProbe:\n     # -- The initial delay (in seconds) for the Synchrony container readiness probe, after which the probe will start running\n     initialDelaySeconds: 5\n-    # -- How often (in seconds) the Synchrony container readiness robe will run\n+    # -- How often (in seconds) the Synchrony container readiness probe will run\n     periodSeconds: 1\n     # -- The number of consecutive failures of the Synchrony container readiness probe before the pod fails readiness checks\n     failureThreshold: 30\n@@ -180,6 +188,14 @@ synchrony:\n   # Confluence service will use to communicate directly with Synchrony, so the URL must be resovable both from inside and\n   # outside the Kubernetes cluster.\n   ingressUrl:\n+  # -- Specifies a list of additional Java libraries that should be added to the Synchrony container.\n+  # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n+  # library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which\n+  # directory in the volume contains the library file.\n+  additionalLibraries: []\n+#    - volumeName:\n+#      subDirectory:\n+#      fileName:\n\n ingress:\n   # -- True if an Ingress Resource should be created.\n@@ -193,9 +209,11 @@ ingress:\n   # -- The max body size to allow. Requests exceeding this size will result\n   # in an 413 error being returned to the client.\n   # https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size\n-  maxBodySize: 10m\n+  maxBodySize: 250m\n   # -- The fully-qualified hostname of the Ingress Resource.\n   host:\n+  # -- The base path for the ingress rule.\n+  path: \"/\"\n   # -- The custom annotations that should be applied to the Ingress\n   # Resource when not using the Kubernetes ingress-nginx controller.\n   annotations: {}\n@@ -206,9 +224,9 @@ ingress:\n   tlsSecretName:\n\n fluentd:\n-  # -- True if the fluentd sidecar should be added to each pod\n+  # -- True if the Fluentd sidecar should be added to each pod\n   enabled: false\n-  # -- True if a custom config should be used for fluentd\n+  # -- True if a custom config should be used for Fluentd\n   customConfigFile: false\n   # -- Custom fluent.conf file\n   # fluent.conf: |\n@@ -225,18 +243,18 @@ fluentd:\n   #     tag confluence-access-logs\n   #   </source>\n\n- # -- The name of the image containing the fluentd sidecar\n+ # -- The name of the image containing the Fluentd sidecar\n   imageName: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.2\n-  # -- The port on which the fluentd sidecar will listen\n+  # -- The port on which the Fluentd sidecar will listen\n   httpPort: 9880\n   elasticsearch:\n-    # -- True if fluentd should send all log events to an elasticsearch service.\n+    # -- True if Fluentd should send all log events to an Elasticsearch service.\n     enabled: true\n-    # -- The hostname of the Elasticsearch service that fluentd should send logs to.\n+    # -- The hostname of the Elasticsearch service that Fluentd should send logs to.\n     hostname: elasticsearch\n-    # -- The prefix of the elasticsearch index name that will be used\n+    # -- The prefix of the Elasticsearch index name that will be used\n     indexNamePrefix: confluence\n-  # -- Specify custom volumes to be added to fluentd container (e.g. more log sources)\n+  # -- Specify custom volumes to be added to Fluentd container (e.g. more log sources)\n   extraVolumes: []\n   # - name: local-home\n   #   mountPath: /opt/atlassian/confluence/logs\n@@ -258,9 +276,9 @@ volumes:\n         requests:\n           storage: 1Gi\n     # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n-    # volume which will be used for the local-home volumes. If not defined, then defaults to an emptyDir volume.\n+    # volume that will be used for the local-home volumes. If not defined, then defaults to an emptyDir volume.\n     customVolume: {}\n-    # -- The path within the Confluence container which the local-home volume should be mounted.\n+    # -- The path within the Confluence container where the local-home volume should be mounted.\n     mountPath: \"/var/atlassian/application-data/confluence\"\n   sharedHome:\n     persistentVolumeClaim:\n@@ -273,11 +291,11 @@ volumes:\n         requests:\n           storage: 1Gi\n     # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n-    # volume which will be used for the shared-home volume. If not defined, then defaults to an emptyDir (i.e. unshared) volume.\n+    # volume, which will be used for the shared-home volume. If not defined, then defaults to an emptyDir (i.e. unshared) volume.\n     customVolume: {}\n     # -- Specifies the path in the Confluence container to which the shared-home volume will be mounted.\n     mountPath: \"/var/atlassian/application-data/shared-home\"\n-    # -- Specifies the sub-directory of the shared-home volume which will be mounted in to the Confluence container.\n+    # -- Specifies the sub-directory of the shared-home volume that will be mounted in to the Confluence container.\n     subPath:\n     nfsPermissionFixer:\n       # -- If enabled, this will alter the shared-home volume's root directory so that Confluence can write to it.\n@@ -315,8 +333,8 @@ additionalLabels: {}\n # -- Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into server container\n # configMap and secret are two available types (camelCase is important!)\n # mountPath is a destination directory in a container and key is file name\n-# name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name + index position,\n-# for example custom-config-0, keystore-2\n+# name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name and index position,\n+# for example, custom-config-0, keystore-2\n additionalFiles: []\n\n #  - name: custom-config\n```\n\n## 0.7.0\n\n**Release date:** 2021-05-10\n\n![AppVersion: 7.12.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Merge branch 'master' into issue-712/DCKUBE-205-make-possible-to-run-k8s-tests-in-local-cluster\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/confluence/values.yaml b/src/main/charts/confluence/values.yaml\nindex 08095d6..da3a956 100644\n--- a/src/main/charts/confluence/values.yaml\n+++ b/src/main/charts/confluence/values.yaml\n@@ -208,7 +208,24 @@ ingress:\n fluentd:\n   # -- True if the fluentd sidecar should be added to each pod\n   enabled: false\n-  # -- The name of the image containing the fluentd sidecar\n+  # -- True if a custom config should be used for fluentd\n+  customConfigFile: false\n+  # -- Custom fluent.conf file\n+  # fluent.conf: |\n+  fluentdCustomConfig: {}\n+  # fluent.conf: |\n+  #   <source>\n+  #     @type tail\n+  #     <parse>\n+  #     @type multiline\n+  #     format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n+  #     </parse>\n+  #     path /opt/atlassian/confluence/logs/access_log.*\n+  #     pos_file /tmp/confluencelog.pos\n+  #     tag confluence-access-logs\n+  #   </source>\n+\n+ # -- The name of the image containing the fluentd sidecar\n   imageName: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.2\n   # -- The port on which the fluentd sidecar will listen\n   httpPort: 9880\n@@ -219,7 +236,12 @@ fluentd:\n     hostname: elasticsearch\n     # -- The prefix of the elasticsearch index name that will be used\n     indexNamePrefix: confluence\n-\n+  # -- Specify custom volumes to be added to fluentd container (e.g. more log sources)\n+  extraVolumes: []\n+  # - name: local-home\n+  #   mountPath: /opt/atlassian/confluence/logs\n+  #   subPath: log\n+  #   readOnly: true\n # -- Specify additional annotations to be added to all Confluence and Synchrony pods\n podAnnotations: {}\n #  \"name\": \"value\"\n@@ -296,6 +318,7 @@ additionalLabels: {}\n # name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name + index position,\n # for example custom-config-0, keystore-2\n additionalFiles: []\n+\n #  - name: custom-config\n #    type: configMap\n #    key: log4j.properties\n```\n\n## 0.1.0\n\n**Release date:** 2021-05-07\n\n![AppVersion: 7.9.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.9.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-205 Allow addition of entries in /etc/hosts for each pod.\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/confluence/values.yaml b/src/main/charts/confluence/values.yaml\nindex 0ae8cf2..08095d6 100644\n--- a/src/main/charts/confluence/values.yaml\n+++ b/src/main/charts/confluence/values.yaml\n@@ -308,3 +308,12 @@ additionalFiles: []\n #    type: secret\n #    key: keystore.jks\n #    mountPath: /var/ssl\n+\n+# -- Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file. See\n+# https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ for more\n+# information.\n+additionalHosts: []\n+#  - ip: \"127.0.0.1\"\n+#    hostnames:\n+#    - \"foo.local\"\n+#    - \"bar.local\"\n```\n\n## 0.7.0\n\n**Release date:** 2021-05-07\n\n![AppVersion: 7.12.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.12.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Release 0.7.0 (#123)\n* Update charts descriptors (#121)\n* feat (fluentd) extra fluentd customization to (jira / confluence) helm charts (#95)\n* Update application versions (#116)\n* DCKUBE-103: add a system to enable collab editing by default\n* indenting jira's additionalFiles volume mounts and adding to confluence\n* Merge branch 'master' into issue-712/DCKUBE-205-make-possible-to-run-k8s-tests-in-local-cluster\n* DCKUBE-205: use separate ingress for setup\n* Update documentation for 0.6.0 release\n* DCKUBE-205: increase the default Nginx timeout\n* feat(perms): Paramterize setPermissions boolean flag (#97)\n* DCKUBE-205: provide the ability to open debug port on Connie JVM\n* DCKUBE-205: provide the ability to open debug port on Connie JVM\n* DCKUBE-205: provide the ability to open debug port on Connie JVM\n* DCKUBE-231: Max body size should be configurable\n* DCKUBE-90: Additional details relating to the Ingress controller\n* Introducing an easier way to mount secrets and configmaps (#102)\n* Merge branch 'master' into dckube-131-nfs-fixer-removal\n* DCKUBE-131: fix for initContainer being synthesized twice\n* Merge branch 'master' into dckube-131-nfs-fixer-removal\n* DCKUBE-131: Updates to template formatting and readme wording\n* Merge pull request #98 from https://github.com/atlassian/data-center-helm-charts/dckube-131-nfs-fixer-removal\n* DCKUBE-131: Alter NFS permissions via init container\n* feat(range): Fix support for multiple plugins\n* ISSUE-85: Add context path for Confluence\n* Update READMEs for 0.5.0 release\n* DCNG-1021 fix stray CR for Confluence\n* DCNG-976 remove unnecessary local-home volume mount from confluence fluentd container\n* DCNG-976 replace Confluence chart fluentd log file tail input, with HTTP events posted direct from Confluence\n* Merge pull request #59 from https://github.com/atlassian/data-center-helm-charts/minor-cleanup-and-Azure-related-fixes\n* DCNG-976 remove duplicate additionalContainers from confluence chart\n* Merge remote-tracking branch 'origin/master' into DCNG-976-efk\n* Fix gid value\n* Merge remote-tracking branch 'origin/master' into DCNG-976-efk\n* OpenShift support (#56)\n* Merge remote-tracking branch 'origin/master' into DCNG-976-efk\n* DCNG-977 enable access logs in Confluence by default, for consistency with Jira+BB\n* DCNG-977 document use of double-mounted local-home volume\n* DCNG-783 minor cleanup and Azure related fixes\n* DCNG-977 capture Confluence tomcat/access logs into local-home volume\n* DCNG-976 limit fluentd to just atlassian-confluence.log\n* DCNG-976 use fluent/fluentd-kubernetes-daemonset for the sidecar\n* DCNG-976 use subPath to limit the scope of the local-hme volumeMount in the fluentd container.\n* DCNG-976 add support for EFK (Elasticsearch/Fluentd/Kibana) stack\n* DCNG-925 support for BYO NFS server\n* DCNG-961 Set confluence.clusterNodeName.useHostname sysprop\n* default customVolume chart value to empty map , to avoid helm warning\n* Add optional TLS to ingress spec\n* DCNG-892 simplify config of https/http\n* DCNG-892 update docs\n* DCNG-892 Configure the created ingress as nginx by default\n* DCNG-892 Move ingress value structure up to top level\n* DCNG-892 Add Ingress template to the Helm charts, and activate it for EKS testing\n* DCNG-927 Tweak doco for clarity\n* DCNG-927 Allow Tomcat ingress https/secure config to be changed for Jira/Confluence, and make consistent with Bitbucket\n* DCNG-921 add doco for enabling clustering\n* DCNG-921 disable clustering by defaault\n* DCNG-920 Disable Synchrony by default, but keep enabled for integration testing\n* DCNG-913 Make bitbucket/confluence license secret optional\n* DCNG-914 make jira/confluence DB config values fully optional\n* DCNG-893 move emptyDir volume defaults back into the templates\n* DCNG-893 Make localHome/sharedHome configuration more consistent by adding an optional shared-home PVC to the chart\n* rename localHome.persistentVolumeClaim.enabled to .create\n* DCNG-893 update documentation\n* DCNG-893 rework how volumes are customised in the Confluence chart\n* DCNG-893 disable PVs by default on Bitbucket and Confluence\n* DCNG-898 add a series of unit tests for the serviceAccount and image config rendering\n* DCNG-899 Added service account to db-connectivity-test\n* DCNG-897 Use \"before-hook-creation,hook-succeeded\" deletion policy\n* Merge remote-tracking branch 'origin/master' into DCNG-897\n* DCNG-897 Add hook-delete-policy to chart tests and nfs-fixer job\n* DCNG-894 Add a ServiceAccount, ClusterRole and ClusterRoleBinding to the Confluence chart\n* DCNG-880 Added support for custom builds in kubeVersion\n* DCNG-853 Fixed kubeVersion\n* DCNG-853 Updated products' charts\n* confluence 7.9.0 is out\n* DCNG-856 add -n to each command in NOTES.txt\n* DCNG-856 Add NOTES.txt\n* DCNG-849 avoid incorrect rendering for empty  additionalEnvironmentVariables\n* DCNG-849 check for the presense of additionalLabels so we don't render an empty {}\n* Merge pull request #6 from https://github.com/atlassian/data-center-helm-charts/DCNG-849\n* DCNG-850 add extension point for additional environment variables\n* DCNG-848 add extension point for additional labels\n* Merge pull request #3 from https://github.com/atlassian/data-center-helm-charts/DCNG-848\n* DCNG-866 Replace hardcoded image pull policy with value placeholder\n* DCNG-848 Add support for additional volumes and volume mounts\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/confluence/values.yaml b/src/main/charts/confluence/values.yaml\nindex 88b9260..820308f 100644\n--- a/src/main/charts/confluence/values.yaml\n+++ b/src/main/charts/confluence/values.yaml\n@@ -9,18 +9,41 @@ image:\n   # -- The docker image tag to be used. Defaults to the Chart appVersion.\n   tag:\n\n-# -- Specifies which serviceAccount to use for the pods. If not specified, the kubernetes default will be used.\n-serviceAccountName:\n+serviceAccount:\n+  # -- Specifies the name of the ServiceAccount to be used by the pods.\n+  # If not specified, but the the \"serviceAccount.create\" flag is set, then the ServiceAccount name will be auto-generated,\n+  # otherwise the 'default' ServiceAccount will be used.\n+  name:\n+  # -- true if a ServiceAccount should be created, or false if it already exists\n+  create: true\n+  # -- The list of image pull secrets that should be added to the created ServiceAccount\n+  imagePullSecrets: []\n+  clusterRole:\n+    # -- Specifies the name of the ClusterRole that will be created if the \"serviceAccount.clusterRole.create\" flag is set.\n+    # If not specified, a name will be auto-generated.\n+    name:\n+    # -- true if a ClusterRole should be created, or false if it already exists\n+    create: true\n+  clusterRoleBinding:\n+    # -- Specifies the name of the ClusterRoleBinding that will be created if the \"serviceAccount.clusterRoleBinding.create\" flag is set\n+    # If not specified, a name will be auto-generated.\n+    name:\n+    # -- true if a ClusterRoleBinding should be created, or false if it already exists\n+    create: true\n\n database:\n   # -- The type of database being used.\n   # Valid values include 'postgresql', 'mysql', 'oracle', 'mssql'.\n+  # If not specified, then it will need to be provided via browser during initial startup.\n   type:\n   # -- The JDBC URL of the database to be used by Confluence and Synchrony, e.g. jdbc:postgresql://host:port/database\n+  # If not specified, then it will need to be provided via browser during initial startup.\n   url:\n   credentials:\n     # -- The name of the Kubernetes Secret that contains the database login credentials.\n-    secretName: confluence-database-credentials\n+    # If specified, then the credentials will be automatically populated during Confluence setup.\n+    # Otherwise, they will need to be provided via the browser after initial startup.\n+    secretName:\n     # -- The key in the Secret used to store the database login username\n     usernameSecretKey: username\n     # -- The key in the Secret used to store the database login password\n@@ -32,16 +55,29 @@ confluence:\n     port: 80\n     # -- The type of Kubernetes service to use for Confluence\n     type: ClusterIP\n-  # -- The GID used by the Confluence docker image\n-  gid: \"2002\"\n+    # -- The Tomcat context path that Confluence will use. The ATL_TOMCAT_CONTEXTPATH will be set automatically\n+    contextPath:\n+  # -- Enable or disable security context in StatefulSet template spec. Enabled by default with UID 2002.\n+  # -- Disable when deploying to OpenShift, unless anyuid policy is attached to a service account\n+  securityContext:\n+    enabled: true\n+    # -- The GID used by the Confluence docker image\n+    gid: \"2002\"\n+  # -- The umask used by the Confluence process when it creates new files.\n+  # Default is 0022, which makes the new files read/writeable by the Confluence user, and readable by everyone else.\n+  umask: \"0022\"\n+  # -- Boolean to define whether to set home directory permissions on startup of Confluence container. Set to false to disable this behaviour.\n+  setPermissions: false\n   ports:\n     # -- The port on which the Confluence container listens for HTTP traffic\n     http: 8090\n     # -- The port on which the Confluence container listens for Hazelcast traffic\n     hazelcast: 5701\n   license:\n-    # -- The name of the Kubernetes Secret which contains the Confluence license key\n-    secretName: confluence-license\n+    # -- The name of the Kubernetes Secret which contains the Confluence license key.\n+    # If specified, then the license will be automatically populated during Confluence setup.\n+    # Otherwise, it will need to be provided via the browser after initial startup.\n+    secretName:\n     # -- The key in the Kubernetes Secret which contains the Confluence license key\n     secretKey: license-key\n   readinessProbe:\n@@ -51,6 +87,22 @@ confluence:\n     periodSeconds: 5\n     # -- The number of consecutive failures of the Confluence container readiness probe before the pod fails readiness checks\n     failureThreshold: 30\n+\n+  accessLog:\n+    # -- True if access logging should be enabled.\n+    enabled: true\n+    # -- The path within the Confluence container where the local-home volume should be mounted in order to capture access logs.\n+    mountPath: \"/opt/atlassian/confluence/logs\"\n+    # -- The subdirectory within the local-home volume where access logs should be stored.\n+    localHomeSubPath: \"logs\"\n+\n+  clustering:\n+    # -- Set to true if Data Center clustering should be enabled\n+    # This will automatically configure cluster peer discovery between cluster nodes.\n+    enabled: false\n+    # -- Set to true if the Kubernetes pod name should be used as the end-user-visible name of the Data Center cluster node.\n+    usePodNameAsClusterNodeName: true\n+\n   resources:\n     jvm:\n       # -- The maximum amount of heap memory that will be used by the Confluence JVM\n@@ -93,7 +145,19 @@ confluence:\n #      subDirectory:\n #      fileName:\n\n+  # -- Defines any additional volumes mounts for the Confluence container.\n+  # These can refer to existing volumes, or new volumes can be defined in volumes.additional.\n+  additionalVolumeMounts: []\n+\n+  # -- Defines any additional environment variables to be passed to the Confluence container.\n+  # See https://hub.docker.com/r/atlassian/confluence-server for supported variables.\n+  additionalEnvironmentVariables: []\n+\n synchrony:\n+  # -- True if Synchrony (i.e. Collaborative Editing) should be enabled.\n+  # This will result in a separate StatefulSet and Service to be created for Synchrony.\n+  # If disabled, then Collaborative Editing will be disabled in Confluence.\n+  enabled: false\n   service:\n     # -- The port on which the Synchrony Kubernetes service will listen\n     port: 80\n@@ -117,37 +181,118 @@ synchrony:\n   # outside the Kubernetes cluster.\n   ingressUrl:\n\n+ingress:\n+  # -- True if an Ingress Resource should be created.\n+  create: false\n+  # -- True if the created Ingress Resource is to use the Kubernetes ingress-nginx controller:\n+  # https://kubernetes.github.io/ingress-nginx/\n+  # This will populate the Ingress Resource with annotations for the Kubernetes ingress-nginx controller.\n+  # Set to false if a different controller is to be used, in which case the appropriate annotations for that\n+  # controller need to be specified.\n+  nginx: true\n+  # -- The max body size to allow. Requests exceeding this size will result\n+  # in an 413 error being returned to the client.\n+  # https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size\n+  maxBodySize: 10m\n+  # -- The fully-qualified hostname of the Ingress Resource.\n+  host:\n+  # -- The custom annotations that should be applied to the Ingress\n+  # Resource when not using the Kubernetes ingress-nginx controller.\n+  annotations: {}\n+  # -- True if the browser communicates with the application over HTTPS.\n+  https: true\n+  # -- Secret that contains a TLS private key and certificate.\n+  # Optional if Ingress Controller is configured to use one secret for all ingresses\n+  tlsSecretName:\n+\n+fluentd:\n+  # -- True if the fluentd sidecar should be added to each pod\n+  enabled: false\n+  # -- True if a custom config should be used for fluentd\n+  customConfigFile: false\n+  # -- Custom fluent.conf file\n+  # fluent.conf: |\n+  fluentdCustomConfig: {}\n+  # fluent.conf: |\n+  #   <source>\n+  #     @type tail\n+  #     <parse>\n+  #     @type multiline\n+  #     format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n+  #     </parse>\n+  #     path /opt/atlassian/confluence/logs/access_log.*\n+  #     pos_file /tmp/confluencelog.pos\n+  #     tag confluence-access-logs\n+  #   </source>\n+\n+ # -- The name of the image containing the fluentd sidecar\n+  imageName: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.2\n+  # -- The port on which the fluentd sidecar will listen\n+  httpPort: 9880\n+  elasticsearch:\n+    # -- True if fluentd should send all log events to an elasticsearch service.\n+    enabled: true\n+    # -- The hostname of the Elasticsearch service that fluentd should send logs to.\n+    hostname: elasticsearch\n+    # -- The prefix of the elasticsearch index name that will be used\n+    indexNamePrefix: confluence\n+  # -- Specify custom volumes to be added to fluentd container (e.g. more log sources)\n+  extraVolumes: []\n+  # - name: local-home\n+  #   mountPath: /opt/atlassian/confluence/logs\n+  #   subPath: log\n+  #   readOnly: true\n # -- Specify additional annotations to be added to all Confluence and Synchrony pods\n podAnnotations: {}\n #  \"name\": \"value\"\n\n volumes:\n   localHome:\n-    # -- Specifies the name of the storage class that should be used for the Confluence local-home volume\n-    storageClassName:\n-    # -- Specifies the standard Kubernetes resource requests and/or limits for the Confluence local-home volume.\n-    resources:\n-      requests:\n-        storage: 1Gi\n-    # -- Specifies the path in the Confluence container to which the local-home volume will be mounted.\n+    persistentVolumeClaim:\n+      # -- If true, then a PersistentVolumeClaim will be created for each local-home volume.\n+      create: false\n+      # -- Specifies the name of the storage class that should be used for the local-home volume claim.\n+      storageClassName:\n+      # -- Specifies the standard Kubernetes resource requests and/or limits for the local-home volume claims.\n+      resources:\n+        requests:\n+          storage: 1Gi\n+    # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n+    # volume which will be used for the local-home volumes. If not defined, then defaults to an emptyDir volume.\n+    customVolume: {}\n+    # -- The path within the Confluence container which the local-home volume should be mounted.\n     mountPath: \"/var/atlassian/application-data/confluence\"\n   sharedHome:\n+    persistentVolumeClaim:\n+      # -- If true, then a PersistentVolumeClaim will be created for the shared-home volume.\n+      create: false\n+      # -- Specifies the name of the storage class that should be used for the shared-home volume claim.\n+      storageClassName:\n+      # -- Specifies the standard Kubernetes resource requests and/or limits for the shared-home volume claims.\n+      resources:\n+        requests:\n+          storage: 1Gi\n+    # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n+    # volume which will be used for the shared-home volume. If not defined, then defaults to an emptyDir (i.e. unshared) volume.\n+    customVolume: {}\n     # -- Specifies the path in the Confluence container to which the shared-home volume will be mounted.\n     mountPath: \"/var/atlassian/application-data/shared-home\"\n     # -- Specifies the sub-directory of the shared-home volume which will be mounted in to the Confluence container.\n     subPath:\n-    # -- The name of the PersistentVolumeClaim which will be used for the shared-home volume\n-    volumeClaimName: confluence-shared-home\n     nfsPermissionFixer:\n       # -- If enabled, this will alter the shared-home volume's root directory so that Confluence can write to it.\n       # This is a workaround for a Kubernetes bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260\n-      enabled: true\n+      enabled: false\n       # -- The path in the initContainer where the shared-home volume will be mounted\n       mountPath: /shared-home\n       # -- By default, the fixer will change the group ownership of the volume's root directory to match the Confluence\n       # container's GID (2002), and then ensures the directory is group-writeable. If this is not the desired behaviour,\n       # command used can be specified here.\n       command:\n+  # -- Defines additional volumes that should be applied to all Confluence pods.\n+  # Note that this will not create any corresponding volume mounts;\n+  # those needs to be defined in confluence.additionalVolumeMounts\n+  additional: []\n\n # -- Standard Kubernetes node-selectors that will be applied to all Confluence and Synchrony pods\n nodeSelector: {}\n@@ -163,3 +308,26 @@ additionalContainers: []\n\n # -- Additional initContainer definitions that will be added to all Confluence pods\n additionalInitContainers: []\n+\n+# -- Additional labels that should be applied to all resources\n+additionalLabels: {}\n+\n+# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into server container\n+# configMap and secret are two available types (camelCase is important!)\n+# mountPath is a destination directory in a container and key is file name\n+# name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name + index position,\n+# for example custom-config-0, keystore-2\n+additionalFiles: []\n+\n+#  - name: custom-config\n+#    type: configMap\n+#    key: log4j.properties\n+#    mountPath:  /var/atlassian\n+#  - name: custom-config\n+#    type: configMap\n+#    key: web.xml\n+#    mountPath: /var/atlassian\n+#  - name: keystore\n+#    type: secret\n+#    key: keystore.jks\n+#    mountPath: /var/ssl\n```\n\n## 0.1.0\n\n**Release date:** 2020-11-04\n\n![AppVersion: 7.9.0-beta1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=7.9.0-beta1-jdk11&color=success&logo=)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* OSR-523 Snapshot of helm charts and test code from internal repo\n\n### Default value changes\n\n```diff\n# -- The initial number of pods that should be started at deployment of each of Confluence and Synchrony.\n# Note that because Confluence requires initial manual configuration after the first pod is deployed, and before scaling\n# up to additional pods, this should always be kept as 1.\nreplicaCount: 1\n\nimage:\n  repository: atlassian/confluence-server\n  pullPolicy: IfNotPresent\n  # -- The docker image tag to be used. Defaults to the Chart appVersion.\n  tag:\n\n# -- Specifies which serviceAccount to use for the pods. If not specified, the kubernetes default will be used.\nserviceAccountName:\n\ndatabase:\n  # -- The type of database being used.\n  # Valid values include 'postgresql', 'mysql', 'oracle', 'mssql'.\n  type:\n  # -- The JDBC URL of the database to be used by Confluence and Synchrony, e.g. jdbc:postgresql://host:port/database\n  url:\n  credentials:\n    # -- The name of the Kubernetes Secret that contains the database login credentials.\n    secretName: confluence-database-credentials\n    # -- The key in the Secret used to store the database login username\n    usernameSecretKey: username\n    # -- The key in the Secret used to store the database login password\n    passwordSecretKey: password\n\nconfluence:\n  service:\n    # -- The port on which the Confluence Kubernetes service will listen\n    port: 80\n    # -- The type of Kubernetes service to use for Confluence\n    type: ClusterIP\n  # -- The GID used by the Confluence docker image\n  gid: \"2002\"\n  ports:\n    # -- The port on which the Confluence container listens for HTTP traffic\n    http: 8090\n    # -- The port on which the Confluence container listens for Hazelcast traffic\n    hazelcast: 5701\n  license:\n    # -- The name of the Kubernetes Secret which contains the Confluence license key\n    secretName: confluence-license\n    # -- The key in the Kubernetes Secret which contains the Confluence license key\n    secretKey: license-key\n  readinessProbe:\n    # -- The initial delay (in seconds) for the Confluence container readiness probe, after which the probe will start running\n    initialDelaySeconds: 10\n    # -- How often (in seconds) the Confluence container readiness robe will run\n    periodSeconds: 5\n    # -- The number of consecutive failures of the Confluence container readiness probe before the pod fails readiness checks\n    failureThreshold: 30\n  resources:\n    jvm:\n      # -- The maximum amount of heap memory that will be used by the Confluence JVM\n      maxHeap: \"1g\"\n      # -- The minimum amount of heap memory that will be used by the Confluence JVM\n      minHeap: \"1g\"\n      # -- The memory reserved for the Confluence JVM code cache\n      reservedCodeCache: \"512m\"\n    # -- Specifies the standard Kubernetes resource requests and/or limits for the Confluence container.\n    # It is important that if the memory resources are specified here, they must allow for the size of the Confluence JVM.\n    # That means the maximum heap size, the reserved code cache size, plus other JVM overheads, must be accommodated.\n    # Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    container: {}\n    #  limits:\n    #    cpu: \"4\"\n    #    memory: \"2G\"\n    #  requests:\n    #    cpu: \"4\"\n    #    memory: \"2G\"\n\n  # -- Specifies a list of additional arguments that can be passed to the Confluence JVM, e.g. system properties\n  additionalJvmArgs: []\n#    - -Dfoo=bar\n#    - -Dfruit=lemon\n\n  # -- Specifies a list of additional Java libraries that should be added to the Confluence container.\n  # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n  # library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which\n  # directory in the volume contains the library file.\n  additionalLibraries: []\n#    - volumeName:\n#      subDirectory:\n#      fileName:\n\n  # -- Specifies a list of additional Confluence plugins that should be added to the Confluence container.\n  # These are specified in the same manner as the additionalLibraries field, but the files will be loaded\n  # as bundled plugins rather than as libraries.\n  additionalBundledPlugins: []\n#    - volumeName:\n#      subDirectory:\n#      fileName:\n\nsynchrony:\n  service:\n    # -- The port on which the Synchrony Kubernetes service will listen\n    port: 80\n    # -- The type of Kubernetes service to use for Synchrony\n    type: ClusterIP\n  ports:\n    # -- The port on which the Synchrony container listens for HTTP traffic\n    http: 8091\n    # -- The port on which the Synchrony container listens for Hazelcast traffic\n    hazelcast: 5701\n  readinessProbe:\n    # -- The initial delay (in seconds) for the Synchrony container readiness probe, after which the probe will start running\n    initialDelaySeconds: 5\n    # -- How often (in seconds) the Synchrony container readiness robe will run\n    periodSeconds: 1\n    # -- The number of consecutive failures of the Synchrony container readiness probe before the pod fails readiness checks\n    failureThreshold: 30\n  # -- The base URL of the Synchrony service.\n  # This will be the URL that users' browsers will be given to communicate with Synchrony, as well as the URL that the\n  # Confluence service will use to communicate directly with Synchrony, so the URL must be resovable both from inside and\n  # outside the Kubernetes cluster.\n  ingressUrl:\n\n# -- Specify additional annotations to be added to all Confluence and Synchrony pods\npodAnnotations: {}\n#  \"name\": \"value\"\n\nvolumes:\n  localHome:\n    # -- Specifies the name of the storage class that should be used for the Confluence local-home volume\n    storageClassName:\n    # -- Specifies the standard Kubernetes resource requests and/or limits for the Confluence local-home volume.\n    resources:\n      requests:\n        storage: 1Gi\n    # -- Specifies the path in the Confluence container to which the local-home volume will be mounted.\n    mountPath: \"/var/atlassian/application-data/confluence\"\n  sharedHome:\n    # -- Specifies the path in the Confluence container to which the shared-home volume will be mounted.\n    mountPath: \"/var/atlassian/application-data/shared-home\"\n    # -- Specifies the sub-directory of the shared-home volume which will be mounted in to the Confluence container.\n    subPath:\n    # -- The name of the PersistentVolumeClaim which will be used for the shared-home volume\n    volumeClaimName: confluence-shared-home\n    nfsPermissionFixer:\n      # -- If enabled, this will alter the shared-home volume's root directory so that Confluence can write to it.\n      # This is a workaround for a Kubernetes bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260\n      enabled: true\n      # -- The path in the initContainer where the shared-home volume will be mounted\n      mountPath: /shared-home\n      # -- By default, the fixer will change the group ownership of the volume's root directory to match the Confluence\n      # container's GID (2002), and then ensures the directory is group-writeable. If this is not the desired behaviour,\n      # command used can be specified here.\n      command:\n\n# -- Standard Kubernetes node-selectors that will be applied to all Confluence and Synchrony pods\nnodeSelector: {}\n\n# -- Standard Kubernetes tolerations that will be applied to all Confluence and Synchrony pods\ntolerations: []\n\n# -- Standard Kubernetes affinities that will be applied to all Confluence and Synchrony pods\naffinity: {}\n\n# -- Additional container definitions that will be added to all Confluence pods\nadditionalContainers: []\n\n# -- Additional initContainer definitions that will be added to all Confluence pods\nadditionalInitContainers: []\n```\n\n---\nAutogenerated from Helm Chart and git history using [helm-changelog](https://github.com/mogensen/helm-changelog)\n"
  },
  {
    "path": "src/main/charts/confluence/Chart.yaml",
    "content": "apiVersion: v2\nname: confluence\ndescription: A chart for installing Confluence Data Center on Kubernetes\ntype: application\nversion: '2.0.13'\nappVersion: 10.2.11\nkubeVersion: \">=1.21.x-0\"\nkeywords:\n- Confluence\n- Confluence Server\n- Confluence Data Center\n- Confluence DC\n- Atlassian\nhome: https://atlassian.github.io/data-center-helm-charts/\nicon: https://atlassian.github.io/data-center-helm-charts/icons/confluence.svg\nsources:\n- https://github.com/atlassian/data-center-helm-charts\n- https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/\ndeprecated: false\nannotations:\n  artifacthub.io/containsSecurityUpdates: \"true\"\n  artifacthub.io/changes: |-\n    - \"Update appVersions for DC apps (#1113)\"\n\ndependencies:\n- name: common\n  version: 1.2.7\n  repository: https://atlassian.github.io/data-center-helm-charts\n- name: opensearch\n  version: 3.5.0\n  repository: https://opensearch-project.github.io/helm-charts\n  condition: opensearch.enabled\n"
  },
  {
    "path": "src/main/charts/confluence/README.md",
    "content": "# confluence\n\n![Version: 2.0.13](https://img.shields.io/badge/Version-2.0.13-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 10.2.11](https://img.shields.io/badge/AppVersion-10.2.11-informational?style=flat-square)\n\nA chart for installing Confluence Data Center on Kubernetes\n\n**Homepage:** <https://atlassian.github.io/data-center-helm-charts/>\n\n## Source Code\n\n* <https://github.com/atlassian/data-center-helm-charts>\n* <https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/>\n\n## Requirements\n\nKubernetes: `>=1.21.x-0`\n\n| Repository | Name | Version |\n|------------|------|---------|\n| https://atlassian.github.io/data-center-helm-charts | common | 1.2.7 |\n| https://opensearch-project.github.io/helm-charts | opensearch | 3.5.0 |\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| additionalConfigMaps | list | `[]` | Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix for a ConfigMap name, fileName is used as subPath  |\n| additionalContainers | list | `[]` | Additional container definitions that will be added to all Confluence pods  |\n| additionalFiles | list | `[]` | Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into service container. Configuration details below (camelCase is important!): 'name'      - References existing ConfigMap or secret name. 'type'      - 'configMap' or 'secret' 'key'       - The file name. 'mountPath' - The destination directory in a container. VolumeMount and Volumes are added with this name and index position, for example; custom-config-0, keystore-2  |\n| additionalHosts | list | `[]` | Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file. https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ |\n| additionalInitContainers | list | `[]` | Additional initContainer definitions that will be added to all Confluence pods  |\n| additionalLabels | object | `{}` | Additional labels that should be applied to all resources  |\n| affinity | object | `{}` | Standard K8s affinities that will be applied to all Confluence pods  |\n| atlassianAnalyticsAndSupport.analytics.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a JSON which DC products will read and send analytics events to Atlassian data pipelines  |\n| atlassianAnalyticsAndSupport.helmValues.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a YAML file which can be optionally including to support.zip  |\n| confluence.accessLog.enabled | bool | `true` | Set to 'true' if access logging should be enabled.  |\n| confluence.accessLog.localHomeSubPath | string | `\"logs\"` | The subdirectory within the local-home volume where access logs should be stored.  |\n| confluence.accessLog.mountPath | string | `\"/opt/atlassian/confluence/logs\"` | The path within the Confluence container where the local-home volume should be mounted in order to capture access logs.  |\n| confluence.additionalAnnotations | object | `{}` | Defines additional annotations to the Confluence StateFulSet. This might be required when deploying using a GitOps approach |\n| confluence.additionalBundledPlugins | list | `[]` | Specifies a list of additional Confluence plugins that should be added to the Confluence container. Note plugins installed via this method will appear as bundled plugins rather than user plugins. These should be specified in the same manner as the 'additionalLibraries' property. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  NOTE: only .jar files can be loaded using this approach. OBR's can be extracted (unzipped) to access the associated .jar  An alternative to this method is to install the plugins via \"Manage Apps\" in the product system administration UI.  |\n| confluence.additionalCertificates | object | `{\"customCmd\":null,\"initContainer\":{\"resources\":{},\"securityContext\":{}},\"secretList\":[],\"secretName\":null}` | Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates  |\n| confluence.additionalCertificates.customCmd | string | `nil` | Custom command to be executed in the init container to import certificates  |\n| confluence.additionalCertificates.initContainer.resources | object | `{}` | Resources allocated to the import-certs init container  |\n| confluence.additionalCertificates.initContainer.securityContext | object | `{}` | Custom SecurityContext for the import-certs init container  |\n| confluence.additionalCertificates.secretList | list | `[]` | A list of secrets with their respective keys holding certificates to be added to the Java truststore. It is mandatory to specify which keys from secret data need to be mounted as files to the init container.  |\n| confluence.additionalCertificates.secretName | string | `nil` | Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.  |\n| confluence.additionalEnvironmentVariables | list | `[]` | Defines any additional environment variables to be passed to the Confluence container. See https://hub.docker.com/r/atlassian/confluence for supported variables.  |\n| confluence.additionalJvmArgs | list | `[]` | Specifies a list of additional arguments that can be passed to the Confluence JVM, e.g. system properties.  |\n| confluence.additionalLibraries | list | `[]` | Specifies a list of additional Java libraries that should be added to the Confluence container. Each item in the list should specify the name of the volume that contains the library, as well as the name of the library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which directory in the volume contains the library file. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  |\n| confluence.additionalPorts | list | `[]` | Defines any additional ports for the Confluence container.  |\n| confluence.additionalVolumeClaimTemplates | list | `[]` | Defines additional volumeClaimTemplates that should be applied to the Confluence pod. Note that this will not create any corresponding volume mounts; those needs to be defined in confluence.additionalVolumeMounts  |\n| confluence.additionalVolumeMounts | list | `[]` | Defines any additional volumes mounts for the Confluence container. These can refer to existing volumes, or new volumes can be defined via 'volumes.additional'.  |\n| confluence.clustering.enabled | bool | `false` | Set to 'true' if Data Center clustering should be enabled This will automatically configure cluster peer discovery between cluster nodes.  |\n| confluence.clustering.usePodNameAsClusterNodeName | bool | `true` | Set to 'true' if the K8s pod name should be used as the end-user-visible name of the Data Center cluster node.  |\n| confluence.containerSecurityContext | object | `{}` | Standard K8s field that holds security configurations that will be applied to a container. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/  |\n| confluence.forceConfigUpdate | bool | `false` | The Docker entrypoint.py generates application configuration on first start; not all of these files are regenerated on subsequent starts. By default, confluence.cfg.xml is generated only once. Set `forceConfigUpdate` to true to change this behavior.  |\n| confluence.hazelcastService.annotations | object | `{}` | Additional annotations to apply to the Hazelcast Service  |\n| confluence.hazelcastService.enabled | bool | `false` | Enable or disable an additional Hazelcast service that Confluence nodes can use to join a cluster. It is recommended to create a separate Hazelcast service if the Confluence service uses a LoadBalancer type (e.g., NLB), ensuring that the Hazelcast port is not exposed at all. |\n| confluence.hazelcastService.port | int | `5701` | The port on which the Confluence K8s Hazelcast Service will listen  |\n| confluence.hazelcastService.type | string | `\"ClusterIP\"` | The type of the Hazelcast K8s service to use for Confluence  |\n| confluence.jvmDebug.enabled | bool | `false` | Set to 'true' for remote debugging. Confluence JVM will be started with debugging port 5005 open. |\n| confluence.license.secretKey | string | `\"license-key\"` | The key in the K8s Secret that contains the Confluence license key  |\n| confluence.license.secretName | string | `nil` | The name of the K8s Secret that contains the Confluence license key. If specified, then the license will be automatically populated during Confluence setup. Otherwise, it will need to be provided via the browser after initial startup. An Example of creating a K8s secret for the license below: 'kubectl create secret generic <secret-name> --from-literal=license-key=<license> https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| confluence.livenessProbe.customProbe | object | `{}` | Custom livenessProbe to override the default tcpSocket probe  |\n| confluence.livenessProbe.enabled | bool | `false` | Whether to apply the livenessProbe check to pod.  |\n| confluence.livenessProbe.failureThreshold | int | `12` | The number of consecutive failures of the Confluence container liveness probe before the pod fails liveness checks.  |\n| confluence.livenessProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| confluence.livenessProbe.periodSeconds | int | `5` | How often (in seconds) the Confluence container liveness probe will run  |\n| confluence.livenessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| confluence.ports.hazelcast | int | `5701` | The port on which the Confluence container listens for Hazelcast traffic  |\n| confluence.ports.http | int | `8090` | The port on which the Confluence container listens for HTTP traffic  |\n| confluence.postStart | object | `{\"command\":null}` | PostStart is executed immediately after a container is created. However, there is no guarantee that the hook will execute before the container ENTRYPOINT. See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks  |\n| confluence.readinessProbe.customProbe | object | `{}` | Custom readinessProbe to override the default /status httpGet  |\n| confluence.readinessProbe.enabled | bool | `true` | Whether to apply the readinessProbe check to pod.  |\n| confluence.readinessProbe.failureThreshold | int | `6` | The number of consecutive failures of the Confluence container readiness probe before the pod fails readiness checks.  |\n| confluence.readinessProbe.initialDelaySeconds | int | `10` | The initial delay (in seconds) for the Confluence container readiness probe, after which the probe will start running.  |\n| confluence.readinessProbe.periodSeconds | int | `5` | How often (in seconds) the Confluence container readiness probe will run  |\n| confluence.readinessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| confluence.resources.container.requests.cpu | string | `\"2\"` | Initial CPU request by Confluence pod.  |\n| confluence.resources.container.requests.memory | string | `\"2G\"` | Initial Memory request by Confluence pod  |\n| confluence.resources.jvm.maxHeap | string | `\"1g\"` | The maximum amount of heap memory that will be used by the Confluence JVM  |\n| confluence.resources.jvm.minHeap | string | `\"1g\"` | The minimum amount of heap memory that will be used by the Confluence JVM  |\n| confluence.resources.jvm.reservedCodeCache | string | `\"256m\"` | The memory reserved for the Confluence JVM code cache  |\n| confluence.s3AttachmentsStorage.bucketName | string | `nil` |  |\n| confluence.s3AttachmentsStorage.bucketRegion | string | `nil` |  |\n| confluence.s3AttachmentsStorage.endpointOverride | string | `nil` | EXPERIMENTAL Feature! Override the default AWS API endpoint with a custom one, for example to use Minio as object storage https://min.io/  |\n| confluence.securityContext.fsGroup | int | `2002` | The GID used by the Confluence docker image GID will default to 2002 if not supplied and securityContextEnabled is set to true. This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Confluence container. However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260 |\n| confluence.securityContext.fsGroupChangePolicy | string | `\"OnRootMismatch\"` | fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod. This field only applies to volume types that support fsGroup controlled ownership and permissions. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods  |\n| confluence.securityContextEnabled | bool | `true` | Whether to apply security context to pod.  |\n| confluence.seraphConfig | object | `{\"autoLoginCookieAge\":\"1209600\",\"generateByHelm\":false}` | By default seraph-config.xml is generated in the container entrypoint from a template shipped with an official Confluence image. However, seraph-config.xml generation may fail if container is not run as root, which is a common case if Confluence is deployed to OpenShift.  |\n| confluence.seraphConfig.generateByHelm | bool | `false` | Mount seraph-config.xml as a ConfigMap. Override configuration elements if necessary  |\n| confluence.service.annotations | object | `{}` | Additional annotations to apply to the Service  |\n| confluence.service.contextPath | string | `nil` | The Tomcat context path that Confluence will use. The ATL_TOMCAT_CONTEXTPATH will be set automatically.  |\n| confluence.service.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| confluence.service.nodePort | string | `nil` | Only applicable if service.type is NodePort. NodePort for Confluence service  |\n| confluence.service.port | int | `80` | The port on which the Confluence K8s Service will listen  |\n| confluence.service.sessionAffinity | string | `\"None\"` | Session affinity type. If you want to make sure that connections from a particular client are passed to the same pod each time, set sessionAffinity to ClientIP. See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity  |\n| confluence.service.sessionAffinityConfig | object | `{\"clientIP\":{\"timeoutSeconds\":null}}` | Session affinity configuration  |\n| confluence.service.sessionAffinityConfig.clientIP.timeoutSeconds | string | `nil` | Specifies the seconds of ClientIP type session sticky time. The value must be > 0 && <= 86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).  |\n| confluence.service.type | string | `\"ClusterIP\"` | The type of K8s service to use for Confluence  |\n| confluence.session.autologinCookieAge | string | `nil` | The maximum time a user can remain logged-in with 'Remember Me'. Defaults to 1209600; two weeks, in seconds  |\n| confluence.session.timeout | string | `nil` | User session timeout. Set to 30 minutes in web.xml  |\n| confluence.setPermissions | bool | `true` | Boolean to define whether to set local home directory permissions on startup of Confluence container. Set to 'false' to disable this behaviour.  |\n| confluence.shutdown.command | string | `\"/shutdown-wait.sh\"` | By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/), using a script supplied by the Docker image. If any other shutdown behaviour is needed it can be achieved by overriding this value. Note that the shutdown command needs to wait for the application shutdown completely before exiting; see [the default command](https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/src/master/shutdown-wait.sh) for details.  |\n| confluence.shutdown.terminationGracePeriodSeconds | int | `25` | The termination grace period for pods during shutdown. This should be set to the Confluence internal grace period (default 20 seconds), plus a small buffer to allow the JVM to fully terminate.  |\n| confluence.startupProbe.enabled | bool | `false` | Whether to apply the startupProbe check to pod.  |\n| confluence.startupProbe.failureThreshold | int | `120` | The number of consecutive failures of the Confluence container startup probe before the pod fails startup checks.  |\n| confluence.startupProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| confluence.startupProbe.periodSeconds | int | `5` | How often (in seconds) the Confluence container startup probe will run  |\n| confluence.tomcatConfig | object | `{\"acceptCount\":\"100\",\"accessLogMaxDays\":\"-1\",\"accessLogPattern\":\"%h %{X-AUSERNAME}o %t &quot;%r&quot; %s %b %D %U %I &quot;%{User-Agent}i&quot;\",\"connectionTimeout\":\"20000\",\"customServerXml\":\"\",\"debug\":\"0\",\"enableLookups\":\"false\",\"generateByHelm\":false,\"maxHttpHeaderSize\":\"8192\",\"maxThreads\":\"100\",\"mgmtPort\":\"8000\",\"minSpareThreads\":\"10\",\"port\":\"8090\",\"protocol\":\"org.apache.coyote.http11.Http11NioProtocol\",\"proxyInternalIps\":null,\"proxyName\":null,\"proxyPort\":null,\"redirectPort\":\"8443\",\"requestAttributesEnabled\":\"false\",\"scheme\":null,\"secure\":null,\"stuckThreadDetectionValveThreshold\":\"60\",\"trustedProxies\":null,\"uriEncoding\":\"UTF-8\"}` | By default Tomcat's server.xml is generated in the container entrypoint from a template shipped with an official Confluence image. However, server.xml generation may fail if container is not run as root, which is a common case if Confluence is deployed to OpenShift.  |\n| confluence.tomcatConfig.customServerXml | string | `\"\"` | Custom server.xml to be mounted into /opt/atlassian/confluence/conf  |\n| confluence.tomcatConfig.generateByHelm | bool | `false` | Mount server.xml as a ConfigMap. Override configuration elements if necessary  |\n| confluence.topologySpreadConstraints | list | `[]` | Defines topology spread constraints for Confluence pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| confluence.tunnel | object | `{\"additionalConnector\":{\"URIEncoding\":\"UTF-8\",\"acceptCount\":\"10\",\"connectionTimeout\":\"20000\",\"enableLookups\":\"false\",\"maxThreads\":\"50\",\"minSpareThreads\":\"10\",\"port\":null,\"secure\":false}}` | Configure additional Tomcat connector to set up tunnel. Define the connector port and optional additional attributes. When 'tunnel.additionalConnector.port' is defined, an additional connector is added to server.xml and '-Dsecure.tunnel.upstream.port=<port_number>' is added to JVM args  |\n| confluence.umask | string | `\"0022\"` | The umask used by the Confluence process when it creates new files. The default is 0022. This gives the new files:  - read/write permissions for the Confluence user  - read permissions for everyone else.  |\n| confluence.useHelmReleaseNameAsContainerName | bool | `false` | Whether the main container should acquire helm release name. By default the container name is `confluence` which corresponds to the name of the Helm Chart.  |\n| database.credentials.passwordSecretKey | string | `\"password\"` | The key ('password') in the Secret used to store the database login password  |\n| database.credentials.secretName | string | `nil` | from-literal=password=<password>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| database.credentials.usernameSecretKey | string | `\"username\"` | The key ('username') in the Secret used to store the database login username  |\n| database.type | string | `nil` | The database type that should be used. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Valid values include: * 'postgresql' * 'mysql' * 'oracle' * 'mssql' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasetype  |\n| database.url | string | `nil` | The jdbc URL of the database. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Example URLs include: * 'jdbc:postgresql://<dbhost>:5432/<dbname>' * 'jdbc:mysql://<dbhost>/<dbname>' * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>' * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl  |\n| fluentd.command | string | `nil` | The command used to start Fluentd. If not supplied the default command will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"  Note: The custom command can be free-form, however pay particular attention to the process that should ultimately be left running in the container. This process should be invoked with 'exec' so that signals are appropriately propagated to it, for instance SIGTERM. An example of how such a command may look is: \"<command 1> && <command 2> && exec <primary command>\" |\n| fluentd.customConfigFile | bool | `false` | Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default) should be used for Fluentd. If enabled this config must be supplied via the 'fluentdCustomConfig' property below. If your custom config forces fluentd to run in a server mode, add `-Datlassian.logging.cloud.enabled=true` to `confluence.AdditionalJvmArgs` stanza in values file  |\n| fluentd.elasticsearch.enabled | bool | `true` | Set to 'true' if Fluentd should send all log events to an Elasticsearch service.  |\n| fluentd.elasticsearch.hostname | string | `\"elasticsearch\"` | The hostname of the Elasticsearch service that Fluentd should send logs to.  |\n| fluentd.elasticsearch.indexNamePrefix | string | `\"confluence\"` | The prefix of the Elasticsearch index name that will be used  |\n| fluentd.enabled | bool | `false` | Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod  |\n| fluentd.extraVolumes | list | `[]` | Specify custom volumes to be added to Fluentd container (e.g. more log sources)  |\n| fluentd.fluentdCustomConfig | object | `{}` | Custom fluent.conf file  |\n| fluentd.httpPort | int | `9880` | The port on which the Fluentd sidecar will listen  |\n| fluentd.imageRepo | string | `\"fluent/fluentd-kubernetes-daemonset\"` | The Fluentd sidecar image repository  |\n| fluentd.imageTag | string | `\"v1.11.5-debian-elasticsearch7-1.2\"` | The Fluentd sidecar image tag  |\n| fluentd.resources | object | `{}` | Resources requests and limits for fluentd sidecar container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| gateway.additionalRules | list | `[]` | Advanced routing rules. Use this for complex routing scenarios like header-based routing, traffic splitting, or multiple backends. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule  |\n| gateway.annotations | object | `{}` | Annotations to add to the HTTPRoute resource.  |\n| gateway.create | bool | `false` | Set to 'true' if an HTTPRoute Resource should be created. This depends on a pre-provisioned Gateway API controller being available and a Gateway resource. Cannot be enabled if ingress.create is true.  |\n| gateway.filters | list | `[]` | HTTP filters to apply to requests. Can be used to add/remove headers, perform redirects, or rewrite URLs. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter  |\n| gateway.hostnames | list | `[]` | The hostnames that should be routed to Confluence. At least one hostname is required when gateway.create is true. Setting hostnames activates gateway mode for product configuration even when gateway.create is false, allowing use with a pre-existing Gateway or external proxy. The first entry is used as the canonical hostname for base URL, proxy settings, and NOTES output — list the primary/public hostname first.  |\n| gateway.https | bool | `true` | Whether users access the application over HTTPS. This does not configure TLS on the Gateway or load balancer — it must match how traffic is actually routed to the application.  |\n| gateway.labels | object | `{}` | Labels to add to the HTTPRoute resource.  |\n| gateway.parentRefs | list | `[]` | Reference to the parent Gateway resource. Supports any standard parentRef fields (name, namespace, sectionName, etc.). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference  |\n| gateway.path | string | `nil` | The base path for routing. When empty, falls back to the product's service.contextPath (same behavior as ingress). Set explicitly to override, e.g. \"/confluence\".  |\n| gateway.pathType | string | `\"PathPrefix\"` | Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\". PathPrefix is recommended for most use cases.  |\n| gateway.timeouts | object | `{\"backendRequest\":\"60s\",\"request\":\"60s\"}` | Timeout configuration for HTTPRoute rules. Note: when migrating from Ingress, these replace proxyReadTimeout and proxySendTimeout. There is no Gateway API equivalent for proxyConnectTimeout or maxBodySize — those require controller-specific policies (e.g. Envoy Gateway BackendTrafficPolicy). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts  |\n| hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| image.pullPolicy | string | `\"IfNotPresent\"` | Image pull policy  |\n| image.repository | string | `\"atlassian/confluence\"` | The Confluence Docker image to use https://hub.docker.com/r/atlassian/confluence  |\n| image.tag | string | `\"\"` | The docker image tag to be used - defaults to the Chart appVersion  |\n| ingress.additionalPaths | list | `[]` | Additional paths to be added to the Ingress resource to point to different backend services  |\n| ingress.annotations | object | `{}` | The custom annotations that should be applied to the Ingress Resource. If using an ingress-nginx controller be sure that the annotations you add here are compatible with those already defined in the 'ingess.yaml' template  |\n| ingress.className | string | `\"nginx\"` | The class name used by the ingress controller if it's being used.  Please follow documentation of your ingress controller. If the cluster contains multiple ingress controllers, this setting allows you to control which of them is used for Atlassian application traffic.  |\n| ingress.create | bool | `false` | Set to 'true' if an Ingress Resource should be created. This depends on a pre-provisioned Ingress Controller being available.  |\n| ingress.host | string | `nil` | The fully-qualified hostname (FQDN) of the Confluence instance. This value is used to configure the product's proxy settings and, when ingress.create is true, the Ingress resource routing rules.  |\n| ingress.https | bool | `true` | Whether users access the application over HTTPS. Set to 'false' if not using TLS, e.g. when reaching the service via localhost port-forwarding.  |\n| ingress.maxBodySize | string | `\"250m\"` | The max body size to allow. Requests exceeding this size will result in an HTTP 413 error being returned to the client.  |\n| ingress.nginx | bool | `true` | Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx' controller. https://kubernetes.github.io/ingress-nginx/  This will populate the Ingress Resource with annotations that are specific to the K8s ingress-nginx controller. Set to 'false' if a different controller is to be used, in which case the appropriate annotations for that controller must be specified below under 'ingress.annotations'.  |\n| ingress.openShiftRoute | bool | `false` | Set to true if you want to create an OpenShift Route instead of an Ingress  |\n| ingress.path | string | `nil` | The base path for the application, e.g. '/confluence'. Defaults to 'confluence.service.contextPath'.  |\n| ingress.proxyConnectTimeout | int | `60` | Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.  |\n| ingress.proxyReadTimeout | int | `60` | Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.  |\n| ingress.proxySendTimeout | int | `60` | Sets a timeout for transmitting a request to the proxied server. The timeout is set only between two successive write operations, not for the transmission of the whole request. If the proxied server does not receive anything within this time, the connection is closed.  |\n| ingress.routeHttpHeaders | object | `{}` | routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only  |\n| ingress.tlsSecretName | string | `nil` | The name of the K8s Secret that contains the TLS private key and corresponding certificate. When utilised, TLS termination occurs at the ingress point where traffic to the Service, and it's Pods is in plaintext.  Usage is optional and depends on your use case. The Ingress Controller itself can also be configured with a TLS secret for all Ingress Resources. https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets https://kubernetes.io/docs/concepts/services-networking/ingress/#tls  |\n| monitoring.exposeJmxMetrics | bool | `false` | Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter  |\n| monitoring.fetchJmxExporterJar | bool | `true` | Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar to shared home and provide an absolute path in jmxExporterCustomJarLocation  |\n| monitoring.grafana.createDashboards | bool | `false` | Create ConfigMaps with Grafana dashboards  |\n| monitoring.grafana.dashboardAnnotations | object | `{}` | Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage  |\n| monitoring.grafana.dashboardLabels | object | `{}` | Label selector for Grafana dashboard importer sidecar  |\n| monitoring.jmxExporterCustomConfig | object | `{}` | Custom JMX config with the rules  |\n| monitoring.jmxExporterCustomJarLocation | string | `nil` | Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home  |\n| monitoring.jmxExporterImageRepo | string | `\"bitnamilegacy/jmx-exporter\"` | Image repository with jmx_exporter jar  |\n| monitoring.jmxExporterImageTag | string | `\"0.18.0\"` |  |\n| monitoring.jmxExporterInitContainer | object | `{\"customSecurityContext\":{},\"jmxJarLocation\":null,\"resources\":{},\"runAsRoot\":true}` | JMX exporter init container configuration  |\n| monitoring.jmxExporterInitContainer.customSecurityContext | object | `{}` | Custom SecurityContext for the jmx exporter init container  |\n| monitoring.jmxExporterInitContainer.jmxJarLocation | string | `nil` | The location of the JMX exporter jarfile in the JMX exporter image Leave blank for default bitnami image  |\n| monitoring.jmxExporterInitContainer.resources | object | `{}` | Resources requests and limits for the JMX exporter init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| monitoring.jmxExporterInitContainer.runAsRoot | bool | `true` | Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume. Set to false if running containers as root is not allowed in the cluster.  |\n| monitoring.jmxExporterPort | int | `9999` | Port number on which metrics will be available  |\n| monitoring.jmxExporterPortType | string | `\"ClusterIP\"` | JMX exporter port type  |\n| monitoring.jmxServiceAnnotations | object | `{}` | Annotations added to the jmx service  |\n| monitoring.serviceMonitor.create | bool | `false` | Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.  |\n| monitoring.serviceMonitor.prometheusLabelSelector | object | `{}` | ServiceMonitorSelector of the prometheus instance.  |\n| monitoring.serviceMonitor.scrapeIntervalSeconds | int | `30` | Scrape interval for the JMX service.  |\n| monitoring.serviceMonitor.scrapeTimeoutSeconds | int | `20` | How long until a scrape request times out. It cannot be greater than the scrape interval.  |\n| nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Confluence pods  |\n| opensearch.credentials.createSecret | bool | `true` | Let the Helm chart create a secret with an auto generated initial admin password  |\n| opensearch.credentials.existingSecretRef | object | `{\"name\":null}` | Use an existing secret with the key OPENSEARCH_INITIAL_ADMIN_PASSWORD holding the initial admin password  |\n| opensearch.enabled | bool | `false` | Deploy OpenSearch Helm chart and Configure Confluence to use it as a search platform  |\n| opensearch.envFrom[0].secretRef.name | string | `\"opensearch-initial-password\"` | If using a pre-created secret, make sure to change secret name to match opensearch.credentials.existingSecretRef.name  |\n| opensearch.extraEnvs[0].name | string | `\"plugins.security.ssl.http.enabled\"` |  |\n| opensearch.extraEnvs[0].value | string | `\"false\"` |  |\n| opensearch.persistence.size | string | `\"10Gi\"` |  |\n| opensearch.resources.requests.cpu | int | `1` |  |\n| opensearch.resources.requests.memory | string | `\"1Gi\"` |  |\n| opensearch.singleNode | bool | `true` | OpenSearch helm specific values, see: https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch/values.yaml  |\n| openshift.runWithRestrictedSCC | bool | `false` | When set to true, the containers will run with a restricted Security Context Constraint (SCC). See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server configuration files as ConfigMaps.  |\n| ordinals | object | `{\"enabled\":false,\"start\":0}` | Set a custom start ordinal number for the K8s stateful set. Note that this depends on the StatefulSetStartOrdinal K8s feature gate, which has entered beta state with K8s version 1.27.  |\n| ordinals.enabled | bool | `false` | Enable only if StatefulSetStartOrdinal K8s feature gate is available.  |\n| ordinals.start | int | `0` | Set start ordinal to a positive integer, defaulting to 0.  |\n| podAnnotations | object | `{}` | Custom annotations that will be applied to all Confluence pods  |\n| podDisruptionBudget | object | `{\"annotations\":{},\"enabled\":false,\"labels\":{},\"maxUnavailable\":null,\"minAvailable\":null}` | PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.  |\n| podLabels | object | `{}` | Custom labels that will be applied to all Confluence pods  |\n| priorityClassName | string | `nil` | Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster. For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| replicaCount | int | `1` | The initial number of Confluence pods that should be started at deployment time. Note that Confluence requires manual configuration via the browser post deployment after the first pod is deployed. This configuration must be completed before scaling up additional pods. As such this value should always be kept as 1, but can be altered once manual configuration is complete.  |\n| schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Confluence pods. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| serviceAccount.annotations | object | `{}` | Annotations to add to the ServiceAccount (if created)  |\n| serviceAccount.clusterRole.create | bool | `false` | Set to 'true' if a ClusterRole should be created, or 'false' if it already exists.  |\n| serviceAccount.clusterRole.name | string | `nil` | The name of the ClusterRole to be used. If not specified, but the \"serviceAccount.clusterRole.create\" flag is set to 'true', then the ClusterRole name will be auto-generated.  |\n| serviceAccount.clusterRoleBinding.create | bool | `false` | Set to 'true' if a ClusterRoleBinding should be created, or 'false' if it already exists.  |\n| serviceAccount.clusterRoleBinding.name | string | `nil` | The name of the ClusterRoleBinding to be created. If not specified, but the \"serviceAccount.clusterRoleBinding.create\" flag is set to 'true', then the ClusterRoleBinding name will be auto-generated.  |\n| serviceAccount.create | bool | `true` | Set to 'true' if a ServiceAccount should be created, or 'false' if it already exists.  |\n| serviceAccount.eksIrsa.roleArn | string | `nil` |  |\n| serviceAccount.imagePullSecrets | list | `[]` | For Docker images hosted in private registries, define the list of image pull secrets that should be utilized by the created ServiceAccount https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod  |\n| serviceAccount.name | string | `nil` | The name of the ServiceAccount to be used by the pods. If not specified, but the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name will be auto-generated, otherwise the 'default' ServiceAccount will be used. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server  |\n| serviceAccount.role.create | bool | `true` | Create a role for Hazelcast client with privileges to get and list pods and endpoints in the namespace. Set to false if you need to create a Role and RoleBinding manually  |\n| serviceAccount.roleBinding | object | `{\"create\":true}` | Grant permissions defined in Role (list and get pods and endpoints) to a service account.  |\n| synchrony.additionalAnnotations | string | `nil` | Defines additional annotations to the Synchrony StateFulSet. This might be required when deploying using a GitOps approach |\n| synchrony.additionalCertificates | object | `{\"customCmd\":null,\"initContainer\":{\"resources\":{},\"securityContext\":{}},\"secretList\":[],\"secretName\":null}` | Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates  |\n| synchrony.additionalCertificates.customCmd | string | `nil` | Custom command to be executed in the init container to import certificates  |\n| synchrony.additionalCertificates.initContainer.resources | object | `{}` | Resources allocated to the import-certs init container  |\n| synchrony.additionalCertificates.initContainer.securityContext | object | `{}` | Custom SecurityContext for the import-certs init container  |\n| synchrony.additionalCertificates.secretList | list | `[]` | A list of secrets with their respective keys holding certificates to be added to the Java truststore. It is mandatory to specify which keys from secret data need to be mounted as files to the init container.  |\n| synchrony.additionalCertificates.secretName | string | `nil` | Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.  |\n| synchrony.additionalEnvironmentVariables | list | `[]` | Additional environment variables passed to synchrony container |\n| synchrony.additionalJvmArgs | list | `[]` | Specifies a list of additional arguments that can be passed to the Synchrony JVM, e.g. system properties.  |\n| synchrony.additionalLibraries | list | `[]` | Specifies a list of additional Java libraries that should be added to the Synchrony container. Each item in the list should specify the name of the volume that contains the library, as well as the name of the library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which directory in the volume contains the library file. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  |\n| synchrony.additionalPorts | list | `[]` | Defines any additional ports for the Synchrony container.  |\n| synchrony.additionalVolumeMounts | list | `[]` | Defines any additional volumes mounts for the Synchrony container. These can refer to existing volumes, or new volumes can be defined via 'volumes.additionalSynchrony'.  |\n| synchrony.affinity | object | `{}` | Standard K8s affinities that will be applied to all Synchrony pods  |\n| synchrony.containerSecurityContext | object | `{}` | Standard K8s field that holds security configurations that will be applied to a container. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/  |\n| synchrony.enabled | bool | `false` | Set to 'true' if Synchrony (i.e. collaborative editing) should be enabled. This will result in a separate StatefulSet and Service to be created for Synchrony. If disabled, then collaborative editing will be disabled in Confluence. |\n| synchrony.hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| synchrony.ingress | object | `{\"annotations\":null,\"path\":null,\"pathType\":null}` | If 'synchrony.ingress.path' is defined, a dedicated Synchrony ingress object is created. This is useful if you need to deploy multiple instances of Confluence with Synchrony enabled using the same Ingress hostname and different synchrony paths  |\n| synchrony.ingress.annotations | string | `nil` | Custom annotations applied to Synchrony ingress  |\n| synchrony.ingress.path | string | `nil` | Ingress path applied to Synchrony ingress  |\n| synchrony.ingress.pathType | string | `nil` | Defaults to Prefix, but can be ImplementationSpecific if rewrite target is applied  |\n| synchrony.nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Synchrony pods  |\n| synchrony.podAnnotations | object | `{}` | Custom annotations that will be applied to all Synchrony pods. When undefined, default to '.Values.podAnnotations' which are Confluence pod annotations (if defined) |\n| synchrony.ports.hazelcast | int | `5701` | The port on which the Synchrony container listens for Hazelcast traffic  |\n| synchrony.ports.http | int | `8091` | The port on which the Synchrony container listens for HTTP traffic  |\n| synchrony.priorityClassName | string | `nil` | Priority class for the Synchrony pods. The PriorityClass with this name needs to be available in the cluster. If not specified the default priorityClassName will be used. For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| synchrony.readinessProbe.failureThreshold | int | `10` | The number of consecutive failures of the Synchrony container readiness probe before the pod fails readiness checks.  |\n| synchrony.readinessProbe.healthcheckPath | string | `\"/synchrony/heartbeat\"` | The healthcheck path to check against for the Synchrony container useful when configuring behind a reverse-proxy or loadbalancer https://confluence.atlassian.com/confkb/cannot-enable-collaborative-editing-on-synchrony-cluster-962962742.html  |\n| synchrony.readinessProbe.initialDelaySeconds | int | `5` | The initial delay (in seconds) for the Synchrony container readiness probe, after which the probe will start running.  |\n| synchrony.readinessProbe.periodSeconds | int | `1` | How often (in seconds) the Synchrony container readiness probe will run  |\n| synchrony.replicaCount | int | `1` | Number of Synchrony pods  |\n| synchrony.resources.container.requests.cpu | string | `\"2\"` | Initial CPU request by Synchrony pod. Because the container CPU request value is used in -XX:ActiveProcessorCount argument to Synchrony JVM  only integers are allowed, e.g. 1, 2, 3 etc. If you want to have a small CPU claim, set it to 30m, 50m, etc. Any container cpu request value containing `m` character will be converted to -XX:ActiveProcessorCount=1  See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#meaning-of-cpu  |\n| synchrony.resources.container.requests.memory | string | `\"2.5G\"` | Initial Memory request Synchrony pod  |\n| synchrony.resources.jvm.maxHeap | string | `\"2g\"` | The minimum amount of heap memory that will be used by the Synchrony JVM  |\n| synchrony.resources.jvm.minHeap | string | `\"1g\"` | The maximum amount of heap memory that will be used by the Synchrony JVM  |\n| synchrony.resources.jvm.stackSize | string | `\"2048k\"` | The memory allocated for the Synchrony stack  |\n| synchrony.schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Synchrony pods. If not specified, the default schedulerName will be used. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| synchrony.securityContext.fsGroup | int | `2002` | The GID used by the Confluence docker image GID will default to 2002 if not supplied and securityContextEnabled is set to true. This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Confluence container. However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260 |\n| synchrony.securityContextEnabled | bool | `true` |  |\n| synchrony.service.annotations | object | `{}` | Annotations to apply to Synchrony Service  |\n| synchrony.service.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| synchrony.service.nodePort | string | `nil` | Only applicable if service.type is NodePort. NodePort for Synchrony service  |\n| synchrony.service.port | int | `80` | The port on which the Synchrony K8s Service will listen  |\n| synchrony.service.type | string | `\"ClusterIP\"` | The type of K8s service to use for Synchrony  |\n| synchrony.service.url | string | `nil` | Complete URL of Synchrony Service (i.e. https://public.mydomain.com/synchrony). If left empty, it is calculated from ingress.https and ingress.host |\n| synchrony.setPermissions | bool | `true` | Boolean to define whether to set synchrony home directory permissions on startup of Synchrony container. Set to 'false' to disable this behaviour.  |\n| synchrony.shutdown.terminationGracePeriodSeconds | int | `25` | The termination grace period for pods during shutdown. This should be set to the Synchrony internal grace period (default 20 seconds), plus a small buffer to allow the JVM to fully terminate. |\n| synchrony.tolerations | list | `[]` | Standard K8s tolerations that will be applied to all Synchrony pods  |\n| synchrony.topologySpreadConstraints | list | `[]` | Defines topology spread constraints for Synchrony pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| testPods | object | `{\"affinity\":{},\"annotations\":{},\"image\":{\"permissionsTestContainer\":\"debian:stable-slim\",\"statusTestContainer\":\"alpine:latest\"},\"labels\":{},\"nodeSelector\":{},\"resources\":{},\"schedulerName\":null,\"tolerations\":[]}` | Metadata and pod spec for pods started in Helm tests  |\n| tolerations | list | `[]` | Standard K8s tolerations that will be applied to all Confluence pods  |\n| updateStrategy | object | `{}` | StatefulSet update strategy. When unset defaults to Rolling update. See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets  |\n| volumes.additional | list | `[]` | Defines additional volumes that should be applied to all Confluence pods. Note that this will not create any corresponding volume mounts; those needs to be defined in confluence.additionalVolumeMounts  |\n| volumes.additionalSynchrony | list | `[]` | Defines additional volumes that should be applied to all Synchrony pods. Note that this will not create any corresponding volume mounts; those needs to be defined in synchrony.additionalVolumeMounts  |\n| volumes.defaultPermissionsMode | int | `484` | Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511 Typically overridden in volumes from Secrets and ConfigMaps to make mounted files executable  |\n| volumes.localHome.customVolume | object | `{}` | Static provisioning of local-home using K8s PVs and PVCs  NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for pods is not recommended. Dynamic provisioning described above is the prescribed approach.  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the local-home volume(s). If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static  |\n| volumes.localHome.mountPath | string | `\"/var/atlassian/application-data/confluence\"` | Specifies the path in the Confluence container to which the local-home volume will be mounted.  |\n| volumes.localHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically created for each pod based on the 'StorageClassName' supplied below.  |\n| volumes.localHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests for the local-home volume claims.  |\n| volumes.localHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the local-home volume claim.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted | string | `nil` | Configures the volume retention behavior that applies when the StatefulSet is deleted.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled | string | `nil` | Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.  |\n| volumes.localHome.subPath | string | `nil` | Specifies the sub-directory of the local-home volume that will be mounted in to the Confluence container.  |\n| volumes.sharedHome.customVolume | object | `{}` | Static provisioning of shared-home using K8s PVs and PVCs  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the shared-home volume. If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/  |\n| volumes.sharedHome.mountPath | string | `\"/var/atlassian/application-data/shared-home\"` | Specifies the path in the Confluence container to which the shared-home volume will be mounted.  |\n| volumes.sharedHome.nfsPermissionFixer.command | string | `nil` | By default, the fixer will change the group ownership of the volume's root directory to match the Confluence container's GID (2002), and then ensures the directory is group-writeable. If this is not the desired behaviour, command used can be specified here.  |\n| volumes.sharedHome.nfsPermissionFixer.enabled | bool | `true` | If 'true', this will alter the shared-home volume's root directory so that Confluence can write to it. This is a workaround for a K8s bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260  |\n| volumes.sharedHome.nfsPermissionFixer.imageRepo | string | `\"alpine\"` | Image repository for the permission fixer init container. Defaults to alpine  |\n| volumes.sharedHome.nfsPermissionFixer.imageTag | string | `\"latest\"` | Image tag for the permission fixer init container. Defaults to latest  |\n| volumes.sharedHome.nfsPermissionFixer.mountPath | string | `\"/shared-home\"` | The path in the K8s initContainer where the shared-home volume will be mounted  |\n| volumes.sharedHome.nfsPermissionFixer.resources | object | `{}` | Resources requests and limits for nfsPermissionFixer init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| volumes.sharedHome.persistentVolumeClaim.accessModes | list | `[\"ReadWriteMany\"]` | Specify the access modes that should be used for the 'shared-home' volume claim. Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations. Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes  |\n| volumes.sharedHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically created for shared-home based on the 'StorageClassName' supplied below.  |\n| volumes.sharedHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests limits for the shared-home volume claims.  |\n| volumes.sharedHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the 'shared-home' volume claim.  |\n| volumes.sharedHome.subPath | string | `nil` | Specifies the sub-directory of the shared-home volume that will be mounted in to the Confluence container.  |\n| volumes.synchronyHome.customVolume | object | `{}` | Static provisioning of synchrony-home using K8s PVs and PVCs  NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for pods is not recommended. Dynamic provisioning described above is the prescribed approach.  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the synchrony-home volume(s). If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static  |\n| volumes.synchronyHome.mountPath | string | `\"/var/atlassian/application-data/confluence\"` | Specifies the path in the Synchrony container to which the synchrony-home volume will be mounted.  |\n| volumes.synchronyHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically created for each pod based on the 'StorageClassName' supplied below.  |\n| volumes.synchronyHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests for the synchrony-home volume claims.  |\n| volumes.synchronyHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the synchrony-home volume claim.  |\n| volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenDeleted | string | `nil` | Configures the volume retention behavior that applies when the StatefulSet is deleted.  |\n| volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenScaled | string | `nil` | Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/main/charts/confluence/grafana-dashboards/cache-clearing.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {},\n      \"description\": \"Indicates that all caches are being flushed by a plugin. This is an operation which should not be triggered by external plugins and can lead to product slowdowns\\n\\n \\n\\nDetermine who invoked this, this can be determined by the invokerPluginKey tag. Reach out to the app vendor and flag this issue to them. \\n\\nAdditionally, the className tag refers to the implementation of CacheManager invoked and may be helpful. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"com.atlassian.diagnostics.noisy-neighbour-plugin\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cacheManager\\\",name=\\\"flushAll\\\"}[5m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Flush All Caches Rate (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Indicates that a single cache has all of its entries removed. This may or may not cause slowdowns in products or plugins. \\n\\nCheck the frequency at which these cache removals occur and from which product. You can find out what plugin created the cache using the pluginKeyAtCreation tag. Additionally, the className tag refers to the implementation of Cache, which may be helpful. If the frequency is excessive, consider reaching out to the app vendor and flag this issue to them. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (tag_pluginKeyAtCreation) (rate(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cache\\\",name=\\\"removeAll\\\"}[5m]))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Remove all entries rate (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measure how many times a plugin has been disabled/enabled since uptime.\\n\\nSome caches are cleared when plugin is disabled/ enabled and this may have a short term performance impact. To understand what has been disabled/enabled, check the Universal Plugin Manager audit logs.\\nhttps://confluence.atlassian.com/upm/viewing-installed-apps-273875714.html\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"plugin\\\",name=\\\"counter\\\",category01=\\\"enabled\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"enabled\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        },\n        {\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"plugin\\\",name=\\\"counter\\\",category01=\\\"disabled\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"disabled\",\n          \"refId\": \"B\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Plugin enabled/disabled events (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Indicates that a single entry in a cache has been reset. This may or may not cause slowdowns in products or plugins. \\n\\nCheck the frequency at which these cache resets occur and from which product. You can find out what plugin created the cache using the pluginKeyAtCreation tag. Additionally, the className tag refers to the implementation of CacedReference, which may be helpful. If the frequency is excessive, consider reaching out to the app vendor and flag this issue to them. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (tag_pluginKeyAtCreation) (rate(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cachedReference\\\",name=\\\"reset\\\"}[5m]))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Reset cache rate (cluster wide)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"10s\",\n  \"schemaVersion\": 36,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"confluence\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Confluence Cache Clearing\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/confluence/grafana-dashboards/cluster-locks.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"expr\": \"\",\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"iconSize\": 0,\n        \"lineColor\": \"\",\n        \"name\": \"Annotations & Alerts\",\n        \"query\": \"\",\n        \"showLine\": false,\n        \"step\": \"\",\n        \"tagKeys\": \"\",\n        \"tagsField\": \"\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"textField\": \"\",\n        \"textFormat\": \"\",\n        \"titleFormat\": \"\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657606892935,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was held for. Used by Confluence in a clustered environment.\\n\\nLock contention can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue. It maybe normal to have a thread holding onto a lock for a long time, if there aren\\u2019t any threads waiting for the lock - see db.cluster.lock.waited.duration to find out if there are any threads waiting for the lock.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance,tag_pluginKeyAtCreation,tag_implementation,tag_lockName) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Cluster Locks Held (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was held for. Used by Confluence in a clustered environment.\\n\\nLock contention can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue. It maybe normal to have a thread holding onto a lock for a long time, if there aren\\u2019t any threads waiting for the lock - see db.cluster.lock.waited.duration to find out if there are any threads waiting for the lock.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 7,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance,tag_pluginKeyAtCreation,tag_implementation,tag_lockName) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Locks Waiting (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was held for. Used by Confluence in a clustered environment.\\n\\nLock contention can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue. It maybe normal to have a thread holding onto a lock for a long time, if there aren\\u2019t any threads waiting for the lock - see db.cluster.lock.waited.duration to find out if there are any threads waiting for the lock.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 5,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without(instance,implementation, tag_lockName) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_pluginKeyAtCreation}} \",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Cluster Locks Held (over time - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was waited for. Used by Confluence in a clustered environment.\\n\\nIf there many threads waiting for the same lock, it can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 9\n      },\n      \"id\": 6,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without(instance,implementation, tag_lockName) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Locks Waiting (over time - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"* Average heavily weights timers from the last 5 minutes\\n\\nMeasures how long a database cluster lock was held for. Used by Confluence in a clustered environment.\\n\\nIf there many threads waiting for the same lock, it can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"lock name\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 350\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Count\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 211\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"plugin key\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 383\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Avg\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 242\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 3,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"99th Percentile\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max by (tag_lockName, tag_pluginKeyAtCreation)  (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Most locks held (cluster wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value #A\": false,\n              \"category00\": true,\n              \"category01\": true,\n              \"category02\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_lockName\": false,\n              \"tag_pluginKeyAtCreation\": false\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value #A\": \"Avg* time\",\n              \"Value #B\": \"Count\",\n              \"Value #C\": \"99th Percentile time\",\n              \"tag_lockName\": \"lock name\",\n              \"tag_pluginKeyAtCreation\": \"plugin key\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"* Average heavily weights timers from the last 5 minutes\\nMeasures how long a database cluster lock was waited for. Used by Confluence in a clustered environment.\\n\\nIf there many threads waiting for the same lock, it can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"lock name\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 518\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Count\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 79\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"plugin key\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 278\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Avg\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 121\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 18\n      },\n      \"id\": 11,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"99th Percentile\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max by (tag_lockName, tag_pluginKeyAtCreation)  (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Most locks waited (cluster wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value #A\": false,\n              \"category00\": true,\n              \"category01\": true,\n              \"category02\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_lockName\": false,\n              \"tag_pluginKeyAtCreation\": false\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value #A\": \"Avg* time\",\n              \"Value #B\": \"Count\",\n              \"Value #C\": \"99th Percentile time\",\n              \"tag_lockName\": \"lock name\",\n              \"tag_pluginKeyAtCreation\": \"plugin key\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 36,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"confluence\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Confluence Cluster Locks\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/confluence/grafana-dashboards/database-load.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"expr\": \"\",\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"iconSize\": 0,\n        \"lineColor\": \"\",\n        \"name\": \"Annotations & Alerts\",\n        \"query\": \"\",\n        \"showLine\": false,\n        \"step\": \"\",\n        \"tagKeys\": \"\",\n        \"tagsField\": \"\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"textField\": \"\",\n        \"textFormat\": \"\",\n        \"titleFormat\": \"\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657606921819,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 15,\n      \"isNew\": false,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n          \"editable\": false,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 5,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineStyle\": {\n                  \"fill\": \"\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"auto\",\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 5000\n                  }\n                ]\n              },\n              \"unit\": \"ms\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 1\n          },\n          \"id\": 2,\n          \"isNew\": false,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"list\",\n              \"placement\": \"bottom\"\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"span\": 0,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"$datasource\"\n              },\n              \"exemplar\": true,\n              \"expr\": \"(avg without (instance, tag_entityType) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"}))\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"{{tag_invokerPluginKey}} - {{name}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"Load Using AO EntityManager (mean - cluster wide)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n          \"editable\": false,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 5,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineStyle\": {\n                  \"fill\": \"\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"auto\",\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 5000\n                  }\n                ]\n              },\n              \"unit\": \"ms\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 1\n          },\n          \"id\": 6,\n          \"isNew\": false,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"list\",\n              \"placement\": \"bottom\"\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"span\": 0,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"$datasource\"\n              },\n              \"exemplar\": true,\n              \"expr\": \"topk(5, (max without(instance) (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"})))\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{tag_invokerPluginKey}} - {{name}} - {{tag_entityType}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"Load Using AO EntityManager (p99 - cluster wide)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"Measures the total count of AO operations (create, find, delete, deleteWithSQL, get, stream, count) by the plugins.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n          \"editable\": false,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 5,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineStyle\": {\n                  \"fill\": \"\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"auto\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 5000\n                  }\n                ]\n              },\n              \"unit\": \"none\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 9\n          },\n          \"id\": 20,\n          \"isNew\": false,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"list\",\n              \"placement\": \"bottom\"\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"span\": 0,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"$datasource\"\n              },\n              \"exemplar\": true,\n              \"expr\": \"sum without (instance, tag_entityType) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"})\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"{{tag_invokerPluginKey}} - {{name}} \",\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"Cumulative Count Using AO's EntityManager (cluster wide)\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"span\": 0,\n      \"title\": \"Relative load by API\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 13,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"AO's executeInTransaction\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 2\n      },\n      \"id\": 34,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m]))))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Load via AO's executeInTransaction (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 2\n      },\n      \"id\": 36,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))) /\\n(sum without (instance, tag_taskName) (delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via AO's executeInTransaction (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 38,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cumulative count using AO's executeInTransaction (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 10\n      },\n      \"id\": 40,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}} - {{tag_taskName}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via AO's executeInTransaction (p99)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO transaction takes, when executed inside the TransactionCallBack. This is mainly used by Confluence plugins.\\n\\nThe transaction can have many AO operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 42,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName, tag_invokerPluginKey) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"executeInTransaction\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total active operations running  via AO's executeInTransaction (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO transaction takes, when executed inside the TransactionCallBack. This is mainly used by Confluence plugins.\\n\\nThe transaction can have many AO operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"com.atlassian.jira.diagnostics - com.atlassian.jira.diagnostics.dao.DefaultAlertEntityDao$$Lambda$4007/1458213163 (task)\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 18\n      },\n      \"id\": 44,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"executeInTransaction\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active operations running via AO's executeInTransaction (over time - active count)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 26\n      },\n      \"id\": 17,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"SAL's transactionalExecutor\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 27\n      },\n      \"id\": 22,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"}[5m]))))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Load via SAL's transactionalExecutor (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 27\n      },\n      \"id\": 24,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))) /\\n(sum without (instance, tag_taskName) (delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via SAL's transactionalExecutor (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 35\n      },\n      \"id\": 26,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cumulative count using SAL's transactionalExecutor (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 35\n      },\n      \"id\": 28,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via SAL's transactionalExecutor (p99)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an SAL transaction takes, when executed inside the DefaultTransactionalExecutor.\\n\\nThe transaction can have many SAL operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 43\n      },\n      \"id\": 30,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName, tag_invokerPluginKey) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"sal\\\",name=\\\"transactionalExecutor\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total active operations running  via SAL's transactionalExecutor (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an SAL transaction takes, when executed inside the DefaultTransactionalExecutor.\\n\\nThe transaction can have many SAL operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 43\n      },\n      \"id\": 32,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"sal\\\",name=\\\"transactionalExecutor\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active operations using SAL's transactionalExecutor (over time - active count)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 51\n      },\n      \"id\": 11,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"AO upgrade tasks\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an App is taking to upgrade a part of the data that it stores in the database.\\n\\nUpgrade tasks happen when an App is both updated and enabled, during this time the App\\u2019s functionality will probably be unavailable, and it may temporarily increase load on the database and the node the upgrade task is running on.\\n\\nIf an App stores a lot of data in database then this may take a while to run, if possible, try to schedule upgrading Apps with large amounts of data in off-peak hours.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 52\n      },\n      \"id\": 7,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_fromPluginKey, tag_taskName) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"upgradeTask\\\",tag_statistic=\\\"active\\\",tag_subCategory=\\\"current\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"AO Upgrade Tasks (current - active count)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an App is taking to upgrade a part of the data that it stores in the database.\\n\\nUpgrade tasks happen when an App is both updated and enabled, during this time the App\\u2019s functionality will probably be unavailable, and it may temporarily increase load on the database and the node the upgrade task is running on.\\n\\nIf an App stores a lot of data in database then this may take a while to run, if possible, try to schedule upgrading Apps with large amounts of data in off-peak hours.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 52\n      },\n      \"id\": 9,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_confluence_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"upgradeTask\\\",tag_statistic=\\\"active\\\",tag_subCategory=\\\"current\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"AO Upgrade Tasks (over time - active count)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 36,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"confluence\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Confluence Database Load\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/confluence/grafana-dashboards/hikari.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Active hikari pool connections\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_1_ActiveConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Total connections in hikari pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_1_TotalConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Idle connections in hikari pool\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 11\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_1_IdleConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Idle Connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Waiting connections\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 11\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_zaxxer_hikari_Pool_HikariPool_1_ThreadsAwaitingConnection{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Threads Awaiting Connection\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"confluence\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"atlassian\",\n          \"value\": \"atlassian\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"confluence-jmx\",\n          \"value\": \"confluence-jmx\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Confluence Hikari Connection Pool\",\n  \"version\": 4,\n  \"weekStart\": \"\"\n}\n"
  },
  {
    "path": "src/main/charts/confluence/grafana-dashboards/overview.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"DOWN\"\n                }\n              },\n              \"type\": \"special\"\n            },\n            {\n              \"options\": {\n                \"from\": 1,\n                \"result\": {\n                  \"index\": 1,\n                  \"text\": \"UP\"\n                },\n                \"to\": 9999999\n              },\n              \"type\": \"range\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 1\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 22,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Pid{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Status\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 21,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Uptime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}/1000\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"dateTimeAsIso\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 23,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_StartTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Start time\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 0\n      },\n      \"id\": 24,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_OperatingSystem_AvailableProcessors{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Available CPU Cores\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 18,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"jvm_threads_state{namespace=\\\"$namespace\\\", service=\\\"$service\\\", state=\\\"BLOCKED\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ state }} ({{ pod }})\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Blocked Threads\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 8,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 9,\n        \"x\": 15,\n        \"y\": 0\n      },\n      \"id\": 33,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"60s\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 40\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(java_lang_OperatingSystem_ProcessCpuLoad{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} * 100)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"cpu load ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"CPU\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 7\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"100*(jvm_memory_bytes_used{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"}/jvm_memory_bytes_max{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Used {{ area }} ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Heap Used %\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 7\n      },\n      \"id\": 40,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"jvm\\\", category01=\\\"gc\\\"}\",\n          \"legendFormat\": \"{{ pod }} - {{tag_cause}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"GC Pauses\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 7\n      },\n      \"id\": 34,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 32,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 25,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(Standalone_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} count ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(Standalone_GlobalRequestProcessor_errorCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} error ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Tomcat Request Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 80\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 20\n      },\n      \"id\": 19,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(Standalone_ThreadPool_currentThreadCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} / Standalone_ThreadPool_maxThreads{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}) * 100\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"used {{name}} ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 90,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Tomcat Threads\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 20\n      },\n      \"id\": 26,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(Standalone_GlobalRequestProcessor_processingTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m]) / increase(Standalone_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat Request Processing Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 20\n      },\n      \"id\": 27,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"8.2.5\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"Standalone_Manager_activeSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"active sessions: {{context}} ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"Standalone_Manager_rejectedSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"rejected sessions: {{context}} ({{ pod }})\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Tomcat Sessions\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 30,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Database\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 14,\n        \"w\": 16,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"connection\\\",category02=\\\"latency\\\",name=\\\"statistics\\\"}\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Database Latency\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 14,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 32\n      },\n      \"id\": 36,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"postgres\\\",name=\\\"reads\\\"}[10m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"reads ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"postgres\\\",name=\\\"writes\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"writes ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Database Reads / Writes\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"confluence\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Confluence Overview\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/confluence/grafana-dashboards/plugin-monitoring.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a confluence search will take to return a result.\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"topk(5, (sum without (instance) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"manager\\\"}) / sum without (instance) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"manager\\\"})*1000))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}} {{tag_searchType}}\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Confluence Search Response Times (mean - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a confluence search will take to return a result.\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 3,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"topk(5, (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"manager\\\"}))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}} {{tag_searchType}}\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Confluence Search Response Times (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a confluence takes to reindex\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"topk(5, (sum without (instance) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"index\\\", name=\\\"reindex\\\"}) / sum without (instance) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"index\\\", name=\\\"reindex\\\"})*1000))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Confluence Index Times (top 5 - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a confluence takes to reindex\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 9\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"topk(5, (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"index\\\", name=\\\"reindex\\\"}))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Confluence Index Time (p99 - cluster wide) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a confluence LongRunningTask takes to complete\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"topk(5, (sum without (instance) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"longRunningTask\\\"}) / sum without (instance) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"longRunningTask\\\"})*1000))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_taskClass}}\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Confluence Long Running Tasks Time (mean - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a confluence Long Running Task takes to complete\\n\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 18\n      },\n      \"id\": 7,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"topk(5, (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"longRunningTask\\\"}))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_taskClass}}\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Confluence Long Running Task Time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"schemaVersion\": 36,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"confluence\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Confluence Plugin Monitoring\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/confluence/grafana-dashboards/response-times.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 16,\n      \"panels\": [],\n      \"title\": \"Web fragment evaluation times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long web fragment condition will take to determine whether a web fragment should be displayed or not.\\n\\nWeb fragments conditions determine whether a link or a section on a page should be displayed. Slow web fragment conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"{category00=\\\"web\\\", category01=\\\"servlet\\\", category02=\\\"homepage\\\", job=\\\"atlmetrics\\\", name=\\\"admin\\\"}\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 17,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}[5m])))) /\\n(sum without (instance) (delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Web Fragment Condition Evaluation Time (mean - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long web fragment condition will take to determine whether a web fragment should be displayed or not.\\n\\nWeb fragments conditions determine whether a link or a section on a page should be displayed. Slow web fragment conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 1\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ insatance }} - {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Web Fragment Condition Evaluation Time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 12,\n      \"panels\": [],\n      \"title\": \"Soy web panel render times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a Soy Template web panel is taking to render.\\n\\nThe template renderer might be long-running. If there is a plugin with a slow Soy renderer it might be worth adding (tag__templateName) to the query and contacting the vendor responsible to investigate if long-running queries are expected.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 18,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 11\n      },\n      \"id\": 25,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"Number of template renders\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg without (instance, tag_templateName) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance, tag_templateName) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance, tag_templateName) (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Soy web panel response times (cluster-wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_templateRenderer\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value #A\": 5,\n              \"Value #B\": 6,\n              \"Value #C\": 7,\n              \"job\": 1,\n              \"name\": 2,\n              \"tag_fromPluginKey\": 4,\n              \"tag_templateRenderer\": 3\n            },\n            \"renameByName\": {\n              \"Value #A\": \"AVG response time (ms)\",\n              \"Value #B\": \"Number of template renders\",\n              \"Value #C\": \"99th response time (ms)\",\n              \"tag_fromPluginKey\": \"Plugin key\",\n              \"tag_templateName\": \"\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {},\n      \"description\": \"Measures how long a Soy Template web panel is taking to render.\\n\\nThe template renderer might be long running. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 11\n      },\n      \"id\": 27,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_templateName}} (template)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"soy web panel response time (mean of last 5 minutes - cluster wide) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {},\n      \"description\": \"Measures how long a Soy Template web panel is taking to render.\\n\\nThe template renderer might be long running. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 20\n      },\n      \"id\": 29,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"topk(5, com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_templateName}}__{{ pod }} (template)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"soy web panel response time (p99 - per node) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 29\n      },\n      \"id\": 10,\n      \"panels\": [],\n      \"title\": \"Web resource evaluation times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {},\n      \"description\": \"Measures how long web resource condition will take to determine whether a resource should be displayed or not.\\n\\nSlow web resource conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"{category00=\\\"web\\\", category01=\\\"servlet\\\", category02=\\\"homepage\\\", job=\\\"atlmetrics\\\", name=\\\"admin\\\"}\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 30\n      },\n      \"id\": 5,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"resource\\\", name=\\\"condition\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"resource\\\", name=\\\"condition\\\"}[5m])))) /\\n(sum without (instance) (delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"resource\\\", name=\\\"condition\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Web Resource Condition Evaluation time (mean of last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {},\n      \"description\": \"Measures how long web resource condition will take to determine whether a resource should be displayed or not.\\n\\nSlow web resource conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 30\n      },\n      \"id\": 19,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"resource\\\", name=\\\"condition\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Web Resource Condition Evaluation Time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 39\n      },\n      \"id\": 21,\n      \"panels\": [],\n      \"title\": \"REST response times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Use this table to quickly identify the slowest calls and some outliers using the 99th percentile response time. Use this table to figure out which endpoint to investigate then correlate it with the other timeseries panels for more detailed diagnosis \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 26,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 40\n      },\n      \"id\": 31,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"Requests count\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.5.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"topk(500, avg without (instance) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance) (com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance) (com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Most requested endpoints & response time\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"category00\": true,\n              \"category01\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_path\": true\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value #A\": \"AVG response time (ms)\",\n              \"Value #B\": \"Requests count\",\n              \"Value #C\": \"99th response time (ms)\",\n              \"job\": \"\",\n              \"tag_action\": \"Action\",\n              \"tag_fromPluginKey\": \"Plugin Key\",\n              \"tag_path\": \"Path\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {},\n      \"description\": \"Measures HTTP responses of the REST APIs that uses the atlassian-rest module.\\n\\nCheck the frequency and duration of the rest requests. If excessive or very slow, consider reaching out to the app vendor and flag this issue to them.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 30000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 40\n      },\n      \"id\": 33,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}) * \\n(delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_confluence_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_path}} (path)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP REST response time (mean of last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures HTTP response of the REST APIs that uses the atlassian-rest module.\\n\\nCheck the frequency and duration of the rest requests. If excessive or very slow, consider reaching out to the app vendor and flag this issue to the\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 30000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 49\n      },\n      \"id\": 35,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_confluence_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_path}} (path)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP REST response time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {},\n      \"description\": \"A timeseries of plugins REST average response times regardless of which node they are running on\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 58\n      },\n      \"id\": 37,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"avg without (instance, tag_path, tag_action) (com_atlassian_confluence_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\",category01=\\\"rest\\\", name=\\\"request\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP REST average response time per plugin\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"10s\",\n  \"schemaVersion\": 36,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"confluence\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"Confluence_MailTaskQueue_ErrorQueueSize\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Confluence Response Times\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/confluence/templates/NOTES.txt",
    "content": "Thank you for installing {{ title .Chart.Name }}.\n\nYour release is named {{ .Release.Name }}, and resides in namespace {{ .Release.Namespace }}.\n\nPlease run sanity tests against the release to verify it's healthy:\n\n  $ helm test {{ .Release.Name }} -n {{ .Release.Namespace }}\n\nIf the Kubernetes resources in the release are still starting up, then the tests may fail, so it\nis advisable to wait for the tests to pass before continuing.\n\nTo see the custom values you used for this release:\n\n  $ helm get values {{ .Release.Name }} -n {{ .Release.Namespace }}\n\n{{ if eq (include \"common.gateway.isConfigured\" .) \"true\" -}}\n{{ title .Chart.Name }} service URL: {{ include \"common.gateway.origin\" . }}{{ include \"confluence.path\" . }}\n{{- else }}\nGet the {{ title .Chart.Name }} URL by running these commands in the same shell:\n{{- if contains \"NodePort\" .Values.confluence.service.type }}\n  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ .Release.Name }}-{{ .Chart.Name }})\n  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n  echo http://$NODE_IP:$NODE_PORT\n{{- else if contains \"LoadBalancer\" .Values.confluence.service.type }}\n  NOTE: It may take a few minutes for the LoadBalancer hostname to be available.\n        You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ .Release.Name }}-{{ .Chart.Name }}'\n\n  export SERVICE_HOSTNAME=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ .Release.Name }}-{{ .Chart.Name }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n  echo http://$SERVICE_HOSTNAME:{{ .Values.confluence.service.port }}\n{{- else if contains \"ClusterIP\" .Values.confluence.service.type }}\n  Step 1: Get the pod name\n    $ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"app.kubernetes.io/instance={{ .Release.Name }}\" -o jsonpath=\"{.items[0].metadata.name}\")\n  Step 2 (Optional): Check if the pod name has been exported successfully and the pod status\n    $ echo POD_NAME: $POD_NAME && echo POD_STATUS: $(kubectl get pod $POD_NAME -o jsonpath='{.status.phase}')\n  Step 3: Wait for pods up and running, then forward pod port to localhost\n    $ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME {{ .Values.confluence.ports.http }}\n  Step 4: Access {{ title .Chart.Name }} on localhost:\n    http://localhost:{{ .Values.confluence.ports.http }}\n{{- end }}\n{{- end }}\n{{- if not ( or .Values.volumes.localHome.persistentVolumeClaim.create .Values.volumes.localHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Local Home!!!        #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{- if not ( or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Shared Home!!!       #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{- if ( and .Values.synchrony.enabled ( not ( or .Values.volumes.synchronyHome.persistentVolumeClaim.create .Values.volumes.synchronyHome.customVolume ))) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Synchrony Home!!!    #####\n######         Synchrony logs will be lost when the pod is terminated.      #####\n#################################################################################\n{{- end }}\n{{- if ( or .Values.confluence.securityContext.enabled .Values.confluence.securityContext.gid ) }}\n\n#################################################################################\n#####      DEPRECATION WARNING: confluence.securityContext deprecation      #####\n#####    Update your values to the new confluence.securityContext format    #####\n#################################################################################\n{{- end}}\n\nFor further documentation, see https://atlassian.github.io/data-center-helm-charts/"
  },
  {
    "path": "src/main/charts/confluence/templates/_fluentd_templates.tpl",
    "content": "{{- define \"fluentd.container\" -}}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd\n  image: {{ .Values.fluentd.imageRepo }}:{{ .Values.fluentd.imageTag }}\n  command: [\"sh\", \"-c\", {{ include \"fluentd.start.command\" . | quote }}]\n{{- if .Values.fluentd.resources }}\n  resources:\n  {{- with .Values.fluentd.resources }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- end }}\n  ports:\n    - containerPort: {{ .Values.fluentd.httpPort }}\n      protocol: TCP\n  volumeMounts:\n    - name: fluentd-config\n      mountPath: /fluentd/etc\n      readOnly: true\n{{- if .Values.fluentd.extraVolumes }}\n  {{ toYaml .Values.fluentd.extraVolumes | nindent 4}}\n{{- end }}\n  env:\n    - name: POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: POD_NAMESPACE\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.namespace\n    - name: POD_IP\n      valueFrom:\n        fieldRef:\n          fieldPath: status.podIP\n    - name: HELM_RELEASE_NAME\n      value: {{ include \"common.names.fullname\" . }}\n{{ end }}\n{{ end }}\n\n{{- define \"fluentd.config.volume\" }}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd-config\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-fluentd-config\n{{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n\n{{/* Define a sanitized list of additionalEnvironmentVariables */}}\n{{- define \"confluence.sanitizedAdditionalEnvVars\" -}}\n{{- range .Values.confluence.additionalEnvironmentVariables }}\n- name: {{ .name }}\n  value: {{ if regexMatch \"(?i)(secret|token|password)\" .name }}\"Sanitized by Support Utility\"{{ else}}{{ .value }}{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define a sanitized list of additionalJvmArgs */}}\n{{- define \"confluence.sanitizedAdditionalJvmArgs\" -}}\n{{- range .Values.confluence.additionalJvmArgs }}\n {{- $jvmArgs := regexSplit \"=\" . -1 }}\n   {{- if regexMatch \"(?i)(secret|token|password).*$\" (first $jvmArgs) }}\n-  {{ first $jvmArgs }}=Sanitized by Support Utility{{ else}}\n-  {{ . }}\n{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define sanitized Helm values */}}\n{{- define \"confluence.sanitizedValues\" -}}\n{{- $sanitizedAdditionalEnvs := dict .Chart.Name (dict \"additionalEnvironmentVariables\" (include \"confluence.sanitizedAdditionalEnvVars\" .)) }}\n{{- $sanitizedAdditionalJvmArgs := dict .Chart.Name (dict \"additionalJvmArgs\" (include \"confluence.sanitizedAdditionalJvmArgs\" .)) }}\n{{- $mergedValues := merge $sanitizedAdditionalEnvs $sanitizedAdditionalJvmArgs .Values }}\n{{- toYaml $mergedValues | replace \" |2-\" \"\" | replace \" |-\" \"\" |  replace \"|2\" \"\" | nindent 4 }}\n{{- end }}\n\n{{- define \"confluence.analyticsJson\" }}\n{\n  \"imageTag\": {{ if or (eq .Values.image.tag \"\") (eq .Values.image.tag nil) }}{{ .Chart.AppVersion | quote }}{{ else }}{{ regexSplit \"-\" .Values.image.tag -1 | first |  quote }}{{ end }},\n  \"replicas\": {{ .Values.replicaCount }},\n  \"isJmxEnabled\": {{ .Values.monitoring.exposeJmxMetrics }},\n  \"ingressType\": {{ if not .Values.ingress.create }}\"NONE\"{{ else }}{{ if .Values.ingress.nginx }}\"NGINX\"{{ else }}\"OTHER\"{{ end }}{{ end }},\n{{- $sanitizedMinorVersion := regexReplaceAll \"[^0-9]\" .Capabilities.KubeVersion.Minor \"\" }}\n  \"k8sVersion\": \"{{ .Capabilities.KubeVersion.Major }}.{{ $sanitizedMinorVersion }}\",\n  \"serviceType\": {{ if regexMatch \"^(ClusterIP|NodePort|LoadBalancer|ExternalName)$\" .Values.confluence.service.type }}{{ snakecase .Values.confluence.service.type | upper | quote }}{{ else }}\"UNKNOWN\"{{ end }},\n{{- if eq .Values.database.type nil }}\n  \"dbType\": \"UNKNOWN\",\n{{- else }}\n{{- $databaseTypeMap := dict \"postgres\" \"POSTGRES\" \"mssql\" \"MSSQL\" \"sqlserver\" \"SQLSERVER\" \"oracle\" \"ORACLE\" \"mysql\" \"MYSQL\" }}\n{{- $dbTypeInValues := .Values.database.type }}\n{{- $dbType := \"UNKNOWN\" | quote }}\n{{- range $key, $value := $databaseTypeMap }}\n{{- if regexMatch (printf \"(?i)%s\" $key) $dbTypeInValues }}\n  {{- $dbType = $value | quote }}\n{{- end }}\n{{- end }}\n  \"dbType\": {{ $dbType }},\n{{- end }}\n  \"isS3AttachmentsStorageEnabled\": {{- if and .Values.confluence.s3AttachmentsStorage.bucketName .Values.confluence.s3AttachmentsStorage.bucketRegion }}true{{ else }}false{{ end }},\n  \"isClusteringEnabled\": {{ .Values.confluence.clustering.enabled }},\n  \"isSharedHomePVCCreated\": {{ .Values.volumes.sharedHome.persistentVolumeClaim.create }},\n  \"isServiceMonitorCreated\": {{ .Values.monitoring.serviceMonitor.create }},\n  \"isGrafanaDashboardsCreated\": {{ .Values.monitoring.grafana.createDashboards }},\n  \"isRunOnOpenshift\": {{ .Capabilities.APIVersions.Has \"route.openshift.io/v1/Route\" }},\n  \"isRunWithRestrictedSCC\": {{ .Values.openshift.runWithRestrictedSCC }},\n  \"isOpenshiftRouteCreated\": {{ .Values.ingress.openShiftRoute}}\n}\n{{- end }}\n\n{{/*\nThe name the synchrony app within the chart.\nTODO: This will break if the common.names.name exceeds 63 characters, need to find a more rebust way to do this\n*/}}\n{{- define \"synchrony.name\" -}}\n{{ include \"common.names.name\" . }}-synchrony\n{{- end }}\n\n{{/*\nThe full-qualfied name of the synchrony app within the chart.\nTODO: This will break if the confluence.fullname exceeds 63 characters, need to find a more rebust way to do this\n*/}}\n{{- define \"synchrony.fullname\" -}}\n{{ include \"common.names.fullname\" . }}-synchrony\n{{- end }}\n\n{{/*\nThe name of the service account to be used.\nIf the name is defined in the chart values, then use that,\nelse if we're creating a new service account then use the name of the Helm release,\nelse just use the \"default\" service account.\n*/}}\n{{- define \"confluence.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.name -}}\n{{- .Values.serviceAccount.name -}}\n{{- else -}}\n{{- if .Values.serviceAccount.create -}}\n{{- include \"common.names.fullname\" . -}}\n{{- else -}}\ndefault\n{{- end -}}\n{{- end -}}\n{{- end }}\n\n{{/*\nThe name of the ClusterRole that will be created.\nIf the name is defined in the chart values, then use that,\nelse use the name of the Helm release.\n*/}}\n{{- define \"confluence.clusterRoleName\" -}}\n{{- if and .Values.serviceAccount.clusterRole.name .Values.serviceAccount.clusterRole.create }}\n{{- .Values.serviceAccount.clusterRole.name }}\n{{- else }}\n{{- include \"common.names.fullname\" . -}}\n{{- end }}\n{{- end }}\n\n{{/*\nThe name of the ClusterRoleBinding that will be created.\nIf the name is defined in the chart values, then use that,\nelse use the name of the ClusterRole.\n*/}}\n{{- define \"confluence.clusterRoleBindingName\" -}}\n{{- if and .Values.serviceAccount.clusterRoleBinding.name .Values.serviceAccount.clusterRoleBinding.create }}\n{{- .Values.serviceAccount.clusterRoleBinding.name }}\n{{- else }}\n{{- include \"confluence.clusterRoleName\" . -}}\n{{- end }}\n{{- end }}\n\n{{/*\nThese labels will be applied to all Synchrony resources in the chart\n*/}}\n{{- define \"synchrony.labels\" -}}\nhelm.sh/chart: {{ include \"common.names.chart\" . }}\n{{ include \"synchrony.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{ with .Values.additionalLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nSelector labels for finding Confluence (non-Synchrony) resources\n*/}}\n{{- define \"confluence.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"common.names.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n\n{{/*\nSelector labels for finding Synchrony resources\n*/}}\n{{- define \"synchrony.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"synchrony.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n\n{{/*\nPod labels\n*/}}\n{{- define \"confluence.podLabels\" -}}\n{{ with .Values.podLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.sysprop.hazelcastListenPort\" -}}\n-Dconfluence.cluster.hazelcast.listenPort={{ .Values.confluence.ports.hazelcast }}\n{{- end }}\n\n{{- define \"confluence.sysprop.s3Config\" -}}\n{{- if and .Values.confluence.s3AttachmentsStorage.bucketName .Values.confluence.s3AttachmentsStorage.bucketRegion }}\n-Dconfluence.filestore.attachments.s3.bucket.name={{ .Values.confluence.s3AttachmentsStorage.bucketName }}\n-Dconfluence.filestore.attachments.s3.bucket.region={{ .Values.confluence.s3AttachmentsStorage.bucketRegion }}\n{{- if .Values.confluence.s3AttachmentsStorage.endpointOverride }}\n-Dconfluence.filestore.attachments.s3.endpoint.override={{ .Values.confluence.s3AttachmentsStorage.endpointOverride }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.sysprop.clusterNodeName\" -}}\n-Dconfluence.clusterNodeName.useHostname={{ .Values.confluence.clustering.usePodNameAsClusterNodeName }}\n{{- end }}\n\n{{- define \"confluence.sysprop.fluentdAppender\" -}}\n-Datlassian.logging.cloud.enabled={{ if and .Values.fluentd.enabled (not .Values.fluentd.customConfigFile ) }}{{.Values.fluentd.enabled }}{{ else }}false{{ end }}\n{{- end }}\n\n{{- define \"confluence.sysprop.debug\" -}}\n{{- if .Values.confluence.jvmDebug.enabled }} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 {{ end -}}\n{{- end }}\n\n{{- define \"confluence.sysprop.enable.synchrony.by.default\" -}}\n-Dsynchrony.by.default.enable.collab.editing.if.manually.managed=true\n{{- end -}}\n\n{{- define \"confluence.sysprop.synchronyServiceUrl\" -}}\n{{- $synchronyIngressPath := \"synchrony\" }}\n{{- if .Values.synchrony.ingress.path }}\n{{- $sanitizePathRegex := \"^/|\\\\(.*\" }}\n{{- $synchronyIngressPath = regexReplaceAll $sanitizePathRegex .Values.synchrony.ingress.path \"\" }}\n{{- end }}\n{{- if .Values.synchrony.enabled -}}\n    {{- if .Values.synchrony.service.url -}}-Dsynchrony.service.url={{ .Values.synchrony.service.url }}/v1\n    {{- else -}}-Dsynchrony.service.url={{ include \"common.gateway.scheme\" . }}://{{ include \"common.gateway.hostname\" . }}/{{ $synchronyIngressPath }}/v1\n    {{- end }}\n{{- else -}}\n-Dsynchrony.btf.disabled=true\n{{- end -}}\n{{- end -}}\n\n{{/*\nCreate default value for the service path.\n*/}}\n{{- define \"confluence.path\" -}}\n{{- include \"common.gateway.path\" (dict\n  \"useGatewayMode\" (include \"common.gateway.useGatewayMode\" .)\n  \"gatewayPath\"   .Values.gateway.path\n  \"ingressPath\"   .Values.ingress.path\n  \"contextPath\"   .Values.confluence.service.contextPath\n) -}}\n{{- end }}\n\n{{/*\nAlias for backward compatibility with ingress templates.\n*/}}\n{{- define \"confluence.ingressPath\" -}}\n{{- include \"confluence.path\" . -}}\n{{- end }}\n\n{{/*\nThe command that should be run by the nfs-fixer init container to correct the permissions of the shared-home root directory.\n*/}}\n{{- define \"confluence.sharedHome.permissionFix.command\" -}}\n{{- $securityContext := .Values.confluence.securityContext }}\n{{- with .Values.volumes.sharedHome.nfsPermissionFixer }}\n    {{- if .command }}\n        {{ .command }}\n    {{- else }}\n        {{- if and $securityContext.gid $securityContext.enabled }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.gid .mountPath .mountPath }}\n        {{- else if $securityContext.fsGroup }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.fsGroup .mountPath .mountPath }}\n        {{- else }}\n            {{- printf \"(chgrp 2002 %s; chmod g+w %s)\" .mountPath .mountPath }}\n        {{- end }}\n    {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe command that should be run to start the fluentd service\n*/}}\n{{- define \"fluentd.start.command\" -}}\n{{- if .Values.fluentd.command }}\n{{ .Values.fluentd.command }}\n{{- else }}\n{{- print \"exec fluentd -c /fluentd/etc/fluent.conf -v\" }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.image\" -}}\n{{- if .Values.image.registry -}}\n{{ .Values.image.registry}}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- else -}}\n{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefines the volume mounts used by the Confluence container.\nNote that the local-home volume is mounted twice, once for the local-home directory itself, and again\non Tomcat's logs directory. THis ensures that Tomcat+Confluence logs get captured in the same volume.\n*/}}\n{{ define \"confluence.volumeMounts\" }}\n- name: local-home\n  mountPath: {{ .Values.volumes.localHome.mountPath | quote }}\n  {{- if .Values.volumes.localHome.subPath }}\n  subPath: {{ .Values.volumes.localHome.subPath | quote }}\n  {{- end }}\n- name: local-home\n  mountPath: {{ .Values.confluence.accessLog.mountPath | quote }}\n  subPath: {{ .Values.confluence.accessLog.localHomeSubPath | quote }}\n- name: shared-home\n  mountPath: {{ .Values.volumes.sharedHome.mountPath | quote }}\n  {{- if .Values.volumes.sharedHome.subPath }}\n  subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n  {{- end }}\n{{- if or .Values.confluence.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  mountPath: /opt/atlassian/confluence/conf/server.xml\n  subPath: server.xml\n{{- end }}\n{{- if or .Values.confluence.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: seraph-config-xml\n  mountPath: /opt/atlassian/confluence/confluence/WEB-INF/classes/seraph-config.xml\n  subPath: seraph-config.xml\n{{- end }}\n{{- if or .Values.confluence.additionalCertificates.secretName .Values.confluence.additionalCertificates.secretList }}\n- name: keystore\n  mountPath: /var/ssl\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  mountPath: /opt/atlassian/helm\n{{- end }}\n{{ end }}\n\n{{/*\nDefines the volume mounts used by the Synchrony container.\n*/}}\n{{ define \"synchrony.volumeMounts\" }}\n- name: synchrony-home\n  mountPath: {{ .Values.volumes.synchronyHome.mountPath | quote }}\n{{- if or .Values.synchrony.additionalCertificates.secretName .Values.synchrony.additionalCertificates.secretList }}\n- name: keystore\n  mountPath: /var/ssl\n{{- end }}\n{{ end }}\n\n{{/*\nFor each additional library declared, generate a volume mount that injects that library into the Confluence lib directory\n*/}}\n{{- define \"confluence.additionalLibraries\" -}}\n{{- range .Values.confluence.additionalLibraries }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/confluence/confluence/WEB-INF/lib/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional Synchrony library declared, generate a volume mount that injects that library into the Confluence lib directory\n*/}}\n{{- define \"synchrony.additionalLibraries\" -}}\n{{- range .Values.synchrony.additionalLibraries }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/confluence/confluence/WEB-INF/lib/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"confluence.podAnnotations\" -}}\n{{- range $key, $value := .Values.podAnnotations }}\n{{ $key }}: {{ tpl $value $ | quote }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"synchrony.podAnnotations\" -}}\n{{- with .Values.synchrony.podAnnotations }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional init containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"confluence.additionalInitContainers\" -}}\n{{- with .Values.additionalInitContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional hosts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"confluence.additionalHosts\" -}}\n{{- with .Values.additionalHosts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"confluence.additionalContainers\" -}}\n{{- with .Values.additionalContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional ports here instead of in values.yaml to allow template overrides\n*/}}\n{{- define \"confluence.additionalPorts\" -}}\n{{- with .Values.confluence.additionalPorts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional ports here instead of in values.yaml to allow template overrides\n*/}}\n{{- define \"synchrony.additionalPorts\" -}}\n{{- with .Values.synchrony.additionalPorts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional Confluence volume mounts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"confluence.additionalVolumeMounts\" -}}\n{{- with .Values.confluence.additionalVolumeMounts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional Synchrony volume mounts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"synchrony.additionalVolumeMounts\" -}}\n{{- with .Values.synchrony.additionalVolumeMounts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"synchrony.additionalEnvironmentVariables\" -}}\n{{- with .Values.synchrony.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"confluence.additionalEnvironmentVariables\" -}}\n{{- with .Values.confluence.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional plugin declared, generate a volume mount that injects that library into the Confluence plugins directory\n*/}}\n{{- define \"confluence.additionalBundledPlugins\" -}}\n{{- range .Values.confluence.additionalBundledPlugins }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/confluence/confluence/WEB-INF/atlassian-bundled-plugins/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.volumes\" -}}\n{{ if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n{{ include \"confluence.volumes.localHome\" . }}\n{{- end }}\n{{ include \"confluence.volumes.sharedHome\" . }}\n{{- with .Values.volumes.additional }}\n{{- toYaml . | nindent 0 }}\n{{- end }}\n{{- if or .Values.confluence.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-server-config\n    items:\n      - key: server.xml\n        path: server.xml\n{{- end }}\n{{- if or .Values.confluence.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: seraph-config-xml\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-server-config\n    items:\n      - key: seraph-config.xml\n        path: seraph-config.xml\n{{- end }}\n{{- if or .Values.confluence.additionalCertificates.secretName .Values.confluence.additionalCertificates.secretList }}\n- name: keystore\n  emptyDir: {}\n{{- if .Values.confluence.additionalCertificates.secretName }}\n- name: certs\n  secret:\n    secretName: {{ .Values.confluence.additionalCertificates.secretName }}\n{{- else }}\n{{- range .Values.confluence.additionalCertificates.secretList }}\n- name: {{ .name }}\n  secret:\n    secretName: {{ .name }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-helm-values\n{{- end }}\n{{- end }}\n\n{{- define \"synchrony.volumes\" -}}\n{{ if not .Values.volumes.synchronyHome.persistentVolumeClaim.create }}\n{{ include \"synchrony.volumes.synchronyHome\" . }}\n{{- end }}\n{{- if .Values.synchrony.additionalLibraries }}\n{{ include \"confluence.volumes.sharedHome\" . }}\n{{- end }}\n{{- with .Values.volumes.additionalSynchrony }}\n{{- toYaml . | nindent 0 }}\n{{- end }}\n{{- if or .Values.synchrony.additionalCertificates.secretName .Values.synchrony.additionalCertificates.secretList }}\n- name: keystore\n  emptyDir: {}\n{{- if .Values.synchrony.additionalCertificates.secretName }}\n- name: certs\n  secret:\n    secretName: {{ .Values.synchrony.additionalCertificates.secretName }}\n{{- else }}\n{{- range .Values.synchrony.additionalCertificates.secretList }}\n- name: {{ .name }}\n  secret:\n    secretName: {{ .name }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.volumes.localHome\" -}}\n{{- if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n- name: local-home\n{{ if .Values.volumes.localHome.customVolume }}\n{{- toYaml .Values.volumes.localHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"synchrony.volumes.synchronyHome\" -}}\n{{- if not .Values.volumes.synchronyHome.persistentVolumeClaim.create }}\n- name: synchrony-home\n{{ if .Values.volumes.synchronyHome.customVolume }}\n{{- toYaml .Values.volumes.synchronyHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.volumes.sharedHome\" -}}\n- name: shared-home\n{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\n  persistentVolumeClaim:\n    claimName: {{ include \"common.names.fullname\" . }}-shared-home\n{{ else }}\n{{ if .Values.volumes.sharedHome.customVolume }}\n{{- toYaml .Values.volumes.sharedHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.volumeClaimTemplates\" -}}\n{{- if or .Values.volumes.localHome.persistentVolumeClaim.create .Values.confluence.additionalVolumeClaimTemplates }}\n{{- if and .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled }}\npersistentVolumeClaimRetentionPolicy:\n    whenDeleted: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted}}\n    whenScaled: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled}}\n{{- end}}\nvolumeClaimTemplates:\n{{- if .Values.volumes.localHome.persistentVolumeClaim.create }}\n- apiVersion: v1\n  kind: PersistentVolumeClaim\n  metadata:\n    name: local-home\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .Values.volumes.localHome.persistentVolumeClaim.storageClassName }}\n    storageClassName: {{ .Values.volumes.localHome.persistentVolumeClaim.storageClassName | quote }}\n    {{- end }}\n    {{- with .Values.volumes.localHome.persistentVolumeClaim.resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- range .Values.confluence.additionalVolumeClaimTemplates }}\n- metadata:\n    name: {{ .name }}\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .storageClassName }}\n    storageClassName: {{ .storageClassName | quote }}\n    {{- end }}\n    {{- with .resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"synchrony.volumeClaimTemplates\" -}}\n{{ if .Values.volumes.synchronyHome.persistentVolumeClaim.create }}\n{{- if and .Values.volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenDeleted .Values.volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenScaled }}\npersistentVolumeClaimRetentionPolicy:\n    whenDeleted: {{.Values.volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenDeleted}}\n    whenScaled: {{.Values.volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenScaled}}\n{{- end}}\nvolumeClaimTemplates:\n- apiVersion: v1\n  kind: PersistentVolumeClaim\n  metadata:\n    name: synchrony-home\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .Values.volumes.synchronyHome.persistentVolumeClaim.storageClassName }}\n    storageClassName: {{ .Values.volumes.synchronyHome.persistentVolumeClaim.storageClassName | quote }}\n    {{- end }}\n    {{- with .Values.volumes.synchronyHome.persistentVolumeClaim.resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.sessionVars\"}}\n{{- if .Values.confluence.session.timeout }}\n- name: ATL_CONFLUENCE_SESSION_TIMEOUT\n  value: {{ .Values.confluence.session.timeout | int | quote }}\n{{- end }}\n{{- if .Values.confluence.session.autologinCookieAge }}\n- name: ATL_AUTOLOGIN_COOKIE_AGE\n  value: {{ .Values.confluence.session.autologinCookieAge | int | quote }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.tunnelVars\"}}\n{{- if .Values.confluence.tunnel.additionalConnector.port }}\n{{- with .Values.confluence.tunnel.additionalConnector.port }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_PORT\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.confluence.tunnel.additionalConnector.connectionTimeout }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_CONNECTION_TIMEOUT\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.confluence.tunnel.additionalConnector.maxThreads }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_MAX_THREADS\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.confluence.tunnel.additionalConnector.minSpareThreads }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_MIN_SPARE_THREADS\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.confluence.tunnel.additionalConnector.enableLookups }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_ENABLE_LOOKUPS\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.confluence.tunnel.additionalConnector.acceptCount }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_ACCEPT_COUNT\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.confluence.tunnel.additionalConnector.secure }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_SECURE\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.confluence.tunnel.additionalConnector.URIEncoding }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_URI_ENCODING\n  value: {{ . | quote }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"confluence.databaseEnvVars\" -}}\n{{- if .Values.confluence.forceConfigUpdate }}\n- name: ATL_FORCE_CFG_UPDATE\n  value: \"true\"\n{{- end }}\n{{ with .Values.database.type }}\n- name: ATL_DB_TYPE\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.url }}\n- name: ATL_JDBC_URL\n  value: {{ if contains \"&amp;\" . }}{{ . | quote }}{{ else }}{{ . | replace \"&\" \"&amp;\" | quote }}{{ end }}\n{{ end }}\n{{ with .Values.database.credentials.secretName }}\n- name: ATL_JDBC_USER\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.usernameSecretKey }}\n- name: ATL_JDBC_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.passwordSecretKey }}\n{{ end }}\n{{ end }}\n\n{{- define \"synchrony.databaseEnvVars\" -}}\n{{ with .Values.database.url }}\n- name: SYNCHRONY_DATABASE_URL\n  value: {{ . | replace \"&amp;\" \"&\" | quote }}\n{{ end }}\n{{ with .Values.database.credentials.secretName }}\n- name: SYNCHRONY_DATABASE_USERNAME\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.usernameSecretKey }}\n- name: SYNCHRONY_DATABASE_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.passwordSecretKey }}\n{{ end }}\n{{ end }}\n\n{{- define \"confluence.clusteringEnvVars\" -}}\n{{ if .Values.confluence.clustering.enabled }}\n- name: KUBERNETES_NAMESPACE\n  valueFrom:\n    fieldRef:\n      fieldPath: metadata.namespace\n- name: HAZELCAST_KUBERNETES_SERVICE_NAME\n  value: {{ include \"common.names.fullname\" . | quote }}\n- name: HAZELCAST_KUBERNETES_SERVICE_PORT\n  value: {{ .Values.confluence.ports.hazelcast | quote }}\n- name: ATL_CLUSTER_TYPE\n  value: \"kubernetes\"\n- name: ATL_CLUSTER_NAME\n  value: {{ include \"common.names.fullname\" . | quote }}\n{{ end }}\n{{ end }}\n\n{{- define \"synchrony.clusteringEnvVars\" -}}\n{{ if .Values.confluence.clustering.enabled }}\n- name: KUBERNETES_NAMESPACE\n  valueFrom:\n    fieldRef:\n      fieldPath: metadata.namespace\n- name: HAZELCAST_KUBERNETES_SERVICE_NAME\n  value: {{ include \"synchrony.fullname\" . | quote }}\n- name: HAZELCAST_KUBERNETES_SERVICE_PORT\n  value: {{ .Values.synchrony.ports.hazelcast | quote }}\n- name: CLUSTER_JOIN_TYPE\n  value: \"kubernetes\"\n{{ end }}\n{{ end }}\n\n{{- define \"flooredCPU\" -}}\n    {{- if hasSuffix \"m\" (. | toString) }}\n    {{- div (trimSuffix \"m\" .) 1000 | default 1 }}\n    {{- else }}\n    {{- . }}\n    {{- end }}\n{{- end}}\n\n{{- define \"confluence.addCrtToKeystoreCmd\" }}\n{{- if .Values.confluence.additionalCertificates.customCmd}}\n{{ .Values.confluence.additionalCertificates.customCmd}}\n{{- else }}\nset -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \"Adding $crt to keystore\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\n{{- end }}\n{{- end }}\n\n{{- define \"synchrony.addCrtToKeystoreCmd\" }}\n{{- if .Values.synchrony.additionalCertificates.customCmd}}\n{{ .Values.synchrony.additionalCertificates.customCmd}}\n{{- else }}\nset -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \"Adding $crt to keystore\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\n{{- end }}\n{{- end }}\n\n\n{{- define \"generate_static_password_b64enc\" -}}\n{{- if not (index .Release \"temp_vars\") -}}\n{{-   $_ := set .Release \"temp_vars\" dict -}}\n{{- end -}}\n{{- $key := printf \"%s_%s\" .Release.Name \"password\" -}}\n{{- if not (index .Release.temp_vars $key) -}}\n{{-   $_ := set .Release.temp_vars $key (randAlphaNum 40 | b64enc ) -}}\n{{- end -}}\n{{- index .Release.temp_vars $key -}}\n{{- end -}}\n\n{{- define \"opensearch.initial.admin.password\" }}\n{{- $defaultSecretName := \"opensearch-initial-password\" }}\n{{- $secretName := default $defaultSecretName .Values.opensearch.credentials.existingSecretRef.name }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace $secretName) }}\n{{- if $secretData.data }}\n{{- index $secretData.data \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\" }}\n{{- else }}\n{{ include \"generate_static_password_b64enc\" . }}\n{{- end }}\n{{- end }}\n\n{{- define \"opensearch.env.vars\" }}\n{{- if .Values.opensearch.enabled }}\n- name: ATL_SEARCH_PLATFORM\n  value: opensearch\n- name: ATL_OPENSEARCH_HTTP_URL\n  value: http://opensearch-cluster-master:9200\n- name: ATL_OPENSEARCH_USERNAME\n  value: admin\n- name: ATL_OPENSEARCH_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ .Values.opensearch.credentials.existingSecretRef.name | default \"opensearch-initial-password\" }}\n      key: OPENSEARCH_INITIAL_ADMIN_PASSWORD\n{{- end }}\n{{- end }}\n\n\n"
  },
  {
    "path": "src/main/charts/confluence/templates/config-jvm.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jvm-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  additional_jvm_args: >-\n    {{ include \"confluence.sysprop.hazelcastListenPort\" . }}\n    {{ include \"confluence.sysprop.synchronyServiceUrl\" . }}\n    {{ include \"confluence.sysprop.enable.synchrony.by.default\" . }}\n    {{ include \"confluence.sysprop.clusterNodeName\" . }}\n    {{ include \"confluence.sysprop.fluentdAppender\" . }}\n    {{- include \"confluence.sysprop.debug\" . -}}\n    {{- range .Values.confluence.additionalJvmArgs }}\n    {{ . }}\n    {{- end }}\n    -XX:ActiveProcessorCount={{ max 1 (include \"flooredCPU\" .Values.confluence.resources.container.requests.cpu | float64  | int) }}\n    {{- if .Values.serviceAccount.eksIrsa.roleArn }}\n    -Daws.webIdentityTokenFile=/var/run/secrets/eks.amazonaws.com/serviceaccount/token\n    {{- end }}\n    {{- if or .Values.confluence.additionalCertificates.secretName .Values.confluence.additionalCertificates.secretList }}\n    -Djavax.net.ssl.trustStore=/var/ssl/cacerts\n    {{- end }}\n    {{- include \"confluence.sysprop.s3Config\" . | indent 4 }}\n    {{- if .Values.opensearch.enabled }}\n    -Dsearch.platform=opensearch\n    -Dopensearch.http.url=http://opensearch-cluster-master:9200\n    -Dopensearch.username=admin\n    {{- end }}\n    {{- if .Values.confluence.tunnel.additionalConnector.port }}\n    -Dsecure.tunnel.upstream.port={{ .Values.confluence.tunnel.additionalConnector.port }}\n    {{- end }}\n  max_heap: {{ .Values.confluence.resources.jvm.maxHeap }}\n  min_heap: {{ .Values.confluence.resources.jvm.minHeap }}\n  reserved_code_cache: {{ .Values.confluence.resources.jvm.reservedCodeCache }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/configmap-additional-config.yaml",
    "content": "{{- range $i, $key := .Values.additionalConfigMaps -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-{{ $key.name }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- range $key.keys }}\n  {{ .fileName -}}: |\n{{  .content | trim | indent 4 }}\n{{- end }}\n---\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/configmap-fluentd.yaml",
    "content": "{{ if .Values.fluentd.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-fluentd-config\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{ if .Values.fluentd.customConfigFile }}\n{{- range $key, $value := .Values.fluentd.fluentdCustomConfig }}\n  {{ $key }}: |\n{{ $value | indent 4 }}\n  {{- end }}\n  {{ else }}\n  fluent.conf: |\n    <source>\n      @type http\n      port {{ .Values.fluentd.httpPort }}\n      bind 0.0.0.0\n    </source>\n    <filter **>\n      @type record_transformer\n      <record>\n        podname \"#{ENV['POD_NAME']}\"\n        podnamespace \"#{ENV['POD_NAMESPACE']}\"\n        podip \"#{ENV['POD_IP']}\"\n        helmrelease \"#{ENV['HELM_RELEASE_NAME']}\"\n      </record>\n    </filter>\n    <filter **>\n      @type stdout\n    </filter>\n    {{ if .Values.fluentd.elasticsearch.enabled }}\n    <match **>\n      @type elasticsearch\n      host {{ .Values.fluentd.elasticsearch.hostname }}\n      logstash_format true\n      logstash_prefix {{ .Values.fluentd.elasticsearch.indexNamePrefix }}\n    </match>\n    {{ end }}\n  {{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/configmap-jmx-config.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{- if .Values.monitoring.jmxExporterCustomConfig }}\n  jmx-config.yaml: |\n  {{- with .Values.monitoring.jmxExporterCustomConfig }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- else }}\n  jmx-config.yaml: |\n    rules:\n    - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n      name: java_lang_$2_$3\n    - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n      name: java_lang_Memory_HeapMemoryUsage_$1\n    - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n      name: java_lang_G1_$1_Generation_$2\n    - pattern: '.*'\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/configmap-server-config.yaml",
    "content": "{{ if or .Values.confluence.tomcatConfig.generateByHelm .Values.confluence.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-server-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if or .Values.confluence.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n  server.xml: |\n{{- if .Values.confluence.tomcatConfig.customServerXml }}\n{{- .Values.confluence.tomcatConfig.customServerXml | nindent 6 }}\n{{- else }}\n    <?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <Server port=\"{{ .Values.confluence.tomcatConfig.mgmtPort | default \"8000\" }}\"\n            shutdown=\"SHUTDOWN\">\n      <Service name=\"Catalina\">\n        <Connector port=\"{{ .Values.confluence.tomcatConfig.port | default \"8090\" }}\"\n                   maxThreads=\"{{ .Values.confluence.tomcatConfig.maxThreads | default \"48\" }}\"\n                   minSpareThreads=\"{{ .Values.confluence.tomcatConfig.minSpareThreads | default \"10\" }}\"\n                   connectionTimeout=\"{{ .Values.confluence.tomcatConfig.connectionTimeout | default \"20000\" }}\"\n                   enableLookups=\"{{ .Values.confluence.tomcatConfig.enableLookups | default \"false\" }}\"\n                   protocol=\"{{ .Values.confluence.tomcatConfig.protocol | default \"org.apache.coyote.http11.Http11NioProtocol\" }}\"\n                   redirectPort=\"{{ .Values.confluence.tomcatConfig.redirectPort | default \"8443\" }}\"\n                   acceptCount=\"{{ .Values.confluence.tomcatConfig.acceptCount | default \"100\" }}\"\n                   debug=\"{{ .Values.confluence.tomcatConfig.debug | default \"0\" }}\"\n                   URIEncoding=\"{{ .Values.confluence.tomcatConfig.uriEncoding | default \"UTF-8\" }}\"\n                   secure=\"{{ default (include \"common.gateway.https\" .) .Values.confluence.tomcatConfig.secure }}\"\n                   scheme=\"{{ default (include \"common.gateway.scheme\" .) .Values.confluence.tomcatConfig.scheme }}\"\n                   proxyName=\"{{ .Values.confluence.tomcatConfig.proxyName | default (include \"common.gateway.hostname\" .)  }}\"\n                   proxyPort=\"{{ .Values.confluence.tomcatConfig.proxyPort | default (include \"common.gateway.externalPort\" .)  }}\"\n                   maxHttpHeaderSize=\"{{ .Values.confluence.tomcatConfig.maxHttpHeaderSize | default \"8192\" }}\" />\n\n         {{- if .Values.confluence.tunnel.additionalConnector.port }}\n         <Connector port=\"{{ .Values.confluence.tunnel.additionalConnector.port }}\"\n                    connectionTimeout=\"{{ .Values.confluence.tunnel.additionalConnector.connectionTimeout }}\"\n                    maxThreads=\"{{ .Values.confluence.tunnel.additionalConnector.maxThreads }}\"\n                    minSpareThreads=\"{{ .Values.confluence.tunnel.additionalConnector.minSpareThreads }}\"\n                    enableLookups=\"{{ .Values.confluence.tunnel.additionalConnector.enableLookups }}\"\n                    acceptCount=\"{{ .Values.confluence.tunnel.additionalConnector.acceptCount }}\"\n                    {{- if .Values.confluence.tunnel.additionalConnector.secure }}\n                    secure=\"true\"\n                    {{- end }}\n                    URIEncoding=\"{{ .Values.confluence.tunnel.additionalConnector.URIEncoding }}\" />\n         {{- end }}\n\n        <Engine name=\"Standalone\"\n                defaultHost=\"localhost\"\n                debug=\"0\">\n          <Host name=\"localhost\"\n                debug=\"0\"\n                appBase=\"webapps\"\n                unpackWARs=\"true\"\n                autoDeploy=\"false\"\n                startStopThreads=\"4\">\n            <Valve className=\"org.apache.catalina.valves.ErrorReportValve\" showReport=\"false\" showServerInfo=\"false\" />\n            <Context path=\"{{ .Values.confluence.service.contextPath | default \"\" }}\"\n                     docBase=\"../confluence\"\n                     debug=\"0\"\n                     reloadable=\"false\"\n                     useHttpOnly=\"true\">\n              <!-- Logging configuration for Confluence is specified in confluence/WEB-INF/classes/log4j.properties -->\n              <Manager pathname=\"\"/>\n              <Valve className=\"org.apache.catalina.valves.StuckThreadDetectionValve\"\n                     threshold=\"{{ .Values.confluence.tomcatConfig.stuckThreadDetectionValveThreshold | default \"60\" }}\" />\n            {{ if .Values.confluence.accessLog.enabled }}\n              <Valve className=\"org.apache.catalina.valves.AccessLogValve\"\n                     requestAttributesEnabled=\"{{ .Values.confluence.tomcatConfig.requestAttributesEnabled | default \"false\" }}\"\n                     directory=\"logs\"\n                     prefix=\"confluence_access\"\n                     suffix=\".log\"\n                     rotatable=\"true\"\n                     maxDays=\"{{ .Values.confluence.tomcatConfig.accessLogMaxDays | default \"-1\" }}\"\n                     pattern=\"{{ .Values.confluence.tomcatConfig.accessLogPattern }}\" />\n              <Valve className=\"org.apache.catalina.valves.RemoteIpValve\"\n                     proxiesHeader=\"x-forwarded-by\"\n                     {{- if .Values.confluence.tomcatConfig.proxyInternalIps }}\n                     internalProxies=\"{{ .Values.confluence.tomcatConfig.proxyInternalIps | replace \".\" \"\\\\.\" }}\"\n                     {{- end }}\n                     {{- if .Values.confluence.tomcatConfig.trustedProxies }}\n                     trustedProxies=\"{{ .Values.confluence.tomcatConfig.trustedProxies | replace \".\" \"\\\\.\" }}\"\n                     {{- end }}\n                     remoteIpHeader=\"x-forwarded-for\"\n                     protocolHeader=\"x-forwarded-proto\"\n                     requestAttributesEnabled=\"true\"\n                     resolveHosts=\"false\" />\n            {{ end }}\n            </Context>\n            <Context path=\"${confluence.context.path}/synchrony-proxy\"\n                     docBase=\"../synchrony-proxy\"\n                     debug=\"0\"\n                     reloadable=\"false\"\n                     useHttpOnly=\"true\">\n              <Valve className=\"org.apache.catalina.valves.StuckThreadDetectionValve\"\n                     threshold=\"60\"/>\n            </Context>\n          </Host>\n        </Engine>\n      </Service>\n    </Server>\n{{- end }}\n{{- end }}\n    {{- if or .Values.confluence.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n  seraph-config.xml: |\n    <security-config>\n        <parameters>\n            <init-param>\n                <param-name>login.url</param-name>\n                <param-value>/login.action?os_destination=${originalurl}&amp;permissionViolation=true</param-value>\n            </init-param>\n            <init-param>\n                <param-name>link.login.url</param-name>\n                <param-value>/login.action</param-value>\n            </init-param>\n            <init-param>\n                <param-name>cookie.encoding</param-name>\n                <param-value>cNf</param-value>\n            </init-param>\n            <init-param>\n                <param-name>login.cookie.key</param-name>\n                <param-value>seraph.confluence</param-value>\n            </init-param>\n\n            {% if atl_autologin_cookie_age is defined %}\n              <init-param>\n                  <param-name>autologin.cookie.age</param-name>\n                  <param-value>{{ .Values.confluence.seraphConfig.autoLoginCookieAge | default \"1209600\" }}</param-value>\n              </init-param>\n            {% endif %}\n\n            <!--only basic authentication available-->\n            <init-param>\n                <param-name>authentication.type</param-name>\n                <param-value>os_authType</param-value>\n            </init-param>\n\n            <!-- Invalidate session on login to prevent session fixation attack -->\n             <init-param>\n                <param-name>invalidate.session.on.login</param-name>\n                <param-value>true</param-value>\n            </init-param>\n            <!-- Add names for session attributes that must not be copied to a new session when the old one gets invalidated.\n              Currently it is empty (i.e. all attributes will be copied). -->\n            <init-param>\n                <param-name>invalidate.session.exclude.list</param-name>\n                <param-value></param-value>\n            </init-param>\n        </parameters>\n\n        <rolemapper class=\"com.atlassian.confluence.security.ConfluenceRoleMapper\"/>\n        <controller class=\"com.atlassian.confluence.setup.seraph.ConfluenceSecurityController\"/>\n\n        <!-- Default Confluence authenticator, which uses the configured user management for authentication. -->\n        <authenticator class=\"com.atlassian.confluence.user.ConfluenceAuthenticator\"/>\n\n        <!-- Custom authenticators appear below. To enable one of them, comment out the default authenticator above and uncomment the one below. -->\n\n        <!-- Authenticator with support for Crowd single-sign on (SSO). -->\n        <!-- <authenticator class=\"com.atlassian.confluence.user.ConfluenceCrowdSSOAuthenticator\"/> -->\n\n        <!-- Specialised version of the default authenticator which adds authenticated users to confluence-users if they aren't already a member. -->\n        <!-- <authenticator class=\"com.atlassian.confluence.user.ConfluenceGroupJoiningAuthenticator\"/> -->\n\n        <services>\n            <service class=\"com.atlassian.seraph.service.PathService\">\n                <init-param>\n                    <param-name>config.file</param-name>\n                    <param-value>seraph-paths.xml</param-value>\n                </init-param>\n            </service>\n        </services>\n\n        <elevatedsecurityguard class=\"com.atlassian.confluence.security.seraph.ConfluenceElevatedSecurityGuard\"/>\n    </security-config>\n{{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/configmap-values-analytics.yaml",
    "content": "{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-helm-values\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n  values.yaml: |\n  {{- include \"confluence.sanitizedValues\" . }}\n{{- end }}\n{{- if .Values.atlassianAnalyticsAndSupport.analytics.enabled }}\n  analytics.json: |\n  {{- include \"confluence.analyticsJson\" . | nindent 4 }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/configmaps-grafana-dashboards.yaml",
    "content": "{{- if .Values.monitoring.grafana.createDashboards }}\n{{- $grafanaDashboards := .Files.Glob \"grafana-dashboards/*.json\" -}}\n{{- range $index, $grafanaDashboard := $grafanaDashboards -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n{{- $fileName := split \"/\" $index }}\n  name: {{ include \"common.names.fullname\" . }}-{{ $fileName._1 | trimSuffix \".json\" }}-dashboard\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.monitoring.grafana.dashboardLabels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- if .Values.monitoring.grafana.dashboardAnnotations }}\n  annotations:\n    {{- with .Values.monitoring.grafana.dashboardAnnotations}}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- end }}\ndata:\n  {{ include \"common.names.fullname\" . }}-{{ .Release.Namespace}}-{{ $fileName._1}}: |\n{{ .Files.Get $index | indent 4 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/httproute.yaml",
    "content": "{{- if .Values.gateway.create }}\n{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: gateway.networking.k8s.io/v1\nkind: HTTPRoute\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.gateway.labels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.gateway.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  # Reference to the Gateway\n  parentRefs:\n  {{- toYaml .Values.gateway.parentRefs | nindent 2 }}\n  \n  # Hostnames to match\n  hostnames:\n  {{- range .Values.gateway.hostnames }}\n  - {{ . | quote }}\n  {{- end }}\n  \n  # Routing rules\n  rules:\n\n  {{- if .Values.synchrony.enabled }}\n  # Synchrony rule (collaborative editing)\n  - matches:\n    - path:\n        type: PathPrefix\n        value: {{ .Values.synchrony.ingress.path | default \"/synchrony\" }}\n    {{- with .Values.gateway.timeouts }}\n    timeouts:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n    backendRefs:\n    - name: {{ include \"synchrony.fullname\" . }}\n      port: {{ .Values.synchrony.service.port }}\n      weight: 100\n  {{- end }}\n\n  # Default rule - routes to Confluence service\n  - matches:\n    - path:\n        type: {{ .Values.gateway.pathType }}\n        value: {{ include \"confluence.path\" . }}\n    {{- with .Values.gateway.timeouts }}\n    timeouts:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n    {{- with .Values.gateway.filters }}\n    filters:\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n    backendRefs:\n    - name: {{ include \"common.names.fullname\" . }}\n      port: {{ .Values.confluence.service.port }}\n      weight: 100\n  \n  {{- with .Values.gateway.additionalRules }}\n  {{- toYaml . | nindent 2 }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/ingress-setup.yaml",
    "content": "{{- if and .Values.ingress.create (not .Values.ingress.openShiftRoute) }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-setup\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{ if .Values.ingress.nginx }}\n    \"nginx.ingress.kubernetes.io/affinity\": \"cookie\"\n    \"nginx.ingress.kubernetes.io/affinity-mode\": \"persistent\"\n    \"nginx.ingress.kubernetes.io/proxy-body-size\": {{ .Values.ingress.maxBodySize }}\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": \"300\"\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": \"300\"\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": \"300\"\n    {{- end }}\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{ if and (.Values.ingress.tlsSecretName) (.Values.ingress.host) }}\n  tls:\n    - hosts:\n        - {{ .Values.ingress.host }}\n      secretName: {{ .Values.ingress.tlsSecretName }}\n{{ end }}\n  ingressClassName: {{ default \"nginx\" .Values.ingress.className }}\n  rules:\n    - host: {{ .Values.ingress.host }}\n      http:\n        paths:\n          - path: {{ trimSuffix \"/\" (include \"confluence.ingressPath\" .) }}/setup\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"common.names.fullname\" . }}\n                port:\n                  number: {{ $.Values.confluence.service.port }}\n          - path: {{ trimSuffix \"/\" (include \"confluence.ingressPath\" .) }}/bootstrap\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"common.names.fullname\" . }}\n                port:\n                  number: {{ $.Values.confluence.service.port }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/ingress-synchrony.yaml",
    "content": "{{- if and .Values.ingress.create (not .Values.ingress.openShiftRoute) .Values.synchrony.ingress.path }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-synchrony\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{ if .Values.ingress.nginx }}\n    \"nginx.ingress.kubernetes.io/affinity\": \"cookie\"\n    \"nginx.ingress.kubernetes.io/affinity-mode\": \"persistent\"\n    \"nginx.ingress.kubernetes.io/proxy-body-size\": {{ .Values.ingress.maxBodySize }}\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": {{ .Values.ingress.proxyConnectTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": {{ .Values.ingress.proxyReadTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": {{ .Values.ingress.proxySendTimeout|quote }}\n    {{- end }}\n    {{- with .Values.synchrony.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{ if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n    - hosts:\n        - {{ .Values.ingress.host }}\n      {{ if .Values.ingress.tlsSecretName }}\n      secretName: {{ .Values.ingress.tlsSecretName }}\n      {{ end }}\n{{ end }}\n  ingressClassName: {{ default \"nginx\" .Values.ingress.className }}\n  rules:\n    - host: {{ .Values.ingress.host }}\n      http:\n        paths:\n          - path: {{ .Values.synchrony.ingress.path }}\n            pathType: {{ .Values.synchrony.ingress.pathType | default \"Prefix\" }}\n            backend:\n              service:\n                name: {{ include \"synchrony.fullname\" . }}\n                port:\n                  number: {{ $.Values.synchrony.service.port }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/ingress.yaml",
    "content": "{{- if and .Values.ingress.create (not .Values.ingress.openShiftRoute) }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{ if .Values.ingress.nginx }}\n    \"nginx.ingress.kubernetes.io/affinity\": \"cookie\"\n    \"nginx.ingress.kubernetes.io/affinity-mode\": \"persistent\"\n    \"nginx.ingress.kubernetes.io/proxy-body-size\": {{ .Values.ingress.maxBodySize }}\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": {{ .Values.ingress.proxyConnectTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": {{ .Values.ingress.proxyReadTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": {{ .Values.ingress.proxySendTimeout|quote }}\n    {{- end }}\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{ if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n    - hosts:\n        - {{ .Values.ingress.host }}\n      {{ if .Values.ingress.tlsSecretName }}\n      secretName: {{ .Values.ingress.tlsSecretName }}\n      {{ end }}\n{{ end }}\n  ingressClassName: {{ default \"nginx\" .Values.ingress.className }}\n  rules:\n    - host: {{ .Values.ingress.host }}\n      http:\n        paths:\n          {{ if and .Values.synchrony.enabled (not .Values.synchrony.ingress.path) }}\n          - path: /synchrony\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"synchrony.fullname\" . }}\n                port:\n                  number: {{ $.Values.synchrony.service.port }}\n          {{ end }}\n          - path: {{ include \"confluence.ingressPath\" . }}\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"common.names.fullname\" . }}\n                port:\n                  number: {{ $.Values.confluence.service.port }}\n         {{- range $path := .Values.ingress.additionalPaths }}\n          - path: {{ $path.path }}\n            pathType: {{ $path.pathType | default \"Prefix\" }}\n            backend:\n              service:\n                name: {{ $path.service }}\n                port:\n                  number: {{ $path.portNumber }}\n         {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/pdb.yaml",
    "content": "{{- if .Values.podDisruptionBudget.enabled }}\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.podDisruptionBudget.labels }}\n      {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.podDisruptionBudget.annotations }}\n  annotations:\n    {{- range $key, $value := . }}\n    {{ $key }}: {{ $value | quote }}\n    {{- end }}\n  {{- end }}\nspec:\n  {{- with .Values.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ . }}\n  {{- else }}\n  minAvailable: {{ .Values.podDisruptionBudget.minAvailable | default 0 }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/rbac.yaml",
    "content": "{{- if and (.Values.confluence.clustering.enabled) (or .Values.serviceAccount.clusterRole.create .Values.serviceAccount.role.create) }}\napiVersion: rbac.authorization.k8s.io/v1\n{{- if .Values.serviceAccount.clusterRole.create }}\nkind: ClusterRole\n{{- else }}\nkind: Role\n{{- end }}\nmetadata:\n{{- if .Values.serviceAccount.clusterRole.create }}\n  name: {{ template \"confluence.clusterRoleName\" . }}\n{{- else }}\n  name: {{ include \"common.names.fullname\" . }}\n{{- end }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nrules:\n  - apiGroups:\n      - \"\"\n    resources:\n      - endpoints\n      - pods\n{{- if .Values.serviceAccount.clusterRole.create }}\n      - nodes\n{{- end }}\n    verbs:\n      - get\n      - list\n{{- end }}\n---\n{{- if and (.Values.confluence.clustering.enabled) (or .Values.serviceAccount.clusterRoleBinding.create .Values.serviceAccount.roleBinding.create) }}\napiVersion: rbac.authorization.k8s.io/v1\n{{- if .Values.serviceAccount.clusterRoleBinding.create }}\nkind: ClusterRoleBinding\n{{- else }}\nkind: RoleBinding\n{{- end }}\nmetadata:\n{{- if .Values.serviceAccount.clusterRoleBinding.create }}\n  name: {{ include \"confluence.clusterRoleBindingName\" . }}\n{{- else }}\n  name: {{ include \"common.names.fullname\" . }}\n{{- end }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n{{- if .Values.serviceAccount.clusterRoleBinding.create }}\n  kind: ClusterRole\n{{- else }}\n  kind: Role\n{{- end }}\n  name: {{ include \"confluence.clusterRoleName\" . }}\nsubjects:\n  - kind: ServiceAccount\n    name: {{ include \"confluence.serviceAccountName\" . }}\n    namespace: {{ .Release.Namespace }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/route.yaml",
    "content": "{{- if and .Values.ingress.create .Values.ingress.openShiftRoute }}\nkind: Route\napiVersion: route.openshift.io/v1\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{- if .Values.ingress.routeHttpHeaders }}\n  httpHeaders:\n{{- with .Values.ingress.routeHttpHeaders }}\n{{- toYaml . | nindent 4 }}\n{{- end }}\n{{- end }}\n  host: {{ .Values.ingress.host }}\n  path: {{ include \"confluence.ingressPath\" . }}\n  to:\n    kind: Service\n    name: {{ include \"common.names.fullname\" . }}\n    weight: 100\n  port:\n    targetPort: http\n{{- if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n{{- if .Values.ingress.tlsSecretName }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace .Values.ingress.tlsSecretName) }}\n{{- if $secretData }}\n{{- if hasKey $secretData.data \"tls.crt\" }}\n    certificate: |\n      {{- index $secretData.data \"tls.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"tls.key\" }}\n    key: |\n      {{- index $secretData.data \"tls.key\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"ca.crt\" }}\n    caCertificate: |\n      {{- index $secretData.data \"ca.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- end }}\n{{- end }}\n    termination: edge\n    insecureEdgeTerminationPolicy: Redirect\n  wildcardPolicy: None\n{{- end }}\n{{- if .Values.synchrony.enabled }}\n---\nkind: Route\napiVersion: route.openshift.io/v1\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-synchrony\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{- if .Values.ingress.routeHttpHeaders }}\n  httpHeaders:\n{{- with .Values.ingress.routeHttpHeaders }}\n{{- toYaml . | nindent 4 }}\n{{- end }}\n{{- end }}\n  host: {{ .Values.ingress.host }}\n  path: /synchrony\n  to:\n    kind: Service\n    name: {{ include \"synchrony.fullname\" . }}\n    weight: 100\n  port:\n    targetPort: http\n{{- if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n{{- if .Values.ingress.tlsSecretName }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace .Values.ingress.tlsSecretName) }}\n{{- if $secretData }}\n{{- if hasKey $secretData.data \"tls.crt\" }}\n    certificate: |\n      {{- index $secretData.data \"tls.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"tls.key\" }}\n    key: |\n      {{- index $secretData.data \"tls.key\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"ca.crt\" }}\n    caCertificate: |\n      {{- index $secretData.data \"ca.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- end }}\n{{- end }}\n    termination: edge\n    insecureEdgeTerminationPolicy: Redirect\n  wildcardPolicy: None\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/secret-opensearch.yaml",
    "content": "{{- if and .Values.opensearch.enabled .Values.opensearch.credentials.createSecret (empty .Values.opensearch.credentials.existingSecretRef.name) }}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: opensearch-initial-password\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ntype: Opaque\ndata:\n  OPENSEARCH_INITIAL_ADMIN_PASSWORD: {{- include \"opensearch.initial.admin.password\" . | indent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/service-hazelcast.yaml",
    "content": "{{ if .Values.confluence.hazelcastService.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-hazelcast\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.confluence.hazelcastService.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.confluence.hazelcastService.type }}\n  ports:\n    - port: {{ .Values.confluence.ports.hazelcast }}\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  selector:\n    {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/service-jmx.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{- with .Values.monitoring.jmxServiceAnnotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  type: {{ .Values.monitoring.jmxExporterPortType }}\n  ports:\n    - port: {{ .Values.monitoring.jmxExporterPort}}\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n  {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/service-monitor.yaml",
    "content": "{{- if .Values.monitoring.serviceMonitor.create }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-service-monitor\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.monitoring.serviceMonitor.prometheusLabelSelector }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  endpoints:\n  - interval: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeIntervalSeconds }}\n    path: /metrics\n    port: jmx\n    scheme: http\n    relabelings:\n      - action: replace\n        sourceLabels:\n          - __meta_kubernetes_pod_name\n        targetLabel: instance\n    scrapeTimeout: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeTimeoutSeconds }}\n  selector:\n    matchLabels:\n    {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/service-synchrony.yaml",
    "content": "{{ if .Values.synchrony.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"synchrony.fullname\" . }}\n  labels:\n    {{- include \"synchrony.labels\" . | nindent 4 }}\n  annotations:\n    {{- if .Values.synchrony.service.annotations }}\n    {{- with .Values.synchrony.service.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n    {{- else }}\n    {{- with .Values.confluence.service.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n    {{- end }}\n\nspec:\n  type: {{ .Values.synchrony.service.type }}\n  {{- if and (eq .Values.synchrony.service.type \"LoadBalancer\") (not (empty .Values.synchrony.service.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.synchrony.service.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.synchrony.service.port }}\n      targetPort: http\n      protocol: TCP\n      name: http\n      {{- if and (eq .Values.synchrony.service.type \"NodePort\") .Values.synchrony.service.nodePort}}\n      nodePort: {{ .Values.synchrony.service.nodePort }}\n      {{- end }}\n    - port: {{ .Values.synchrony.ports.hazelcast }}\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  selector:\n    {{- include \"synchrony.selectorLabels\" . | nindent 4 }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.confluence.service.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.confluence.service.type }}\n  sessionAffinity: {{ .Values.confluence.service.sessionAffinity }}\n  {{- if .Values.confluence.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  sessionAffinityConfig:\n    clientIP:\n      timeoutSeconds: {{ .Values.confluence.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  {{- end }}\n  {{- if and (eq .Values.confluence.service.type \"LoadBalancer\") (not (empty .Values.confluence.service.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.confluence.service.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.confluence.service.port }}\n      targetPort: http\n      protocol: TCP\n      name: http\n      {{- if and (eq .Values.confluence.service.type \"NodePort\") .Values.confluence.service.nodePort}}\n      nodePort: {{ .Values.confluence.service.nodePort }}\n      {{- end }}\n  {{- if not .Values.confluence.hazelcastService.enabled }}\n    - port: {{ .Values.confluence.ports.hazelcast }}\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  {{- end }}\n  selector:\n    {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"confluence.serviceAccountName\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- if .Values.serviceAccount.eksIrsa.roleArn }}\n  {{- if not .Values.serviceAccount.annotations }}\n  annotations:\n  {{- end }}\n    eks.amazonaws.com/role-arn: {{ .Values.serviceAccount.eksIrsa.roleArn }}\n  {{- end }}\n{{- with .Values.serviceAccount.imagePullSecrets }}\nimagePullSecrets:\n  {{- toYaml . | nindent 2 }}\n{{- end -}}\n{{- end -}}"
  },
  {
    "path": "src/main/charts/confluence/templates/shared-home-pvc.yaml",
    "content": "{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-shared-home\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nspec:\n  accessModes:\n    {{ range .Values.volumes.sharedHome.persistentVolumeClaim.accessModes }}\n    - {{ . }}\n    {{ end }}\n  {{- if .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName }}\n  storageClassName: {{ .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName | quote }}\n  {{- end }}\n  {{- with .Values.volumes.sharedHome.persistentVolumeClaim.resources }}\n  resources:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/statefulset-synchrony.yaml",
    "content": "{{ if .Values.synchrony.enabled }}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"synchrony.fullname\" . }}\n  labels:\n    {{- include \"synchrony.labels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.synchrony.additionalAnnotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  {{- if .Values.updateStrategy }}\n  {{- with .Values.updateStrategy }}\n  updateStrategy:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{ if .Values.ordinals.enabled }}\n  ordinals:\n    start: {{ .Values.ordinals.start }}\n  {{ end }}\n  replicas: {{ .Values.synchrony.replicaCount }}\n  serviceName: {{ include \"synchrony.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"synchrony.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/synchrony-start-script.yaml\") . | sha256sum }}\n        {{- if .Values.synchrony.podAnnotations }}\n        {{- include \"synchrony.podAnnotations\" . | nindent 8 }}\n        {{- else }}\n        {{- include \"confluence.podAnnotations\" . | nindent 8 }}\n        {{- end }}\n      labels:\n        {{- include \"synchrony.labels\" . | nindent 8 }}\n        {{- include \"confluence.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.synchrony.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"confluence.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.synchrony.shutdown.terminationGracePeriodSeconds }}\n      {{- if .Values.openshift.runWithRestrictedSCC }}\n      {{- else }}\n      {{- if .Values.synchrony.securityContextEnabled }}\n      {{- with .Values.synchrony.securityContext }}\n      securityContext:\n        {{ toYaml . | nindent 8 }}\n      {{- end }}\n      {{- end }}\n      {{- end }}\n      hostAliases:\n        {{- include \"confluence.additionalHosts\" . | nindent 8 }}\n      {{- if or .Values.synchrony.additionalCertificates.secretName .Values.synchrony.additionalCertificates.secretList }}\n      initContainers:\n      - name: import-certs\n        image: {{ include \"confluence.image\" . | quote }}\n        imagePullPolicy: {{ .Values.image.pullPolicy }}\n        volumeMounts:\n          - name: keystore\n            mountPath: /var/ssl\n        {{- if.Values.synchrony.additionalCertificates.secretName }}\n          - name: certs\n            mountPath: /tmp/crt\n        {{- else }}\n        {{- range .Values.synchrony.additionalCertificates.secretList }}\n          {{- $secretName := .name }}\n          {{- range .keys }}\n          - name: {{ $secretName }}\n            mountPath: /tmp/crt/{{$secretName}}-{{ . }}\n            subPath: {{ . }}\n          {{- end }}\n        {{- end }}\n        {{- end }}\n        command: [\"/bin/bash\"]\n        args: [\"-c\", {{ include \"synchrony.addCrtToKeystoreCmd\" . }}]\n        resources:\n        {{- with .Values.synchrony.additionalCertificates.initContainer.resources }}\n        {{- toYaml . | nindent 12 }}\n        {{- end }}\n        securityContext:\n        {{- with .Values.synchrony.additionalCertificates.initContainer.securityContext }}\n        {{- toYaml . | nindent 12 }}\n        {{- end }}\n      {{- end }}\n      containers:\n        - name: synchrony\n          image: {{ include \"confluence.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          command: [\"/scripts/start-synchrony.sh\"]\n          volumeMounts:\n            {{- include \"synchrony.volumeMounts\" . | nindent 12 }}\n            {{- include \"synchrony.additionalVolumeMounts\" . | nindent 12 }}\n            {{- include \"synchrony.additionalLibraries\" . | nindent 12 }}\n            - mountPath: /scripts\n              name: entrypoint-script\n          ports:\n            - name: http\n              containerPort: {{ .Values.synchrony.ports.http }}\n              protocol: TCP\n            - name: hazelcast\n              containerPort: {{ .Values.synchrony.ports.hazelcast }}\n              protocol: TCP\n            {{- include \"synchrony.additionalPorts\" . | nindent 12 }}\n          readinessProbe:\n            httpGet:\n              port: {{ .Values.synchrony.ports.http }}\n              path: {{ .Values.synchrony.readinessProbe.healthcheckPath }}\n            initialDelaySeconds: {{ .Values.synchrony.readinessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.synchrony.readinessProbe.periodSeconds }}\n            failureThreshold: {{ .Values.synchrony.readinessProbe.failureThreshold }}\n          {{- with .Values.synchrony.containerSecurityContext }}\n          securityContext:\n          {{- toYaml . | nindent 12}}\n          {{- end}}\n          {{- with .Values.synchrony.resources.container }}\n          resources:\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          env:\n            - name: SET_PERMISSIONS\n              value: {{ .Values.synchrony.setPermissions | quote }}\n            - name: SYNCHRONY_BIND\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: SYNCHRONY_SERVICE_URL\n            {{ if .Values.synchrony.service.url }}\n              value: \"{{ .Values.synchrony.service.url }}\"\n            {{ else }}\n              value: \"{{ include \"common.gateway.scheme\" . }}://{{ include \"common.gateway.hostname\" . }}/synchrony\"\n            {{ end }}\n            {{- include \"synchrony.databaseEnvVars\" . | nindent 12 }}\n            {{- include \"synchrony.clusteringEnvVars\" . | nindent 12 }}\n            {{- include \"synchrony.additionalEnvironmentVariables\" . | nindent 12 }}\n      {{- if .Values.synchrony.nodeSelector }}\n      nodeSelector:\n      {{- toYaml .Values.synchrony.nodeSelector | nindent 8 }}\n      {{- else if .Values.nodeSelector }}\n      nodeSelector:\n      {{- toYaml .Values.nodeSelector | nindent 8 }}\n      {{- end }}\n      {{- if .Values.synchrony.affinity }}\n      affinity:\n      {{- toYaml .Values.synchrony.affinity | nindent 8 }}\n      {{- else if .Values.affinity }}\n      affinity:\n      {{- toYaml .Values.affinity | nindent 8 }}\n      {{- end }}\n      {{- if .Values.synchrony.tolerations }}\n      tolerations:\n      {{- toYaml .Values.synchrony.tolerations | nindent 8 }}\n      {{- else if .Values.tolerations }}\n      tolerations:\n      {{- toYaml .Values.tolerations | nindent 8 }}\n      {{- end }}\n      {{- if .Values.synchrony.topologySpreadConstraints }}\n      {{- with .Values.synchrony.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- else if .Values.confluence.topologySpreadConstraints }}\n      {{- with .Values.confluence.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- end }}\n      {{- if .Values.synchrony.priorityClassName }}\n      priorityClassName: {{ .Values.synchrony.priorityClassName }}\n      {{- else if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n      {{- end }}\n      {{- if .Values.synchrony.schedulerName }}\n      schedulerName: {{ .Values.synchrony.schedulerName  | quote }}\n      {{- else if .Values.schedulerName }}\n      schedulerName: {{ .Values.schedulerName  | quote }}\n      {{- end }}\n      volumes:\n        - name: entrypoint-script\n          configMap:\n            name: {{ include \"synchrony.fullname\" . }}-entrypoint\n            defaultMode: {{ if .Values.openshift.runWithRestrictedSCC}}360{{ else }}{{ .Values.volumes.defaultPermissionsMode | default \"484\" }}{{ end }}\n        {{ include \"synchrony.volumes\" . | nindent 8 }}\n  {{ include \"synchrony.volumeClaimTemplates\" . | nindent 2 }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/statefulset.yaml",
    "content": "{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.confluence.additionalAnnotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  {{- if .Values.updateStrategy }}\n  {{- with .Values.updateStrategy }}\n  updateStrategy:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{ if .Values.ordinals.enabled }}\n  ordinals:\n    start: {{ .Values.ordinals.start }}\n  {{ end }}\n  replicas: {{ .Values.replicaCount }}\n  serviceName: {{ include \"common.names.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/config-jvm.yaml\") . | sha256sum }}\n        {{- if .Values.additionalConfigMaps }}\n        checksum/config-additional: {{ include (print $.Template.BasePath \"/configmap-additional-config.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- if .Values.fluentd.enabled }}\n        checksum/config-fluentd: {{ include (print $.Template.BasePath \"/configmap-fluentd.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- include \"confluence.podAnnotations\" . | nindent 8 }}\n      labels:\n        {{- include \"common.labels.commonLabels\" . | nindent 8 }}\n        {{- include \"confluence.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"confluence.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.confluence.shutdown.terminationGracePeriodSeconds }}\n      {{- if .Values.openshift.runWithRestrictedSCC }}\n      {{- else }}\n      {{- if .Values.confluence.securityContextEnabled }}\n      {{- with .Values.confluence.securityContext }}\n      securityContext:\n        {{ toYaml . | nindent 8 }}\n        {{- if not .fsGroup }}\n        fsGroup: 2002\n        {{- end }}\n      {{- end }}\n      {{- end }}\n      {{- end }}\n      hostAliases:\n        {{- include \"confluence.additionalHosts\" . | nindent 8 }}\n      initContainers:\n        {{- if .Values.opensearch.enabled }}\n        - name: opensearch-check\n          image: {{ include \"confluence.image\" . | quote }}\n          command: ['sh', '-c']\n          args:\n          - |\n            timeout=300\n            end=$(($(date +%s) + timeout))\n            while [ $(date +%s) -lt $end ]; do\n              if curl -s -o /dev/null -w \"%{http_code}\" http://opensearch-cluster-master:9200 | grep -qE '^(200|401|403)$'; then\n                echo \"OpenSearch is ready\"\n                exit 0\n              fi\n              echo \"OpenSearch server not ready or not reachable. Waiting...\"\n              sleep 5\n            done\n            echo \"OpenSearch did not become ready in ${timeout} seconds. Exiting\"\n            exit 1\n        {{- end }}\n        {{- include \"confluence.additionalInitContainers\" . | nindent 8 }}\n        {{- if and .Values.volumes.sharedHome.nfsPermissionFixer.enabled (not .Values.openshift.runWithRestrictedSCC) }}\n        - name: nfs-permission-fixer\n          image: {{ .Values.volumes.sharedHome.nfsPermissionFixer.imageRepo }}:{{ .Values.volumes.sharedHome.nfsPermissionFixer.imageTag }}\n          imagePullPolicy: IfNotPresent\n          {{- if .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          resources:\n          {{- with .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- end }}\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: {{ .Values.volumes.sharedHome.nfsPermissionFixer.mountPath | quote }}\n              {{- if .Values.volumes.sharedHome.subPath }}\n              subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n              {{- end }}\n          command: [\"sh\", \"-c\", {{ include \"confluence.sharedHome.permissionFix.command\" . | quote }}]\n        {{- end }}\n        {{- include \"common.jmx.initContainer\" . | nindent 8 }}\n        {{- if or .Values.confluence.additionalCertificates.secretName .Values.confluence.additionalCertificates.secretList }}\n        - name: import-certs\n          image: {{ include \"confluence.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          volumeMounts:\n            - name: keystore\n              mountPath: /var/ssl\n          {{- if.Values.confluence.additionalCertificates.secretName }}\n            - name: certs\n              mountPath: /tmp/crt\n          {{- else }}\n          {{- range .Values.confluence.additionalCertificates.secretList }}\n            {{- $secretName := .name }}\n            {{- range .keys }}\n            - name: {{ $secretName }}\n              mountPath: /tmp/crt/{{$secretName}}-{{ . }}\n              subPath: {{ . }}\n            {{- end }}\n          {{- end }}\n          {{- end }}\n          command: [\"/bin/bash\"]\n          args: [\"-c\", {{ include \"confluence.addCrtToKeystoreCmd\" . }}]\n          resources:\n          {{- with .Values.confluence.additionalCertificates.initContainer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          securityContext:\n          {{- with .Values.confluence.additionalCertificates.initContainer.securityContext }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n        {{- end }}\n      containers:\n        - name: {{ if .Values.confluence.useHelmReleaseNameAsContainerName}}{{ include \"common.names.fullname\" . }}{{ else }}{{ .Chart.Name }}{{ end }}\n          image: {{ include \"confluence.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          ports:\n            - name: http\n              containerPort: {{ .Values.confluence.ports.http }}\n              protocol: TCP\n            - name: hazelcast\n              containerPort: {{ .Values.confluence.ports.hazelcast }}\n              protocol: TCP\n            {{- include \"common.jmx.port\" . | nindent 12 }}\n            {{- include \"confluence.additionalPorts\" . | nindent 12 }}\n          {{- if .Values.confluence.readinessProbe.enabled }}\n          readinessProbe:\n            {{- if .Values.confluence.readinessProbe.customProbe}}\n            {{- with .Values.confluence.readinessProbe.customProbe }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n            {{- else }}\n            httpGet:\n              port: {{ .Values.confluence.ports.http }}\n              path: {{ .Values.confluence.service.contextPath }}/status\n            initialDelaySeconds: {{ .Values.confluence.readinessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.confluence.readinessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.confluence.readinessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.confluence.readinessProbe.failureThreshold }}\n            {{- end }}\n          {{- end }}\n          {{- if .Values.confluence.startupProbe.enabled }}\n          startupProbe:\n            tcpSocket:\n              port: {{ .Values.confluence.ports.http }}\n            initialDelaySeconds: {{ .Values.confluence.startupProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.confluence.startupProbe.periodSeconds }}\n            failureThreshold: {{ .Values.confluence.startupProbe.failureThreshold }}\n          {{- end }}\n          {{- if .Values.confluence.livenessProbe.enabled }}\n          livenessProbe:\n          {{- if .Values.confluence.livenessProbe.customProbe}}\n          {{- with .Values.confluence.livenessProbe.customProbe }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- else }}\n            tcpSocket:\n              port: {{ .Values.confluence.ports.http }}\n            initialDelaySeconds: {{ .Values.confluence.livenessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.confluence.livenessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.confluence.livenessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.confluence.livenessProbe.failureThreshold }}\n          {{- end }}\n          {{- end }}\n          {{- with .Values.confluence.containerSecurityContext}}\n          securityContext:\n          {{- toYaml . | nindent 12}}\n          {{- end}}\n          {{- with .Values.confluence.resources.container }}\n          resources:\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          volumeMounts:\n            {{- include \"confluence.volumeMounts\" . | nindent 12 }}\n            {{- include \"common.jmx.config.volumeMounts\" . | nindent 12 }}\n            {{- include \"confluence.additionalVolumeMounts\" . | nindent 12 }}\n            {{- include \"confluence.additionalLibraries\" . | nindent 12 }}\n            {{- include \"confluence.additionalBundledPlugins\" . | nindent 12 }}\n            {{- range $i, $n := .Values.additionalFiles }}\n            - name: {{ .name }}-{{$i}}\n              mountPath: {{ .mountPath }}/{{ .key }}\n              subPath: {{ .key }}\n            {{ end }}\n            {{- range $i, $n := .Values.additionalConfigMaps }}\n            {{- range .keys }}\n            - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n              mountPath: {{ .mountPath }}/{{ .fileName }}\n              subPath: {{ .fileName }}\n            {{ end }}\n            {{- end }}\n          env:\n            {{- include \"confluence.sessionVars\" . | nindent 12 }}\n            {{- include \"confluence.tunnelVars\" . | nindent 12 }}\n            {{ if eq (include \"common.gateway.https\" .) \"true\" }}\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            {{ end }}\n            {{ if .Values.confluence.service.contextPath }}\n            - name: ATL_TOMCAT_CONTEXTPATH\n              value: {{ .Values.confluence.service.contextPath | quote }}\n            {{ end }}\n            - name: ATL_TOMCAT_PORT\n              value: {{ .Values.confluence.ports.http | quote }}\n            {{ if eq (include \"common.gateway.isConfigured\" .) \"true\" }}\n            - name: ATL_PROXY_NAME\n              value: {{ include \"common.gateway.hostname\" . | quote }}\n            - name: ATL_PROXY_PORT\n              value: {{ include \"common.gateway.externalPort\" . | quote }}\n            {{ end }}\n            - name: ATL_TOMCAT_ACCESS_LOG\n              value: {{ .Values.confluence.accessLog.enabled | quote }}\n            - name: UMASK\n              value: {{ .Values.confluence.umask | quote }}\n            - name: SET_PERMISSIONS\n              value: {{ .Values.confluence.setPermissions | quote }}\n            - name: ATL_PRODUCT_HOME_SHARED\n              value: {{ .Values.volumes.sharedHome.mountPath | quote }}\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            {{- include \"confluence.clusteringEnvVars\" . | nindent 12 }}\n            {{- include \"confluence.databaseEnvVars\" . | nindent 12 }}\n            {{ with .Values.confluence.license.secretName }}\n            - name: ATL_LICENSE_KEY\n              valueFrom:\n                secretKeyRef:\n                  name: {{ . }}\n                  key: {{ $.Values.confluence.license.secretKey }}\n            {{ end }}\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_RESERVED_CODE_CACHE_SIZE\n              valueFrom:\n                configMapKeyRef:\n                  key: reserved_code_cache\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            {{- if .Values.monitoring.exposeJmxMetrics }}\n            - name: CATALINA_OPTS\n              value: {{ include \"common.jmx.javaagent\" . | replace \"\\n\" \"\" | quote }}\n            {{- end }}\n            {{- include \"opensearch.env.vars\" . | nindent 12 }}\n            {{- include \"confluence.additionalEnvironmentVariables\" . | nindent 12 }}\n          lifecycle:\n          {{- if .Values.confluence.postStart.command }}\n            postStart:\n              exec:\n                command: [\"/bin/sh\", \"-c\", {{- .Values.confluence.postStart.command | quote }}]\n          {{- end }}\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", {{ .Values.confluence.shutdown.command | quote }}]\n        {{- include \"fluentd.container\" . | nindent 8 }}\n        {{- include \"confluence.additionalContainers\" . | nindent 8 }}\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.confluence.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n      {{- end }}\n      {{- if .Values.schedulerName }}\n      schedulerName: {{ .Values.schedulerName  | quote }}\n      {{- end }}\n      volumes:\n        {{- range $i, $n := .Values.additionalFiles }}\n        - name: {{ .name }}-{{$i}}\n          {{ .type }}:\n            {{ if hasPrefix .type \"secret\" }}{{ .type}}Name{{ else }}name{{ end }}: {{ .name }}\n            items:\n              - key: {{ .key }}\n                path: {{ .key }}\n        {{ end }}\n        {{- range $i, $key := .Values.additionalConfigMaps }}\n        {{- with $ }}\n        {{- range $key.keys }}\n        - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n          configMap:\n            name: {{ include \"common.names.fullname\" $ }}-{{ $key.name }}\n            {{- if .defaultMode }}\n            defaultMode: {{ .defaultMode }}\n            {{- end }}\n            items:\n              - key: {{ .fileName }}\n                path: {{ .fileName }}\n            {{- end }}\n        {{ end }}\n        {{- end }}\n        {{ include \"confluence.volumes\" . | nindent 8 }}\n        {{ include \"fluentd.config.volume\" . | nindent 8 }}\n        {{ include \"common.jmx.config.volume\" . | nindent 8 }}\n  {{ include \"confluence.volumeClaimTemplates\" . | nindent 2 }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/synchrony-start-script.yaml",
    "content": "{{ if .Values.synchrony.enabled }}\n{{- $activeProcessorCount := 1 -}}\n{{- $cpuRequest := .Values.synchrony.resources.container.requests.cpu | toString -}}\n{{- if not (contains \"m\" $cpuRequest) }}\n  {{- $activeProcessorCount = .Values.synchrony.resources.container.requests.cpu -}}\n{{- end }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"synchrony.fullname\" . }}-entrypoint\ndata:\n  # The script we use as the entrypoint for the Synchrony container, because there isn't one we can use out of the box.\n  # Note that the classpath ony really needs to contain synchrony-standalone.jar and the JDBC driver JAR, but for simplicitly\n  # we just add every JAR in the Confluence lib directory.\n  start-synchrony.sh: |\n    #!/usr/bin/env bash\n\n    java \\\n       -Xms{{ .Values.synchrony.resources.jvm.minHeap }} \\\n       -Xmx{{ .Values.synchrony.resources.jvm.maxHeap }} \\\n       -Xss{{ .Values.synchrony.resources.jvm.stackSize }} \\\n       -Dsynchrony.port={{ .Values.synchrony.ports.http }} \\\n       -Dcluster.listen.port={{ .Values.synchrony.ports.hazelcast }} \\\n       {{- if or .Values.synchrony.additionalCertificates.secretName .Values.synchrony.additionalCertificates.secretList }}\n       -Djavax.net.ssl.trustStore=/var/ssl/cacerts \\\n       {{- end }}\n       {{- range .Values.synchrony.additionalJvmArgs }}\n       {{ . }} \\\n       {{- end }}\n       -XX:ActiveProcessorCount={{ $activeProcessorCount }} \\\n       -classpath /opt/atlassian/confluence/confluence/WEB-INF/packages/synchrony-standalone.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/* \\\n       synchrony.core \\\n       sql\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/tests/test-application-status.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"confluence.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.statusTestContainer }}\n      env:\n        - name: STATUS_URL\n          value: \"http://{{ include \"common.names.fullname\" . }}:{{ .Values.confluence.service.port }}/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/tests/test-database-connectivity.yaml",
    "content": "{{ if .Values.database.credentials.secretName }}\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-db-connectivity-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"confluence.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  serviceAccountName: {{ include \"confluence.serviceAccountName\" . }}\n  volumes:\n    {{ include \"confluence.volumes.sharedHome\" . | nindent 4 }}\n  containers:\n    - name: test\n      image: {{ include \"confluence.image\" . | quote }}\n      imagePullPolicy: IfNotPresent\n      volumeMounts:\n        {{- include \"confluence.additionalLibraries\" . | nindent 8 }}\n      env:\n        - name: JDBC_TYPE\n          value: {{ .Values.database.type | quote }}\n        - name: JDBC_URL\n          value: {{ .Values.database.url | quote }}\n        - name: JDBC_USER\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.usernameSecretKey }}\n        - name: JDBC_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.passwordSecretKey }}\n        - name: CLASSPATH\n          value: \"/opt/atlassian/confluence/confluence/WEB-INF/lib/*\"\n      command:\n        - /bin/bash\n        - -ec\n        - |\n          cat <<EOF | jshell - > output.txt\n          var jdbcUrl = System.getenv(\"JDBC_URL\");\n          var jdbcUsername = System.getenv(\"JDBC_USER\");\n          var jdbcPassword = System.getenv(\"JDBC_PASSWORD\");\n\n          System.out.println(\"Establishing connection to \" + jdbcUrl);\n          try (var c = java.sql.DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)) {\n             System.out.println(\"Connection established OK, \" + c.getClass());\n          }\n          EOF\n          cat output.txt\n          grep -q \"Connection established OK\" output.txt\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/confluence/templates/tests/test-shared-home-permissions.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"confluence.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.permissionsTestContainer }}\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        {{- with .Values.confluence.securityContext }}\n        {{- if and .enabled .gid }}\n        runAsUser: {{ .gid }}\n        runAsGroup: {{ .gid }}\n        {{- else if .fsGroup }}\n        runAsUser: {{ .fsGroup }}\n        runAsGroup: {{ .fsGroup }}\n        {{- else }}\n        runAsUser: {{ 2003 }}\n        runAsGroup: {{ 2003 }}\n        {{- end }}\n        {{- end }}\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n          {{- if .Values.volumes.sharedHome.subPath }}\n          subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n          {{- end }}\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  volumes:\n    {{ include \"confluence.volumes.sharedHome\" . | nindent 4 }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/confluence/values.yaml",
    "content": "## Atlassian Confluence Data Center Helm values\n#\n# HEADS UP!\n#\n# Data loss will occur if sections declared as 'REQUIRED' are not configured appropriately!\n# These sections are:\n# - database\n# - volumes\n#\n# Additional details on pre-provisioning these required resources can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#3-configure-database\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#5-configure-persistent-storage\n#\n# To manage external access to the Confluence instance, a Gateway API HTTPRoute or an Ingress\n# resource can be configured under the 'gateway' or 'ingress' stanza respectively.\n# This requires a pre-provisioned gateway/ingress controller to be present.\n#\n# Additional details on configuring external access can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#4-configure-ingress\n#\n##\n\n\n# -- The initial number of Confluence pods that should be started at deployment time.\n# Note that Confluence requires manual configuration via the browser post deployment\n# after the first pod is deployed. This configuration must be completed before\n# scaling up additional pods. As such this value should always be kept as 1,\n# but can be altered once manual configuration is complete.\n#\nreplicaCount: 1\n\n# -- Set a custom start ordinal number for the K8s stateful set.\n# Note that this depends on the StatefulSetStartOrdinal K8s feature gate,\n# which has entered beta state with K8s version 1.27.\n#\nordinals:\n\n  # -- Enable only if StatefulSetStartOrdinal K8s feature gate is available.\n  #\n  enabled: false\n\n  # -- Set start ordinal to a positive integer, defaulting to 0.\n  #\n  start: 0\n\n# -- StatefulSet update strategy. When unset defaults to Rolling update.\n# See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets\n#\nupdateStrategy: {}\n  # type: OnDelete\n\n# Image configuration\n#\nimage:\n\n  # -- The Confluence Docker image to use\n  # https://hub.docker.com/r/atlassian/confluence\n  #\n  repository: atlassian/confluence\n\n  # -- Image pull policy\n  #\n  pullPolicy: IfNotPresent\n\n  # -- The docker image tag to be used - defaults to the Chart appVersion\n  #\n  tag: \"\"\n\n# K8s ServiceAccount configuration. Give fine-grained identity and authorization\n# to Pods\n#\nserviceAccount:\n\n  # -- Set to 'true' if a ServiceAccount should be created, or 'false' if it\n  # already exists.\n  #\n  create: true\n\n  # -- The name of the ServiceAccount to be used by the pods. If not specified, but\n  # the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name\n  # will be auto-generated, otherwise the 'default' ServiceAccount will be used.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server\n  #\n  name:\n\n  # -- For Docker images hosted in private registries, define the list of image pull\n  # secrets that should be utilized by the created ServiceAccount\n  # https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod\n  #\n  imagePullSecrets: []\n  # - name: secretName\n\n  # -- Annotations to add to the ServiceAccount (if created)\n  #\n  annotations: {}\n\n  role:\n    # -- Create a role for Hazelcast client with privileges to get and list pods and endpoints in the namespace.\n    # Set to false if you need to create a Role and RoleBinding manually\n    #\n    create: true\n\n   # Define permissions\n   # https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole\n   #\n  clusterRole:\n\n    # -- Set to 'true' if a ClusterRole should be created, or 'false' if it\n    # already exists.\n    #\n    create: false\n\n    # -- The name of the ClusterRole to be used. If not specified, but\n    # the \"serviceAccount.clusterRole.create\" flag is set to 'true',\n    # then the ClusterRole name will be auto-generated.\n    #\n    name:\n\n  # -- Grant permissions defined in Role (list and get pods and endpoints) to a service account.\n  #\n  roleBinding:\n\n    # Set to false if you need to create a Role and RoleBinding manually\n    #\n    create: true\n\n  # Grant permissions defined in ClusterRole\n  # https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding\n  #\n  clusterRoleBinding:\n\n    # -- Set to 'true' if a ClusterRoleBinding should be created, or 'false' if it\n    # already exists.\n    #\n    create: false\n\n    # -- The name of the ClusterRoleBinding to be created. If not specified, but\n    # the \"serviceAccount.clusterRoleBinding.create\" flag is set to 'true',\n    # then the ClusterRoleBinding name will be auto-generated.\n    #\n    name:\n\n  # Use EKS IRSA. See: https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html\n  #\n  eksIrsa:\n\n    # Defining a full arn of AWS role to assume will automatically annotate confluence,\n    # e.g. `eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/S3Access`.\n    # \"-Daws.webIdentityTokenFile=/var/run/secrets/eks.amazonaws.com/serviceaccount/token\" will be automatically added to Confluence JVM arguments\n    roleArn:\n\n# REQUIRED - Database configuration\n#\n# Confluence requires a backend database. The configuration below can be used to define the\n# database to use and its connection details.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#database-connectivity\n#\ndatabase:\n\n  # -- The database type that should be used. If not specified, then it will need to be\n  # provided via the browser during manual configuration post deployment. Valid values\n  # include:\n   # * 'postgresql'\n   # * 'mysql'\n   # * 'oracle'\n   # * 'mssql'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasetype\n  #\n  type:\n\n  # -- The jdbc URL of the database. If not specified, then it will need to be provided\n  # via the browser during manual configuration post deployment. Example URLs include:\n   # * 'jdbc:postgresql://<dbhost>:5432/<dbname>'\n   # * 'jdbc:mysql://<dbhost>/<dbname>'\n   # * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>'\n   # * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl\n  #\n  url:\n\n  # JDBC connection credentials\n  #\n  credentials:\n\n    # -- The name of the K8s Secret that contains the database login credentials.\n    # If the secret is specified, then the credentials will be automatically utilised on\n    # Confluence startup. If the secret is not provided, then the credentials will need to be\n    # provided via the browser during manual configuration post deployment.\n    #\n    # Example of creating a database credentials K8s secret below:\n    # 'kubectl create secret generic <secret-name> --from-literal=username=<username> \\\n    # --from-literal=password=<password>'\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    # -- The key ('username') in the Secret used to store the database login username\n    #\n    usernameSecretKey: username\n\n    # -- The key ('password') in the Secret used to store the database login password\n    #\n    passwordSecretKey: password\n\n# REQUIRED - Volume configuration\n#\n# By default, the charts will configure the local-home, synchrony-home and shared-home as ephemeral\n# volumes i.e. 'emptyDir: {}'. This is fine for evaluation purposes but for production\n# deployments this is not ideal and so local-home, synchrony-home and shared-home should all be configured\n# appropriately.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#volumes\n#\nvolumes:\n\n  # Each pod requires its own volume for 'local-home'. This is needed for key data\n  # that help define how Confluence works.\n  # https://confluence.atlassian.com/doc/confluence-home-and-other-important-directories-590259707.html\n  #\n  localHome:\n\n    # Dynamic provisioning of local-home using the K8s Storage Classes\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/LOCAL_STORAGE/\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically\n      # created for each pod based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the name of the 'StorageClass' that should be used for the local-home\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests for the local-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # This field controls if and how PVCs are deleted during the lifecycle of a StatefulSet.\n    # Only configure the below two attributes when your Kubernetes version is 1.27+, and\n    # feature gate StatefulSetAutoDeletePVC is enabled.\n    #\n    # For each policy that you can configure, you can set the value to either Delete or Retain.\n    #\n    # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention\n    #\n    persistentVolumeClaimRetentionPolicy:\n\n      # -- Configures the volume retention behavior that applies when the StatefulSet is deleted.\n      #\n      whenDeleted:\n\n      # -- Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.\n      #\n      whenScaled:\n\n    # -- Static provisioning of local-home using K8s PVs and PVCs\n    #\n    # NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for\n    # pods is not recommended. Dynamic provisioning described above is the prescribed\n    # approach.\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the local-home volume(s). If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Confluence container to which the local-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/confluence\"\n\n    # -- Specifies the sub-directory of the local-home volume that will be mounted in to the\n    # Confluence container.\n    #\n    subPath:\n\n  # A volume for 'shared-home' is required by Confluence to effectively operate in multi-node\n  # environment\n  # https://confluence.atlassian.com/doc/set-up-a-confluence-data-center-cluster-982322030.html#SetupaConfluenceDataCentercluster-Setupandconfigureyourcluster\n  #\n  sharedHome:\n\n    # Dynamic provisioning of shared-home using the K8s Storage Class\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically\n      # created for shared-home based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the access modes that should be used for the 'shared-home' volume claim.\n      # Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations.\n      # Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable.\n      # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes\n      #\n      accessModes:\n        - ReadWriteMany\n\n      # -- Specify the name of the 'StorageClass' that should be used for the 'shared-home'\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests limits for the shared-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # -- Static provisioning of shared-home using K8s PVs and PVCs\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the shared-home volume. If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Confluence container to which the shared-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/shared-home\"\n\n    # -- Specifies the sub-directory of the shared-home volume that will be mounted in to the\n    # Confluence container.\n    #\n    subPath:\n\n    # Modify permissions on shared-home\n    #\n    nfsPermissionFixer:\n\n      # -- If 'true', this will alter the shared-home volume's root directory so that Confluence\n      # can write to it. This is a workaround for a K8s bug affecting NFS volumes:\n      # https://github.com/kubernetes/examples/issues/260\n      #\n      enabled: true\n\n      # -- The path in the K8s initContainer where the shared-home volume will be mounted\n      #\n      mountPath: \"/shared-home\"\n\n      # -- Image repository for the permission fixer init container. Defaults to alpine\n      #\n      imageRepo: alpine\n\n      # -- Image tag for the permission fixer init container. Defaults to latest\n      #\n      imageTag: latest\n\n      # -- Resources requests and limits for nfsPermissionFixer init container\n      # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n      #\n      resources: {}\n      #  requests:\n      #    cpu: \"1m\"\n      #    memory: \"20Mi\"\n      #  limits:\n      #    cpu: \"1\"\n      #    memory: \"1G\"\n\n      # -- By default, the fixer will change the group ownership of the volume's root directory\n      # to match the Confluence container's GID (2002), and then ensures the directory is\n      # group-writeable. If this is not the desired behaviour, command used can be specified\n      # here.\n      #\n      command:\n\n  # Each synchrony pod needs its own volume for 'synchrony-home'. The Synchrony process will write logs to that location\n  # and any configuration files can be placed there.\n  #\n  synchronyHome:\n\n    # Dynamic provisioning of synchrony-home using the K8s Storage Classes\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/LOCAL_STORAGE/\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically\n      # created for each pod based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the name of the 'StorageClass' that should be used for the synchrony-home\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests for the synchrony-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # This field controls if and how PVCs are deleted during the lifecycle of a StatefulSet.\n    # Only configure the below two attributes when your Kubernetes version is 1.27+, and\n    # feature gate StatefulSetAutoDeletePVC is enabled.\n    #\n    # For each policy that you can configure, you can set the value to either Delete or Retain.\n    #\n    # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention\n    #\n    persistentVolumeClaimRetentionPolicy:\n\n      # -- Configures the volume retention behavior that applies when the StatefulSet is deleted.\n      #\n      whenDeleted:\n\n      # -- Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.\n      #\n      whenScaled:\n\n    # -- Static provisioning of synchrony-home using K8s PVs and PVCs\n    #\n    # NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for\n    # pods is not recommended. Dynamic provisioning described above is the prescribed\n    # approach.\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the synchrony-home volume(s). If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    #\n    customVolume: { }\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Synchrony container to which the synchrony-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/confluence\"\n\n  # -- Defines additional volumes that should be applied to all Confluence pods.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in confluence.additionalVolumeMounts\n  #\n  additional: []\n\n  # -- Defines additional volumes that should be applied to all Synchrony pods.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in synchrony.additionalVolumeMounts\n  #\n  additionalSynchrony: []\n\n  # -- Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511\n  # Typically overridden in volumes from Secrets and ConfigMaps to make mounted files executable\n  #\n  defaultPermissionsMode: 484\n\n# Ingress configuration\n#\n# Use this section when routing external traffic to Confluence via a Kubernetes Ingress\n# resource (K8s Ingress API). Requires a pre-provisioned Ingress Controller.\n# If using the Gateway API instead, see the 'gateway' section below.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#ingress\n#\ningress:\n\n  # -- Set to 'true' if an Ingress Resource should be created. This depends on a\n  # pre-provisioned Ingress Controller being available.\n  #\n  create: false\n\n  # -- The fully-qualified hostname (FQDN) of the Confluence instance. This value is used\n  # to configure the product's proxy settings and, when ingress.create is true,\n  # the Ingress resource routing rules.\n  #\n  host:\n\n  # -- Whether users access the application over HTTPS. Set to 'false' if not\n  # using TLS, e.g. when reaching the service via localhost port-forwarding.\n  #\n  https: true\n\n  # -- The base path for the application, e.g. '/confluence'.\n  # Defaults to 'confluence.service.contextPath'.\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when ingress.create is true.\n  # They configure the Ingress resource itself and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Set to true if you want to create an OpenShift Route instead of an Ingress\n  #\n  openShiftRoute: false\n\n  # -- routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only\n  #\n  routeHttpHeaders: {}\n\n  # -- The class name used by the ingress controller if it's being used.\n  #\n  # Please follow documentation of your ingress controller. If the cluster\n  # contains multiple ingress controllers, this setting allows you to control\n  # which of them is used for Atlassian application traffic.\n  #\n  className: \"nginx\"\n\n  # -- Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx'\n  # controller.\n  # https://kubernetes.github.io/ingress-nginx/\n  #\n  # This will populate the Ingress Resource with annotations that are specific to\n  # the K8s ingress-nginx controller. Set to 'false' if a different controller is\n  # to be used, in which case the appropriate annotations for that controller must\n  # be specified below under 'ingress.annotations'.\n  #\n  nginx: true\n\n  # -- The max body size to allow. Requests exceeding this size will result\n  # in an HTTP 413 error being returned to the client.\n  #\n  maxBodySize: 250m\n\n  # -- Defines a timeout for establishing a connection with a proxied server. It should\n  # be noted that this timeout cannot usually exceed 75 seconds.\n  #\n  proxyConnectTimeout: 60\n\n  # -- Defines a timeout for reading a response from the proxied server. The timeout is\n  # set only between two successive read operations, not for the transmission of the\n  # whole response. If the proxied server does not transmit anything within this time,\n  # the connection is closed.\n  #\n  proxyReadTimeout: 60\n\n  # -- Sets a timeout for transmitting a request to the proxied server. The timeout is set\n  # only between two successive write operations, not for the transmission of the whole\n  # request. If the proxied server does not receive anything within this time, the\n  # connection is closed.\n  #\n  proxySendTimeout: 60\n\n  # -- The custom annotations that should be applied to the Ingress Resource.\n  # If using an ingress-nginx controller be sure that the annotations you add\n  # here are compatible with those already defined in the 'ingess.yaml' template\n  #\n  annotations: {}\n\n  # -- The name of the K8s Secret that contains the TLS private key and corresponding\n  # certificate. When utilised, TLS termination occurs at the ingress point where\n  # traffic to the Service, and it's Pods is in plaintext.\n  #\n  # Usage is optional and depends on your use case. The Ingress Controller itself\n  # can also be configured with a TLS secret for all Ingress Resources.\n  # https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets\n  # https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n  #\n  tlsSecretName:\n\n  # -- Additional paths to be added to the Ingress resource to point to different backend services\n  #\n  additionalPaths: []\n    #- path: /static-content\n    #  pathType: Prefix\n    #  service: static-content-svc\n    #  portNumber: 80\n\n# Gateway API configuration\n#\n# Use this section when routing external traffic to Confluence via the Kubernetes\n# Gateway API, or when using an external proxy/load balancer without creating\n# any K8s routing resource. Only one of 'ingress' or 'gateway' should be used.\n# https://gateway-api.sigs.k8s.io/\n#\ngateway:\n\n  # -- Set to 'true' if an HTTPRoute Resource should be created. This depends on a\n  # pre-provisioned Gateway API controller being available and a Gateway resource.\n  # Cannot be enabled if ingress.create is true.\n  #\n  create: false\n\n  # -- The hostnames that should be routed to Confluence. At least one hostname\n  # is required when gateway.create is true. Setting hostnames activates gateway\n  # mode for product configuration even when gateway.create is false, allowing\n  # use with a pre-existing Gateway or external proxy.\n  # The first entry is used as the canonical hostname for base URL, proxy\n  # settings, and NOTES output — list the primary/public hostname first.\n  #\n  hostnames: []\n  # - confluence.example.com\n  # - wiki.example.com\n\n  # -- Whether users access the application over HTTPS.\n  # This does not configure TLS on the Gateway or load balancer — it must match\n  # how traffic is actually routed to the application.\n  #\n  https: true\n\n  # -- The port users connect on. Defaults to 443 (https) or 80 (http).\n  # This does not change the Gateway or load balancer port — it must match\n  # the port that is actually used. Only set for non-standard ports.\n  #\n  # externalPort:\n\n  # -- The base path for routing. When empty, falls back to the product's\n  # service.contextPath (same behavior as ingress). Set explicitly to\n  # override, e.g. \"/confluence\".\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when gateway.create is true.\n  # They configure the HTTPRoute resource and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Reference to the parent Gateway resource. Supports any standard\n  # parentRef fields (name, namespace, sectionName, etc.).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference\n  #\n  parentRefs: []\n    # - name: example-gateway\n    #   namespace: example-gateway-namespace\n    #   sectionName: https\n\n  # -- Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\".\n  # PathPrefix is recommended for most use cases.\n  #\n  pathType: \"PathPrefix\"\n\n  # -- Annotations to add to the HTTPRoute resource.\n  #\n  annotations: {}\n  # kubernetes.io/ingress.class: gateway\n  # cert-manager.io/cluster-issuer: letsencrypt\n\n  # -- Labels to add to the HTTPRoute resource.\n  #\n  labels: {}\n  # environment: production\n  # team: platform\n\n  # -- HTTP filters to apply to requests. Can be used to add/remove headers,\n  # perform redirects, or rewrite URLs.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter\n  #\n  filters: []\n  # - type: RequestHeaderModifier\n  #   requestHeaderModifier:\n  #     add:\n  #     - name: X-Forwarded-Proto\n  #       value: https\n\n  # -- Advanced routing rules. Use this for complex routing scenarios like\n  # header-based routing, traffic splitting, or multiple backends.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule\n  #\n  additionalRules: []\n  # - matches:\n  #   - path:\n  #       type: PathPrefix\n  #       value: /api\n  #   backendRefs:\n  #   - name: confluence-api\n  #     port: 8090\n\n  # -- Session affinity (sticky sessions) is required for Atlassian DC products but\n  # is not part of the standard Gateway API HTTPRoute spec. It must be configured\n  # separately through your Gateway implementation's own policy resources.\n  # See docs/docs/examples/ingress/GATEWAY_API_SESSION_AFFINITY.md for working examples.\n\n  # -- Timeout configuration for HTTPRoute rules.\n  # Note: when migrating from Ingress, these replace proxyReadTimeout and\n  # proxySendTimeout. There is no Gateway API equivalent for\n  # proxyConnectTimeout or maxBodySize — those require controller-specific\n  # policies (e.g. Envoy Gateway BackendTrafficPolicy).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts\n  #\n  timeouts:\n    request: \"60s\"\n    backendRequest: \"60s\"\n\n# Confluence configuration\n#\nconfluence:\n\n  # -- Whether the main container should acquire helm release name. By default the container name is `confluence` which corresponds to the name of the Helm Chart.\n  #\n  useHelmReleaseNameAsContainerName: false\n\n  # K8s Confluence Service configuration\n  #\n  service:\n\n    # -- The port on which the Confluence K8s Service will listen\n    #\n    port: 80\n\n    # -- The type of K8s service to use for Confluence\n    #\n    type: ClusterIP\n\n    # --  Only applicable if service.type is NodePort. NodePort for Confluence service\n    #\n    nodePort:\n\n    # -- Session affinity type. If you want to make sure that connections from a particular client\n    # are passed to the same pod each time, set sessionAffinity to ClientIP.\n    # See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity\n    #\n    sessionAffinity: None\n\n    # -- Session affinity configuration\n    #\n    sessionAffinityConfig:\n\n      clientIP:\n\n        # -- Specifies the seconds of ClientIP type session sticky time.\n        # The value must be > 0 && <= 86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).\n        #\n        timeoutSeconds:\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- The Tomcat context path that Confluence will use. The ATL_TOMCAT_CONTEXTPATH\n    # will be set automatically.\n    #\n    contextPath:\n\n    # -- Additional annotations to apply to the Service\n    #\n    annotations: {}\n\n  hazelcastService:\n\n    # -- Enable or disable an additional Hazelcast service that Confluence nodes can use to join a cluster.\n    # It is recommended to create a separate Hazelcast service if the Confluence service\n    # uses a LoadBalancer type (e.g., NLB), ensuring that the Hazelcast port is not exposed at all.\n    enabled: false\n\n    # -- The port on which the Confluence K8s Hazelcast Service will listen\n    #\n    port: 5701\n\n    # -- The type of the Hazelcast K8s service to use for Confluence\n    #\n    type: ClusterIP\n\n    # -- Additional annotations to apply to the Hazelcast Service\n    #\n    annotations: {}\n\n  # Standard K8s field that holds pod-level security attributes and common container settings.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  # Do not populate when deploying to OpenShift, unless anyuid policy is attached to a service account.\n  #\n\n  # -- Whether to apply security context to pod.\n  #\n  securityContextEnabled: true\n\n  securityContext:\n\n    # -- The GID used by the Confluence docker image\n    # GID will default to 2002 if not supplied and securityContextEnabled is set to true.\n    # This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Confluence container.\n    # However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260\n    fsGroup: 2002\n\n    # -- fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod.\n    # This field only applies to volume types that support fsGroup controlled ownership and permissions.\n    # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods\n    #\n    fsGroupChangePolicy: \"OnRootMismatch\"\n\n  # -- Standard K8s field that holds security configurations that will be applied to a container.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  #\n  containerSecurityContext: {}\n\n  # -- The umask used by the Confluence process when it creates new files.\n  # The default is 0022. This gives the new files:\n    #  - read/write permissions for the Confluence user\n    #  - read permissions for everyone else.\n  #\n  umask: \"0022\"\n\n  # -- Boolean to define whether to set local home directory permissions on startup\n  # of Confluence container. Set to 'false' to disable this behaviour.\n  #\n  setPermissions: true\n\n  # Port definitions\n  #\n  ports:\n\n    # -- The port on which the Confluence container listens for HTTP traffic\n    #\n    http: 8090\n\n    # -- The port on which the Confluence container listens for Hazelcast traffic\n    #\n    hazelcast: 5701\n\n  # Confluence licensing details\n  #\n  license:\n\n    # -- The name of the K8s Secret that contains the Confluence license key. If specified, then\n    # the license will be automatically populated during Confluence setup. Otherwise, it will\n    # need to be provided via the browser after initial startup. An Example of creating\n    # a K8s secret for the license below:\n    # 'kubectl create secret generic <secret-name> --from-literal=license-key=<license>\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    # -- The key in the K8s Secret that contains the Confluence license key\n    #\n    secretKey: license-key\n\n  # Confirm that Confluence is up and running with a ReadinessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes\n  #\n  readinessProbe:\n\n    # -- Whether to apply the readinessProbe check to pod.\n    #\n    enabled: true\n\n    # -- The initial delay (in seconds) for the Confluence container readiness probe,\n    # after which the probe will start running.\n    #\n    initialDelaySeconds: 10\n\n    # -- How often (in seconds) the Confluence container readiness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Confluence container readiness probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 6\n\n    # -- Custom readinessProbe to override the default /status httpGet\n    #\n    customProbe: {}\n#      tcpSocket:\n#        port: 8080\n#      periodSeconds: 5\n#      failureThreshold: 120\n\n  # Confirm that Confluence is up and running with a StartupProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-startup-probes\n  #\n  startupProbe:\n\n    # -- Whether to apply the startupProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Confluence container startup probe will run\n    #\n    periodSeconds: 5\n\n    # -- The number of consecutive failures of the Confluence container startup probe\n    # before the pod fails startup checks.\n    #\n    failureThreshold: 120\n\n  # Ensure that the server responds with a LivenessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-tcp-liveness-probe\n  #\n  livenessProbe:\n\n    # -- Whether to apply the livenessProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Confluence container liveness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Confluence container liveness probe\n    # before the pod fails liveness checks.\n    #\n    failureThreshold: 12\n\n    # -- Custom livenessProbe to override the default tcpSocket probe\n    #\n    customProbe: {}\n\n  # Confluence log configuration\n  #\n  accessLog:\n\n    # -- Set to 'true' if access logging should be enabled.\n    #\n    enabled: true\n\n    # -- The path within the Confluence container where the local-home volume should be\n    # mounted in order to capture access logs.\n    #\n    mountPath: \"/opt/atlassian/confluence/logs\"\n\n    # -- The subdirectory within the local-home volume where access logs should be\n    # stored.\n    #\n    localHomeSubPath: \"logs\"\n\n  session:\n\n    # -- User session timeout. Set to 30 minutes in web.xml\n    #\n    timeout:\n\n    # -- The maximum time a user can remain logged-in with 'Remember Me'. Defaults to 1209600; two weeks, in seconds\n    #\n    autologinCookieAge:\n\n  # Data Center clustering\n  #\n  clustering:\n\n    # -- Set to 'true' if Data Center clustering should be enabled\n    # This will automatically configure cluster peer discovery between cluster nodes.\n    #\n    enabled: false\n\n    # -- Set to 'true' if the K8s pod name should be used as the end-user-visible\n    # name of the Data Center cluster node.\n    #\n    usePodNameAsClusterNodeName: true\n\n  # Use AWS S3 to store attachments. From Confluence 8.1 onwards.\n  #\n\n  s3AttachmentsStorage:\n\n    # Bucket name to store attachments. If a bucket name and region (see below) are defined, Confluence will automatically\n    # use AWS S3 to store attachments. Only bucket name is required, not the full arn.\n    #\n    bucketName:\n\n    # AWS region where the S3 bucket is located.\n    #\n    bucketRegion:\n\n    # -- EXPERIMENTAL Feature! Override the default AWS API endpoint with a custom one, for example to use\n    # Minio as object storage https://min.io/\n    #\n    endpointOverride:\n\n  # Confluence Pod resource requests\n  #\n  resources:\n\n    # JVM Memory / Heap Size definitions. The values below are based on the\n    # defaults defined for the Confluence docker container.\n    # https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/src/master/#markdown-header-memory-heap-size\n    #\n    jvm:\n\n      # -- The maximum amount of heap memory that will be used by the Confluence JVM\n      #\n      maxHeap: \"1g\"\n\n      # -- The minimum amount of heap memory that will be used by the Confluence JVM\n      #\n      minHeap: \"1g\"\n\n      # -- The memory reserved for the Confluence JVM code cache\n      #\n      reservedCodeCache: \"256m\"\n\n    # Specifies the standard K8s resource requests and/or limits for the Confluence\n    # container. It is important that if the memory resources are specified here,\n    # they must allow for the size of the Confluence JVM. That means the maximum heap\n    # size, the reserved code cache size, plus other JVM overheads, must be\n    # accommodated. Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    #\n    container:\n\n      requests:\n        # -- Initial CPU request by Confluence pod.\n        #\n        cpu: \"2\"\n\n        # -- Initial Memory request by Confluence pod\n        #\n        memory: \"2G\"\n\n      # limits:\n      #   # -- Initial CPU limit by Confluence pod.\n      #   #\n      #   cpu: \"2\"\n      #\n      #   # -- Initial Memory limit by Confluence pod\n      #   #\n      #   memory: \"2G\"\n\n  shutdown:\n\n    # -- The termination grace period for pods during shutdown. This\n    # should be set to the Confluence internal grace period (default 20\n    # seconds), plus a small buffer to allow the JVM to fully terminate.\n    #\n    terminationGracePeriodSeconds: 25\n\n    # -- By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/),\n    # using a script supplied by the Docker image. If any other\n    # shutdown behaviour is needed it can be achieved by overriding\n    # this value. Note that the shutdown command needs to wait for the\n    # application shutdown completely before exiting; see [the default\n    # command](https://bitbucket.org/atlassian-docker/docker-atlassian-confluence-server/src/master/shutdown-wait.sh)\n    # for details.\n    #\n    command: \"/shutdown-wait.sh\"\n\n  # -- PostStart is executed immediately after a container is created.\n  # However, there is no guarantee that the hook will execute before the container ENTRYPOINT.\n  # See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n  #\n  postStart:\n    command:\n\n  # -- The Docker entrypoint.py generates application configuration on\n  # first start; not all of these files are regenerated on subsequent starts.\n  # By default, confluence.cfg.xml is generated only once. Set `forceConfigUpdate` to true\n  # to change this behavior.\n  #\n  forceConfigUpdate: false\n\n  # -- Specifies a list of additional arguments that can be passed to the Confluence JVM, e.g.\n  # system properties.\n  #\n  additionalJvmArgs: []\n\n  # -- By default Tomcat's server.xml is generated in the container entrypoint from a template\n  # shipped with an official Confluence image. However, server.xml generation may fail if container\n  # is not run as root, which is a common case if Confluence is deployed to OpenShift.\n  #\n  tomcatConfig:\n\n    # -- Mount server.xml as a ConfigMap. Override configuration elements if necessary\n    #\n    generateByHelm: false\n\n    mgmtPort: \"8000\"\n    port: \"8090\"\n    maxThreads: \"100\"\n    minSpareThreads: \"10\"\n    connectionTimeout: \"20000\"\n    enableLookups: \"false\"\n    protocol: \"org.apache.coyote.http11.Http11NioProtocol\"\n    redirectPort: \"8443\"\n    acceptCount: \"100\"\n    debug: \"0\"\n    uriEncoding: \"UTF-8\"\n    # secure is set based on the https setting (gateway.https or ingress.https)\n    secure:\n    # scheme is set based on the https setting (http if false, https if true)\n    scheme:\n    # proxyName is set to the configured hostname (gateway.hostnames[0] or ingress.host)\n    proxyName:\n    # proxyPort is set to the external port (defaults to 443 for https, 80 for http)\n    proxyPort:\n    maxHttpHeaderSize: \"8192\"\n    proxyInternalIps:\n    trustedProxies:\n    stuckThreadDetectionValveThreshold: \"60\"\n    accessLogMaxDays: \"-1\"\n    accessLogPattern: \"%h %{X-AUSERNAME}o %t &quot;%r&quot; %s %b %D %U %I &quot;%{User-Agent}i&quot;\"\n    requestAttributesEnabled: \"false\"\n\n    # -- Custom server.xml to be mounted into /opt/atlassian/confluence/conf\n    #\n    customServerXml: |\n#      <?xml version='1.0' encoding='utf-8'?>\n#      <Server port=\"8005\" shutdown=\"SHUTDOWN\">\n#      </Server>\n\n  # -- By default seraph-config.xml is generated in the container entrypoint from a template\n  # shipped with an official Confluence image. However, seraph-config.xml generation may fail if container\n  # is not run as root, which is a common case if Confluence is deployed to OpenShift.\n  #\n  seraphConfig:\n\n    # -- Mount seraph-config.xml as a ConfigMap. Override configuration elements if necessary\n    #\n    generateByHelm: false\n\n    autoLoginCookieAge: \"1209600\"\n\n  # -- Specifies a list of additional Java libraries that should be added to the\n  # Confluence container. Each item in the list should specify the name of the volume\n  # that contains the library, as well as the name of the library file within that\n  # volume's root directory. Optionally, a subDirectory field can be included to\n  # specify which directory in the volume contains the library file. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  additionalLibraries: []\n  #   - volumeName:\n  #     subDirectory:\n  #     fileName:\n\n  # -- Specifies a list of additional Confluence plugins that should be added to the\n  # Confluence container. Note plugins installed via this method will appear as\n  # bundled plugins rather than user plugins. These should be specified in the same\n  # manner as the 'additionalLibraries' property. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  # NOTE: only .jar files can be loaded using this approach. OBR's can be extracted\n  # (unzipped) to access the associated .jar\n  #\n  # An alternative to this method is to install the plugins via \"Manage Apps\" in the\n  # product system administration UI.\n  #\n  additionalBundledPlugins: []\n  #   - volumeName:\n  #     subDirectory:\n  #     fileName:\n\n  # -- Defines any additional volumes mounts for the Confluence container. These\n  # can refer to existing volumes, or new volumes can be defined via\n  # 'volumes.additional'.\n  #\n  additionalVolumeMounts: []\n\n  # -- Defines any additional environment variables to be passed to the Confluence\n  # container. See https://hub.docker.com/r/atlassian/confluence for\n  # supported variables.\n  #\n  additionalEnvironmentVariables: []\n\n  # -- Defines any additional ports for the Confluence container.\n  #\n  additionalPorts: []\n  #  - name: jmx\n  #    containerPort: 5555\n  #    protocol: TCP\n\n  # -- Defines additional volumeClaimTemplates that should be applied to the Confluence pod.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in confluence.additionalVolumeMounts\n  #\n  additionalVolumeClaimTemplates: []\n  #  - name: myadditionalvolumeclaim\n  #    storageClassName:\n  #    resources:\n  #      requests:\n  #        storage: 1Gi\n\n  # -- Defines additional annotations to the Confluence StateFulSet. This might be required when deploying using a GitOps approach\n  additionalAnnotations: {}\n  #  argocd.argoproj.io/sync-wave: \"10\"\n\n  # -- Defines topology spread constraints for Confluence pods. See details:\n  # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n  #\n  topologySpreadConstraints: []\n  # - maxSkew: 1\n  #   topologyKey: kubernetes.io/hostname\n  #   whenUnsatisfiable: ScheduleAnyway\n  #   labelSelector:\n  #     matchLabels:\n  #       app.kubernetes.io/name: confluence\n\n  # Debugging\n  #\n  jvmDebug:\n\n    # -- Set to 'true' for remote debugging. Confluence JVM will be started with debugging\n    # port 5005 open.\n    enabled: false\n\n  # -- Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates\n  #\n  additionalCertificates:\n    # -- Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data\n    # will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.\n    #\n    secretName:\n    # -- A list of secrets with their respective keys holding certificates to be added to the Java truststore.\n    # It is mandatory to specify which keys from secret data need to be mounted as files to the init container.\n    #\n    secretList: []\n    #- name: self-signed-ca\n    #  keys:\n    #    - ca.crt\n    #    - intermediate.crt\n    #- name: stg-intermediate\n    #  keys:\n    #    - stg.crt\n\n    # -- Custom command to be executed in the init container to import certificates\n    #\n    customCmd:\n\n    initContainer:\n      # -- Resources allocated to the import-certs init container\n      #\n\n      resources: {}\n      # -- Custom SecurityContext for the import-certs init container\n      #\n      securityContext: {}\n\n  # -- Configure additional Tomcat connector to set up tunnel. Define the connector port and optional additional attributes.\n  # When 'tunnel.additionalConnector.port' is defined, an additional connector is added to server.xml\n  # and '-Dsecure.tunnel.upstream.port=<port_number>' is added to JVM args\n  #\n  tunnel:\n    additionalConnector:\n      port:\n      connectionTimeout: \"20000\"\n      maxThreads: \"50\"\n      minSpareThreads: \"10\"\n      enableLookups: \"false\"\n      acceptCount: \"10\"\n      URIEncoding: \"UTF-8\"\n      secure: false\n\n# Monitoring\n#\nmonitoring:\n\n  # -- Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter\n  #\n  exposeJmxMetrics: false\n\n  # --  JMX exporter init container configuration\n  #\n  jmxExporterInitContainer:\n\n    # -- The location of the JMX exporter jarfile in the JMX exporter image\n    # Leave blank for default bitnami image\n    #\n    jmxJarLocation:\n\n    # -- Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume.\n    # Set to false if running containers as root is not allowed in the cluster.\n    #\n    runAsRoot: true\n\n    # -- Custom SecurityContext for the jmx exporter init container\n    #\n    customSecurityContext: {}\n\n    # -- Resources requests and limits for the JMX exporter init container\n    # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n    #\n    resources: {}\n    #  requests:\n    #    cpu: \"1m\"\n    #    memory: \"20Mi\"\n    #  limits:\n    #    cpu: \"1\"\n    #    memory: \"1G\"\n\n  # -- Annotations added to the jmx service\n  #\n  jmxServiceAnnotations: {}\n\n  # -- Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar\n  # to shared home and provide an absolute path in jmxExporterCustomJarLocation\n  #\n  fetchJmxExporterJar: true\n\n  # -- Image repository with jmx_exporter jar\n  #\n  jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n  jmxExporterImageTag: 0.18.0\n\n\n\n  # -- Port number on which metrics will be available\n  #\n  jmxExporterPort: 9999\n\n  # -- JMX exporter port type\n  #\n  jmxExporterPortType: ClusterIP\n\n  # -- Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home\n  #\n  jmxExporterCustomJarLocation:\n\n  # -- Custom JMX config with the rules\n  #\n  jmxExporterCustomConfig: {}\n  #  rules:\n  #   - pattern: \".*\"\n\n  serviceMonitor:\n\n    # -- Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.\n    #\n    create: false\n\n    # -- ServiceMonitorSelector of the prometheus instance.\n    #\n    prometheusLabelSelector: {}\n      # release: prometheus\n\n    # -- Scrape interval for the JMX service.\n    #\n    scrapeIntervalSeconds: 30\n\n    # -- How long until a scrape request times out. It cannot be greater than the scrape interval.\n    #\n    scrapeTimeoutSeconds: 20\n\n  grafana:\n\n    # -- Create ConfigMaps with Grafana dashboards\n    #\n    createDashboards: false\n\n    # -- Label selector for Grafana dashboard importer sidecar\n    #\n    dashboardLabels: {}\n      # grafana_dashboard: dc_monitoring\n\n    # -- Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage\n    #\n    dashboardAnnotations: {}\n      # k8s-sidecar-target-directory: /tmp/dashboards/example-folder\n\n# Confluence Synchrony configuration\n# https://confluence.atlassian.com/doc/configuring-synchrony-858772125.html\nsynchrony:\n\n  # -- Set to 'true' if Synchrony (i.e. collaborative editing) should be enabled.\n  # This will result in a separate StatefulSet and Service to be created for Synchrony.\n  # If disabled, then collaborative editing will be disabled in Confluence.\n  enabled: false\n\n  # -- Number of Synchrony pods\n  #\n  replicaCount: 1\n\n  # -- Custom annotations that will be applied to all Synchrony pods.\n  # When undefined, default to '.Values.podAnnotations' which are Confluence pod annotations (if defined)\n  podAnnotations: {}\n  #  name: <value>\n\n  # -- Additional environment variables passed to synchrony container\n  additionalEnvironmentVariables: []\n\n  # K8s Synchrony Service configuration\n  #\n  service:\n\n    # -- The port on which the Synchrony K8s Service will listen\n    #\n    port: 80\n\n    # -- The type of K8s service to use for Synchrony\n    #\n    type: ClusterIP\n\n    # --  Only applicable if service.type is NodePort. NodePort for Synchrony service\n    #\n    nodePort:\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- Annotations to apply to Synchrony Service\n    #\n    annotations: {}\n\n    # -- Complete URL of Synchrony Service (i.e. https://public.mydomain.com/synchrony). If left empty, it is calculated from ingress.https and ingress.host\n    url:\n\n  # -- If 'synchrony.ingress.path' is defined, a dedicated Synchrony ingress object is created.\n  # This is useful if you need to deploy multiple instances of Confluence with Synchrony enabled\n  # using the same Ingress hostname and different synchrony paths\n  #\n  ingress:\n\n    # -- Ingress path applied to Synchrony ingress\n    #\n    path:\n\n    # -- Defaults to Prefix, but can be ImplementationSpecific if rewrite target is applied\n    #\n    pathType:\n\n    # -- Custom annotations applied to Synchrony ingress\n    #\n    annotations:\n\n\n  securityContextEnabled: true\n\n  securityContext:\n\n    # -- The GID used by the Confluence docker image\n    # GID will default to 2002 if not supplied and securityContextEnabled is set to true.\n    # This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Confluence container.\n    # However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260\n    fsGroup: 2002\n\n  # -- Standard K8s field that holds security configurations that will be applied to a container.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  #\n  containerSecurityContext: {}\n\n  # -- Boolean to define whether to set synchrony home directory permissions on startup\n  # of Synchrony container. Set to 'false' to disable this behaviour.\n  #\n  setPermissions: true\n\n  # Port definitions\n  #\n  ports:\n\n    # -- The port on which the Synchrony container listens for HTTP traffic\n    #\n    http: 8091\n\n    # -- The port on which the Synchrony container listens for Hazelcast traffic\n    #\n    hazelcast: 5701\n\n  # Confirm that Synchrony is up and running with a ReadinessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes\n  #\n  readinessProbe:\n\n    # -- The healthcheck path to check against for the Synchrony container\n    # useful when configuring behind a reverse-proxy or loadbalancer\n    # https://confluence.atlassian.com/confkb/cannot-enable-collaborative-editing-on-synchrony-cluster-962962742.html\n    #\n    healthcheckPath: \"/synchrony/heartbeat\"\n\n    # -- The initial delay (in seconds) for the Synchrony container readiness probe,\n    # after which the probe will start running.\n    #\n    initialDelaySeconds: 5\n\n    # -- How often (in seconds) the Synchrony container readiness probe will run\n    #\n    periodSeconds: 1\n\n    # -- The number of consecutive failures of the Synchrony container readiness probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 10\n\n  # Synchrony Pod resource requests\n  #\n  resources:\n\n    # JVM Memory / Heap Size definitions. The values below are based on the\n    # defaults defined for the Synchrony docker container.\n    #\n    jvm:\n\n      # -- The maximum amount of heap memory that will be used by the Synchrony JVM\n      #\n      minHeap: \"1g\"\n\n      # -- The minimum amount of heap memory that will be used by the Synchrony JVM\n      #\n      maxHeap: \"2g\"\n\n      # -- The memory allocated for the Synchrony stack\n      #\n      stackSize: \"2048k\"\n\n    # Specifies the standard K8s resource requests and/or limits for the Synchrony\n    # container. It is important that if the memory resources are specified here,\n    # they must allow for the size of the Synchrony JVM. That means the maximum heap\n    # size, the reserved code cache size, plus other JVM overheads, must be\n    # accommodated. Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    #\n    container:\n      requests:\n        # -- Initial CPU request by Synchrony pod. Because the container CPU request value is used in -XX:ActiveProcessorCount argument to Synchrony JVM\n        #  only integers are allowed, e.g. 1, 2, 3 etc. If you want to have a small CPU claim, set it to 30m, 50m, etc.\n        # Any container cpu request value containing `m` character will be converted to -XX:ActiveProcessorCount=1\n        #\n        # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#meaning-of-cpu\n        #\n        cpu: \"2\"\n\n        # -- Initial Memory request Synchrony pod\n        #\n        memory: \"2.5G\"\n      # limits:\n      #   # -- Initial CPU limit by Synchrony pod\n      #   #\n      #   cpu: \"2\"\n      #\n      #   # -- Initial Memory limit by Synchrony pod\n      #   #\n      #   memory: \"2.5G\"\n\n  # -- Specifies a list of additional arguments that can be passed to the Synchrony JVM, e.g.\n  # system properties.\n  #\n  additionalJvmArgs: []\n    #- -Dsynchrony.example.system.property=46\n\n  shutdown:\n    # -- The termination grace period for pods during shutdown. This\n    # should be set to the Synchrony internal grace period (default 20\n    # seconds), plus a small buffer to allow the JVM to fully terminate.\n    terminationGracePeriodSeconds: 25\n\n  # -- Specifies a list of additional Java libraries that should be added to the\n  # Synchrony container. Each item in the list should specify the name of the volume\n  # that contains the library, as well as the name of the library file within that\n  # volume's root directory. Optionally, a subDirectory field can be included to\n  # specify which directory in the volume contains the library file. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  additionalLibraries: []\n  #   - volumeName:\n  #     subDirectory:\n  #     fileName:\n\n  # -- Defines any additional volumes mounts for the Synchrony container. These\n  # can refer to existing volumes, or new volumes can be defined via\n  # 'volumes.additionalSynchrony'.\n  #\n  additionalVolumeMounts: []\n\n  # -- Defines additional annotations to the Synchrony StateFulSet. This might be required when deploying using a GitOps approach\n  additionalAnnotations:\n  #  argocd.argoproj.io/sync-wave: \"10\"\n\n  # -- Defines any additional ports for the Synchrony container.\n  #\n  additionalPorts: []\n  #  - name: jmx\n  #    containerPort: 5555\n  #    protocol: TCP\n\n  # -- Standard K8s node-selectors that will be applied to all Synchrony pods\n  #\n  nodeSelector: {}\n  #  name: <value>\n\n  # -- Standard K8s tolerations that will be applied to all Synchrony pods\n  #\n  tolerations: []\n  # - effect: <name>\n  #   operator: <operator>\n  #   key: <key>\n\n  # -- Standard K8s affinities that will be applied to all Synchrony pods\n  #\n  affinity: {}\n  #  name: <value>\n\n  # -- Defines topology spread constraints for Synchrony pods. See details:\n  # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n  #\n  topologySpreadConstraints: []\n  # - maxSkew: 1\n  #   topologyKey: kubernetes.io/hostname\n  #   whenUnsatisfiable: ScheduleAnyway\n  #   labelSelector:\n  #     matchLabels:\n  #       app.kubernetes.io/name: confluence-synchrony\n\n  # -- Standard K8s schedulerName that will be applied to all Synchrony pods. If not specified, the default schedulerName will be used.\n  # Check Kubernetes documentation on how to configure multiple schedulers:\n  # https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n  #\n  schedulerName:\n\n  # -- Priority class for the Synchrony pods. The PriorityClass with this name needs to be available in the cluster. If not specified the default priorityClassName will be used.\n  # For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n  #\n  priorityClassName:\n\n  # -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n  #\n  hostNamespaces: {}\n\n  # -- Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates\n  #\n  additionalCertificates:\n    # -- Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data\n    # will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.\n    #\n    secretName:\n    # -- A list of secrets with their respective keys holding certificates to be added to the Java truststore.\n    # It is mandatory to specify which keys from secret data need to be mounted as files to the init container.\n    #\n    secretList: []\n    #- name: self-signed-ca\n    #  keys:\n    #    - ca.crt\n    #    - intermediate.crt\n    #- name: stg-intermediate\n    #  keys:\n    #    - stg.crt\n\n    # -- Custom command to be executed in the init container to import certificates\n    #\n    customCmd:\n\n    initContainer:\n      # -- Resources allocated to the import-certs init container\n      #\n\n      resources: {}\n      # -- Custom SecurityContext for the import-certs init container\n      #\n      securityContext: {}\n\n# Fluentd configuration\n#\n# Confluence log collection and aggregation can be enabled using Fluentd. This config\n# assumes an existing ELK stack has been stood up and is available.\n# https://www.fluentd.org/\n#\nfluentd:\n\n  # -- Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod\n  #\n  enabled: false\n\n  # -- The Fluentd sidecar image repository\n  #\n  imageRepo: fluent/fluentd-kubernetes-daemonset\n\n  # -- The Fluentd sidecar image tag\n  #\n  imageTag: v1.11.5-debian-elasticsearch7-1.2\n\n  # -- Resources requests and limits for fluentd sidecar container\n  # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n  #\n  resources: {}\n  #  requests:\n  #    cpu: \"1m\"\n  #    memory: \"20Mi\"\n  #  limits:\n  #    cpu: \"1\"\n  #    memory: \"1G\"\n\n  # -- The command used to start Fluentd. If not supplied the default command\n  # will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"\n  #\n  # Note: The custom command can be free-form, however pay particular attention to\n  # the process that should ultimately be left running in the container. This process\n  # should be invoked with 'exec' so that signals are appropriately propagated to it,\n  # for instance SIGTERM. An example of how such a command may look is:\n  # \"<command 1> && <command 2> && exec <primary command>\"\n  command:\n\n  # -- Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default)\n  # should be used for Fluentd. If enabled this config must be supplied via the\n  # 'fluentdCustomConfig' property below. If your custom config forces fluentd to run in a server mode,\n  # add `-Datlassian.logging.cloud.enabled=true` to `confluence.AdditionalJvmArgs` stanza in values file\n  #\n  customConfigFile: false\n\n  # -- Custom fluent.conf file\n  #\n  fluentdCustomConfig: {}\n  # fluent.conf: |\n  #   <source>\n  #     @type tail\n  #     <parse>\n  #     @type multiline\n  #     format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n  #     </parse>\n  #     path /opt/atlassian/confluence/logs/access_log.*\n  #     pos_file /tmp/confluencelog.pos\n  #     tag confluence-access-logs\n  #   </source>\n\n  # -- The port on which the Fluentd sidecar will listen\n  #\n  httpPort: 9880\n\n  # Elasticsearch config based on your ELK stack\n  #\n  elasticsearch:\n\n    # -- Set to 'true' if Fluentd should send all log events to an Elasticsearch service.\n    #\n    enabled: true\n\n    # -- The hostname of the Elasticsearch service that Fluentd should send logs to.\n    #\n    hostname: elasticsearch\n\n    # -- The prefix of the Elasticsearch index name that will be used\n    #\n    indexNamePrefix: confluence\n\n  # -- Specify custom volumes to be added to Fluentd container (e.g. more log sources)\n  #\n  extraVolumes: []\n  # - name: local-home\n  #   mountPath: /opt/atlassian/confluence/logs\n  #   subPath: log\n  #   readOnly: true\n\n\n# -- Custom annotations that will be applied to all Confluence pods\n#\npodAnnotations: {}\n#  name: <value>\n\n# -- Custom labels that will be applied to all Confluence pods\n#\npodLabels: {}\n#  name: <value>\n\n# -- Standard K8s node-selectors that will be applied to all Confluence pods\n#\nnodeSelector: {}\n#  name: <value>\n\n# -- Standard K8s tolerations that will be applied to all Confluence pods\n#\ntolerations: []\n# - effect: <name>\n#   operator: <operator>\n#   key: <key>\n\n# -- Standard K8s affinities that will be applied to all Confluence pods\n#\naffinity: {}\n#  name: <value>\n\n# -- Standard K8s schedulerName that will be applied to all Confluence pods.\n# Check Kubernetes documentation on how to configure multiple schedulers:\n# https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n#\nschedulerName:\n\n# -- Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster.\n# For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n#\npriorityClassName:\n\n# -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n#\nhostNamespaces: {}\n\n# -- Additional container definitions that will be added to all Confluence pods\n#\nadditionalContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional initContainer definitions that will be added to all Confluence pods\n#\nadditionalInitContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional labels that should be applied to all resources\n#\nadditionalLabels: {}\n#  name: <value>\n\n# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be\n# mounted into service container. Configuration details below (camelCase is important!):\n  # 'name'      - References existing ConfigMap or secret name.\n  # 'type'      - 'configMap' or 'secret'\n  # 'key'       - The file name.\n  # 'mountPath' - The destination directory in a container.\n# VolumeMount and Volumes are added with this name and index position, for example;\n# custom-config-0, keystore-2\n#\nadditionalFiles: []\n#  - name: custom-config\n#    type: configMap\n#    key: log4j.properties\n#    mountPath:  /var/atlassian\n#  - name: custom-config\n#    type: configMap\n#    key: web.xml\n#    mountPath: /var/atlassian\n#  - name: keystore\n#    type: secret\n#    key: keystore.jks\n#    mountPath: /var/ssl\n\n# -- Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file.\n# https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\nadditionalHosts: []\n#  - ip: \"127.0.0.1\"\n#    hostnames:\n#    - \"foo.local\"\n#    - \"bar.local\"\n\n# -- PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/\n# You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.\n#\npodDisruptionBudget:\n  enabled: false\n  labels: {}\n  annotations: {}\n  minAvailable:\n  maxUnavailable:\n\n# -- Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix\n# for a ConfigMap name, fileName is used as subPath\n#\nadditionalConfigMaps: []\n#  - name: extra-configmap\n#    keys:\n#      - fileName: hello.properties\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        defaultMode:\n#        content: |\n#          foo=bar\n#          hello=world\n#      - fileName: hello.xml\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        content: |\n#          <xml>\n#          </xml>\n\natlassianAnalyticsAndSupport:\n\n  analytics:\n\n    # -- Mount ConfigMap with selected Helm chart values as a JSON\n    # which DC products will read and send analytics events to Atlassian data pipelines\n    #\n    enabled: true\n\n  helmValues:\n\n    # -- Mount ConfigMap with selected Helm chart values as a YAML file\n    # which can be optionally including to support.zip\n    #\n    enabled: true\n\n# -- Metadata and pod spec for pods started in Helm tests\n#\ntestPods:\n  resources: {}\n  labels: {}\n  annotations: {}\n  nodeSelector: {}\n  tolerations: []\n  affinity: {}\n  schedulerName:\n  image:\n    permissionsTestContainer: debian:stable-slim\n    statusTestContainer: alpine:latest\n\nopenshift:\n\n  # -- When set to true, the containers will run with a restricted Security Context Constraint (SCC).\n  # See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html\n  # This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server\n  # configuration files as ConfigMaps.\n  #\n  runWithRestrictedSCC: false\n\n\nopensearch:\n\n  # -- Deploy OpenSearch Helm chart and Configure Confluence to use it as a search platform\n  #\n  enabled: false\n\n  credentials:\n    # -- Let the Helm chart create a secret with an auto generated initial admin password\n    #\n    createSecret: true\n\n    # -- Use an existing secret with the key OPENSEARCH_INITIAL_ADMIN_PASSWORD holding the initial admin password\n    #\n    existingSecretRef:\n      name:\n\n  # -- OpenSearch helm specific values, see: https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch/values.yaml\n  #\n  singleNode: true\n  resources:\n    requests:\n      cpu: 1\n      memory: 1Gi\n  persistence:\n    size: 10Gi\n  extraEnvs:\n    - name: plugins.security.ssl.http.enabled\n      value: \"false\"\n  envFrom:\n    - secretRef:\n         # -- If using a pre-created secret, make sure to change secret name to match opensearch.credentials.existingSecretRef.name\n         #\n         name: opensearch-initial-password\n"
  },
  {
    "path": "src/main/charts/crowd/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n# Ignore non-template files from symlinked common_templates\ntemplates/common_templates/*.md\n"
  },
  {
    "path": "src/main/charts/crowd/Changelog.md",
    "content": "# Change Log\n\n## 2.0.13\n\n**Release date:** 2026-5-6\n\n![AppVersion: 7.1.5](https://img.shields.io/static/v1?label=AppVersion&message=7.1.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.12\n\n**Release date:** 2026-4-9\n\n![AppVersion: 7.1.5](https://img.shields.io/static/v1?label=AppVersion&message=7.1.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.11\n\n**Release date:** 2026-4-7\n\n![AppVersion: 7.1.5](https://img.shields.io/static/v1?label=AppVersion&message=7.1.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.10\n\n**Release date:** 2026-4-3\n\n![AppVersion: 7.1.5](https://img.shields.io/static/v1?label=AppVersion&message=7.1.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DEVPROD-3580: Add gateway api support (#1084)\n* Update appVersions for DC apps (#1100)\n\n## 2.0.9\n\n**Release date:** 2026-2-1\n\n![AppVersion: 7.1.4](https://img.shields.io/static/v1?label=AppVersion&message=7.1.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1079)\n\n## 2.0.8\n\n**Release date:** 2025-12-29\n\n![AppVersion: 7.1.3](https://img.shields.io/static/v1?label=AppVersion&message=7.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1070)\n\n## 2.0.7\n\n**Release date:** 2025-11-7\n\n![AppVersion: 7.1.0](https://img.shields.io/static/v1?label=AppVersion&message=7.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.6\n\n**Release date:** 2025-11-3\n\n![AppVersion: 7.1.0](https://img.shields.io/static/v1?label=AppVersion&message=7.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Add missing ErrorReportValve to default server.xml #1047 (#1047)\n* fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\n\n## 2.0.5\n\n**Release date:** 2025-11-1\n\n![AppVersion: 7.1.0](https://img.shields.io/static/v1?label=AppVersion&message=7.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1049)\n\n## 2.0.4\n\n**Release date:** 2025-8-27\n\n![AppVersion: 6.3.1](https://img.shields.io/static/v1?label=AppVersion&message=6.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Update Bitnami image references due to deprecation notice (#1037)\n\n## 2.0.3\n\n**Release date:** 2025-8-1\n\n![AppVersion: 6.3.1](https://img.shields.io/static/v1?label=AppVersion&message=6.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.2\n\n**Release date:** 2025-6-16\n\n![AppVersion: 6.3.1](https://img.shields.io/static/v1?label=AppVersion&message=6.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1012)\n\n## 2.0.1\n\n**Release date:** 2025-5-15\n\n![AppVersion: 6.3.0](https://img.shields.io/static/v1?label=AppVersion&message=6.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.0\n\nThis release includes breaking changes. See [Breaking Changes](https://github.com/atlassian/data-center-helm-charts/blob/main/BREAKING_CHANGES.md)\n\n**Release date:** 2025-4-29\n\n![AppVersion: 6.3.0](https://img.shields.io/static/v1?label=AppVersion&message=6.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Remove condition to support legacy securityContext format (#1000)\n\n## 1.22.9\n\n**Release date:** 2025-4-22\n\n![AppVersion: 6.3.0](https://img.shields.io/static/v1?label=AppVersion&message=6.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make it possible to declare additional ingress paths (#991)\n* Bring changelog in order (#990)\n\n## 1.22.8\n\n**Release date:** 2025-4-17\n\n![AppVersion: 6.3.0](https://img.shields.io/static/v1?label=AppVersion&message=6.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\n* Update appVersions for DC apps (#983)\n\n## 1.22.7\n\n**Release date:** 2025-4-1\n\n![AppVersion: 6.2.3](https://img.shields.io/static/v1?label=AppVersion&message=6.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.22.6\n\n**Release date:** 2025-3-19\n\n![AppVersion: 6.2.3](https://img.shields.io/static/v1?label=AppVersion&message=6.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#969)\n\n## 1.22.5\n\n**Release date:** 2025-2-18\n\n![AppVersion: 6.2.2](https://img.shields.io/static/v1?label=AppVersion&message=6.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#959)\n* Add tunnel config for Jira, hostNamespaces in all charts (#958)\n* Allow setting subPath for local-home volumes (#947)\n\n## 1.22.4\n\n**Release date:** 2025-1-30\n\n![AppVersion: 6.2.0](https://img.shields.io/static/v1?label=AppVersion&message=6.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Round up fractional cpu values for ActiveProcessorsCount (#944)\n\n## 1.22.3\n\n**Release date:** 2025-1-13\n\n![AppVersion: 6.2.0](https://img.shields.io/static/v1?label=AppVersion&message=6.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set custom securityContext for import-certs init container. Make affinity independent for Synchrony (#938)\n\n## 1.22.2\n\n**Release date:** 2024-12-16\n\n![AppVersion: 6.1.3](https://img.shields.io/static/v1?label=AppVersion&message=6.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#933)\n* Make it possible to set nodePort in services (#931)\n* Make access log attributes configurable (#932)\n\n## 1.22.1\n\n**Release date:** 2024-12-3\n\n![AppVersion: 6.1.2](https://img.shields.io/static/v1?label=AppVersion&message=6.1.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Grafana dashboards for DC apps (#915)\n\n## 1.22.0\n\n**Release date:** 2024-11-15\n\n![AppVersion: 6.1.1](https://img.shields.io/static/v1?label=AppVersion&message=6.1.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Updated pod labels for all products (#901)\n* Fix shutdown with jmx javaagent enabled (#899)\n* Unset IDs for all the Grafana dashboards (#889)\n\n## 1.21.4\n\n**Release date:** 2024-10-1\n\n![AppVersion: 6.1.0](https://img.shields.io/static/v1?label=AppVersion&message=6.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#884)\n\n## 1.21.3\n\n**Release date:** 2024-9-10\n\n![AppVersion: 6.0.2](https://img.shields.io/static/v1?label=AppVersion&message=6.0.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update common dependency version (#878)\n\n## 1.21.2\n\n**Release date:** 2024-8-26\n\n![AppVersion: 6.0.1](https://img.shields.io/static/v1?label=AppVersion&message=6.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix crowd fluentd config (#870)\n\n## 1.21.1\n\n**Release date:** 2024-8-22\n\n![AppVersion: 6.0.1](https://img.shields.io/static/v1?label=AppVersion&message=6.0.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#865)\n* Make crowd context configurable (#864)\n\n## 1.21.0\n\n**Release date:** 2024-8-13\n\n![AppVersion: 6.0.0](https://img.shields.io/static/v1?label=AppVersion&message=6.0.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Added annotations to the StatefulSets (#857)\n* Update appVersions for DC apps (#858)\n* Make shared home pvc access mode configurable (#855)\n* Allow referencing multiple secrets in additionalCertificates (#852)\n* Make it possible to define resources for import-certs init container (#851)\n* Move update strategy to root level (#849)\n* Add helm value for custom jmx jar location when using other jmx init container images (#846)\n* feat: add appProtocol for service meshes (#847)\n* Make StatefulSet updateStrategy configurable (#845)\n\n## 1.20.1\n\n**Release date:** 2024-7-7\n\n![AppVersion: 6.0.0](https://img.shields.io/static/v1?label=AppVersion&message=6.0.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#825)\n* Make it possible to override proxy settings (#822)\n\n## 1.20.0\n\n**Release date:** 2024-5-13\n\n![AppVersion: 5.3.0](https://img.shields.io/static/v1?label=AppVersion&message=5.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set atlassian.logging.cloud.enabled system property to false if a custom FluentD config is used (#796)\n\n## 1.19.0\n\n**Release date:** 2024-4-22\n\n![AppVersion: 5.3.0](https://img.shields.io/static/v1?label=AppVersion&message=5.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make cacerts writable for user and group (#790)\n\n## 1.18.1\n\n**Release date:** 2024-3-26\n\n![AppVersion: 5.2.3](https://img.shields.io/static/v1?label=AppVersion&message=5.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#769)\n\n## 1.18.0\n\n**Release date:** 2024-2-27\n\n![AppVersion: 5.2.3](https://img.shields.io/static/v1?label=AppVersion&message=5.2.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Openshift analytics (#763)\n* Update appVersions for DC apps (#765)\n* OpenShift Support (#752)\n* Use testPods values for test images and container resources (#761)\n* Relabel instance name on jmx service monitor (#757)\n* Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\n\n## 1.17.2\n\n**Release date:** 2023-12-18\n\n![AppVersion: 5.2.2](https://img.shields.io/static/v1?label=AppVersion&message=5.2.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* StatefulSet PVC auto deletion (#736)\n* Update appVersions for DC apps (#738)\n* Add optional postStart hook (#735)\n\n## 1.17.1\n\n**Release date:** 2023-12-11\n\n![AppVersion: 5.2.1](https://img.shields.io/static/v1?label=AppVersion&message=5.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make liveness probe configurable (#732)\n\n## 1.17.0\n\n**Release date:** 2023-12-7\n\n![AppVersion: 5.2.1](https://img.shields.io/static/v1?label=AppVersion&message=5.2.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make test pod metadata and spec configurable (#727)\n* Optional analytics/support ConfigMap (#721)\n* Fix ingress annotations comment (#720)\n\n## 1.16.6\n\n**Release date:** 2023-10-30\n\n![AppVersion: 5.2.0](https://img.shields.io/static/v1?label=AppVersion&message=5.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* JMX container resources (#707)\n\n## 1.16.5\n\n**Release date:** 2023-10-24\n\n![AppVersion: 5.2.0](https://img.shields.io/static/v1?label=AppVersion&message=5.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix custom jmx config (#699)\n* Copy cacerts first, then import certs (#696)\n\n## 1.16.4\n\n**Release date:** 2023-10-11\n\n![AppVersion: 5.2.0](https://img.shields.io/static/v1?label=AppVersion&message=5.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.3\n\n**Release date:** 2023-10-11\n\n![AppVersion: 5.2.0](https://img.shields.io/static/v1?label=AppVersion&message=5.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.2\n\n**Release date:** 2023-10-8\n\n![AppVersion: 5.2.0](https://img.shields.io/static/v1?label=AppVersion&message=5.2.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add quote to podAnnotation templating (#678)\n* Update appVersions for DC apps (#679)\n\n## 1.16.1\n\n**Release date:** 2023-9-20\n\n![AppVersion: 5.1.5](https://img.shields.io/static/v1?label=AppVersion&message=5.1.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.0\n\n**Release date:** 2023-9-18\n\n![AppVersion: 5.1.5](https://img.shields.io/static/v1?label=AppVersion&message=5.1.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Allow templating of pod annotations (#662)\n* Make securityContext configurable for jmx exporter init container (#670)\n* Add user provided certificates to the default Java truststore (#663)\n\n## 1.15.3\n\n**Release date:** 2023-8-28\n\n![AppVersion: 5.1.4](https://img.shields.io/static/v1?label=AppVersion&message=5.1.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Decouple server and jmx annotations (#654)\n* Disable startup probes by default (#653)\n\n## 1.15.2\n\n**Release date:** 2023-8-22\n\n![AppVersion: 5.1.4](https://img.shields.io/static/v1?label=AppVersion&message=5.1.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add defaultMode to additionalConfigMaps (#647)\n\n## 1.15.1\n\n**Release date:** 2023-8-17\n\n![AppVersion: 5.1.4](https://img.shields.io/static/v1?label=AppVersion&message=5.1.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make startup probes optional (#646)\n\n## 1.15.0\n\n**Release date:** 2023-8-7\n\n![AppVersion: 5.1.4](https://img.shields.io/static/v1?label=AppVersion&message=5.1.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\n* Add annotations to Grafana dashboards ConfigMaps (#637)\n* Add additional ConfigMaps to Helm Charts (#635)\n* Update appVersions for DC apps (#638)\n\n## 1.14.1\n\n**Release date:** 2023-7-26\n\n![AppVersion: 5.1.3](https://img.shields.io/static/v1?label=AppVersion&message=5.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Disable liveness probes by default, make timeoutSeconds configurable (#630)\n\n## 1.14.0\n\n**Release date:** 2023-7-25\n\n![AppVersion: 5.1.3](https://img.shields.io/static/v1?label=AppVersion&message=5.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add liveness probes, make readinessProbes configurable (#626)\n* make sharedHome.permissionFix.command helper to be per-product (#622)\n\n## 1.13.1\n\n**Release date:** 2023-6-28\n\n![AppVersion: 5.1.3](https://img.shields.io/static/v1?label=AppVersion&message=5.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\n\n## 1.13.0\n\n**Release date:** 2023-6-13\n\n![AppVersion: 5.1.3](https://img.shields.io/static/v1?label=AppVersion&message=5.1.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#599)\n* Update Grafana dashboards for DC apps (#596)\n* Update Grafana dashboards for DC apps (#595)\n* Crowd dashboard (#593)\n* Bamboo dashboard (#588)\n* Make sessionAffinity configurable in service spec (#582)\n* Add optional ServiceMonitors to DC Helm Charts (#573)\n* Expose JMX beans on http endpoint (#562)\n\n## 1.12.0\n\n**Release date:** 2023-4-18\n\n![AppVersion: 5.1.2](https://img.shields.io/static/v1?label=AppVersion&message=5.1.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add priorityClassName to pod spec (#557)\n* Add hostAliases for all DC products (#556)\n* Crowd service type edge case documentation (#554)\n* Add a warning to Crowd's values.yaml ingress.path field (#550)\n* Update fluentd cm template for crowd (#547)\n* Documentation for Crowd (#544)\n\n## 1.11.0\n\n**Release date:** 2023-3-22\n\n![AppVersion: 5.1.2](https://img.shields.io/static/v1?label=AppVersion&message=5.1.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix typo in helpers. Add warnings about Crowd in docs (#534)\n* Update appVersions for DC apps (#533)\n* Update crowd helm chart (#532)\n\n## 1.10.0\n\n**Release date:** 2023-2-20\n\n![AppVersion: 5.1.2](https://img.shields.io/static/v1?label=AppVersion&message=5.1.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Bitbucket Mesh to Bitbucket Helm chart (#501)\n\n## 1.9.1\n\n**Release date:** 2023-2-16\n\n![AppVersion: 5.1.2](https://img.shields.io/static/v1?label=AppVersion&message=5.1.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifact hub annotation yaml\n\n## 1.9.0\n\n**Release date:** 2023-2-15\n\n![AppVersion: 5.1.2](https://img.shields.io/static/v1?label=AppVersion&message=5.1.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersion to the latest LTS (#515)\n\n## 1.8.1\n\n**Release date:** 2022-12-12\n\n![AppVersion: 5.1.0](https://img.shields.io/static/v1?label=AppVersion&message=5.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifacthub.io annotations\n\n## 1.8.0\n\n**Release date:** 2022-12-9\n\n![AppVersion: 5.1.0](https://img.shields.io/static/v1?label=AppVersion&message=5.1.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* CLIP-1644: Stop supporting 1.19-1.20 k8s (#486)\n* Update appVersion to 5.1.0\n* Use `ingress.https` flag to enable tls in ingress (#487)\n\n## 1.7.1\n\n**Release date:** 2022-10-26\n\n![AppVersion: 5.0.2](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Patch release to fix Artifacthub metadata\n\n## 1.7.0\n\n**Release date:** 2022-10-25\n\n![AppVersion: 5.0.2](https://img.shields.io/static/v1?label=AppVersion&message=5.0.2&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Pin Python version to 3.9.14 (#468)\n* Update Bitbucket ingress testing values (#466)\n* Ingress Class Name is moved under spec field. (#451)\n* Make ATL_FORCE_CFG_UPDATE configurable in values.yaml (#454)\n* Add osquery related env vars for Terraform (#462)\n* AWS cleanup and log colletion from k8s (#461)\n\n## 1.6.0\n\n**Release date:** 2022-10-12\n\n![AppVersion: 5.0.2](https://img.shields.io/static/v1?label=AppVersion&message=5.0.2&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Crowd version to 5.0.2 (#455)\n* Improved documentation (#448, #440)\n\n\n## 1.5.0\n\n**Release date:** 2022-07-14\n\n![AppVersion: 5.0.1](https://img.shields.io/static/v1?label=AppVersion&message=5.0.1&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix: Use the custom ports for Crowd service (#419)\n* Update Crowd version to 5.0.1 (#430)\n\n## 1.4.0\n\n**Release date:** 2022-05-25\n\n![AppVersion: 5.0.0](https://img.shields.io/static/v1?label=AppVersion&message=5.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make pod securityContext optional (#389)\n* Support for configuring ingress proxy settings via values.yaml (#402)\n* Fixed common.label error (#403)\n* Add ATL_PROXY_NAME and ATL_PROXY_PORT to Crowd (#407)\n* Update Crowd version to 5.0.0 (#412)\n\n## 1.3.0\n\n**Release date:** 2022-03-24\n\n![AppVersion: 4.4.1](https://img.shields.io/static/v1?label=AppVersion&message=4.4.1&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Update Crowd version to 4.4.1 (#396)\n\n\n## 1.2.0\n\n**Release date:** 2022-02-14\n\n![AppVersion: 4.4.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.4.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\nCrowd (1.1.0 -> 1.2.0)\n* Added missing JVM_SUPPORT_RECOMMENDED_ARGS env (#376)\n* Improvements on [documentation](https://github.com/atlassian/data-center-helm-charts/) (#370, #357)\n* Updated Atlassian charts to use common definitions (#303)\n* Added service account annotation (#363)\n* Added new feature additionalVolumeClaimTemplates and provided example in documentation (#334, #368)\n* Added new feature podLabels (#364)\n* Added new feature to define loadBalancerIP (#365)\n* Define podAnnotations as template to allow overrides (#341)\n* DCKUBE-738: Added topologySpreadConstraints to products (#351)\n* Set ActiveProcessorCount automatically based on Values.<product>.resources.container.requests.cpu (#352)\n* Added new feature additionalPorts (for jmx-monitoring) (#353)\n\n\n## 1.1.0\n\n**Release date:** 2021-11-03\n\n![AppVersion: 4.4.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.4.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-721: Update version in Chart.yaml files\n* DCKUBE-733: Update the product versions (#345)\n* DCKUBE-739: Fix typos (#337)\n* DCKUBE-739: Make securityContext changes backward compatible (#332)\n* Roll Statefulset Pods if ConfigMap changes (#315)\n* DCKUBE-677: Make security context more flexible (#321)\n* DCKUBE-722: Enable configuring ingress.class name (#313)\n* DCKUBE-678: Add schedulerName to StatefulSet (#301)\n\n\n## 1.0.0\n\nThis is the first officially supported version of the Helm chart.\n\n![AppVersion: 4.3.5-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.5-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-621: Improvements to graceful shutdown (#282)\n* Improved [documentation](https://github.com/atlassian/data-center-helm-charts/) (#275, #276, #277, #279, #280, #284, #285, #289, #290, #291, #293. #295)\n\n\n## 0.16.0\n\n![AppVersion: 4.3.5-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.5-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DCKUBE-598: Enable NFS permission fixer by default (#241)\n* DCKUBE-581: Enable configuration for SET_PERMISSIONS docker image variable (#261)\n* DCKUBE-613: Configurable grace periods (#249)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/) (#236, #243, #245, #252, #253, #256, #258, #260, #268, #270, #272)\n\n\n## 0.15.0\n\n![AppVersion: 4.3.5-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.5-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Service annotations (#209)\n* DCKUBE-453: Add support for providing a custom fluentd start command (#218)\n* DCKUBE-435: Renamed the 'master' branch to 'main' and set it as default (#232)\n* Update EKS cluster yaml example (#227)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/) (#206, #222, #223, #228, #229, #231, #233, #235)\n\n\n## 0.14.0\n\n![AppVersion: 4.3.5-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.5-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-529: Update Crowd version to 4.3.5-jdk11 (#212)\n\n\n## 0.13.0\n\n![AppVersion: 4.3.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-54: Volume docs updates (#188)\n\n\n## 0.12.0\n\n![AppVersion: 4.3.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-437: Wording improvement for warning in NOTES when PV is not used (#199)\n* DCKUBE-393: Improve readability of Crowd values.yaml file (#184)\n* Defining the following values in the helpers template for each chart, to allow template overrides: (#173)\n\n### Default value changes\n\nThere has been major improvement in the documentation for the keys in `values.yaml` file but there isn't any functional\nchange.\n\n## 0.11.0\n\n**Release date:** 2021-06-09\n\n![AppVersion: 4.3.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-348: Warning of absent persistent volume (#169)\n* DCKUBE-307: Do not print logs when testing helm installation. (#168)\n* DCKUBE-308: Print service URL after installing helm chart (#157)\n* DCKUBE-282: Update icons to SVG (#164)\n\n### Default value changes\n\n```diff\n# No changes in this release\n```\n\n## 0.10.0\n\n**Release date:** 2021-06-01\n\n![AppVersion: 4.3.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Version 0.10.0\n* DCKUBE-332: Update the minimal supported kubernetes version v1.19 (#154)\n\n### Default value changes\n\n```diff\n# No changes in this release\n```\n\n## 0.9.0\n\n**Release date:** 2021-05-25\n\n![AppVersion: 4.3.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Version 0.9.0\n* initial commit - changed the max-body-size of request to 250MB for all products and documented in CONFIG.md (#140)\n* Merge branch 'master' into dckube-267-define-minimum-compute-resources\n* README update for 0.8.0\n* Merge branch 'dckube-267-define-minimum-compute-resources' of github.com:https://github.com/atlassian/data-center-helm-charts/data-center-helm-charts into dckube-267-define-minimum-compute-resources\n* DCKUBE-267: Update cpu request sizes\n* Merge branch 'master' into dckube-267-define-minimum-compute-resources\n* DCKUBE-267: Update cpu request sizes\n* Added ingress.host into values.yaml with corresponding value injection in ingress.yaml for all apps. Defaults to / (#134)\n* DCKUBE-267: Wording updates\n* DCKUBE-267: Initial commit\n* Crowd 0.7.0 README update\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/crowd/values.yaml b/src/main/charts/crowd/values.yaml\nindex a48f866..ce5a29d 100644\n--- a/src/main/charts/crowd/values.yaml\n+++ b/src/main/charts/crowd/values.yaml\n@@ -76,28 +76,30 @@ crowd:\n\n   resources:\n     jvm:\n+      # -- JVM memory arguments below are based on the defaults defined for the Crowd docker container, see:\n+      # https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/src/master/\n+      #\n       # -- The maximum amount of heap memory that will be used by the Crowd JVM\n-      maxHeap: \"1g\"\n+      maxHeap: \"768m\"\n       # -- The minimum amount of heap memory that will be used by the Crowd JVM\n-      minHeap: \"1g\"\n-      # -- The memory reserved for the Crowd JVM code cache\n-      reservedCodeCache: \"512m\"\n+      minHeap: \"384m\"\n     # -- Specifies the standard Kubernetes resource requests and/or limits for the Crowd container.\n     # It is important that if the memory resources are specified here, they must allow for the size of the Crowd JVM.\n     # That means the maximum heap size, the reserved code cache size, plus other JVM overheads, must be accommodated.\n-    # Allowing for (maxHeap+codeCache)*1.5 would be an example.\n-    container: {}\n+    # Allowing for maxHeap * 1.5 would be an example.\n+    container:\n     #  limits:\n-    #    cpu: \"4\"\n-    #    memory: \"2G\"\n-    #  requests:\n-    #    cpu: \"4\"\n-    #    memory: \"2G\"\n+    #    cpu: \"1\"\n+    #    memory: \"1G\"\n+      requests:\n+        cpu: \"2\" # -- If changing the cpu value update additional JVM arg 'ActiveProcessorCount' below\n+        memory: \"1G\"\n\n   # -- Specifies a list of additional arguments that can be passed to the Crowd JVM, e.g. system properties\n-  additionalJvmArgs: []\n-#    - -Dfoo=bar\n-#    - -Dfruit=lemon\n+  additionalJvmArgs:\n+    # -- The value defined for ActiveProcessorCount should correspond to that provided for 'container.requests.cpu'\n+    # see: https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE\n+    - -XX:ActiveProcessorCount=2\n\n   # -- Specifies a list of additional Java libraries that should be added to the Crowd container.\n   # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n@@ -136,9 +138,11 @@ ingress:\n   # -- The max body size to allow. Requests exceeding this size will result\n   # in an 413 error being returned to the client.\n   # https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size\n-  maxBodySize: 10m\n+  maxBodySize: 250m\n   # -- The fully-qualified hostname of the Ingress Resource.\n   host:\n+  # -- The base path for the ingress rule.\n+  path: \"/\"\n   # -- The custom annotations that should be applied to the Ingress\n   # Resource when not using the Kubernetes ingress-nginx controller.\n   annotations: {}\n```\n\n## 0.7.0\n\n**Release date:** 2021-05-13\n\n![AppVersion: 4.3.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Add Crowd as a tested product (#128)\n\n### Default value changes\n\n```diff\n# No changes in this release\n```\n\n## 0.1.0\n\n**Release date:** 2021-05-13\n\n![AppVersion: 4.3.0-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=4.3.0-jdk11&color=success&logo=)\n![Kubernetes: >=1.17.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.17.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* initial Crowd Helm Chart based on Confluence Helm Chart (#106)\n\n### Default value changes\n\n```diff\n# -- The initial number of pods that should be started at deployment of each of Crowd.\n# Note that because Crowd requires initial manual configuration after the first pod is deployed, and before scaling\n# up to additional pods, this should always be kept as 1.\nreplicaCount: 1\n\nimage:\n  repository: atlassian/crowd\n  pullPolicy: IfNotPresent\n  # -- The docker image tag to be used. Defaults to the Chart appVersion.\n  tag: 4.2.2\n\nserviceAccount:\n  # -- Specifies the name of the ServiceAccount to be used by the pods.\n  # If not specified, but the the \"serviceAccount.create\" flag is set, then the ServiceAccount name will be auto-generated,\n  # otherwise the 'default' ServiceAccount will be used.\n  name:\n  # -- true if a ServiceAccount should be created, or false if it already exists\n  create: true\n  # -- The list of image pull secrets that should be added to the created ServiceAccount\n  imagePullSecrets: []\n  clusterRole:\n    # -- Specifies the name of the ClusterRole that will be created if the \"serviceAccount.clusterRole.create\" flag is set.\n    # If not specified, a name will be auto-generated.\n    name:\n    # -- true if a ClusterRole should be created, or false if it already exists\n    create: true\n  clusterRoleBinding:\n    # -- Specifies the name of the ClusterRoleBinding that will be created if the \"serviceAccount.clusterRoleBinding.create\" flag is set\n    # If not specified, a name will be auto-generated.\n    name:\n    # -- true if a ClusterRoleBinding should be created, or false if it already exists\n    create: true\n\ncrowd:\n  service:\n    # -- The port on which the Crowd Kubernetes service will listen\n    port: 80\n    # -- The type of Kubernetes service to use for Crowd\n    type: ClusterIP\n  # -- Enable or disable security context in StatefulSet template spec. Enabled by default with UID 2002.\n  # -- Disable when deploying to OpenShift, unless anyuid policy is attached to a service account\n  securityContext:\n    enabled: true\n    # -- The GID used by the Crowd docker image\n    gid: \"2004\"\n  # -- The umask used by the Crowd process when it creates new files.\n  # Default is 0022, which makes the new files read/writeable by the Crowd user, and readable by everyone else.\n  umask: \"0022\"\n  ports:\n    # -- The port on which the Crowd container listens for HTTP traffic\n    http: 8095\n    # -- The port on which the Crowd container listens for Hazelcast traffic\n    hazelcast: 5701\n  readinessProbe:\n    # -- The initial delay (in seconds) for the Crowd container readiness probe, after which the probe will start running\n    initialDelaySeconds: 10\n    # -- How often (in seconds) the Crowd container readiness robe will run\n    periodSeconds: 5\n    # -- The number of consecutive failures of the Crowd container readiness probe before the pod fails readiness checks\n    failureThreshold: 30\n\n  accessLog:\n    # -- True if access logging should be enabled.\n    enabled: true\n    # -- The path within the Crowd container where the local-home volume should be mounted in order to capture access logs.\n    mountPath: \"/opt/atlassian/crowd/logs\"\n    # -- The subdirectory within the local-home volume where access logs should be stored.\n    localHomeSubPath: \"logs\"\n\n  clustering:\n    # -- Set to true if Data Center clustering should be enabled\n    # This will automatically configure cluster peer discovery between cluster nodes.\n    enabled: false\n    # -- Set to true if the Kubernetes pod name should be used as the end-user-visible name of the Data Center cluster node.\n    usePodNameAsClusterNodeName: true\n\n  resources:\n    jvm:\n      # -- The maximum amount of heap memory that will be used by the Crowd JVM\n      maxHeap: \"1g\"\n      # -- The minimum amount of heap memory that will be used by the Crowd JVM\n      minHeap: \"1g\"\n      # -- The memory reserved for the Crowd JVM code cache\n      reservedCodeCache: \"512m\"\n    # -- Specifies the standard Kubernetes resource requests and/or limits for the Crowd container.\n    # It is important that if the memory resources are specified here, they must allow for the size of the Crowd JVM.\n    # That means the maximum heap size, the reserved code cache size, plus other JVM overheads, must be accommodated.\n    # Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    container: {}\n    #  limits:\n    #    cpu: \"4\"\n    #    memory: \"2G\"\n    #  requests:\n    #    cpu: \"4\"\n    #    memory: \"2G\"\n\n  # -- Specifies a list of additional arguments that can be passed to the Crowd JVM, e.g. system properties\n  additionalJvmArgs: []\n#    - -Dfoo=bar\n#    - -Dfruit=lemon\n\n  # -- Specifies a list of additional Java libraries that should be added to the Crowd container.\n  # Each item in the list should specify the name of the volume which contain the library, as well as the name of the\n  # library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which\n  # directory in the volume contains the library file.\n  additionalLibraries: []\n#    - volumeName:\n#      subDirectory:\n#      fileName:\n\n  # -- Specifies a list of additional Crowd plugins that should be added to the Crowd container.\n  # These are specified in the same manner as the additionalLibraries field, but the files will be loaded\n  # as bundled plugins rather than as libraries.\n  additionalBundledPlugins: []\n#    - volumeName:\n#      subDirectory:\n#      fileName:\n\n  # -- Defines any additional volumes mounts for the Crowd container.\n  # These can refer to existing volumes, or new volumes can be defined in volumes.additional.\n  additionalVolumeMounts: []\n\n  # -- Defines any additional environment variables to be passed to the Crowd container.\n  # See https://hub.docker.com/r/atlassian/crowd for supported variables.\n  additionalEnvironmentVariables: []\n\ningress:\n  # -- True if an Ingress Resource should be created.\n  create: false\n  # -- True if the created Ingress Resource is to use the Kubernetes ingress-nginx controller:\n  # https://kubernetes.github.io/ingress-nginx/\n  # This will populate the Ingress Resource with annotations for the Kubernetes ingress-nginx controller.\n  # Set to false if a different controller is to be used, in which case the appropriate annotations for that\n  # controller need to be specified.\n  nginx: true\n  # -- The max body size to allow. Requests exceeding this size will result\n  # in an 413 error being returned to the client.\n  # https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size\n  maxBodySize: 10m\n  # -- The fully-qualified hostname of the Ingress Resource.\n  host:\n  # -- The custom annotations that should be applied to the Ingress\n  # Resource when not using the Kubernetes ingress-nginx controller.\n  annotations: {}\n  # -- True if the browser communicates with the application over HTTPS.\n  https: true\n  # -- Secret that contains a TLS private key and certificate.\n  # Optional if Ingress Controller is configured to use one secret for all ingresses\n  tlsSecretName:\n\nfluentd:\n  # -- True if the fluentd sidecar should be added to each pod\n  enabled: false\n  # -- The name of the image containing the fluentd sidecar\n  imageName: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.2\n  # -- The port on which the fluentd sidecar will listen\n  httpPort: 9880\n  elasticsearch:\n    # -- True if fluentd should send all log events to an elasticsearch service.\n    enabled: true\n    # -- The hostname of the Elasticsearch service that fluentd should send logs to.\n    hostname: elasticsearch\n    # -- The prefix of the elasticsearch index name that will be used\n    indexNamePrefix: crowd\n\n# -- Specify additional annotations to be added to all Crowd pods\npodAnnotations: {}\n#  \"name\": \"value\"\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      # -- If true, then a PersistentVolumeClaim will be created for each local-home volume.\n      create: false\n      # -- Specifies the name of the storage class that should be used for the local-home volume claim.\n      storageClassName:\n      # -- Specifies the standard Kubernetes resource requests and/or limits for the local-home volume claims.\n      resources:\n        requests:\n          storage: 1Gi\n    # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n    # volume which will be used for the local-home volumes. If not defined, then defaults to an emptyDir volume.\n    customVolume: {}\n    # -- The path within the Crowd container which the local-home volume should be mounted.\n    mountPath: \"/var/atlassian/application-data/crowd\"\n  sharedHome:\n    persistentVolumeClaim:\n      # -- If true, then a PersistentVolumeClaim will be created for the shared-home volume.\n      create: false\n      # -- Specifies the name of the storage class that should be used for the shared-home volume claim.\n      storageClassName:\n      # -- Specifies the standard Kubernetes resource requests and/or limits for the shared-home volume claims.\n      resources:\n        requests:\n          storage: 1Gi\n    # -- When persistentVolumeClaim.create is false, then this value can be used to define a standard Kubernetes\n    # volume which will be used for the shared-home volume. If not defined, then defaults to an emptyDir (i.e. unshared) volume.\n    customVolume: {}\n    # -- Specifies the path in the Crowd container to which the shared-home volume will be mounted.\n    mountPath: \"/var/atlassian/application-data/crowd/shared\"\n    # -- Specifies the sub-directory of the shared-home volume which will be mounted in to the Crowd container.\n    subPath:\n    nfsPermissionFixer:\n      # -- If enabled, this will alter the shared volume's root directory so that Crowd can write to it.\n      # This is a workaround for a Kubernetes bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260\n      enabled: false\n      # -- The path in the initContainer where the shared-home volume will be mounted\n      mountPath: /shared-home\n      # -- By default, the fixer will change the group ownership of the volume's root directory to match the Crowd\n      # container's GID (2002), and then ensures the directory is group-writeable. If this is not the desired behaviour,\n      # command used can be specified here.\n      command:\n  # -- Defines additional volumes that should be applied to all Crowd pods.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in crowd.additionalVolumeMounts\n  additional: []\n\n# -- Standard Kubernetes node-selectors that will be applied to all Crowd pods\nnodeSelector: {}\n\n# -- Standard Kubernetes tolerations that will be applied to all Crowd pods\ntolerations: []\n\n# -- Standard Kubernetes affinities that will be applied to all Crowd pods\naffinity: {}\n\n# -- Additional container definitions that will be added to all Crowd pods\nadditionalContainers: []\n\n# -- Additional initContainer definitions that will be added to all Crowd pods\nadditionalInitContainers: []\n\n# -- Additional labels that should be applied to all resources\nadditionalLabels: {}\n\n# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into server container\n# configMap and secret are two available types (camelCase is important!)\n# mountPath is a destination directory in a container and key is file name\n# name references existing ConfigMap or secret name. VolumeMount and Volumes are added with this name + index position,\n# for example custom-config-0, keystore-2\nadditionalFiles: []\n#  - name: custom-config\n#    type: configMap\n#    key: log4j.properties\n#    mountPath:  /var/atlassian\n#  - name: custom-config\n#    type: configMap\n#    key: web.xml\n#    mountPath: /var/atlassian\n#  - name: keystore\n#    type: secret\n#    key: keystore.jks\n#    mountPath: /var/ssl\n```\n\n---\nAutogenerated from Helm Chart and git history using [helm-changelog](https://github.com/mogensen/helm-changelog)\n"
  },
  {
    "path": "src/main/charts/crowd/Chart.yaml",
    "content": "apiVersion: v2\nname: crowd\ndescription: A chart for installing Crowd Data Center on Kubernetes\ntype: application\nversion: '2.0.13'\nappVersion: 7.1.5\n\nkubeVersion: \">=1.21.x-0\"\nkeywords:\n- Crowd\n- Crowd Server\n- Crowd Data Center\n- Crowd DC\n- Atlassian\nhome: https://atlassian.github.io/data-center-helm-charts/\nicon: https://atlassian.github.io/data-center-helm-charts/icons/crowd.svg\nsources:\n- https://github.com/atlassian/data-center-helm-charts\n- https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/\ndeprecated: false\nannotations:\n  artifacthub.io/containsSecurityUpdates: \"false\"\n  artifacthub.io/changes: |-\n    - \"Update Helm chart version\"\n\ndependencies:\n- name: common\n  version: 1.2.7\n  repository: https://atlassian.github.io/data-center-helm-charts\n"
  },
  {
    "path": "src/main/charts/crowd/README.md",
    "content": "# crowd\n\n![Version: 2.0.13](https://img.shields.io/badge/Version-2.0.13-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 7.1.5](https://img.shields.io/badge/AppVersion-7.1.5-informational?style=flat-square)\n\nA chart for installing Crowd Data Center on Kubernetes\n\n**Homepage:** <https://atlassian.github.io/data-center-helm-charts/>\n\n## Source Code\n\n* <https://github.com/atlassian/data-center-helm-charts>\n* <https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/>\n\n## Requirements\n\nKubernetes: `>=1.21.x-0`\n\n| Repository | Name | Version |\n|------------|------|---------|\n| https://atlassian.github.io/data-center-helm-charts | common | 1.2.7 |\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| additionalConfigMaps | list | `[]` | Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix for a ConfigMap name, fileName is used as subPath  |\n| additionalContainers | list | `[]` | Additional container definitions that will be added to all Crowd pods  |\n| additionalFiles | list | `[]` | Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into service container. Configuration details below (camelCase is important!): 'name'      - References existing ConfigMap or secret name. 'type'      - 'configMap' or 'secret' 'key'       - The file name. 'mountPath' - The destination directory in a container. VolumeMount and Volumes are added with this name and index position, for example; custom-config-0, keystore-2  |\n| additionalHosts | list | `[]` | Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file. https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ |\n| additionalInitContainers | list | `[]` | Additional initContainer definitions that will be added to all Crowd pods  |\n| additionalLabels | object | `{}` | Additional labels that should be applied to all resources  |\n| affinity | object | `{}` | Standard K8s affinities that will be applied to all Crowd pods  |\n| atlassianAnalyticsAndSupport.analytics.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a JSON which DC products will read and send analytics events to Atlassian data pipelines  |\n| atlassianAnalyticsAndSupport.helmValues.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a YAML file which can be optionally including to support.zip  |\n| crowd.accessLog.enabled | bool | `true` | Set to 'true' if access logging should be enabled.  |\n| crowd.accessLog.localHomeSubPath | string | `\"logs\"` | The subdirectory within the local-home volume where access logs should be stored.  |\n| crowd.accessLog.mountPath | string | `\"/opt/atlassian/crowd/apache-tomcat/logs\"` | The path within the Crowd container where the local-home volume should be mounted in order to capture access logs.  |\n| crowd.additionalAnnotations | object | `{}` | Defines additional annotations to the Bamboo StateFulSet. This might be required when deploying using a GitOps approach |\n| crowd.additionalBundledPlugins | list | `[]` | Specifies a list of additional Crowd plugins that should be added to the Crowd container. Note plugins installed via this method will appear as bundled plugins rather than user plugins. These should be specified in the same manner as the 'additionalLibraries' property. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  NOTE: only .jar files can be loaded using this approach. OBR's can be extracted (unzipped) to access the associated .jar  An alternative to this method is to install the plugins via \"Manage Apps\" in the product system administration UI.  |\n| crowd.additionalCertificates | object | `{\"customCmd\":null,\"initContainer\":{\"resources\":{},\"securityContext\":{}},\"secretList\":[],\"secretName\":null}` | Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates  |\n| crowd.additionalCertificates.customCmd | string | `nil` | Custom command to be executed in the init container to import certificates  |\n| crowd.additionalCertificates.initContainer.resources | object | `{}` | Resources allocated to the import-certs init container  |\n| crowd.additionalCertificates.initContainer.securityContext | object | `{}` | Custom SecurityContext for the import-certs init container  |\n| crowd.additionalCertificates.secretList | list | `[]` | A list of secrets with their respective keys holding certificates to be added to the Java truststore. It is mandatory to specify which keys from secret data need to be mounted as files to the init container  |\n| crowd.additionalCertificates.secretName | string | `nil` | Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.  |\n| crowd.additionalEnvironmentVariables | list | `[]` | Defines any additional environment variables to be passed to the Crowd container. See https://hub.docker.com/r/atlassian/crowd for supported variables. |\n| crowd.additionalJvmArgs | list | `[]` | Specifies a list of additional arguments that can be passed to the Crowd JVM, e.g. system properties.  |\n| crowd.additionalLibraries | list | `[]` | Specifies a list of additional Java libraries that should be added to the Crowd container. Each item in the list should specify the name of the volume that contains the library, as well as the name of the library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which directory in the volume contains the library file. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  |\n| crowd.additionalPorts | list | `[]` | Defines any additional ports for the Crowd container.  |\n| crowd.additionalVolumeClaimTemplates | list | `[]` | Defines additional volumeClaimTemplates that should be applied to the Crowd pod. Note that this will not create any corresponding volume mounts; those needs to be defined in crowd.additionalVolumeMounts  |\n| crowd.additionalVolumeMounts | list | `[]` | Defines any additional volumes mounts for the Crowd container. These can refer to existing volumes, or new volumes can be defined in volumes.additional. |\n| crowd.containerSecurityContext | object | `{}` | Standard K8s field that holds security configurations that will be applied to a container. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/  |\n| crowd.livenessProbe.customProbe | object | `{}` | Custom livenessProbe to override the default tcpSocket probe  |\n| crowd.livenessProbe.enabled | bool | `false` | Whether to apply the livenessProbe check to pod.  |\n| crowd.livenessProbe.failureThreshold | int | `12` | The number of consecutive failures of the Crowd container liveness probe before the pod fails liveness checks.  |\n| crowd.livenessProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| crowd.livenessProbe.periodSeconds | int | `5` | How often (in seconds) the Crowd container liveness probe will run  |\n| crowd.livenessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| crowd.ports.http | int | `8095` | The port on which the Crowd container listens for HTTP traffic  |\n| crowd.postStart | object | `{\"command\":null}` | PostStart is executed immediately after a container is created. However, there is no guarantee that the hook will execute before the container ENTRYPOINT. See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks  |\n| crowd.readinessProbe.customProbe | object | `{}` | Custom readinessProbe to override the default /status httpGet  |\n| crowd.readinessProbe.enabled | bool | `true` | Whether to apply the readinessProbe check to pod.  |\n| crowd.readinessProbe.failureThreshold | int | `10` | The number of consecutive failures of the Crowd container readiness probe before the pod fails readiness checks.  |\n| crowd.readinessProbe.initialDelaySeconds | int | `10` | The initial delay (in seconds) for the Crowd container readiness probe, after which the probe will start running.  |\n| crowd.readinessProbe.periodSeconds | int | `5` | How often (in seconds) the Crowd container readiness probe will run  |\n| crowd.readinessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| crowd.resources.container.requests.cpu | string | `\"2\"` | Initial CPU request by Crowd pod  |\n| crowd.resources.container.requests.memory | string | `\"1G\"` | Initial Memory request by Crowd pod  |\n| crowd.resources.jvm.maxHeap | string | `\"768m\"` | The maximum amount of heap memory that will be used by the Crowd JVM  |\n| crowd.resources.jvm.minHeap | string | `\"384m\"` | The minimum amount of heap memory that will be used by the Crowd JVM  |\n| crowd.securityContext.fsGroup | int | `2004` | The GID used by the Crowd docker image GID will default to 2004 if not supplied and securityContextEnabled is set to true. This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Crowd container. However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260  |\n| crowd.securityContext.fsGroupChangePolicy | string | `\"OnRootMismatch\"` | fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod. This field only applies to volume types that support fsGroup controlled ownership and permissions. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods  |\n| crowd.securityContextEnabled | bool | `true` | Whether to apply security context to pod.  |\n| crowd.service.annotations | object | `{}` | Additional annotations to apply to the Service  |\n| crowd.service.contextPath | string | `\"/crowd\"` | The Tomcat context path that Crowd will use. The ATL_TOMCAT_CONTEXTPATH will be set automatically.  |\n| crowd.service.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| crowd.service.nodePort | string | `nil` | Only applicable if service.type is NodePort. NodePort for Crowd service  |\n| crowd.service.port | int | `80` | The port on which the Crowd K8s Service will listen  |\n| crowd.service.sessionAffinity | string | `\"None\"` | Session affinity type. If you want to make sure that connections from a particular client are passed to the same pod each time, set sessionAffinity to ClientIP. See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity  |\n| crowd.service.sessionAffinityConfig | object | `{\"clientIP\":{\"timeoutSeconds\":null}}` | Session affinity configuration  |\n| crowd.service.sessionAffinityConfig.clientIP.timeoutSeconds | string | `nil` | Specifies the seconds of ClientIP type session sticky time. The value must be > 0 && <= 86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).  |\n| crowd.service.type | string | `\"ClusterIP\"` | The type of K8s service to use for Crowd. For loadBalancer type, deselect the consistent client IP address in Crowd Session configuration. Read more: https://atlassian.github.io/data-center-helm-charts/troubleshooting/LIMITATIONS/#loadbalancer-service-type  |\n| crowd.setPermissions | bool | `true` | Boolean to define whether to set local home directory permissions on startup of Crowd container. Set to 'false' to disable this behaviour.  |\n| crowd.shutdown.command | string | `\"/shutdown-wait.sh\"` | By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/), using a script supplied by the Docker image. If any other shutdown behaviour is needed it can be achieved by overriding this value. Note that the shutdown command needs to wait for the application shutdown completely before exiting; see [the default command](https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/src/master/shutdown-wait.sh) for details.  |\n| crowd.shutdown.terminationGracePeriodSeconds | int | `30` | The termination grace period for pods during shutdown. This should be set to the internal grace period, plus a small buffer to allow the JVM to fully terminate.  |\n| crowd.startupProbe.enabled | bool | `false` | Whether to apply the startupProbe check to pod.  |\n| crowd.startupProbe.failureThreshold | int | `120` | The number of consecutive failures of the Crowd container startup probe before the pod fails startup checks.  |\n| crowd.startupProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| crowd.startupProbe.periodSeconds | int | `5` | How often (in seconds) the Crowd container startup probe will run  |\n| crowd.tomcatConfig.acceptCount | string | `\"100\"` |  |\n| crowd.tomcatConfig.accessLogsMaxDays | string | `\"-1\"` |  |\n| crowd.tomcatConfig.connectionTimeout | string | `\"20000\"` |  |\n| crowd.tomcatConfig.enableLookups | string | `\"false\"` |  |\n| crowd.tomcatConfig.generateByHelm | bool | `false` | Mount server.xml as a ConfigMap. Override configuration elements if necessary  |\n| crowd.tomcatConfig.maxHttpHeaderSize | string | `\"8192\"` |  |\n| crowd.tomcatConfig.maxThreads | string | `\"150\"` |  |\n| crowd.tomcatConfig.mgmtPort | string | `\"8020\"` |  |\n| crowd.tomcatConfig.minSpareThreads | string | `\"25\"` |  |\n| crowd.tomcatConfig.port | string | `\"8095\"` |  |\n| crowd.tomcatConfig.protocol | string | `\"HTTP/1.1\"` |  |\n| crowd.tomcatConfig.proxyInternalIps | string | `nil` |  |\n| crowd.tomcatConfig.proxyName | string | `nil` |  |\n| crowd.tomcatConfig.proxyPort | string | `nil` |  |\n| crowd.tomcatConfig.redirectPort | string | `\"8443\"` |  |\n| crowd.tomcatConfig.requestAttributesEnabled | string | `\"false\"` |  |\n| crowd.tomcatConfig.scheme | string | `nil` |  |\n| crowd.tomcatConfig.secure | string | `nil` |  |\n| crowd.topologySpreadConstraints | list | `[]` | Defines topology spread constraints for Crowd pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| crowd.umask | string | `\"0022\"` | The umask used by the Crowd process when it creates new files. The default is 0022. This gives the new files:  - read/write permissions for the Crowd user  - read permissions for everyone else.  |\n| crowd.useHelmReleaseNameAsContainerName | bool | `false` | Whether the main container should acquire helm release name. By default the container name is `crowd` which corresponds to the name of the Helm Chart.  |\n| fluentd.command | string | `nil` | The command used to start Fluentd. If not supplied the default command will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"  Note: The custom command can be free-form, however pay particular attention to the process that should ultimately be left running in the container. This process should be invoked with 'exec' so that signals are appropriately propagated to it, for instance SIGTERM. An example of how such a command may look is: \"<command 1> && <command 2> && exec <primary command>\" |\n| fluentd.customConfigFile | bool | `false` | Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default) should be used for Fluentd. If enabled this config must be supplied via the 'fluentdCustomConfig' property below. If your custom config forces fluentd to run in a server mode, add `-Datlassian.logging.cloud.enabled=true` to `crowd.AdditionalJvmArgs` stanza in values file  |\n| fluentd.elasticsearch.enabled | bool | `true` | Set to 'true' if Fluentd should send all log events to an Elasticsearch service.  |\n| fluentd.elasticsearch.hostname | string | `\"elasticsearch\"` | The hostname of the Elasticsearch service that Fluentd should send logs to.  |\n| fluentd.elasticsearch.indexNamePrefix | string | `\"crowd\"` | The prefix of the Elasticsearch index name that will be used  |\n| fluentd.enabled | bool | `false` | Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod  |\n| fluentd.extraVolumes | list | `[]` | Specify custom volumes to be added to Fluentd container (e.g. more log sources)  |\n| fluentd.fluentdCustomConfig | object | `{}` | Custom fluent.conf file  |\n| fluentd.httpPort | int | `9880` | The port on which the Fluentd sidecar will listen  |\n| fluentd.imageRepo | string | `\"fluent/fluentd-kubernetes-daemonset\"` | The Fluentd sidecar image repository  |\n| fluentd.imageTag | string | `\"v1.11.5-debian-elasticsearch7-1.2\"` | The Fluentd sidecar image tag  |\n| fluentd.resources | object | `{}` | Resources requests and limits for fluentd sidecar container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| gateway.additionalRules | list | `[]` | Advanced routing rules. Use this for complex routing scenarios like header-based routing, traffic splitting, or multiple backends. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule  |\n| gateway.annotations | object | `{}` | Annotations to add to the HTTPRoute resource.  |\n| gateway.create | bool | `false` | Set to 'true' if an HTTPRoute Resource should be created. This depends on a pre-provisioned Gateway API controller being available and a Gateway resource. Cannot be enabled if ingress.create is true.  |\n| gateway.filters | list | `[]` | HTTP filters to apply to requests. Can be used to add/remove headers, perform redirects, or rewrite URLs. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter  |\n| gateway.hostnames | list | `[]` | The hostnames that should be routed to Crowd. At least one hostname is required when gateway.create is true. Setting hostnames activates gateway mode for product configuration even when gateway.create is false, allowing use with a pre-existing Gateway or external proxy. The first entry is used as the canonical hostname for base URL, proxy settings, and NOTES output — list the primary/public hostname first.  |\n| gateway.https | bool | `true` | Whether users access the application over HTTPS. This does not configure TLS on the Gateway or load balancer — it must match how traffic is actually routed to the application.  |\n| gateway.labels | object | `{}` | Labels to add to the HTTPRoute resource.  |\n| gateway.parentRefs | list | `[]` | Reference to the parent Gateway resource. Supports any standard parentRef fields (name, namespace, sectionName, etc.). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference  |\n| gateway.path | string | `\"/\"` | The base path for routing. When empty, falls back to the product's service.contextPath (same behavior as ingress). Set explicitly to override, e.g. \"/crowd\".  |\n| gateway.pathType | string | `\"PathPrefix\"` | Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\". PathPrefix is recommended for most use cases.  |\n| gateway.timeouts | object | `{\"backendRequest\":\"60s\",\"request\":\"60s\"}` | Timeout configuration for HTTPRoute rules. Note: when migrating from Ingress, these replace proxyReadTimeout and proxySendTimeout. There is no Gateway API equivalent for proxyConnectTimeout or maxBodySize — those require controller-specific policies (e.g. Envoy Gateway BackendTrafficPolicy). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts  |\n| hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| image | object | `{\"pullPolicy\":\"IfNotPresent\",\"repository\":\"atlassian/crowd\",\"tag\":\"\"}` | Image configuration  |\n| image.pullPolicy | string | `\"IfNotPresent\"` | Image pull policy  |\n| image.repository | string | `\"atlassian/crowd\"` | The Docker Crowd Docker image to use https://hub.docker.com/r/atlassian/crowd  |\n| image.tag | string | `\"\"` | The docker image tag to be used. Defaults to appVersion in Chart.yaml  |\n| ingress.additionalPaths | list | `[]` | Additional paths to be added to the Ingress resource to point to different backend services  |\n| ingress.annotations | object | `{}` | The custom annotations that should be applied to the Ingress Resource. If using an ingress-nginx controller be sure that the annotations you add here are compatible with those already defined in the 'ingess.yaml' template  |\n| ingress.className | string | `\"nginx\"` | The class name used by the ingress controller if it's being used.  Please follow documentation of your ingress controller. If the cluster contains multiple ingress controllers, this setting allows you to control which of them is used for Atlassian application traffic.  |\n| ingress.create | bool | `false` | Set to 'true' if an Ingress Resource should be created. This depends on a pre-provisioned Ingress Controller being available.  |\n| ingress.host | string | `nil` | The fully-qualified hostname (FQDN) of the Crowd instance. This value is used to configure the product's proxy settings and, when ingress.create is true, the Ingress resource routing rules.  |\n| ingress.https | bool | `true` | Whether users access the application over HTTPS. Set to 'false' if not using TLS, e.g. when reaching the service via localhost port-forwarding.  |\n| ingress.maxBodySize | string | `\"250m\"` | The max body size to allow. Requests exceeding this size will result in an HTTP 413 error being returned to the client.  |\n| ingress.nginx | bool | `true` | Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx' controller. https://kubernetes.github.io/ingress-nginx/  This will populate the Ingress Resource with annotations that are specific to the K8s ingress-nginx controller. Set to 'false' if a different controller is to be used, in which case the appropriate annotations for that controller must be specified below under 'ingress.annotations'.  |\n| ingress.openShiftRoute | bool | `false` | Set to true if you want to create an OpenShift Route instead of an Ingress  |\n| ingress.path | string | `\"/\"` | The base path for the application, e.g. '/crowd'.  |\n| ingress.proxyConnectTimeout | int | `60` | Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.  |\n| ingress.proxyReadTimeout | int | `60` | Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.  |\n| ingress.proxySendTimeout | int | `60` | Sets a timeout for transmitting a request to the proxied server. The timeout is set only between two successive write operations, not for the transmission of the whole request. If the proxied server does not receive anything within this time, the connection is closed.  |\n| ingress.routeHttpHeaders | object | `{}` | routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only  |\n| ingress.tlsSecretName | string | `nil` | The name of the K8s Secret that contains the TLS private key and corresponding certificate. When utilised, TLS termination occurs at the ingress point where traffic to the Service, and it's Pods is in plaintext.  Usage is optional and depends on your use case. The Ingress Controller itself can also be configured with a TLS secret for all Ingress Resources. https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets https://kubernetes.io/docs/concepts/services-networking/ingress/#tls  |\n| monitoring.exposeJmxMetrics | bool | `false` | Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter  |\n| monitoring.fetchJmxExporterJar | bool | `true` | Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar to shared home and provide an absolute path in jmxExporterCustomJarLocation  |\n| monitoring.grafana.createDashboards | bool | `false` | Create ConfigMaps with Grafana dashboards  |\n| monitoring.grafana.dashboardAnnotations | object | `{}` | Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage  |\n| monitoring.grafana.dashboardLabels | object | `{}` | Label selector for Grafana dashboard importer sidecar  |\n| monitoring.jmxExporterCustomConfig | object | `{}` | Custom JMX config with the rules  |\n| monitoring.jmxExporterCustomJarLocation | string | `nil` | Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home  |\n| monitoring.jmxExporterImageRepo | string | `\"bitnamilegacy/jmx-exporter\"` | Image repository with jmx_exporter jar  |\n| monitoring.jmxExporterImageTag | string | `\"0.18.0\"` |  |\n| monitoring.jmxExporterInitContainer | object | `{\"customSecurityContext\":{},\"jmxJarLocation\":null,\"resources\":{},\"runAsRoot\":true}` | JMX exporter init container configuration  |\n| monitoring.jmxExporterInitContainer.customSecurityContext | object | `{}` | Custom SecurityContext for the jmx exporter init container  |\n| monitoring.jmxExporterInitContainer.jmxJarLocation | string | `nil` | The location of the JMX exporter jarfile in the JMX exporter image Leave blank for default bitnami image  |\n| monitoring.jmxExporterInitContainer.resources | object | `{}` | Resources requests and limits for the JMX exporter init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| monitoring.jmxExporterInitContainer.runAsRoot | bool | `true` | Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume. Set to false if running containers as root is not allowed in the cluster.  |\n| monitoring.jmxExporterPort | int | `9999` | Port number on which metrics will be available  |\n| monitoring.jmxExporterPortType | string | `\"ClusterIP\"` | JMX exporter port type  |\n| monitoring.jmxServiceAnnotations | object | `{}` | Annotations added to the jmx service  |\n| monitoring.serviceMonitor.create | bool | `false` | Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.  |\n| monitoring.serviceMonitor.prometheusLabelSelector | object | `{}` | ServiceMonitorSelector of the prometheus instance.  |\n| monitoring.serviceMonitor.scrapeIntervalSeconds | int | `30` | Scrape interval for the JMX service.  |\n| nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Crowd pods  |\n| openshift.runWithRestrictedSCC | bool | `false` | When set to true, the containers will run with a restricted Security Context Constraint (SCC). See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server configuration files as ConfigMaps.  |\n| ordinals | object | `{\"enabled\":false,\"start\":0}` | Set a custom start ordinal number for the K8s stateful set. Note that this depends on the StatefulSetStartOrdinal K8s feature gate, which has entered beta state with K8s version 1.27.  |\n| ordinals.enabled | bool | `false` | Enable only if StatefulSetStartOrdinal K8s feature gate is available.  |\n| ordinals.start | int | `0` | Set start ordinal to a positive integer, defaulting to 0.  |\n| podAnnotations | object | `{}` | Custom annotations that will be applied to all Crowd pods  |\n| podDisruptionBudget | object | `{\"annotations\":{},\"enabled\":false,\"labels\":{},\"maxUnavailable\":null,\"minAvailable\":null}` | PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.  |\n| podLabels | object | `{}` | Custom labels that will be applied to all Crowd pods  |\n| priorityClassName | string | `nil` | Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster. For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| replicaCount | int | `1` | The initial number of Crowd pods that should be started at deployment time. Note that Crowd requires manual configuration via the browser post deployment after the first pod is deployed. This configuration must be completed before scaling up additional pods. As such this value should always be kept as 1, but can be altered once manual configuration is complete.  |\n| schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Crowd pods. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| serviceAccount.annotations | object | `{}` | Annotations to add to the ServiceAccount (if created)  |\n| serviceAccount.create | bool | `true` | Set to 'true' if a ServiceAccount should be created, or 'false' if it already exists.  |\n| serviceAccount.imagePullSecrets | list | `[]` | For Docker images hosted in private registries, define the list of image pull secrets that should be utilized by the created ServiceAccount https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod  |\n| serviceAccount.name | string | `nil` | The name of the ServiceAccount to be used by the pods. If not specified, but the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name will be auto-generated, otherwise the 'default' ServiceAccount will be used. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server  |\n| terminationGracePeriodSeconds | int | `30` | Kubernetes default, but can be overridden here. |\n| testPods | object | `{\"affinity\":{},\"annotations\":{},\"image\":{\"permissionsTestContainer\":\"debian:stable-slim\",\"statusTestContainer\":\"alpine:latest\"},\"labels\":{},\"nodeSelector\":{},\"resources\":{},\"schedulerName\":null,\"tolerations\":[]}` | Metadata and pod spec for pods started in Helm tests  |\n| tolerations | list | `[]` | Standard K8s tolerations that will be applied to all Crowd pods  |\n| updateStrategy | object | `{}` | StatefulSet update strategy. When unset defaults to Rolling update. See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets  |\n| volumes.additional | list | `[]` | Defines additional volumes that should be applied to all Crowd pods. Note that this will not create any corresponding volume mounts; those needs to be defined in crowd.additionalVolumeMounts  |\n| volumes.localHome.customVolume | object | `{}` | Static provisioning of local-home using K8s PVs and PVCs  NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for pods is not recommended. Dynamic provisioning described above is the prescribed approach.  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the local-home volume(s). If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static  |\n| volumes.localHome.mountPath | string | `\"/var/atlassian/application-data/crowd\"` | Specifies the path in the Crowd container to which the local-home volume will be mounted.  |\n| volumes.localHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically created for each pod based on the 'StorageClassName' supplied below.  |\n| volumes.localHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the local-home volume claims.  |\n| volumes.localHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the local-home volume claim.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted | string | `nil` | Configures the volume retention behavior that applies when the StatefulSet is deleted.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled | string | `nil` | Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.  |\n| volumes.localHome.subPath | string | `nil` | Specifies the sub-directory of the local-home volume that will be mounted in to the Crowd container.  |\n| volumes.sharedHome.customVolume | object | `{}` | Static provisioning of shared-home using K8s PVs and PVCs  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the shared-home volume. If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/  |\n| volumes.sharedHome.mountPath | string | `\"/var/atlassian/application-data/crowd/shared\"` | Specifies the path in the Crowd container to which the shared-home volume will be mounted.  |\n| volumes.sharedHome.nfsPermissionFixer.command | string | `nil` | By default, the fixer will change the group ownership of the volume's root directory to match the Crowd container's GID (2002), and then ensures the directory is group-writeable. If this is not the desired behaviour, command used can be specified here.  |\n| volumes.sharedHome.nfsPermissionFixer.enabled | bool | `true` | If 'true', this will alter the shared-home volume's root directory so that Crowd can write to it. This is a workaround for a K8s bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260  |\n| volumes.sharedHome.nfsPermissionFixer.imageRepo | string | `\"alpine\"` | Image repository for the permission fixer init container. Defaults to alpine  |\n| volumes.sharedHome.nfsPermissionFixer.imageTag | string | `\"latest\"` | Image tag for the permission fixer init container. Defaults to latest  |\n| volumes.sharedHome.nfsPermissionFixer.mountPath | string | `\"/shared-home\"` | The path in the K8s initContainer where the shared-home volume will be mounted  |\n| volumes.sharedHome.nfsPermissionFixer.resources | object | `{}` | Resources requests and limits for nfsPermissionFixer init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| volumes.sharedHome.persistentVolumeClaim.accessModes | list | `[\"ReadWriteMany\"]` | Specify the access modes that should be used for the 'shared-home' volume claim. Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations. Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes  |\n| volumes.sharedHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically created for shared-home based on the 'StorageClassName' supplied below.  |\n| volumes.sharedHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the shared-home volume claims.  |\n| volumes.sharedHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the 'shared-home' volume claim.  |\n| volumes.sharedHome.subPath | string | `nil` | Specifies the sub-directory of the shared-home volume that will be mounted in to the Crowd container.  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/main/charts/crowd/grafana-dashboards/overview.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"DOWN\"\n                }\n              },\n              \"type\": \"special\"\n            },\n            {\n              \"options\": {\n                \"from\": 1,\n                \"result\": {\n                  \"index\": 1,\n                  \"text\": \"UP\"\n                },\n                \"to\": 9999999\n              },\n              \"type\": \"range\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 1\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 22,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Pid{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Status\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 21,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_Uptime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}/1000\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"dateTimeAsIso\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 23,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_StartTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Start time\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 0\n      },\n      \"id\": 24,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_OperatingSystem_AvailableProcessors{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Available CPU Cores\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 19,\n        \"w\": 5,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 18,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"jvm_threads_state{namespace=\\\"$namespace\\\", service=\\\"$service\\\", state=\\\"BLOCKED\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ state }} ({{ pod }})\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Blocked Threads\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 8,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 0\n      },\n      \"id\": 33,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"60s\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 40\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(java_lang_OperatingSystem_ProcessCpuLoad{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} * 100)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"cpu load ({{ pod }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"CPU\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 7\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"100*(jvm_memory_bytes_used{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"}/jvm_memory_bytes_max{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Used {{ area }} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Heap Used %\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 7\n      },\n      \"id\": 34,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Old_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"G1_Old_Generation ({{ pod }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(java_lang_G1_Young_Generation_CollectionCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"G1_Young_Generation ({{ pod }})\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"GC Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 32,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"\\\"http-nio-8085\\\" count (10.0.3.117:9999)\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 25,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} count ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_errorCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} error ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Tomcat Request Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 80\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 20\n      },\n      \"id\": 19,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(Catalina_ThreadPool_currentThreadCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} / Catalina_ThreadPool_maxThreads{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}) * 100\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"used {{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 90,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Tomcat Threads\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 20\n      },\n      \"id\": 26,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_processingTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m]) / increase(Catalina_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat Request Processing Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 20\n      },\n      \"id\": 27,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"8.2.5\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"Catalina_Manager_activeSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"active sessions: {{context}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"Catalina_Manager_rejectedSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"rejected sessions: {{context}} ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Tomcat Sessions\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 30,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Database\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 16,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 40,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_mchange_v2_c3p0_PooledDataSource_numBusyConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"busy ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_mchange_v2_c3p0_PooledDataSource_numConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"total ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Total and Active connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 32\n      },\n      \"id\": 42,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_mchange_v2_c3p0_PooledDataSource_numBusyConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"busy {{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_mchange_v2_c3p0_PooledDataSource_maxPoolSize{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"hide\": false,\n          \"legendFormat\": \"maxPoolSize ({{ pod }})\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Busy connections vs. max pool size\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 32\n      },\n      \"id\": 44,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.4.7\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"com_mchange_v2_c3p0_PooledDataSource_numIdleConnections{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"legendFormat\": \"idle {{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Idle connections\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"revision\": 1,\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"crowd\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"java_lang_Runtime_Uptime{product=\\\"crowd\\\"}\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"java_lang_Runtime_Uptime{product=\\\"crowd\\\"}\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"java_lang_Runtime_Uptime{product=\\\"crowd\\\"}\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"java_lang_Runtime_Uptime{product=\\\"crowd\\\"}\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Crowd Overview\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/crowd/templates/NOTES.txt",
    "content": "Thank you for installing {{ title .Chart.Name }}.\n\nYour release is named {{ .Release.Name }}, and resides in namespace {{ .Release.Namespace }}.\n\nPlease run sanity tests against the release to verify it's healthy:\n\n  $ helm test {{ .Release.Name }} -n {{ .Release.Namespace }}\n\nIf the Kubernetes resources in the release are still starting up, then the tests may fail, so it\nis advisable to wait for the tests to pass before continuing.\n\nTo see the custom values you used for this release:\n\n  $ helm get values {{ .Release.Name }} -n {{ .Release.Namespace }}\n\n{{ if eq (include \"common.gateway.isConfigured\" .) \"true\" -}}\n{{ title .Chart.Name }} service URL: {{ include \"common.gateway.origin\" . }}{{ include \"crowd.path\" . }}\n{{- else }}\nGet the {{ title .Chart.Name }} URL by running these commands in the same shell:\n{{- if contains \"NodePort\" .Values.crowd.service.type }}\n  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ .Release.Name }})\n  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n  echo http://$NODE_IP:$NODE_PORT\n{{- else if contains \"LoadBalancer\" .Values.crowd.service.type }}\n  NOTE: It may take a few minutes for the LoadBalancer Hostname to be available.\n        You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ .Release.Name }}'\n\n  export SERVICE_HOSTNAME=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ .Release.Name }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n  echo http://$SERVICE_HOSTNAME:{{ .Values.crowd.service.port }}\n{{- else if contains \"ClusterIP\" .Values.crowd.service.type }}\n  Step 1: Get the pod name\n    $ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"app.kubernetes.io/instance={{ .Release.Name }}\" -o jsonpath=\"{.items[0].metadata.name}\")\n  Step 2 (Optional): Check if the pod name has been exported successfully and the pod status\n    $ echo POD_NAME: $POD_NAME && echo POD_STATUS: $(kubectl get pod $POD_NAME -o jsonpath='{.status.phase}')\n  Step 3: Wait for pods up and running, then forward pod port to localhost.\n    $ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME {{ .Values.crowd.ports.http }}\n  Step 4: Access {{ title .Chart.Name }} on localhost:\n    http://localhost:{{ .Values.crowd.ports.http }}\n{{- end }}\n{{- end }}\n{{- if not ( or .Values.volumes.localHome.persistentVolumeClaim.create .Values.volumes.localHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Local Home!!!        #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{- if not ( or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Shared Home!!!       #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{- if ( or .Values.crowd.securityContext.enabled .Values.crowd.securityContext.gid ) }}\n\n#################################################################################\n######         DEPRECATION WARNING: crowd.securityContext deprecation       #####\n######       Update your values to the new crowd.securityContext format     #####\n#################################################################################\n{{- end}}\n\nFor further documentation, see https://atlassian.github.io/data-center-helm-charts/"
  },
  {
    "path": "src/main/charts/crowd/templates/_fluentd_templates.tpl",
    "content": "{{- define \"fluentd.container\" -}}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd\n  image: {{ .Values.fluentd.imageRepo }}:{{ .Values.fluentd.imageTag }}\n  command: [\"sh\", \"-c\", {{ include \"fluentd.start.command\" . | quote }}]\n{{- if .Values.fluentd.resources }}\n  resources:\n  {{- with .Values.fluentd.resources }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- end }}\n  ports:\n    - containerPort: {{ .Values.fluentd.httpPort }}\n      protocol: TCP\n  volumeMounts:\n    - name: local-home\n      mountPath: /application-data/logs\n      subPath: logs\n      readOnly: true\n    - name: fluentd-config\n      mountPath: /fluentd/etc\n      readOnly: true\n{{- if .Values.fluentd.extraVolumes }}\n  {{ toYaml .Values.fluentd.extraVolumes | nindent 4}}\n{{- end }}\n  env:\n    - name: POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: POD_NAMESPACE\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.namespace\n    - name: POD_IP\n      valueFrom:\n        fieldRef:\n          fieldPath: status.podIP\n    - name: HELM_RELEASE_NAME\n      value: {{ include \"common.names.fullname\" . }}\n{{ end }}\n{{ end }}\n\n{{- define \"fluentd.config.volume\" }}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd-config\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-fluentd-config\n{{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n\n{{/* Define a sanitized list of additionalEnvironmentVariables */}}\n{{- define \"crowd.sanitizedAdditionalEnvVars\" -}}\n{{- range .Values.crowd.additionalEnvironmentVariables }}\n- name: {{ .name }}\n  value: {{ if regexMatch \"(?i)(secret|token|password)\" .name }}\"Sanitized by Support Utility\"{{ else}}{{ .value }}{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define a sanitized list of additionalJvmArgs */}}\n{{- define \"crowd.sanitizedAdditionalJvmArgs\" -}}\n{{- range .Values.crowd.additionalJvmArgs }}\n {{- $jvmArgs := regexSplit \"=\" . -1 }}\n   {{- if regexMatch \"(?i)(secret|token|password).*$\" (first $jvmArgs) }}\n-  {{ first $jvmArgs }}=Sanitized by Support Utility{{ else}}\n-  {{ . }}\n{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define sanitized Helm values */}}\n{{- define \"crowd.sanitizedValues\" -}}\n{{- $sanitizedAdditionalEnvs := dict .Chart.Name (dict \"additionalEnvironmentVariables\" (include \"crowd.sanitizedAdditionalEnvVars\" .)) }}\n{{- $sanitizedAdditionalJvmArgs := dict .Chart.Name (dict \"additionalJvmArgs\" (include \"crowd.sanitizedAdditionalJvmArgs\" .)) }}\n{{- $mergedValues := merge $sanitizedAdditionalEnvs $sanitizedAdditionalJvmArgs .Values }}\n{{- toYaml $mergedValues | replace \" |2-\" \"\" | replace \" |-\" \"\" |  replace \"|2\" \"\" | nindent 4 }}\n{{- end }}\n\n{{- define \"crowd.analyticsJson\" }}\n{\n  \"imageTag\": {{ if or (eq .Values.image.tag \"\") (eq .Values.image.tag nil) }}{{ .Chart.AppVersion | quote }}{{ else }}{{ regexSplit \"-\" .Values.image.tag -1 | first |  quote }}{{ end }},\n  \"replicas\": {{ .Values.replicaCount }},\n  \"isJmxEnabled\": {{ .Values.monitoring.exposeJmxMetrics }},\n  \"ingressType\": {{ if not .Values.ingress.create }}\"NONE\"{{ else }}{{ if .Values.ingress.nginx }}\"NGINX\"{{ else }}\"OTHER\"{{ end }}{{ end }},\n{{- $sanitizedMinorVersion := regexReplaceAll \"[^0-9]\" .Capabilities.KubeVersion.Minor \"\" }}\n  \"k8sVersion\": \"{{ .Capabilities.KubeVersion.Major }}.{{ $sanitizedMinorVersion }}\",\n  \"serviceType\": {{ if regexMatch \"^(ClusterIP|NodePort|LoadBalancer|ExternalName)$\" .Values.crowd.service.type }}{{ snakecase .Values.crowd.service.type | upper | quote }}{{ else }}\"UNKNOWN\"{{ end }},\n  \"dbType\": \"UNKNOWN\",\n  \"isSharedHomePVCCreated\": {{ .Values.volumes.sharedHome.persistentVolumeClaim.create }},\n  \"isServiceMonitorCreated\": {{ .Values.monitoring.serviceMonitor.create }},\n  \"isGrafanaDashboardsCreated\": {{ .Values.monitoring.grafana.createDashboards }},\n  \"isRunOnOpenshift\": {{ .Capabilities.APIVersions.Has \"route.openshift.io/v1/Route\" }},\n  \"isRunWithRestrictedSCC\": {{ .Values.openshift.runWithRestrictedSCC }},\n  \"isOpenshiftRouteCreated\": {{ .Values.ingress.openShiftRoute}}\n}\n{{- end }}\n\n{{/*\nThe name of the service account to be used.\nIf the name is defined in the chart values, then use that,\nelse if we're creating a new service account then use the name of the Helm release,\nelse just use the \"default\" service account.\n*/}}\n{{- define \"crowd.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.name -}}\n{{- .Values.serviceAccount.name -}}\n{{- else -}}\n{{- if .Values.serviceAccount.create -}}\n{{- include \"common.names.fullname\" . -}}\n{{- else -}}\ndefault\n{{- end -}}\n{{- end -}}\n{{- end }}\n\n{{/*\nPod labels\n*/}}\n{{- define \"crowd.podLabels\" -}}\n{{ with .Values.podLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{- define \"crowd.sysprop.clusterNodeName\" -}}\n-Dcluster.node.name=${KUBE_POD_NAME}\n{{- end }}\n\n{{- define \"crowd.sysprop.fluentdAppender\" -}}\n-Datlassian.logging.cloud.enabled={{ if and .Values.fluentd.enabled (not .Values.fluentd.customConfigFile ) }}{{.Values.fluentd.enabled }}{{ else }}false{{ end }}\n{{- end }}\n\n{{/*\nThe command that should be run by the nfs-fixer init container to correct the permissions of the shared-home root directory.\n*/}}\n{{- define \"crowd.sharedHome.permissionFix.command\" -}}\n{{- $securityContext := .Values.crowd.securityContext }}\n{{- with .Values.volumes.sharedHome.nfsPermissionFixer }}\n    {{- if .command }}\n        {{ .command }}\n    {{- else }}\n        {{- if and $securityContext.gid $securityContext.enabled }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.gid .mountPath .mountPath }}\n        {{- else if $securityContext.fsGroup }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.fsGroup .mountPath .mountPath }}\n        {{- else }}\n            {{- printf \"(chgrp 2004 %s; chmod g+w %s)\" .mountPath .mountPath }}\n        {{- end }}\n    {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe command that should be run to start the fluentd service\n*/}}\n{{- define \"fluentd.start.command\" -}}\n{{- if .Values.fluentd.command }}\n{{ .Values.fluentd.command }}\n{{- else }}\n{{- print \"exec fluentd -c /fluentd/etc/fluent.conf -v\" }}\n{{- end }}\n{{- end }}\n\n{{- define \"crowd.image\" -}}\n{{- if .Values.image.registry -}}\n{{ .Values.image.registry}}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- else -}}\n{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefines the volume mounts used by the Crowd container.\nNote that the local-home volume is mounted twice, once for the local-home directory itself, and again\non Tomcat's logs directory. THis ensures that Tomcat+Crowd logs get captured in the same volume.\n*/}}\n{{ define \"crowd.volumeMounts\" }}\n- name: local-home\n  mountPath: {{ .Values.volumes.localHome.mountPath | quote }}\n  {{- if .Values.volumes.localHome.subPath }}\n  subPath: {{ .Values.volumes.localHome.subPath | quote }}\n  {{- end }}\n- name: local-home\n  mountPath: {{ .Values.crowd.accessLog.mountPath | quote }}\n  subPath: {{ .Values.crowd.accessLog.localHomeSubPath | quote }}\n- name: shared-home\n  mountPath: {{ .Values.volumes.sharedHome.mountPath | quote }}\n  {{- if .Values.volumes.sharedHome.subPath }}\n  subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n  {{- end }}\n{{- if or .Values.crowd.additionalCertificates.secretName .Values.crowd.additionalCertificates.secretList }}\n- name: keystore\n  mountPath: /var/ssl\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  mountPath: /opt/atlassian/helm\n{{- end }}\n{{- if or .Values.crowd.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  mountPath: /opt/atlassian/crowd/apache-tomcat/conf/server.xml\n  subPath: server.xml\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional library declared, generate a volume mount that injects that library into the Crowd lib directory\n*/}}\n{{- define \"crowd.additionalLibraries\" -}}\n{{- range .Values.crowd.additionalLibraries }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/crowd/crowd-webapp/WEB-INF/lib/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"crowd.podAnnotations\" -}}\n{{- range $key, $value := .Values.podAnnotations }}\n{{ $key }}: {{ tpl $value $ | quote }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional init containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"crowd.additionalInitContainers\" -}}\n{{- with .Values.additionalInitContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"crowd.additionalContainers\" -}}\n{{- with .Values.additionalContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional ports here instead of in values.yaml to allow template overrides\n*/}}\n{{- define \"crowd.additionalPorts\" -}}\n{{- with .Values.crowd.additionalPorts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional volume mounts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"crowd.additionalVolumeMounts\" -}}\n{{- with .Values.crowd.additionalVolumeMounts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"crowd.additionalEnvironmentVariables\" -}}\n{{- with .Values.crowd.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional plugin declared, generate a volume mount that injects that library into the Crowd plugins directory\n*/}}\n{{- define \"crowd.additionalBundledPlugins\" -}}\n{{- range .Values.crowd.additionalBundledPlugins }}\n- name: {{ .volumeName }}\n  mountPath: \"/var/atlassian/application-data/crowd/shared/plugins/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"crowd.volumes\" -}}\n{{ if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n{{ include \"crowd.volumes.localHome\" . }}\n{{- end }}\n{{ include \"crowd.volumes.sharedHome\" . }}\n{{- with .Values.volumes.additional }}\n{{- toYaml . | nindent 0 }}\n{{- end }}\n{{- if or .Values.crowd.additionalCertificates.secretName .Values.crowd.additionalCertificates.secretList }}\n- name: keystore\n  emptyDir: {}\n{{- if .Values.crowd.additionalCertificates.secretName }}\n- name: certs\n  secret:\n    secretName: {{ .Values.crowd.additionalCertificates.secretName }}\n{{- else }}\n{{- range .Values.crowd.additionalCertificates.secretList }}\n- name: {{ .name }}\n  secret:\n    secretName: {{ .name }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-helm-values\n{{- end }}\n{{- if or .Values.crowd.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-server-config\n    items:\n      - key: server.xml\n        path: server.xml\n{{- end }}\n{{- end }}\n\n{{- define \"crowd.volumes.localHome\" -}}\n{{- if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n- name: local-home\n{{ if .Values.volumes.localHome.customVolume }}\n{{- toYaml .Values.volumes.localHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"crowd.volumes.sharedHome\" -}}\n- name: shared-home\n{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\n  persistentVolumeClaim:\n    claimName: {{ include \"common.names.fullname\" . }}-shared-home\n{{ else }}\n{{ if .Values.volumes.sharedHome.customVolume }}\n{{- toYaml .Values.volumes.sharedHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"crowd.volumeClaimTemplates\" -}}\n{{- if or .Values.volumes.localHome.persistentVolumeClaim.create .Values.crowd.additionalVolumeClaimTemplates }}\n{{- if and .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled }}\npersistentVolumeClaimRetentionPolicy:\n    whenDeleted: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted}}\n    whenScaled: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled}}\n{{- end}}\nvolumeClaimTemplates:\n{{- if .Values.volumes.localHome.persistentVolumeClaim.create }}\n- apiVersion: v1\n  kind: PersistentVolumeClaim\n  metadata:\n    name: local-home\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .Values.volumes.localHome.persistentVolumeClaim.storageClassName }}\n    storageClassName: {{ .Values.volumes.localHome.persistentVolumeClaim.storageClassName | quote }}\n    {{- end }}\n    {{- with .Values.volumes.localHome.persistentVolumeClaim.resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- range .Values.crowd.additionalVolumeClaimTemplates }}\n- metadata:\n    name: {{ .name }}\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .storageClassName }}\n    storageClassName: {{ .storageClassName | quote }}\n    {{- end }}\n    {{- with .resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"flooredCPU\" -}}\n    {{- if hasSuffix \"m\" (. | toString) }}\n    {{- div (trimSuffix \"m\" .) 1000 | default 1 }}\n    {{- else }}\n    {{- . }}\n    {{- end }}\n{{- end}}\n\n\n{{/*\nDefine additional hosts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"crowd.additionalHosts\" -}}\n{{- with .Values.additionalHosts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{- define \"crowd.addCrtToKeystoreCmd\" }}\n{{- if .Values.crowd.additionalCertificates.customCmd}}\n{{ .Values.crowd.additionalCertificates.customCmd}}\n{{- else }}\nset -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \"Adding $crt to keystore\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\n{{- end }}\n{{- end }}\n\n\n\n{{/*\nCreate default value for the service path.\n*/}}\n{{- define \"crowd.path\" -}}\n{{- include \"common.gateway.path\" (dict\n  \"useGatewayMode\" (include \"common.gateway.useGatewayMode\" .)\n  \"gatewayPath\"   .Values.gateway.path\n  \"ingressPath\"   .Values.ingress.path\n  \"contextPath\"   .Values.crowd.service.contextPath\n) -}}\n{{- end }}\n\n"
  },
  {
    "path": "src/main/charts/crowd/templates/config-jvm.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jvm-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  additional_jvm_args: >-\n    {{ include \"crowd.sysprop.clusterNodeName\" . }}\n    {{ include \"crowd.sysprop.fluentdAppender\" . }}\n    {{- range .Values.crowd.additionalJvmArgs }}\n    {{ . }}\n    {{- end }}\n    -XX:ActiveProcessorCount={{ max 1 (include \"flooredCPU\" .Values.crowd.resources.container.requests.cpu | float64  | int) }}\n    {{- if or .Values.crowd.additionalCertificates.secretName .Values.crowd.additionalCertificates.secretList }}\n    -Djavax.net.ssl.trustStore=/var/ssl/cacerts\n    {{- end }}\n  max_heap: {{ .Values.crowd.resources.jvm.maxHeap }}\n  min_heap: {{ .Values.crowd.resources.jvm.minHeap }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/configmap-additional-config.yaml",
    "content": "{{- range $i, $key := .Values.additionalConfigMaps -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-{{ $key.name }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- range $key.keys }}\n  {{ .fileName -}}: |\n{{  .content | trim | indent 4 }}\n{{- end }}\n---\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/configmap-fluentd.yaml",
    "content": "{{ if .Values.fluentd.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-fluentd-config\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{ if .Values.fluentd.customConfigFile }}\n{{- range $key, $value := .Values.fluentd.fluentdCustomConfig }}\n  {{ $key }}: |\n{{ $value | indent 4 }}\n  {{- end }}\n  {{ else }}\n  fluent.conf: |\n    <source>\n      @type tail\n      path /application-data/logs/catalina.*.log\n      pos_file /fluentd/pos/catalina.pos\n      refresh_interval 5\n      <parse>\n        @type none\n      </parse>\n      tag crowd-catalina-logs\n    </source>\n    <source>\n      @type tail\n      path /application-data/logs/crowd_access.*.log\n      pos_file /fluentd/pos/access.pos\n      refresh_interval 5\n      <parse>\n        @type none\n      </parse>\n      tag crowd-access-logs\n    </source>\n    <source>\n      @type tail\n      path /application-data/logs/atlassian-crowd.log\n      pos_file /fluentd/pos/application.pos\n      refresh_interval 5\n      <parse>\n        @type none\n      </parse>\n      tag crowd-application-logs\n    </source>\n    <filter **>\n      @type record_transformer\n      <record>\n        podname \"#{ENV['POD_NAME']}\"\n        podnamespace \"#{ENV['POD_NAMESPACE']}\"\n        podip \"#{ENV['POD_IP']}\"\n        helmrelease \"#{ENV['HELM_RELEASE_NAME']}\"\n      </record>\n    </filter>\n    <filter **>\n      @type stdout\n    </filter>\n    {{ if .Values.fluentd.elasticsearch.enabled }}\n    <match **>\n      @type elasticsearch\n      host {{ .Values.fluentd.elasticsearch.hostname }}\n      logstash_format true\n      logstash_prefix {{ .Values.fluentd.elasticsearch.indexNamePrefix }}\n    </match>\n    {{ end }}\n  {{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/configmap-jmx-config.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{- if .Values.monitoring.jmxExporterCustomConfig }}\n  jmx-config.yaml: |\n  {{- with .Values.monitoring.jmxExporterCustomConfig }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- else }}\n  jmx-config.yaml: |\n    rules:\n      - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n        name: java_lang_$2_$3\n        labels:\n          product: \"crowd\"\n      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n        name: java_lang_Memory_HeapMemoryUsage_$1\n        labels:\n          product: \"crowd\"\n      - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n        name: java_lang_G1_$1_Generation_$2\n        labels:\n          product: \"crowd\"\n      - pattern: '.*'\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/configmap-server-config.yaml",
    "content": "{{ if or .Values.crowd.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-server-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if or .Values.crowd.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n  server.xml: |\n{{- if .Values.crowd.tomcatConfig.customServerXml }}\n{{- .Values.crowd.tomcatConfig.customServerXml | nindent 6 }}\n{{- else }}\n    <?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <Server port=\"{{ .Values.crowd.tomcatConfig.mgmtPort | default \"8020\" }}\"\n            shutdown=\"SHUTDOWN\">\n\n      <Listener className=\"org.apache.catalina.startup.VersionLoggerListener\"/>\n      <Listener className=\"org.apache.catalina.core.AprLifecycleListener\"\n                SSLEngine=\"on\"/>\n      <Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\"/>\n      <Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\"/>\n      <Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\"/>\n\n      <Service name=\"Catalina\">\n\n        <Connector port=\"{{ .Values.crowd.tomcatConfig.port | default \"8095\" }}\"\n                   maxThreads=\"{{ .Values.crowd.tomcatConfig.maxThreads | default \"150\" }}\"\n                   minSpareThreads=\"{{ .Values.crowd.tomcatConfig.minSpareThreads | default \"25\" }}\"\n                   connectionTimeout=\"{{ .Values.crowd.tomcatConfig.connectionTimeout | default \"20000\" }}\"\n                   enableLookups=\"{{ .Values.crowd.tomcatConfig.enableLookups | default \"false\" }}\"\n                   protocol=\"{{ .Values.crowd.tomcatConfig.protocol | default \"HTTP/1.1\" }}\"\n                   redirectPort=\"{{ .Values.crowd.tomcatConfig.redirectPort | default \"8443\" }}\"\n                   acceptCount=\"{{ .Values.crowd.tomcatConfig.acceptCount | default \"100\" }}\"\n                   secure=\"{{ default (include \"common.gateway.https\" .) .Values.crowd.tomcatConfig.secure }}\"\n                   scheme=\"{{ default (include \"common.gateway.scheme\" .) .Values.crowd.tomcatConfig.scheme }}\"\n                   proxyName=\"{{ .Values.crowd.tomcatConfig.proxyName | default (include \"common.gateway.hostname\" .)  }}\"\n                   proxyPort=\"{{ .Values.crowd.tomcatConfig.proxyPort | default (include \"common.gateway.externalPort\" .)  }}\"\n                   maxHttpHeaderSize=\"{{ .Values.crowd.tomcatConfig.maxHttpHeaderSize | default \"8192\" }}\"\n                   useBodyEncodingForURI=\"true\"\n                   URIEncoding=\"UTF-8\"\n                   compression=\"on\"\n                   sendReasonPhrase=\"true\"\n                   compressableMimeType=\"text/html,text/xml,application/xml,text/plain,text/css,application/json,application/javascript,application/x-javascript\" />\n\n        <Engine name=\"Catalina\"\n                defaultHost=\"localhost\">\n\n        <Host appBase=\"webapps\" autoDeploy=\"true\" name=\"localhost\" unpackWARs=\"true\">\n           <Valve className=\"org.apache.catalina.valves.ErrorReportValve\" showReport=\"false\" showServerInfo=\"false\" />\n           <Context path=\"{{ .Values.crowd.service.contextPath | default \"/crowd\" }}\" docBase=\"../../crowd-webapp\" debug=\"0\">\n             <Manager pathname=\"\" />\n           </Context>\n        </Host>\n        {{- if .Values.crowd.accessLog.enabled }}\n            <Valve className=\"org.apache.catalina.valves.AccessLogValve\"\n                   requestAttributesEnabled=\"{{ .Values.crowd.tomcatConfig.requestAttributesEnabled | default \"false\" }}\"\n                   directory=\"logs\"\n                   prefix=\"crowd_access\"\n                   suffix=\".log\"\n                   rotatable=\"true\"\n                   pattern=\"%h %{X-AUSERNAME}o %t &quot;%r&quot; %s %b %D %U %I &quot;%{User-Agent}i&quot;\"\n                   maxDays=\"{{ .Values.crowd.tomcatConfig.accessLogsMaxDays | default \"-1\" }}\"/>\n            <Valve className=\"org.apache.catalina.valves.RemoteIpValve\"\n                   proxiesHeader=\"x-forwarded-by\"\n                   {{- if .Values.crowd.tomcatConfig.proxyInternalIps }}\n                   internalProxies=\"{{ .Values.crowd.tomcatConfig.proxyInternalIps | replace \".\" \"\\\\.\" }}\"\n                   {{- end }}\n                   remoteIpHeader=\"x-forwarded-for\"\n                   protocolHeader=\"x-forwarded-proto\"\n                   requestAttributesEnabled=\"true\"\n                   resolveHosts=\"false\" />\n        {{- end }}\n        </Engine>\n\n      </Service>\n        <Listener className=\"org.apache.catalina.core.AprLifecycleListener\" SSLEngine=\"on\" />\n        <!-- Prevent memory leaks due to use of particular java/javax APIs-->\n        <Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\" />\n        <Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\" />\n        <Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\" />\n    </Server>\n{{- end }}\n{{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/configmap-values-analytics.yaml",
    "content": "{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-helm-values\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n  values.yaml: |\n  {{- include \"crowd.sanitizedValues\" . }}\n{{- end }}\n{{- if .Values.atlassianAnalyticsAndSupport.analytics.enabled }}\n  analytics.json: |\n  {{- include \"crowd.analyticsJson\" . | nindent 4 }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/configmaps-grafana-dashboards.yaml",
    "content": "{{- if .Values.monitoring.grafana.createDashboards }}\n{{- $grafanaDashboards := .Files.Glob \"grafana-dashboards/*.json\" -}}\n{{- range $index, $grafanaDashboard := $grafanaDashboards -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n{{- $fileName := split \"/\" $index }}\n  name: {{ include \"common.names.fullname\" . }}-{{ $fileName._1 | trimSuffix \".json\" }}-dashboard\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.monitoring.grafana.dashboardLabels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\ndata:\n  {{ include \"common.names.fullname\" . }}-{{ .Release.Namespace}}-{{ $fileName._1}}: |\n{{ .Files.Get $index | indent 4 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/httproute.yaml",
    "content": "{{- if .Values.gateway.create }}\n{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: gateway.networking.k8s.io/v1\nkind: HTTPRoute\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.gateway.labels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.gateway.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  # Reference to the Gateway\n  parentRefs:\n  {{- toYaml .Values.gateway.parentRefs | nindent 2 }}\n  \n  # Hostnames to match\n  hostnames:\n  {{- range .Values.gateway.hostnames }}\n  - {{ . | quote }}\n  {{- end }}\n  \n  # Routing rules\n  rules:\n  # Default rule - routes to Crowd service\n  - matches:\n    - path:\n        type: {{ .Values.gateway.pathType }}\n        value: {{ include \"crowd.path\" . }}\n    {{- with .Values.gateway.timeouts }}\n    timeouts:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n    {{- with .Values.gateway.filters }}\n    filters:\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n    backendRefs:\n    - name: {{ include \"common.names.fullname\" . }}\n      port: {{ .Values.crowd.service.port }}\n      weight: 100\n  \n  {{- with .Values.gateway.additionalRules }}\n  {{- toYaml . | nindent 2 }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/ingress.yaml",
    "content": "{{- if and .Values.ingress.create (not .Values.ingress.openShiftRoute) }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{ if .Values.ingress.nginx }}\n    \"nginx.ingress.kubernetes.io/affinity\": \"cookie\"\n    \"nginx.ingress.kubernetes.io/affinity-mode\": \"persistent\"\n    \"nginx.ingress.kubernetes.io/proxy-body-size\": {{ .Values.ingress.maxBodySize }}\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": {{ .Values.ingress.proxyConnectTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": {{ .Values.ingress.proxyReadTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": {{ .Values.ingress.proxySendTimeout|quote }}\n    {{- end }}\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{ if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n    - hosts:\n        - {{ .Values.ingress.host }}\n      {{ if .Values.ingress.tlsSecretName }}\n      secretName: {{ .Values.ingress.tlsSecretName }}\n      {{ end }}\n{{ end }}\n  ingressClassName: {{ default \"nginx\" .Values.ingress.className }}\n  rules:\n    - host: {{ .Values.ingress.host }}\n      http:\n        paths:\n          - path: {{ .Values.ingress.path }}\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"common.names.fullname\" . }}\n                port:\n                  number: {{ $.Values.crowd.service.port }}\n         {{- range $path := .Values.ingress.additionalPaths }}\n          - path: {{ $path.path }}\n            pathType: {{ $path.pathType | default \"Prefix\" }}\n            backend:\n              service:\n                name: {{ $path.service }}\n                port:\n                  number: {{ $path.portNumber }}\n         {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/pdb.yaml",
    "content": "{{- if .Values.podDisruptionBudget.enabled }}\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.podDisruptionBudget.labels }}\n      {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.podDisruptionBudget.annotations }}\n  annotations:\n    {{- range $key, $value := . }}\n    {{ $key }}: {{ $value | quote }}\n    {{- end }}\n  {{- end }}\nspec:\n  {{- with .Values.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ . }}\n  {{- else }}\n  minAvailable: {{ .Values.podDisruptionBudget.minAvailable | default 0 }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/route.yaml",
    "content": "{{- if and .Values.ingress.create .Values.ingress.openShiftRoute }}\nkind: Route\napiVersion: route.openshift.io/v1\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{- if .Values.ingress.routeHttpHeaders }}\n  httpHeaders:\n{{- with .Values.ingress.routeHttpHeaders }}\n{{- toYaml . | nindent 4 }}\n{{- end }}\n{{- end }}\n  host: {{ .Values.ingress.host }}\n  path: /crowd\n  to:\n    kind: Service\n    name: {{ include \"common.names.fullname\" . }}\n    weight: 100\n  port:\n    targetPort: http\n{{- if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n{{- if .Values.ingress.tlsSecretName }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace .Values.ingress.tlsSecretName) }}\n{{- if $secretData }}\n{{- if hasKey $secretData.data \"tls.crt\" }}\n    certificate: |\n      {{- index $secretData.data \"tls.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"tls.key\" }}\n    key: |\n      {{- index $secretData.data \"tls.key\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"ca.crt\" }}\n    caCertificate: |\n      {{- index $secretData.data \"ca.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- end }}\n{{- end }}\n    termination: edge\n    insecureEdgeTerminationPolicy: Redirect\n  wildcardPolicy: None\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/service-jmx.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{- with .Values.monitoring.jmxServiceAnnotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  type: {{ .Values.monitoring.jmxExporterPortType }}\n  ports:\n    - port: {{ .Values.monitoring.jmxExporterPort}}\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n  {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/service-monitor.yaml",
    "content": "{{- if .Values.monitoring.serviceMonitor.create }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-service-monitor\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.monitoring.serviceMonitor.prometheusLabelSelector }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  endpoints:\n  - interval: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeIntervalSeconds }}\n    path: /metrics\n    port: jmx\n    scheme: http\n    relabelings:\n      - action: replace\n        sourceLabels:\n          - __meta_kubernetes_pod_name\n        targetLabel: instance\n  selector:\n    matchLabels:\n    {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.crowd.service.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.crowd.service.type }}\n  sessionAffinity: {{ .Values.crowd.service.sessionAffinity }}\n  {{- if .Values.crowd.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  sessionAffinityConfig:\n    clientIP:\n      timeoutSeconds: {{ .Values.crowd.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  {{- end }}\n  {{- if and (eq .Values.crowd.service.type \"LoadBalancer\") (not (empty .Values.crowd.service.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.crowd.service.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.crowd.service.port }}\n      targetPort: http\n      protocol: TCP\n      name: http\n      {{- if and (eq .Values.crowd.service.type \"NodePort\") .Values.crowd.service.nodePort}}\n      nodePort: {{ .Values.crowd.service.nodePort }}\n      {{- end }}\n  selector:\n    {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"crowd.serviceAccountName\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- with .Values.serviceAccount.imagePullSecrets }}\nimagePullSecrets:\n  {{- toYaml . | nindent 2 }}\n{{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/shared-home-pvc.yaml",
    "content": "{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-shared-home\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nspec:\n  accessModes:\n  {{ range .Values.volumes.sharedHome.persistentVolumeClaim.accessModes }}\n    - {{ . }}\n  {{ end }}\n  {{- if .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName }}\n  storageClassName: {{ .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName | quote }}\n  {{- end }}\n  {{- with .Values.volumes.sharedHome.persistentVolumeClaim.resources }}\n  resources:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/statefulset.yaml",
    "content": "{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.crowd.additionalAnnotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  {{- if .Values.updateStrategy }}\n  {{- with .Values.updateStrategy }}\n  updateStrategy:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{ if .Values.ordinals.enabled }}\n  ordinals:\n    start: {{ .Values.ordinals.start }}\n  {{ end }}\n  replicas: {{ .Values.replicaCount }}\n  serviceName: {{ include \"common.names.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/config-jvm.yaml\") . | sha256sum }}\n        {{- if .Values.additionalConfigMaps }}\n        checksum/config-additional: {{ include (print $.Template.BasePath \"/configmap-additional-config.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- if .Values.fluentd.enabled }}\n        checksum/config-fluentd: {{ include (print $.Template.BasePath \"/configmap-fluentd.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- include \"crowd.podAnnotations\" . | nindent 8 }}\n      labels:\n        {{- include \"common.labels.commonLabels\" . | nindent 8 }}\n        {{- include \"crowd.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"crowd.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.crowd.shutdown.terminationGracePeriodSeconds }}\n      hostAliases:\n        {{- include \"crowd.additionalHosts\" . | nindent 8 }}\n      {{- if .Values.openshift.runWithRestrictedSCC }}\n      {{- else }}\n      {{- if .Values.crowd.securityContextEnabled }}\n      {{- with .Values.crowd.securityContext }}\n      securityContext:\n        {{ toYaml . | nindent 8 }}\n        {{- if not .fsGroup }}\n        fsGroup: 2004\n        {{- end }}\n      {{- end }}\n      {{- end }}\n      {{- end }}\n      initContainers:\n        {{- include \"crowd.additionalInitContainers\" . | nindent 8 }}\n        {{- if and .Values.volumes.sharedHome.nfsPermissionFixer.enabled (not .Values.openshift.runWithRestrictedSCC) }}\n        - name: nfs-permission-fixer\n          image: {{ .Values.volumes.sharedHome.nfsPermissionFixer.imageRepo }}:{{ .Values.volumes.sharedHome.nfsPermissionFixer.imageTag }}\n          imagePullPolicy: IfNotPresent\n          {{- if .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          resources:\n          {{- with .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- end }}\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: {{ .Values.volumes.sharedHome.nfsPermissionFixer.mountPath | quote }}\n              {{- if .Values.volumes.sharedHome.subPath }}\n              subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n              {{- end }}\n          command: [\"sh\", \"-c\", {{ include \"crowd.sharedHome.permissionFix.command\" . | quote }}]\n        {{- end }}\n        {{- include \"common.jmx.initContainer\" . | nindent 8 }}\n        {{- if or .Values.crowd.additionalCertificates.secretName .Values.crowd.additionalCertificates.secretList }}\n        - name: import-certs\n          image: {{ include \"crowd.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          volumeMounts:\n            - name: keystore\n              mountPath: /var/ssl\n          {{- if.Values.crowd.additionalCertificates.secretName }}\n            - name: certs\n              mountPath: /tmp/crt\n          {{- else }}\n          {{- range .Values.crowd.additionalCertificates.secretList }}\n            {{- $secretName := .name }}\n            {{- range .keys }}\n            - name: {{ $secretName }}\n              mountPath: /tmp/crt/{{$secretName}}-{{ . }}\n              subPath: {{ . }}\n            {{- end }}\n          {{- end }}\n          {{- end }}\n          command: [\"/bin/bash\"]\n          args: [\"-c\", {{ include \"crowd.addCrtToKeystoreCmd\" . }}]\n          resources:\n          {{- with .Values.crowd.additionalCertificates.initContainer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          securityContext:\n          {{- with .Values.crowd.additionalCertificates.initContainer.securityContext }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n        {{- end }}\n      containers:\n        - name: {{ if .Values.crowd.useHelmReleaseNameAsContainerName}}{{ include \"common.names.fullname\" . }}{{ else }}{{ .Chart.Name }}{{ end }}\n          image: {{ include \"crowd.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          ports:\n            - name: http\n              containerPort: {{ .Values.crowd.ports.http }}\n              protocol: TCP\n            {{- include \"crowd.additionalPorts\" . | nindent 12 }}\n            {{- include \"common.jmx.port\" . | nindent 12 }}\n          {{- if .Values.crowd.readinessProbe.enabled }}\n          readinessProbe:\n            {{- if .Values.crowd.readinessProbe.customProbe}}\n            {{- with .Values.crowd.readinessProbe.customProbe }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n            {{- else }}\n            httpGet:\n              port: {{ .Values.crowd.ports.http }}\n              path: {{ .Values.crowd.service.contextPath}}/status\n            initialDelaySeconds: {{ .Values.crowd.readinessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.crowd.readinessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.crowd.readinessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.crowd.readinessProbe.failureThreshold }}\n            {{- end }}\n          {{- end }}\n          {{- if .Values.crowd.startupProbe.enabled }}\n          startupProbe:\n            tcpSocket:\n              port: {{ .Values.crowd.ports.http }}\n            initialDelaySeconds: {{ .Values.crowd.startupProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.crowd.startupProbe.periodSeconds }}\n            failureThreshold: {{ .Values.crowd.startupProbe.failureThreshold }}\n          {{- end }}\n          {{- if .Values.crowd.livenessProbe.enabled }}\n          livenessProbe:\n          {{- if .Values.crowd.livenessProbe.customProbe}}\n          {{- with .Values.crowd.livenessProbe.customProbe }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- else }}\n            tcpSocket:\n              port: {{ .Values.crowd.ports.http }}\n            initialDelaySeconds: {{ .Values.crowd.livenessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.crowd.livenessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.crowd.livenessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.crowd.livenessProbe.failureThreshold }}\n          {{- end }}\n          {{- end }}\n          {{- with .Values.crowd.containerSecurityContext}}\n          securityContext:\n          {{- toYaml . | nindent 12}}\n          {{- end}}\n          {{- with .Values.crowd.resources.container }}\n          resources:\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          volumeMounts:\n            {{- include \"crowd.volumeMounts\" . | nindent 12 }}\n            {{- include \"common.jmx.config.volumeMounts\" . | nindent 12 }}\n            {{- include \"crowd.additionalVolumeMounts\" . | nindent 12 }}\n            {{- include \"crowd.additionalLibraries\" . | nindent 12 }}\n            {{- include \"crowd.additionalBundledPlugins\" . | nindent 12 }}\n            {{- range $i, $n := .Values.additionalFiles }}\n            - name: {{ .name }}-{{$i}}\n              mountPath: {{ .mountPath }}/{{ .key }}\n              subPath: {{ .key }}\n            {{ end }}\n            {{- range $i, $n := .Values.additionalConfigMaps }}\n            {{- range .keys }}\n            - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n              mountPath: {{ .mountPath }}/{{ .fileName }}\n              subPath: {{ .fileName }}\n            {{ end }}\n            {{- end }}\n          env:\n            - name: KUBE_POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            {{ if eq (include \"common.gateway.https\" .) \"true\" }}\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            {{ end }}\n            {{ if .Values.crowd.service.contextPath }}\n            - name: ATL_TOMCAT_CONTEXTPATH\n              value: {{ .Values.crowd.service.contextPath | quote }}\n            {{ end }}\n            - name: ATL_TOMCAT_PORT\n              value: {{ .Values.crowd.ports.http | quote }}\n            {{ if eq (include \"common.gateway.isConfigured\" .) \"true\" }}\n            - name: ATL_PROXY_NAME\n              value: {{ include \"common.gateway.hostname\" . | quote }}\n            - name: ATL_PROXY_PORT\n              value: {{ include \"common.gateway.externalPort\" . | quote }}\n            {{ end }}\n            - name: ATL_TOMCAT_ACCESS_LOG\n              value: {{ .Values.crowd.accessLog.enabled | quote }}\n            - name: UMASK\n              value: {{ .Values.crowd.umask | quote }}\n            - name: SET_PERMISSIONS\n              value: {{ .Values.crowd.setPermissions | quote }}\n            - name: ATL_PRODUCT_HOME_SHARED\n              value: {{ .Values.volumes.sharedHome.mountPath | quote }}\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            {{- if .Values.monitoring.exposeJmxMetrics }}\n            - name: CATALINA_OPTS\n              value: {{ include \"common.jmx.javaagent\" . | replace \"\\n\" \"\" | quote }}\n            {{- end }}\n            {{- include \"crowd.additionalEnvironmentVariables\" . | nindent 12 }}\n          lifecycle:\n          {{- if .Values.crowd.postStart.command }}\n            postStart:\n              exec:\n                command: [\"/bin/sh\", \"-c\", {{- .Values.crowd.postStart.command | quote }}]\n          {{- end }}\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", {{ .Values.crowd.shutdown.command | quote }}]\n        {{- include \"fluentd.container\" . | nindent 8 }}\n        {{- include \"crowd.additionalContainers\" . | nindent 8 }}\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.crowd.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n      {{- end }}\n      {{- if .Values.schedulerName }}\n      schedulerName: {{ .Values.schedulerName  | quote }}\n      {{- end }}\n      volumes:\n        {{- range $i, $n := .Values.additionalFiles }}\n        - name: {{ .name }}-{{$i}}\n          {{ .type }}:\n            {{ if hasPrefix .type \"secret\" }}{{ .type}}Name{{ else }}name{{ end }}: {{ .name }}\n            items:\n              - key: {{ .key }}\n                path: {{ .key }}\n        {{ end }}\n        {{- range $i, $key := .Values.additionalConfigMaps }}\n        {{- with $ }}\n        {{- range $key.keys }}\n        - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n          configMap:\n            name: {{ include \"common.names.fullname\" $ }}-{{ $key.name }}\n            {{- if .defaultMode }}\n            defaultMode: {{ .defaultMode }}\n            {{- end }}\n            items:\n              - key: {{ .fileName }}\n                path: {{ .fileName }}\n            {{- end }}\n        {{ end }}\n        {{- end }}\n        {{ include \"crowd.volumes\" . | nindent 8 }}\n        {{ include \"fluentd.config.volume\" . | nindent 8 }}\n        {{ include \"common.jmx.config.volume\" . | nindent 8 }}\n  {{ include \"crowd.volumeClaimTemplates\" . | nindent 2 }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/tests/test-application-status.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"crowd.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.statusTestContainer }}\n      env:\n        - name: STATUS_URL\n          value: \"http://{{ include \"common.names.fullname\" . }}:{{ .Values.crowd.service.port }}/crowd/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/templates/tests/test-shared-home-permissions.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"crowd.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.permissionsTestContainer }}\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        {{- with .Values.crowd.securityContext }}\n        {{- if and .enabled .gid }}\n        runAsUser: {{ .gid }}\n        runAsGroup: {{ .gid }}\n        {{- else if .fsGroup }}\n        runAsUser: {{ .fsGroup }}\n        runAsGroup: {{ .fsGroup }}\n        {{- else }}\n        runAsUser: {{ 2004 }}\n        runAsGroup: {{ 2004 }}\n        {{- end }}\n        {{- end }}\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n          {{- if .Values.volumes.sharedHome.subPath }}\n          subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n          {{- end }}\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  volumes:\n    {{ include \"crowd.volumes.sharedHome\" . | nindent 4 }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/crowd/values.yaml",
    "content": "## Atlassian Crowd Data Center Helm values\n#\n# HEADS UP!\n#\n# Data loss will occur if sections declared as 'REQUIRED' are not configured appropriately!\n# For Crowd, the required section is:\n# - volumes\n#\n# Additional details on pre-provisioning these required resources can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#5-configure-persistent-storage\n#\n# To manage external access to the Crowd instance, a Gateway API HTTPRoute or an Ingress\n# resource can be configured under the 'gateway' or 'ingress' stanza respectively.\n# This requires a pre-provisioned gateway/ingress controller to be present.\n#\n# Additional details on configuring external access can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#4-configure-ingress\n#\n##\n\n# -- The initial number of Crowd pods that should be started at deployment time.\n# Note that Crowd requires manual configuration via the browser post deployment\n# after the first pod is deployed. This configuration must be completed before\n# scaling up additional pods. As such this value should always be kept as 1,\n# but can be altered once manual configuration is complete.\n#\nreplicaCount: 1\n\n# -- Set a custom start ordinal number for the K8s stateful set.\n# Note that this depends on the StatefulSetStartOrdinal K8s feature gate,\n# which has entered beta state with K8s version 1.27.\n#\nordinals:\n\n  # -- Enable only if StatefulSetStartOrdinal K8s feature gate is available.\n  #\n  enabled: false\n\n  # -- Set start ordinal to a positive integer, defaulting to 0.\n  #\n  start: 0\n\n# -- StatefulSet update strategy. When unset defaults to Rolling update.\n# See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets\n#\nupdateStrategy: {}\n  # type: OnDelete\n\n# -- The termination grace period for pods during shutdown. 30s is the\n# -- Kubernetes default, but can be overridden here.\nterminationGracePeriodSeconds: 30\n\n# -- Image configuration\n#\nimage:\n\n  # -- The Docker Crowd Docker image to use\n  # https://hub.docker.com/r/atlassian/crowd\n  #\n  repository: atlassian/crowd\n\n  # -- Image pull policy\n  #\n  pullPolicy: IfNotPresent\n\n  # -- The docker image tag to be used. Defaults to appVersion in Chart.yaml\n  #\n  tag: \"\"\n\n# K8s ServiceAccount configuration. Give fine-grained identity and authorization\n# to Pods\n#\nserviceAccount:\n\n  # -- Set to 'true' if a ServiceAccount should be created, or 'false' if it\n  # already exists.\n  #\n  create: true\n\n  # -- The name of the ServiceAccount to be used by the pods. If not specified, but\n  # the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name\n  # will be auto-generated, otherwise the 'default' ServiceAccount will be used.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server\n  #\n  name:\n\n  # -- For Docker images hosted in private registries, define the list of image pull\n  # secrets that should be utilized by the created ServiceAccount\n  # https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod\n  #\n  imagePullSecrets: []\n  # - name: secretName\n\n  # -- Annotations to add to the ServiceAccount (if created)\n  #\n  annotations: {}\n\n# Crowd configuration\n#\ncrowd:\n\n  # -- Whether the main container should acquire helm release name. By default the container name is `crowd` which corresponds to the name of the Helm Chart.\n  #\n  useHelmReleaseNameAsContainerName: false\n\n  # K8s Crowd Service configuration\n  #\n  service:\n\n    # -- The port on which the Crowd K8s Service will listen\n    #\n    port: 80\n\n    # -- The type of K8s service to use for Crowd.\n    # For loadBalancer type, deselect the consistent client IP address in Crowd Session configuration.\n    # Read more: https://atlassian.github.io/data-center-helm-charts/troubleshooting/LIMITATIONS/#loadbalancer-service-type\n    #\n    type: ClusterIP\n\n    # --  Only applicable if service.type is NodePort. NodePort for Crowd service\n    #\n    nodePort:\n\n    # -- Session affinity type. If you want to make sure that connections from a particular client\n    # are passed to the same pod each time, set sessionAffinity to ClientIP.\n    # See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity\n    #\n    sessionAffinity: None\n\n    # -- Session affinity configuration\n    #\n    sessionAffinityConfig:\n\n      clientIP:\n\n        # -- Specifies the seconds of ClientIP type session sticky time.\n        # The value must be > 0 && <= 86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).\n        #\n        timeoutSeconds:\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- The Tomcat context path that Crowd will use. The ATL_TOMCAT_CONTEXTPATH\n    # will be set automatically.\n    #\n    contextPath: \"/crowd\"\n\n    # -- Additional annotations to apply to the Service\n    #\n    annotations: {}\n\n  # Standard K8s field that holds pod-level security attributes and common container settings.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  # Do not populate when deploying to OpenShift, unless anyuid policy is attached to a service account.\n  #\n\n  # -- Whether to apply security context to pod.\n  #\n  securityContextEnabled: true\n\n  securityContext:\n\n    # -- The GID used by the Crowd docker image\n    # GID will default to 2004 if not supplied and securityContextEnabled is set to true.\n    # This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Crowd container.\n    # However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260\n    #\n    fsGroup: 2004\n\n    # -- fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod.\n    # This field only applies to volume types that support fsGroup controlled ownership and permissions.\n    # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods\n    #\n    fsGroupChangePolicy: \"OnRootMismatch\"\n\n  # -- Standard K8s field that holds security configurations that will be applied to a container.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  #\n  containerSecurityContext: {}\n\n  # -- The umask used by the Crowd process when it creates new files.\n  # The default is 0022. This gives the new files:\n    #  - read/write permissions for the Crowd user\n    #  - read permissions for everyone else.\n  #\n  umask: \"0022\"\n\n  # -- Boolean to define whether to set local home directory permissions on startup\n  # of Crowd container. Set to 'false' to disable this behaviour.\n  #\n  setPermissions: true\n\n  # Port definitions\n  #\n  ports:\n\n    # -- The port on which the Crowd container listens for HTTP traffic\n    #\n    http: 8095\n\n  # Confirm that Crowd is up and running with a ReadinessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes\n  #\n  readinessProbe:\n\n    # -- Whether to apply the readinessProbe check to pod.\n    #\n    enabled: true\n\n    # -- The initial delay (in seconds) for the Crowd container readiness probe,\n    # after which the probe will start running.\n    #\n    initialDelaySeconds: 10\n\n    # -- How often (in seconds) the Crowd container readiness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Crowd container readiness probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 10\n\n    # -- Custom readinessProbe to override the default /status httpGet\n    #\n    customProbe: {}\n#      tcpSocket:\n#        port: 8080\n#      periodSeconds: 5\n#      failureThreshold: 120\n\n  startupProbe:\n\n    # -- Whether to apply the startupProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Crowd container startup probe will run\n    #\n    periodSeconds: 5\n\n    # -- The number of consecutive failures of the Crowd container startup probe\n    # before the pod fails startup checks.\n    #\n    failureThreshold: 120\n\n  # Ensure that the server responds with a LivenessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-tcp-liveness-probe\n  #\n  livenessProbe:\n\n    # -- Whether to apply the livenessProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Crowd container liveness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Crowd container liveness probe\n    # before the pod fails liveness checks.\n    #\n    failureThreshold: 12\n\n    # -- Custom livenessProbe to override the default tcpSocket probe\n    #\n    customProbe: {}\n\n  # Crowd log configuration\n  #\n  accessLog:\n\n    # -- Set to 'true' if access logging should be enabled.\n    #\n    enabled: true\n\n    # -- The path within the Crowd container where the local-home volume should be\n    # mounted in order to capture access logs.\n    #\n    mountPath: \"/opt/atlassian/crowd/apache-tomcat/logs\"\n\n    # -- The subdirectory within the local-home volume where access logs should be\n    # stored.\n    #\n    localHomeSubPath: \"logs\"\n\n  shutdown:\n\n    # -- The termination grace period for pods during shutdown. This\n    # should be set to the internal grace period, plus a small buffer\n    # to allow the JVM to fully terminate.\n    #\n    terminationGracePeriodSeconds: 30\n\n    # -- By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/),\n    # using a script supplied by the Docker image. If any other\n    # shutdown behaviour is needed it can be achieved by overriding\n    # this value. Note that the shutdown command needs to wait for the\n    # application shutdown completely before exiting; see [the default\n    # command](https://bitbucket.org/atlassian-docker/docker-atlassian-crowd/src/master/shutdown-wait.sh)\n    # for details.\n    #\n    command: \"/shutdown-wait.sh\"\n\n  # -- PostStart is executed immediately after a container is created.\n  # However, there is no guarantee that the hook will execute before the container ENTRYPOINT.\n  # See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n  #\n  postStart:\n    command:\n\n  # Crowd Pod resource requests\n  #\n  resources:\n\n    # JVM Memory / Heap Size definitions. These values below are based on the\n    # defaults defined for the Crowd docker container.\n    # https://bitbucket.org/atlassian-docker/docker-atlassian-crowd-server/src/master/#markdown-header-memory-heap-size\n    #\n    jvm:\n\n      # -- The maximum amount of heap memory that will be used by the Crowd JVM\n      #\n      maxHeap: \"768m\"\n\n      # -- The minimum amount of heap memory that will be used by the Crowd JVM\n      #\n      minHeap: \"384m\"\n\n    # Specifies the standard K8s resource requests and/or limits for the Crowd\n    # container. It is important that if the memory resources are specified here,\n    # they must allow for the size of the Crowd JVM. That means the maximum heap\n    # size, the reserved code cache size, plus other JVM overheads, must be\n    # accommodated. Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    #\n    container:\n\n      requests:\n        # -- Initial CPU request by Crowd pod\n        #\n        cpu: \"2\"\n\n        # -- Initial Memory request by Crowd pod\n        #\n        memory: \"1G\"\n        #  limits:\n        #    cpu: \"2\"\n        #    memory: \"1G\"\n\n  # -- Specifies a list of additional arguments that can be passed to the Crowd JVM, e.g.\n  # system properties.\n  #\n  additionalJvmArgs: []\n\n  tomcatConfig:\n\n    # -- Mount server.xml as a ConfigMap. Override configuration elements if necessary\n    #\n    generateByHelm: false\n\n    mgmtPort: \"8020\"\n    port: \"8095\"\n    maxThreads: \"150\"\n    minSpareThreads: \"25\"\n    connectionTimeout: \"20000\"\n    enableLookups: \"false\"\n    protocol: \"HTTP/1.1\"\n    redirectPort: \"8443\"\n    acceptCount: \"100\"\n    # secure is set based on the https setting (gateway.https or ingress.https)\n    secure:\n    # scheme is set based on the https setting (http if false, https if true)\n    scheme:\n    # proxyName is set to the configured hostname (gateway.hostnames[0] or ingress.host)\n    proxyName:\n    # proxyPort is set to the external port (defaults to 443 for https, 80 for http)\n    proxyPort:\n    maxHttpHeaderSize: \"8192\"\n    accessLogsMaxDays: \"-1\"\n    requestAttributesEnabled: \"false\"\n    proxyInternalIps:\n\n  # -- Specifies a list of additional Java libraries that should be added to the\n  # Crowd container. Each item in the list should specify the name of the volume\n  # that contains the library, as well as the name of the library file within that\n  # volume's root directory. Optionally, a subDirectory field can be included to\n  # specify which directory in the volume contains the library file. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  additionalLibraries: []\n#    - volumeName:\n#      subDirectory:\n#      fileName:\n\n  # -- Specifies a list of additional Crowd plugins that should be added to the\n  # Crowd container. Note plugins installed via this method will appear as\n  # bundled plugins rather than user plugins. These should be specified in the same\n  # manner as the 'additionalLibraries' property. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  # NOTE: only .jar files can be loaded using this approach. OBR's can be extracted\n  # (unzipped) to access the associated .jar\n  #\n  # An alternative to this method is to install the plugins via \"Manage Apps\" in the\n  # product system administration UI.\n  #\n  additionalBundledPlugins: []\n#    - volumeName:\n#      subDirectory:\n#      fileName:\n\n  # -- Defines any additional volumes mounts for the Crowd container.\n  # These can refer to existing volumes, or new volumes can be defined in volumes.additional.\n  additionalVolumeMounts: []\n\n  # -- Defines any additional environment variables to be passed to the Crowd container.\n  # See https://hub.docker.com/r/atlassian/crowd for supported variables.\n  additionalEnvironmentVariables: []\n\n  # -- Defines any additional ports for the Crowd container.\n  #\n  additionalPorts: []\n  #  - name: jmx\n  #    containerPort: 5555\n  #    protocol: TCP\n\n  # -- Defines additional volumeClaimTemplates that should be applied to the Crowd pod.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in crowd.additionalVolumeMounts\n  #\n  additionalVolumeClaimTemplates: []\n  #  - name: myadditionalvolumeclaim\n  #    storageClassName:\n  #    resources:\n  #      requests:\n  #        storage: 1Gi\n\n  # -- Defines additional annotations to the Bamboo StateFulSet. This might be required when deploying using a GitOps approach\n  additionalAnnotations: {}\n  #  argocd.argoproj.io/sync-wave: \"10\"\n\n  # -- Defines topology spread constraints for Crowd pods. See details:\n  # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n  #\n  topologySpreadConstraints: []\n  # - maxSkew: 1\n  #   topologyKey: kubernetes.io/hostname\n  #   whenUnsatisfiable: ScheduleAnyway\n  #   labelSelector:\n  #     matchLabels:\n\n  # -- Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates\n  #\n  additionalCertificates:\n    # -- Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data\n    # will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.\n    #\n    secretName:\n    # -- A list of secrets with their respective keys holding certificates to be added to the Java truststore.\n    # It is mandatory to specify which keys from secret data need to be mounted as files to the init container\n    #\n    secretList: []\n    #- name: self-signed-ca\n    #  keys:\n    #    - ca.crt\n    #    - intermediate.crt\n    #- name: stg-intermediate\n    #  keys:\n    #    - stg.crt\n\n    # -- Custom command to be executed in the init container to import certificates\n    #\n    customCmd:\n\n    initContainer:\n      # -- Resources allocated to the import-certs init container\n      #\n\n      resources: {}\n      # -- Custom SecurityContext for the import-certs init container\n      #\n      securityContext: {}\n\n# Ingress configuration\n#\n# Use this section when routing external traffic to Crowd via a Kubernetes Ingress\n# resource (K8s Ingress API). Requires a pre-provisioned Ingress Controller.\n# If using the Gateway API instead, see the 'gateway' section below.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#ingress\n#\ningress:\n\n  # -- Set to 'true' if an Ingress Resource should be created. This depends on a\n  # pre-provisioned Ingress Controller being available.\n  #\n  create: false\n\n  # -- The fully-qualified hostname (FQDN) of the Crowd instance. This value is used\n  # to configure the product's proxy settings and, when ingress.create is true,\n  # the Ingress resource routing rules.\n  #\n  host:\n\n  # -- Whether users access the application over HTTPS. Set to 'false' if not\n  # using TLS, e.g. when reaching the service via localhost port-forwarding.\n  #\n  https: true\n\n  # -- The base path for the application, e.g. '/crowd'.\n  #\n  path: \"/\"\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when ingress.create is true.\n  # They configure the Ingress resource itself and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Set to true if you want to create an OpenShift Route instead of an Ingress\n  #\n  openShiftRoute: false\n\n  # -- routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only\n  #\n  routeHttpHeaders: {}\n\n  # -- The class name used by the ingress controller if it's being used.\n  #\n  # Please follow documentation of your ingress controller. If the cluster\n  # contains multiple ingress controllers, this setting allows you to control\n  # which of them is used for Atlassian application traffic.\n  #\n  className: \"nginx\"\n\n  # -- Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx'\n  # controller.\n  # https://kubernetes.github.io/ingress-nginx/\n  #\n  # This will populate the Ingress Resource with annotations that are specific to\n  # the K8s ingress-nginx controller. Set to 'false' if a different controller is\n  # to be used, in which case the appropriate annotations for that controller must\n  # be specified below under 'ingress.annotations'.\n  #\n  nginx: true\n\n  # -- The max body size to allow. Requests exceeding this size will result\n  # in an HTTP 413 error being returned to the client.\n  #\n  maxBodySize: 250m\n\n  # -- Defines a timeout for establishing a connection with a proxied server. It should\n  # be noted that this timeout cannot usually exceed 75 seconds.\n  #\n  proxyConnectTimeout: 60\n\n  # -- Defines a timeout for reading a response from the proxied server. The timeout is\n  # set only between two successive read operations, not for the transmission of the\n  # whole response. If the proxied server does not transmit anything within this time,\n  # the connection is closed.\n  #\n  proxyReadTimeout: 60\n\n  # -- Sets a timeout for transmitting a request to the proxied server. The timeout is set\n  # only between two successive write operations, not for the transmission of the whole\n  # request. If the proxied server does not receive anything within this time, the\n  # connection is closed.\n  #\n  proxySendTimeout: 60\n\n  # -- The custom annotations that should be applied to the Ingress Resource.\n  # If using an ingress-nginx controller be sure that the annotations you add\n  # here are compatible with those already defined in the 'ingess.yaml' template\n  #\n  annotations: {}\n\n  # -- The name of the K8s Secret that contains the TLS private key and corresponding\n  # certificate. When utilised, TLS termination occurs at the ingress point where\n  # traffic to the Service, and it's Pods is in plaintext.\n  #\n  # Usage is optional and depends on your use case. The Ingress Controller itself\n  # can also be configured with a TLS secret for all Ingress Resources.\n  # https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets\n  # https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n  #\n  tlsSecretName:\n\n  # -- Additional paths to be added to the Ingress resource to point to different backend services\n  #\n  additionalPaths: []\n    #- path: /static-content\n    #  pathType: Prefix\n    #  service: static-content-svc\n    #  portNumber: 80\n\n# Gateway API configuration\n#\n# Use this section when routing external traffic to Crowd via the Kubernetes\n# Gateway API, or when using an external proxy/load balancer without creating\n# any K8s routing resource. Only one of 'ingress' or 'gateway' should be used.\n# https://gateway-api.sigs.k8s.io/\n#\ngateway:\n\n  # -- Set to 'true' if an HTTPRoute Resource should be created. This depends on a\n  # pre-provisioned Gateway API controller being available and a Gateway resource.\n  # Cannot be enabled if ingress.create is true.\n  #\n  create: false\n\n  # -- The hostnames that should be routed to Crowd. At least one hostname\n  # is required when gateway.create is true. Setting hostnames activates gateway\n  # mode for product configuration even when gateway.create is false, allowing\n  # use with a pre-existing Gateway or external proxy.\n  # The first entry is used as the canonical hostname for base URL, proxy\n  # settings, and NOTES output — list the primary/public hostname first.\n  #\n  hostnames: []\n  # - crowd.example.com\n  # - identity.example.com\n\n  # -- Whether users access the application over HTTPS.\n  # This does not configure TLS on the Gateway or load balancer — it must match\n  # how traffic is actually routed to the application.\n  #\n  https: true\n\n  # -- The port users connect on. Defaults to 443 (https) or 80 (http).\n  # This does not change the Gateway or load balancer port — it must match\n  # the port that is actually used. Only set for non-standard ports.\n  #\n  # externalPort:\n\n  # -- The base path for routing. When empty, falls back to the product's\n  # service.contextPath (same behavior as ingress). Set explicitly to\n  # override, e.g. \"/crowd\".\n  #\n  path: \"/\"\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when gateway.create is true.\n  # They configure the HTTPRoute resource and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Reference to the parent Gateway resource. Supports any standard\n  # parentRef fields (name, namespace, sectionName, etc.).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference\n  #\n  parentRefs: []\n    # - name: example-gateway\n    #   namespace: example-gateway-namespace\n    #   sectionName: https\n\n  # -- Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\".\n  # PathPrefix is recommended for most use cases.\n  #\n  pathType: \"PathPrefix\"\n\n  # -- Annotations to add to the HTTPRoute resource.\n  #\n  annotations: {}\n  # kubernetes.io/ingress.class: gateway\n  # cert-manager.io/cluster-issuer: letsencrypt\n\n  # -- Labels to add to the HTTPRoute resource.\n  #\n  labels: {}\n  # environment: production\n  # team: platform\n\n  # -- HTTP filters to apply to requests. Can be used to add/remove headers,\n  # perform redirects, or rewrite URLs.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter\n  #\n  filters: []\n  # - type: RequestHeaderModifier\n  #   requestHeaderModifier:\n  #     add:\n  #     - name: X-Forwarded-Proto\n  #       value: https\n\n  # -- Advanced routing rules. Use this for complex routing scenarios like\n  # header-based routing, traffic splitting, or multiple backends.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule\n  #\n  additionalRules: []\n  # - matches:\n  #   - path:\n  #       type: PathPrefix\n  #       value: /api\n  #   backendRefs:\n  #   - name: crowd-api\n  #     port: 8095\n\n  # -- Session affinity (sticky sessions) is required for Atlassian DC products but\n  # is not part of the standard Gateway API HTTPRoute spec. It must be configured\n  # separately through your Gateway implementation's own policy resources.\n  # See docs/docs/examples/ingress/GATEWAY_API_SESSION_AFFINITY.md for working examples.\n\n  # -- Timeout configuration for HTTPRoute rules.\n  # Note: when migrating from Ingress, these replace proxyReadTimeout and\n  # proxySendTimeout. There is no Gateway API equivalent for\n  # proxyConnectTimeout or maxBodySize — those require controller-specific\n  # policies (e.g. Envoy Gateway BackendTrafficPolicy).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts\n  #\n  timeouts:\n    request: \"60s\"\n    backendRequest: \"60s\"\n\n# Fluentd configuration\n#\n# Crowd log collection and aggregation can be enabled using Fluentd. This config\n# assumes an existing ELK stack has been stood up and is available.\n# https://www.fluentd.org/\n#\nfluentd:\n\n  # -- Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod\n  #\n  enabled: false\n\n  # -- The Fluentd sidecar image repository\n  #\n  imageRepo: fluent/fluentd-kubernetes-daemonset\n\n  # -- The Fluentd sidecar image tag\n  #\n  imageTag: v1.11.5-debian-elasticsearch7-1.2\n\n  # -- Resources requests and limits for fluentd sidecar container\n  # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n  #\n  resources: {}\n  #  requests:\n  #    cpu: \"1m\"\n  #    memory: \"20Mi\"\n  #  limits:\n  #    cpu: \"1\"\n  #    memory: \"1G\"\n\n  # -- The command used to start Fluentd. If not supplied the default command\n  # will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"\n  #\n  # Note: The custom command can be free-form, however pay particular attention to\n  # the process that should ultimately be left running in the container. This process\n  # should be invoked with 'exec' so that signals are appropriately propagated to it,\n  # for instance SIGTERM. An example of how such a command may look is:\n  # \"<command 1> && <command 2> && exec <primary command>\"\n  command:\n\n  # -- Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default)\n  # should be used for Fluentd. If enabled this config must be supplied via the\n  # 'fluentdCustomConfig' property below. If your custom config forces fluentd to run in a server mode,\n  # add `-Datlassian.logging.cloud.enabled=true` to `crowd.AdditionalJvmArgs` stanza in values file\n  #\n  customConfigFile: false\n\n  # -- Custom fluent.conf file\n  #\n  fluentdCustomConfig: { }\n  # fluent.conf: |\n  #   <source>\n  #     @type tail\n  #     <parse>\n  #     @type multiline\n  #     format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n  #     </parse>\n  #     path /opt/atlassian/crowd/apache-tomcat/logs/access_log.*\n  #     pos_file /tmp/crowdlog.pos\n  #     tag crowd-access-logs\n  #   </source>\n\n  # -- The port on which the Fluentd sidecar will listen\n  #\n  httpPort: 9880\n\n  # Elasticsearch config based on your ELK stack\n  #\n  elasticsearch:\n\n    # -- Set to 'true' if Fluentd should send all log events to an Elasticsearch service.\n    #\n    enabled: true\n\n    # -- The hostname of the Elasticsearch service that Fluentd should send logs to.\n    #\n    hostname: elasticsearch\n\n    # -- The prefix of the Elasticsearch index name that will be used\n    #\n    indexNamePrefix: crowd\n\n  # -- Specify custom volumes to be added to Fluentd container (e.g. more log sources)\n  #\n  extraVolumes: [ ]\n  # - name: local-home\n  #   mountPath: /opt/atlassian/crowd/logs\n  #   subPath: log\n  #   readOnly: true\n\n\n# REQUIRED - Volume configuration\n#\n# By default, the charts will configure the local-home and shared-home as ephemeral\n# volumes i.e. 'emptyDir: {}'. This is fine for evaluation purposes but for production\n# deployments this is not ideal and so local-home and shared-home should both be configured\n# appropriately.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#volumes\n#\nvolumes:\n  localHome:\n\n    # Each pod requires its own volume for 'local-home'. This is needed for key data\n    # that help define how Crowd works.\n    # https://crowd.atlassian.com/doc/crowd-home-and-other-important-directories-590259707.html\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically\n      # created for each pod based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the name of the 'StorageClass' that should be used for the local-home\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests and/or limits for the local-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # This field controls if and how PVCs are deleted during the lifecycle of a StatefulSet.\n    # Only configure the below two attributes when your Kubernetes version is 1.27+, and\n    # feature gate StatefulSetAutoDeletePVC is enabled.\n    #\n    # For each policy that you can configure, you can set the value to either Delete or Retain.\n    #\n    # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention\n    #\n    persistentVolumeClaimRetentionPolicy:\n\n      # -- Configures the volume retention behavior that applies when the StatefulSet is deleted.\n      #\n      whenDeleted:\n\n      # -- Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.\n      #\n      whenScaled:\n\n    # -- Static provisioning of local-home using K8s PVs and PVCs\n    #\n    # NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for\n    # pods is not recommended. Dynamic provisioning described above is the prescribed\n    # approach.\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the local-home volume(s). If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Crowd container to which the local-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/crowd\"\n\n    # -- Specifies the sub-directory of the local-home volume that will be mounted in to the\n    # Crowd container.\n    #\n    subPath:\n\n  # A volume for 'shared-home' is required by Crowd to effectively operate in multi-node\n  # environment\n  # https://crowd.atlassian.com/doc/set-up-a-crowd-data-center-cluster-982322030.html#SetupaCrowdDataCentercluster-Setupandconfigureyourcluster\n  #\n  sharedHome:\n\n    # Dynamic provisioning of shared-home using the K8s Storage Class\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically\n      # created for shared-home based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the access modes that should be used for the 'shared-home' volume claim.\n      # Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations.\n      # Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable.\n      # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes\n      #\n      accessModes:\n        - ReadWriteMany\n\n      # -- Specify the name of the 'StorageClass' that should be used for the 'shared-home'\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests and/or limits for the shared-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # -- Static provisioning of shared-home using K8s PVs and PVCs\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the shared-home volume. If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Crowd container to which the shared-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/crowd/shared\"\n\n    # -- Specifies the sub-directory of the shared-home volume that will be mounted in to the\n    # Crowd container.\n    #\n    subPath:\n\n    # Modify permissions on shared-home\n    #\n    nfsPermissionFixer:\n\n      # -- If 'true', this will alter the shared-home volume's root directory so that Crowd\n      # can write to it. This is a workaround for a K8s bug affecting NFS volumes:\n      # https://github.com/kubernetes/examples/issues/260\n      #\n      enabled: true\n\n      # -- The path in the K8s initContainer where the shared-home volume will be mounted\n      #\n      mountPath: /shared-home\n\n      # -- Image repository for the permission fixer init container. Defaults to alpine\n      #\n      imageRepo: alpine\n\n      # -- Image tag for the permission fixer init container. Defaults to latest\n      #\n      imageTag: latest\n\n      # -- Resources requests and limits for nfsPermissionFixer init container\n      # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n      #\n      resources: {}\n      #  requests:\n      #    cpu: \"1m\"\n      #    memory: \"20Mi\"\n      #  limits:\n      #    cpu: \"1\"\n      #    memory: \"1G\"\n\n      # -- By default, the fixer will change the group ownership of the volume's root directory\n      # to match the Crowd container's GID (2002), and then ensures the directory is\n      # group-writeable. If this is not the desired behaviour, command used can be specified\n      # here.\n      #\n      command:\n\n  # -- Defines additional volumes that should be applied to all Crowd pods.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in crowd.additionalVolumeMounts\n  #\n  additional: []\n\n\n# -- Custom annotations that will be applied to all Crowd pods\n#\npodAnnotations: {}\n#  \"name\": <value>\n\n# -- Custom labels that will be applied to all Crowd pods\n#\npodLabels: {}\n#  name: <value>\n\n# -- Standard K8s node-selectors that will be applied to all Crowd pods\n#\nnodeSelector: {}\n#  \"name\": <value>\n\n# -- Standard K8s tolerations that will be applied to all Crowd pods\n#\ntolerations: []\n# - effect: <name>\n#   operator: <operator>\n#   key: <key>\n\n# -- Standard K8s affinities that will be applied to all Crowd pods\n#\naffinity: {}\n#  name: <value>\n\n# -- Standard K8s schedulerName that will be applied to all Crowd pods.\n# Check Kubernetes documentation on how to configure multiple schedulers:\n# https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n#\nschedulerName:\n\n# -- Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster.\n# For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n#\npriorityClassName:\n\n# -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n#\nhostNamespaces: {}\n\n# -- Additional container definitions that will be added to all Crowd pods\n#\nadditionalContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional initContainer definitions that will be added to all Crowd pods\n#\nadditionalInitContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional labels that should be applied to all resources\n#\nadditionalLabels: {}\n#  name: <value>\n\n# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be\n# mounted into service container. Configuration details below (camelCase is important!):\n  # 'name'      - References existing ConfigMap or secret name.\n  # 'type'      - 'configMap' or 'secret'\n  # 'key'       - The file name.\n# 'mountPath' - The destination directory in a container.\n# VolumeMount and Volumes are added with this name and index position, for example;\n# custom-config-0, keystore-2\n#\nadditionalFiles: []\n#  - name: custom-config\n#    type: configMap\n#    key: log4j.properties\n#    mountPath:  /var/atlassian\n#  - name: custom-config\n#    type: configMap\n#    key: web.xml\n#    mountPath: /var/atlassian\n#  - name: keystore\n#    type: secret\n#    key: keystore.jks\n#    mountPath: /var/ssl\n\n# -- Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file.\n# https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\nadditionalHosts: []\n#  - ip: \"127.0.0.1\"\n#    hostnames:\n#    - \"foo.local\"\n#    - \"bar.local\"\n\n# -- Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix\n# for a ConfigMap name, fileName is used as subPath\n#\nadditionalConfigMaps: []\n#  - name: extra-configmap\n#    keys:\n#      - fileName: hello.properties\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        defaultMode:\n#        content: |\n#          foo=bar\n#          hello=world\n#      - fileName: hello.xml\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        content: |\n#          <xml>\n#          </xml>\n\n# Monitoring\n#\nmonitoring:\n\n  # -- Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter\n  #\n  exposeJmxMetrics: false\n\n  # --  JMX exporter init container configuration\n  #\n  jmxExporterInitContainer:\n\n    # -- The location of the JMX exporter jarfile in the JMX exporter image\n    # Leave blank for default bitnami image\n    #\n    jmxJarLocation:\n\n    # -- Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume.\n    # Set to false if running containers as root is not allowed in the cluster.\n    #\n    runAsRoot: true\n\n    # -- Custom SecurityContext for the jmx exporter init container\n    #\n    customSecurityContext: {}\n\n    # -- Resources requests and limits for the JMX exporter init container\n    # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n    #\n    resources: {}\n    #  requests:\n    #    cpu: \"1m\"\n    #    memory: \"20Mi\"\n    #  limits:\n    #    cpu: \"1\"\n    #    memory: \"1G\"\n\n  # -- Annotations added to the jmx service\n  #\n  jmxServiceAnnotations: {}\n\n  # -- Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar\n  # to shared home and provide an absolute path in jmxExporterCustomJarLocation\n  #\n  fetchJmxExporterJar: true\n\n  # -- Image repository with jmx_exporter jar\n  #\n  jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n  jmxExporterImageTag: 0.18.0\n\n\n\n  # -- Port number on which metrics will be available\n  #\n  jmxExporterPort: 9999\n\n  # -- JMX exporter port type\n  #\n  jmxExporterPortType: ClusterIP\n\n  # -- Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home\n  #\n  jmxExporterCustomJarLocation:\n\n  # -- Custom JMX config with the rules\n  #\n  jmxExporterCustomConfig: {}\n  #  rules:\n  #   - pattern: \".*\"\n\n  serviceMonitor:\n\n    # -- Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.\n    #\n    create: false\n\n    # -- ServiceMonitorSelector of the prometheus instance.\n    #\n    prometheusLabelSelector: {}\n      # release: prometheus\n\n    # -- Scrape interval for the JMX service.\n    #\n    scrapeIntervalSeconds: 30\n\n  grafana:\n\n    # -- Create ConfigMaps with Grafana dashboards\n    #\n    createDashboards: false\n\n    # -- Label selector for Grafana dashboard importer sidecar\n    #\n    dashboardLabels: {}\n    # grafana_dashboard: dc_monitoring\n\n    # -- Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage\n    #\n    dashboardAnnotations: {}\n      # k8s-sidecar-target-directory: /tmp/dashboards/example-folder\n\n# -- PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/\n# You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.\n#\npodDisruptionBudget:\n  enabled: false\n  labels: {}\n  annotations: {}\n  minAvailable:\n  maxUnavailable:\n\natlassianAnalyticsAndSupport:\n\n  analytics:\n\n    # -- Mount ConfigMap with selected Helm chart values as a JSON\n    # which DC products will read and send analytics events to Atlassian data pipelines\n    #\n    enabled: true\n\n  helmValues:\n\n    # -- Mount ConfigMap with selected Helm chart values as a YAML file\n    # which can be optionally including to support.zip\n    #\n    enabled: true\n\n# -- Metadata and pod spec for pods started in Helm tests\n#\ntestPods:\n  resources: {}\n  labels: {}\n  annotations: {}\n  nodeSelector: {}\n  tolerations: []\n  affinity: {}\n  schedulerName:\n  image:\n    permissionsTestContainer: debian:stable-slim\n    statusTestContainer: alpine:latest\n\nopenshift:\n\n  # -- When set to true, the containers will run with a restricted Security Context Constraint (SCC).\n  # See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html\n  # This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server\n  # configuration files as ConfigMaps.\n  #\n  runWithRestrictedSCC: false\n"
  },
  {
    "path": "src/main/charts/jira/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n# Ignore non-template files from symlinked common_templates\ntemplates/common_templates/*.md\n"
  },
  {
    "path": "src/main/charts/jira/Changelog.md",
    "content": "# Change Log\n\n## 2.0.13\n\n**Release date:** 2026-5-6\n\n![AppVersion: 11.3.4](https://img.shields.io/static/v1?label=AppVersion&message=11.3.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DEVPROD-3811 Added support for OpenSearch for Jira. (#1099)\n* Update appVersions for DC apps (#1113)\n\n## 2.0.12\n\n**Release date:** 2026-4-9\n\n![AppVersion: 11.3.3](https://img.shields.io/static/v1?label=AppVersion&message=11.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.11\n\n**Release date:** 2026-4-7\n\n![AppVersion: 11.3.3](https://img.shields.io/static/v1?label=AppVersion&message=11.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.10\n\n**Release date:** 2026-4-3\n\n![AppVersion: 11.3.3](https://img.shields.io/static/v1?label=AppVersion&message=11.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DEVPROD-3580: Add gateway api support (#1084)\n* Update appVersions for DC apps (#1100)\n* TR-534 Make jira server xml tomcat 11 compatibile (#1091)\n\n## 2.0.9\n\n**Release date:** 2026-2-1\n\n![AppVersion: 11.3.1](https://img.shields.io/static/v1?label=AppVersion&message=11.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 2.0.8\n\n**Release date:** 2025-12-29\n\n![AppVersion: 11.3.1](https://img.shields.io/static/v1?label=AppVersion&message=11.3.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1071)\n* feat: Added scrape timeout configuration on servicemonitor (#1067)\n\n## 2.0.7\n\n**Release date:** 2025-11-7\n\n![AppVersion: 10.3.13](https://img.shields.io/static/v1?label=AppVersion&message=10.3.13&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1058)\n\n## 2.0.6\n\n**Release date:** 2025-11-3\n\n![AppVersion: 10.3.12](https://img.shields.io/static/v1?label=AppVersion&message=10.3.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Add missing ErrorReportValve to default server.xml #1047 (#1047)\n* fix: Added default Kubernetes parameters to VolumeClaimTemplate to prevent infinite DRIFT (#1030)\n\n## 2.0.5\n\n**Release date:** 2025-11-1\n\n![AppVersion: 10.3.12](https://img.shields.io/static/v1?label=AppVersion&message=10.3.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1049)\n\n## 2.0.4\n\n**Release date:** 2025-8-27\n\n![AppVersion: 10.3.9](https://img.shields.io/static/v1?label=AppVersion&message=10.3.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* fix: Update Bitnami image references due to deprecation notice (#1037)\n* Update appVersions for DC apps (#1029)\n\n## 2.0.3\n\n**Release date:** 2025-8-1\n\n![AppVersion: 10.3.8](https://img.shields.io/static/v1?label=AppVersion&message=10.3.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1021)\n\n## 2.0.2\n\n**Release date:** 2025-6-16\n\n![AppVersion: 10.3.7](https://img.shields.io/static/v1?label=AppVersion&message=10.3.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1014)\n* Quote int in session vars (#1009)\n\n## 2.0.1\n\n**Release date:** 2025-5-15\n\n![AppVersion: 10.3.6](https://img.shields.io/static/v1?label=AppVersion&message=10.3.6&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#1006)\n\n## 2.0.0\n\nThis release includes breaking changes. See [Breaking Changes](https://github.com/atlassian/data-center-helm-charts/blob/main/BREAKING_CHANGES.md)\n\n**Release date:** 2025-4-29\n\n![AppVersion: 10.3.5](https://img.shields.io/static/v1?label=AppVersion&message=10.3.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Remove condition to support legacy securityContext format (#1000)\n\n## 1.22.9\n\n**Release date:** 2025-4-22\n\n![AppVersion: 10.3.5](https://img.shields.io/static/v1?label=AppVersion&message=10.3.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make session and autologin configurable for Jira and Confluence (#992)\n* Make it possible to declare additional ingress paths (#991)\n* Bring changelog in order (#990)\n\n## 1.22.8\n\n**Release date:** 2025-4-17\n\n![AppVersion: 10.3.5](https://img.shields.io/static/v1?label=AppVersion&message=10.3.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Configure jira session timeout (#987)\n* Set fsGroupChangePolicy to OnRootMismatch in securityContext by default (#986)\n\n## 1.22.7\n\n**Release date:** 2025-4-1\n\n![AppVersion: 10.3.5](https://img.shields.io/static/v1?label=AppVersion&message=10.3.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#977)\n\n## 1.22.6\n\n**Release date:** 2025-3-19\n\n![AppVersion: 10.3.4](https://img.shields.io/static/v1?label=AppVersion&message=10.3.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#969)\n\n## 1.22.5\n\n**Release date:** 2025-2-18\n\n![AppVersion: 10.3.3](https://img.shields.io/static/v1?label=AppVersion&message=10.3.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make access log pattern configurable for Jira and Confluence when running as non root (#961)\n* Add tunnel config for Jira, hostNamespaces in all charts (#958)\n* Allow setting subPath for local-home volumes (#947)\n\n## 1.22.4\n\n**Release date:** 2025-1-30\n\n![AppVersion: 10.3.2](https://img.shields.io/static/v1?label=AppVersion&message=10.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Round up fractional cpu values for ActiveProcessorsCount (#944)\n\n## 1.22.3\n\n**Release date:** 2025-1-13\n\n![AppVersion: 10.3.2](https://img.shields.io/static/v1?label=AppVersion&message=10.3.2&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Set custom securityContext for import-certs init container. Make affinity independent for Synchrony (#938)\n\n## 1.22.2\n\n**Release date:** 2024-12-16\n\n![AppVersion: 10.3.0](https://img.shields.io/static/v1?label=AppVersion&message=10.3.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#933)\n* Make it possible to set nodePort in services (#931)\n* Make access log attributes configurable (#932)\n\n## 1.22.1\n\n**Release date:** 2024-12-3\n\n![AppVersion: 9.12.15](https://img.shields.io/static/v1?label=AppVersion&message=9.12.15&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#922)\n* Make make stuckthreaddetectionvalve configurable (#921)\n* Update Grafana dashboards for DC apps (#915)\n\n## 1.22.0\n\n**Release date:** 2024-11-15\n\n![AppVersion: 9.12.15](https://img.shields.io/static/v1?label=AppVersion&message=9.12.15&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add s3 backups to Helm values (#907)\n* Updated pod labels for all products (#901)\n* Fix shutdown with jmx javaagent enabled (#899)\n* Unset IDs for all the Grafana dashboards (#889)\n\n## 1.21.4\n\n**Release date:** 2024-10-1\n\n![AppVersion: 9.12.13](https://img.shields.io/static/v1?label=AppVersion&message=9.12.13&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#881)\n\n## 1.21.3\n\n**Release date:** 2024-9-10\n\n![AppVersion: 9.12.13](https://img.shields.io/static/v1?label=AppVersion&message=9.12.13&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update common dependency version (#878)\n\n## 1.21.2\n\n**Release date:** 2024-8-26\n\n![AppVersion: 9.12.12](https://img.shields.io/static/v1?label=AppVersion&message=9.12.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#869)\n\n## 1.21.1\n\n**Release date:** 2024-8-22\n\n![AppVersion: 9.12.12](https://img.shields.io/static/v1?label=AppVersion&message=9.12.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#865)\n\n## 1.21.0\n\n**Release date:** 2024-8-13\n\n![AppVersion: 9.12.12](https://img.shields.io/static/v1?label=AppVersion&message=9.12.12&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Added annotations to the StatefulSets (#857)\n* Update appVersions for DC apps (#858)\n* Add a dedicated helm values stanza for s3 attachments (#854)\n* Make shared home pvc access mode configurable (#855)\n* Allow referencing multiple secrets in additionalCertificates (#852)\n* Make it possible to define resources for import-certs init container (#851)\n* Move update strategy to root level (#849)\n* Add helm value for custom jmx jar location when using other jmx init container images (#846)\n* feat: add appProtocol for service meshes (#847)\n* Make StatefulSet updateStrategy configurable (#845)\n* Fix default for acceptCount (#832)\n\n## 1.20.1\n\n**Release date:** 2024-7-7\n\n![AppVersion: 9.12.11](https://img.shields.io/static/v1?label=AppVersion&message=9.12.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#825)\n* Make it possible to override proxy settings (#822)\n\n## 1.20.0\n\n**Release date:** 2024-5-13\n\n![AppVersion: 9.12.8](https://img.shields.io/static/v1?label=AppVersion&message=9.12.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#803)\n* Set atlassian.logging.cloud.enabled system property to false if a custom FluentD config is used (#796)\n\n## 1.19.0\n\n**Release date:** 2024-4-22\n\n![AppVersion: 9.12.7](https://img.shields.io/static/v1?label=AppVersion&message=9.12.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make cacerts writable for user and group (#790)\n\n## 1.18.1\n\n**Release date:** 2024-3-26\n\n![AppVersion: 9.12.5](https://img.shields.io/static/v1?label=AppVersion&message=9.12.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#770)\n\n## 1.18.0\n\n**Release date:** 2024-2-27\n\n![AppVersion: 9.12.4](https://img.shields.io/static/v1?label=AppVersion&message=9.12.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Openshift analytics (#763)\n* Update appVersions for DC apps (#765)\n* OpenShift Support (#752)\n* Use testPods values for test images and container resources (#761)\n* Relabel instance name on jmx service monitor (#757)\n* Added pvc retention policy to Bitbucket Mesh StatefulSet (#755)\n\n## 1.17.2\n\n**Release date:** 2023-12-18\n\n![AppVersion: 9.12.1](https://img.shields.io/static/v1?label=AppVersion&message=9.12.1&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* StatefulSet PVC auto deletion (#736)\n* Update appVersions for DC apps (#738)\n* Add optional postStart hook (#735)\n\n## 1.17.1\n\n**Release date:** 2023-12-11\n\n![AppVersion: 9.12.0](https://img.shields.io/static/v1?label=AppVersion&message=9.12.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make liveness probe configurable (#732)\n\n## 1.17.0\n\n**Release date:** 2023-12-7\n\n![AppVersion: 9.12.0](https://img.shields.io/static/v1?label=AppVersion&message=9.12.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make test pod metadata and spec configurable (#727)\n* Optional analytics/support ConfigMap (#721)\n* Fix ingress annotations comment (#720)\n\n## 1.16.6\n\n**Release date:** 2023-10-30\n\n![AppVersion: 9.4.11](https://img.shields.io/static/v1?label=AppVersion&message=9.4.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* JMX container resources (#707)\n\n## 1.16.5\n\n**Release date:** 2023-10-24\n\n![AppVersion: 9.4.11](https://img.shields.io/static/v1?label=AppVersion&message=9.4.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix custom jmx config (#699)\n* Copy cacerts first, then import certs (#696)\n\n## 1.16.4\n\n**Release date:** 2023-10-11\n\n![AppVersion: 9.4.11](https://img.shields.io/static/v1?label=AppVersion&message=9.4.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.3\n\n**Release date:** 2023-10-11\n\n![AppVersion: 9.4.11](https://img.shields.io/static/v1?label=AppVersion&message=9.4.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.2\n\n**Release date:** 2023-10-8\n\n![AppVersion: 9.4.11](https://img.shields.io/static/v1?label=AppVersion&message=9.4.11&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#683)\n* Add quote to podAnnotation templating (#678)\n\n## 1.16.1\n\n**Release date:** 2023-9-20\n\n![AppVersion: 9.4.10](https://img.shields.io/static/v1?label=AppVersion&message=9.4.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update Helm chart version\n\n## 1.16.0\n\n**Release date:** 2023-9-18\n\n![AppVersion: 9.4.10](https://img.shields.io/static/v1?label=AppVersion&message=9.4.10&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Allow templating of pod annotations (#662)\n* Make securityContext configurable for jmx exporter init container (#670)\n* Add user provided certificates to the default Java truststore (#663)\n\n## 1.15.3\n\n**Release date:** 2023-8-28\n\n![AppVersion: 9.4.9](https://img.shields.io/static/v1?label=AppVersion&message=9.4.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Decouple server and jmx annotations (#654)\n* Disable startup probes by default (#653)\n\n## 1.15.2\n\n**Release date:** 2023-8-22\n\n![AppVersion: 9.4.9](https://img.shields.io/static/v1?label=AppVersion&message=9.4.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add defaultMode to additionalConfigMaps (#647)\n\n## 1.15.1\n\n**Release date:** 2023-8-17\n\n![AppVersion: 9.4.9](https://img.shields.io/static/v1?label=AppVersion&message=9.4.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make startup probes optional (#646)\n\n## 1.15.0\n\n**Release date:** 2023-8-7\n\n![AppVersion: 9.4.9](https://img.shields.io/static/v1?label=AppVersion&message=9.4.9&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add PodDisruptionBudget to Atlassian DC Helm Charts (#636)\n* Add annotations to Grafana dashboards ConfigMaps (#637)\n* Add additional ConfigMaps to Helm Charts (#635)\n* Update appVersions for DC apps (#638)\n\n## 1.14.1\n\n**Release date:** 2023-7-26\n\n![AppVersion: 9.4.8](https://img.shields.io/static/v1?label=AppVersion&message=9.4.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Disable liveness probes by default, make timeoutSeconds configurable (#630)\n\n## 1.14.0\n\n**Release date:** 2023-7-25\n\n![AppVersion: 9.4.8](https://img.shields.io/static/v1?label=AppVersion&message=9.4.8&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add liveness probes, make readinessProbes configurable (#626)\n* Support running Jira and Confluence containers as non root (incl running in OpenShift) (#623)\n* make sharedHome.permissionFix.command helper to be per-product (#622)\n\n## 1.13.1\n\n**Release date:** 2023-6-28\n\n![AppVersion: 9.4.7](https://img.shields.io/static/v1?label=AppVersion&message=9.4.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Run jmx init container as root: get fix from common chart ver 1.2.3 (#608)\n* Add s3 avatars storage support for Jira (#608)\n\n## 1.13.0\n\n**Release date:** 2023-6-13\n\n![AppVersion: 9.4.7](https://img.shields.io/static/v1?label=AppVersion&message=9.4.7&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#599)\n* Update Grafana dashboards for DC apps (#589)\n* Bamboo dashboard (#588)\n* Make sessionAffinity configurable in service spec (#582)\n* Cleanup dashboards\n* Jira Grafana Dashboards (#578)\n* Add optional ServiceMonitors to DC Helm Charts (#573)\n* Expose JMX beans on http endpoint (#562)\n\n## 1.12.0\n\n**Release date:** 2023-4-18\n\n![AppVersion: 9.4.5](https://img.shields.io/static/v1?label=AppVersion&message=9.4.5&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add priorityClassName to pod spec (#557)\n* Update appVersions for DC apps (#558)\n\n## 1.11.0\n\n**Release date:** 2023-3-22\n\n![AppVersion: 9.4.4](https://img.shields.io/static/v1?label=AppVersion&message=9.4.4&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersions for DC apps (#533)\n* JIRA - Add livenessProbe check to monitor the health of applications for each pod (#511)\n\n## 1.10.0\n\n**Release date:** 2023-2-20\n\n![AppVersion: 9.4.3](https://img.shields.io/static/v1?label=AppVersion&message=9.4.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Bitbucket Mesh to Bitbucket Helm chart (#501)\n\n## 1.9.1\n\n**Release date:** 2023-2-16\n\n![AppVersion: 9.4.3](https://img.shields.io/static/v1?label=AppVersion&message=9.4.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifact hub annotation yaml\n\n## 1.9.0\n\n**Release date:** 2023-2-15\n\n![AppVersion: 9.4.3](https://img.shields.io/static/v1?label=AppVersion&message=9.4.3&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update appVersion to the latest LTS (#515)\n\n## 1.8.1\n\n**Release date:** 2022-12-12\n\n![AppVersion: 9.4.0](https://img.shields.io/static/v1?label=AppVersion&message=9.4.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix artifacthub.io annotations\n\n## 1.8.0\n\n**Release date:** 2022-12-9\n\n![AppVersion: 9.4.0](https://img.shields.io/static/v1?label=AppVersion&message=9.4.0&color=success&logo=)\n![Kubernetes: >=1.21.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.21.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* CLIP-1644: Stop supporting 1.19-1.20 k8s (#486)\n* Use `ingress.https` flag to enable https in ingress (#487)\n* Update appVersion to 9.4.0\n\n## 1.7.1\n\n**Release date:** 2022-10-26\n\n![AppVersion: 9.0.0](https://img.shields.io/static/v1?label=AppVersion&message=9.0.0&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Patch release to fix Artifacthub metadata\n\n## 1.7.0\n\n**Release date:** 2022-10-25\n\n![AppVersion: 8.20.13](https://img.shields.io/static/v1?label=AppVersion&message=8.20.13&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Pin Python version to 3.9.14 (#468)\n* Update Bitbucket ingress testing values (#466)\n* Ingress Class Name is moved under spec field. (#451)\n* Make ATL_FORCE_CFG_UPDATE configurable in values.yaml (#454)\n* Add osquery related env vars for Terraform (#462)\n* AWS cleanup and log colletion from k8s (#461)\n\n## 1.6.0\n\n**Release date:** 2022-10-12\n\n![AppVersion: 8.20.13](https://img.shields.io/static/v1?label=AppVersion&message=8.20.13&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update the default Jira version to 8.20.13 (#453)\n* Ingress Class Name is moved under spec. (#450)\n* Improved documentation (#448, #440)\n\n## 1.6.0\n\n**Release date:** TBD\n\n![AppVersion: 8.20.10](https://img.shields.io/static/v1?label=AppVersion&message=8.20.10&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Ingress is using `spec.ingressClassName` field instead of deprecated annotation\n\n\n## 1.5.0\n\n**Release date:** 2022-07-14\n\n![AppVersion: 8.20.10](https://img.shields.io/static/v1?label=AppVersion&message=8.20.10&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Fix: Use the custom ports for Jira service (#419)\n* Update the default Jira version to 8.20.10 (#430)\n\n\n## 1.4.1\n\n**Release date:** 2022-06-09\n\n![AppVersion: 8.20.9](https://img.shields.io/static/v1?label=AppVersion&message=8.20.9&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Update the default Jira version to 8.20.9 (#417)\n\n\n## 1.4.0\n\n**Release date:** 2022-05-25\n\n![AppVersion: 8.20.8](https://img.shields.io/static/v1?label=AppVersion&message=8.20.8&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Make pod securityContext optional (#389)\n* Support for configuring ingress proxy settings via values.yaml (#402)\n* Update Jira version to 8.20.8 (#412)\n\n\n## 1.3.0\n\n**Release date:** 2022-03-24\n\n![AppVersion: 8.20.7](https://img.shields.io/static/v1?label=AppVersion&message=8.20.7&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCD-1455: Remove the unused Jira license value\n* Update Jira version to 8.20.7 (#396)\n\n\n## 1.2.0\n\n**Release date:** 2022-02-14\n\n![AppVersion: 8.20.5-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.20.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCD-1452: Updated appVersion to the latest product LTS version. (#378)\n* Improvements on [documentation](https://github.com/atlassian/data-center-helm-charts/) (#370, #357)\n* Updated Atlassian charts to use common definitions (#303)\n* Added service account annotation (#363)\n* Added new feature additionalVolumeClaimTemplates and provided example in documentation (#334, #368)\n* Added new feature podLabels (#364)\n* Added new feature to define loadBalancerIP (#365)\n* Define podAnnotations as template to allow overrides (#341)\n* DCKUBE-738: Added topologySpreadConstraints to products (#351)\n* Set ActiveProcessorCount automatically based on Values.<product>.resources.container.requests.cpu (#352)\n* Added new feature additionalPorts (for jmx-monitoring) (#353)\n\n\n## 1.1.0\n\n**Release date:** 2021-11-03\n\n![AppVersion: 8.20.1-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.20.1-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-721: Update version in Chart.yaml files\n* DCKUBE-733: Update the product versions (#345)\n* DCD-1380: Update Jira to 8.20 LTS (#339)\n* DCKUBE-739: Fix typos (#337)\n* DCKUBE-739: Make securityContext changes backward compatible (#332)\n* Roll Statefulset Pods if ConfigMap changes (#315)\n* DCKUBE-677: Make security context more flexible (#321)\n* DCKUBE-722: Enable configuring ingress.class name (#313)\n* BAMBK8S-47: Bamboo agent Helm chart (#316)\n* DCKUBE-717: Bind EHCACHE ports as environmental variables (#308)\n* DCKUBE-719: Cleanup redundant (not-used) jira.terminationGracePeriodSeconds (#306)\n* DCKUBE-678: Add schedulerName to StatefulSet (#301)\n\n\n## 1.0.0\n\nThis is the first officially supported version of the Helm chart.\n\n![AppVersion: 8.13.9-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.9-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-621: Improvements to graceful shutdown (#282)\n* DCKUBE-626: Update Jira to 8.19.0 (#286)\n* Improved [documentation](https://github.com/atlassian/data-center-helm-charts/) (#275, #276, #277, #279, #280, #284, #285, #289, #290, #291, #293. #295)\n\n\n## 0.16.0\n\n![AppVersion: 8.13.9-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.9-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* DCKUBE-598: Enable NFS permission fixer by default (#241)\n* DCKUBE-581: Enable configuration for SET_PERMISSIONS docker image variable (#261)\n* DCKUBE-613: Configurable grace periods (#249)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/) (#236, #243, #245, #252, #253, #256, #258, #260, #268, #270, #272)\n\n\n## 0.15.0\n\n![AppVersion: 8.13.9-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.9-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n* Add Service annotations (#209)\n* DCKUBE-453: Add support for providing a custom fluentd start command (#218)\n* DCKUBE-435: Renamed the 'master' branch to 'main' and set it as default (#232)\n* Update EKS cluster yaml example (#227)\n* Improve [documentation](https://github.com/atlassian/data-center-helm-charts/) (#206, #222, #223, #228, #229, #231, #233, #235)\n\n\n## 0.14.0\n\n![AppVersion: 8.13.9-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.9-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-529: Update Jira version to 8.13.9-jdk11 (#212)\n\n\n## 0.13.0\n\n![AppVersion: 8.13.7-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.7-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-474: Added Jira Proxy information to helm chart (#202)\n* DCKUBE-54: Volume docs updates (#188)\n\n\n## 0.12.0\n\n![AppVersion: 8.13.7-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.7-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-437: Wording improvement for warning in NOTES when PV is not used (#199)\n* DCKUBE-390: Improve readability of Jira values.yaml file (#179)\n* Defining the following values in the helpers template for each chart, to allow template overrides: (#173)\n\n### Default value changes\n\nThere has been major improvement in the documentation for the keys in `values.yaml` file but there isn't any functional change.\n\n## 0.11.0\n\n**Release date:** 2021-06-09\n\n![AppVersion: 8.13.7-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.7-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* DCKUBE-348: Warning of absent persistent volume (#169)\n* DCKUBE-307: Do not print logs when testing helm installation. (#168)\n* DCKUBE-308: Print service URL after installing helm chart (#157)\n* DCKUBE-282: Update icons to SVG (#164)\n\n### Default value changes\n\n```diff\ndiff --git a/src/main/charts/jira/values.yaml b/src/main/charts/jira/values.yaml\nindex 2ec894b..0c3a003 100644\n--- a/src/main/charts/jira/values.yaml\n+++ b/src/main/charts/jira/values.yaml\n@@ -46,7 +46,7 @@ jira:\n     port: 80\n     # -- The type of Kubernetes service to use for Jira\n     type: ClusterIP\n-    # -- The Tomcat context path that Confluence will use. The ATL_TOMCAT_CONTEXTPATH will be set automatically\n+    # -- The Tomcat context path that Jira will use. The ATL_TOMCAT_CONTEXTPATH will be set automatically\n     contextPath:\n   # -- Enable or disable security context in StatefulSet template spec. Enabled by default with UID 2001.\n   # -- Disable when deploying to OpenShift, unless anyuid policy is attached to a service account\n```\n\n## 0.10.0\n\n**Release date:** 2021-06-01\n\n![AppVersion: 8.13.6-jdk11](https://img.shields.io/static/v1?label=AppVersion&message=8.13.6-jdk11&color=success&logo=)\n![Kubernetes: >=1.19.x-0](https://img.shields.io/static/v1?label=Kubernetes&message=>=1.19.x-0&color=informational&logo=kubernetes)\n![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo=helm)\n\n\n* Version 0.10.0\n* DCKUBE-332: Update the minimal supported kubernetes version v1.19 (#154)\n\n### Default value changes\n\n```diff\n# No changes in this release\n```\n"
  },
  {
    "path": "src/main/charts/jira/Chart.yaml",
    "content": "apiVersion: v2\nname: jira\ndescription: A chart for installing Jira Data Center on Kubernetes\ntype: application\nversion: '2.0.13'\nappVersion: 11.3.6\nkubeVersion: \">=1.21.x-0\"\nkeywords:\n- Jira\n- Jira Software\n- Jira Server\n- Jira Data Center\n- Jira DC\n- Atlassian\nhome: https://atlassian.github.io/data-center-helm-charts/\nicon: \n  https://atlassian.github.io/data-center-helm-charts/icons/jira-software.svg\nsources:\n- https://github.com/atlassian/data-center-helm-charts\n- https://bitbucket.org/atlassian-docker/docker-atlassian-jira/\ndeprecated: false\nannotations:\n  artifacthub.io/containsSecurityUpdates: \"false\"\n  artifacthub.io/changes: |-\n    - \"DEVPROD-3811 Added support for OpenSearch for Jira. (#1099)\"\n    - \"Update appVersions for DC apps (#1113)\"\n\ndependencies:\n- name: common\n  version: 1.2.7\n  repository: https://atlassian.github.io/data-center-helm-charts\n- name: opensearch\n  version: 3.5.0\n  repository: https://opensearch-project.github.io/helm-charts\n  condition: opensearch.enabled\n"
  },
  {
    "path": "src/main/charts/jira/README.md",
    "content": "# jira\n\n![Version: 2.0.13](https://img.shields.io/badge/Version-2.0.13-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 11.3.6](https://img.shields.io/badge/AppVersion-11.3.6-informational?style=flat-square)\n\nA chart for installing Jira Data Center on Kubernetes\n\n**Homepage:** <https://atlassian.github.io/data-center-helm-charts/>\n\n## Source Code\n\n* <https://github.com/atlassian/data-center-helm-charts>\n* <https://bitbucket.org/atlassian-docker/docker-atlassian-jira/>\n\n## Requirements\n\nKubernetes: `>=1.21.x-0`\n\n| Repository | Name | Version |\n|------------|------|---------|\n| https://atlassian.github.io/data-center-helm-charts | common | 1.2.7 |\n| https://opensearch-project.github.io/helm-charts | opensearch | 3.5.0 |\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| additionalConfigMaps | list | `[]` | Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix for a ConfigMap name, fileName is used as subPath  |\n| additionalContainers | list | `[]` | Additional container definitions that will be added to all Jira pods  |\n| additionalFiles | list | `[]` | Additional existing ConfigMaps and Secrets not managed by Helm that should be mounted into service container. Configuration details below (camelCase is important!): 'name'      - References existing ConfigMap or secret name. 'type'      - 'configMap' or 'secret' 'key'       - The file name. 'mountPath' - The destination directory in a container. VolumeMount and Volumes are added with this name and index position, for example; custom-config-0, keystore-2  |\n| additionalHosts | list | `[]` | Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file. https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ |\n| additionalInitContainers | list | `[]` | Additional initContainer definitions that will be added to all Jira pods  |\n| additionalLabels | object | `{}` | Additional labels that should be applied to all resources  |\n| affinity | object | `{}` | Standard K8s affinities that will be applied to all Jira pods  |\n| atlassianAnalyticsAndSupport.analytics.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a JSON which DC products will read and send analytics events to Atlassian data pipelines  |\n| atlassianAnalyticsAndSupport.helmValues.enabled | bool | `true` | Mount ConfigMap with selected Helm chart values as a YAML file which can be optionally including to support.zip  |\n| database.credentials.passwordSecretKey | string | `\"password\"` | The key ('password') in the Secret used to store the database login password  |\n| database.credentials.secretName | string | `nil` | from-literal=password=<password>' https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets  |\n| database.credentials.usernameSecretKey | string | `\"username\"` | The key ('username') in the Secret used to store the database login username  |\n| database.driver | string | `nil` | The Java class name of the JDBC driver to be used. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Valid drivers are: * 'org.postgresql.Driver' * 'com.mysql.jdbc.Driver' * 'oracle.jdbc.OracleDriver' * 'com.microsoft.sqlserver.jdbc.SQLServerDriver' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasedriver:  |\n| database.type | string | `nil` | The database type that should be used. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Valid values include: * 'postgres72' * 'mysql57' * 'mysql8' * 'oracle10g' * 'mssql' * 'postgresaurora96' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasetype  |\n| database.url | string | `nil` | The jdbc URL of the database. If not specified, then it will need to be provided via the browser during manual configuration post deployment. Example URLs include: * 'jdbc:postgresql://<dbhost>:5432/<dbname>' * 'jdbc:mysql://<dbhost>/<dbname>' * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>' * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>' https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl  |\n| fluentd.command | string | `nil` | The command used to start Fluentd. If not supplied the default command will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"  Note: The custom command can be free-form, however pay particular attention to the process that should ultimately be left running in the container. This process should be invoked with 'exec' so that signals are appropriately propagated to it, for instance SIGTERM. An example of how such a command may look is: \"<command 1> && <command 2> && exec <primary command>\" |\n| fluentd.customConfigFile | bool | `false` | Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default) should be used for Fluentd. If enabled this config must be supplied via the 'fluentdCustomConfig' property below. If your custom config forces fluentd to run in a server mode, add `-Datlassian.logging.cloud.enabled=true` to `jira.AdditionalJvmArgs` stanza in values file  |\n| fluentd.elasticsearch.enabled | bool | `true` | Set to 'true' if Fluentd should send all log events to an Elasticsearch service.  |\n| fluentd.elasticsearch.hostname | string | `\"elasticsearch\"` | The hostname of the Elasticsearch service that Fluentd should send logs to.  |\n| fluentd.elasticsearch.indexNamePrefix | string | `\"jira\"` | The prefix of the Elasticsearch index name that will be used  |\n| fluentd.enabled | bool | `false` | Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod  |\n| fluentd.extraVolumes | list | `[]` | Specify custom volumes to be added to Fluentd container (e.g. more log sources)  |\n| fluentd.fluentdCustomConfig | object | `{}` | Custom fluent.conf file  |\n| fluentd.httpPort | int | `9880` | The port on which the Fluentd sidecar will listen  |\n| fluentd.imageRepo | string | `\"fluent/fluentd-kubernetes-daemonset\"` | The Fluentd sidecar image repository  |\n| fluentd.imageTag | string | `\"v1.11.5-debian-elasticsearch7-1.2\"` | The Fluentd sidecar image tag  |\n| fluentd.resources | object | `{}` | Resources requests and limits for fluentd sidecar container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| gateway.additionalRules | list | `[]` | Advanced routing rules. Use this for complex routing scenarios like header-based routing, traffic splitting, or multiple backends. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule  |\n| gateway.annotations | object | `{}` | Annotations to add to the HTTPRoute resource.  |\n| gateway.create | bool | `false` | Set to 'true' if an HTTPRoute Resource should be created. This depends on a pre-provisioned Gateway API controller being available and a Gateway resource. Cannot be enabled if ingress.create is true.  |\n| gateway.filters | list | `[]` | HTTP filters to apply to requests. Can be used to add/remove headers, perform redirects, or rewrite URLs. See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter  |\n| gateway.hostnames | list | `[]` | The hostnames that should be routed to Jira. At least one hostname is required when gateway.create is true. Setting hostnames activates gateway mode for product configuration even when gateway.create is false, allowing use with a pre-existing Gateway or external proxy. The first entry is used as the canonical hostname for base URL, proxy settings, and NOTES output — list the primary/public hostname first.  |\n| gateway.https | bool | `true` | Whether users access the application over HTTPS. This does not configure TLS on the Gateway or load balancer — it must match how traffic is actually routed to the application.  |\n| gateway.labels | object | `{}` | Labels to add to the HTTPRoute resource.  |\n| gateway.parentRefs | list | `[]` | Reference to the parent Gateway resource. Supports any standard parentRef fields (name, namespace, sectionName, etc.). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference  |\n| gateway.path | string | `nil` | The base path for routing. When empty, falls back to the product's service.contextPath (same behavior as ingress). Set explicitly to override, e.g. \"/jira\".  |\n| gateway.pathType | string | `\"PathPrefix\"` | Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\". PathPrefix is recommended for most use cases.  |\n| gateway.timeouts | object | `{\"backendRequest\":\"60s\",\"request\":\"60s\"}` | Timeout configuration for HTTPRoute rules. Note: when migrating from Ingress, these replace proxyReadTimeout and proxySendTimeout. There is no Gateway API equivalent for proxyConnectTimeout or maxBodySize — those require controller-specific policies (e.g. Envoy Gateway BackendTrafficPolicy). See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts  |\n| hostNamespaces | object | `{}` | Share host namespaces which may include hostNetwork, hostIPC, and hostPID  |\n| image.pullPolicy | string | `\"IfNotPresent\"` | Image pull policy  |\n| image.repository | string | `\"atlassian/jira-software\"` | The Jira Docker image to use https://hub.docker.com/r/atlassian/jira-software  |\n| image.tag | string | `\"\"` | The docker image tag to be used - defaults to the Chart appVersion  |\n| ingress.additionalPaths | list | `[]` | Additional paths to be added to the Ingress resource to point to different backend services  |\n| ingress.annotations | object | `{}` | The custom annotations that should be applied to the Ingress Resource. If using an ingress-nginx controller be sure that the annotations you add here are compatible with those already defined in the 'ingess.yaml' template  |\n| ingress.className | string | `\"nginx\"` | The class name used by the ingress controller if it's being used.  Please follow documentation of your ingress controller. If the cluster contains multiple ingress controllers, this setting allows you to control which of them is used for Atlassian application traffic.  |\n| ingress.create | bool | `false` | Set to 'true' if an Ingress Resource should be created. This depends on a pre-provisioned Ingress Controller being available.  |\n| ingress.host | string | `nil` | The fully-qualified hostname (FQDN) of the Jira instance. This value is used to configure the product's proxy settings and, when ingress.create is true, the Ingress resource routing rules.  |\n| ingress.https | bool | `true` | Whether users access the application over HTTPS. Set to 'false' if not using TLS, e.g. when reaching the service via localhost port-forwarding.  |\n| ingress.maxBodySize | string | `\"250m\"` | The max body size to allow. Requests exceeding this size will result in an HTTP 413 error being returned to the client.  |\n| ingress.nginx | bool | `true` | Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx' controller. https://kubernetes.github.io/ingress-nginx/  This will populate the Ingress Resource with annotations that are specific to the K8s ingress-nginx controller. Set to 'false' if a different controller is to be used, in which case the appropriate annotations for that controller must be specified below under 'ingress.annotations'.  |\n| ingress.openShiftRoute | bool | `false` | Set to true if you want to create an OpenShift Route instead of an Ingress  |\n| ingress.path | string | `nil` | The base path for the application, e.g. '/jira'. Defaults to 'jira.service.contextPath'.  |\n| ingress.proxyConnectTimeout | int | `60` | Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.  |\n| ingress.proxyReadTimeout | int | `60` | Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.  |\n| ingress.proxySendTimeout | int | `60` | Sets a timeout for transmitting a request to the proxied server. The timeout is set only between two successive write operations, not for the transmission of the whole request. If the proxied server does not receive anything within this time, the connection is closed.  |\n| ingress.routeHttpHeaders | object | `{}` | routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only  |\n| ingress.tlsSecretName | string | `nil` | The name of the K8s Secret that contains the TLS private key and corresponding certificate. When utilised, TLS termination occurs at the ingress point where traffic to the Service, and it's Pods is in plaintext.  Usage is optional and depends on your use case. The Ingress Controller itself can also be configured with a TLS secret for all Ingress Resources. https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets https://kubernetes.io/docs/concepts/services-networking/ingress/#tls  |\n| jira.accessLog.localHomeSubPath | string | `\"log\"` | The subdirectory within the local-home volume where access logs should be stored.  |\n| jira.accessLog.mountPath | string | `\"/opt/atlassian/jira/logs\"` | The path within the Jira container where the local-home volume should be mounted in order to capture access logs.  |\n| jira.additionalAnnotations | object | `{}` | Defines additional annotations to the Jira StateFulSet. This might be required when deploying using a GitOps approach |\n| jira.additionalBundledPlugins | list | `[]` | Specifies a list of additional Jira plugins that should be added to the Jira container. Note plugins installed via this method will appear as bundled plugins rather than user plugins. These should be specified in the same manner as the 'additionalLibraries' property. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  NOTE: only .jar files can be loaded using this approach. OBR's can be extracted (unzipped) to access the associated .jar  An alternative to this method is to install the plugins via \"Manage Apps\" in the product system administration UI.  |\n| jira.additionalCertificates | object | `{\"customCmd\":null,\"initContainer\":{\"resources\":{},\"securityContext\":{}},\"secretList\":[],\"secretName\":null}` | Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates  |\n| jira.additionalCertificates.customCmd | string | `nil` | Custom command to be executed in the init container to import certificates  |\n| jira.additionalCertificates.initContainer.resources | object | `{}` | Resources allocated to the import-certs init container  |\n| jira.additionalCertificates.initContainer.securityContext | object | `{}` | Custom SecurityContext for the import-certs init container  |\n| jira.additionalCertificates.secretList | list | `[]` | A list of secrets with their respective keys holding certificates to be added to the Java truststore. It is mandatory to specify which keys from secret data need to be mounted as files to the init container.  |\n| jira.additionalCertificates.secretName | string | `nil` | Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.  |\n| jira.additionalConfigProperties | list | `[]` | Additional properties to inject into jira-config.properties at container startup via ADDITIONAL_JIRA_CONFIG_* environment variables. Each entry is a \"key=value\" property line. Environment variable names are sorted for consistent file generation; order has no effect on runtime behavior.  Requires a Jira container image version that supports ADDITIONAL_JIRA_CONFIG_*.  |\n| jira.additionalConfigPropertiesExpandEnv | list | `[]` | Additional properties requiring environment variable expansion at container startup. Values containing {VAR_NAME} placeholders will be replaced with the corresponding environment variable value. Useful for injecting secrets without hardcoding them in values.  |\n| jira.additionalEnvironmentVariables | list | `[]` | Defines any additional environment variables to be passed to the Jira container. See https://hub.docker.com/r/atlassian/jira-software for supported variables.  |\n| jira.additionalJvmArgs | list | `[]` |  |\n| jira.additionalLibraries | list | `[]` | Specifies a list of additional Java libraries that should be added to the Jira container. Each item in the list should specify the name of the volume that contains the library, as well as the name of the library file within that volume's root directory. Optionally, a subDirectory field can be included to specify which directory in the volume contains the library file. Additional details: https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/  |\n| jira.additionalPorts | list | `[]` | Defines any additional ports for the Jira container.  |\n| jira.additionalVolumeClaimTemplates | list | `[]` | Defines additional volumeClaimTemplates that should be applied to the Jira pod. Note that this will not create any corresponding volume mounts; those needs to be defined in jira.additionalVolumeMounts  |\n| jira.additionalVolumeMounts | list | `[]` | Defines any additional volumes mounts for the Jira container. These can refer to existing volumes, or new volumes can be defined via 'volumes.additional'.  |\n| jira.clustering.enabled | bool | `false` | Set to 'true' if Data Center clustering should be enabled This will automatically configure cluster peer discovery between cluster nodes.  |\n| jira.containerSecurityContext | object | `{}` | Standard K8s field that holds security configurations that will be applied to a container. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/  |\n| jira.forceConfigUpdate | bool | `false` | The Docker entrypoint.py generates application configuration on first start; not all of these files are regenerated on subsequent starts. By default, dbconfig.xml is generated only once. Set `forceConfigUpdate` to true to change this behavior.  |\n| jira.livenessProbe.customProbe | object | `{}` | Custom livenessProbe to override the default tcpSocket probe  |\n| jira.livenessProbe.enabled | bool | `false` | Whether to apply the livenessProbe check to pod.  |\n| jira.livenessProbe.failureThreshold | int | `12` | The number of consecutive failures of the Jira container liveness probe before the pod fails liveness checks.  |\n| jira.livenessProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| jira.livenessProbe.periodSeconds | int | `5` | How often (in seconds) the Jira container liveness probe will run  |\n| jira.livenessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| jira.ports.ehcache | int | `40001` | Ehcache port  |\n| jira.ports.ehcacheobject | int | `40011` | Ehcache object port  |\n| jira.ports.http | int | `8080` | The port on which the Jira container listens for HTTP traffic  |\n| jira.postStart | object | `{\"command\":null}` | PostStart is executed immediately after a container is created. However, there is no guarantee that the hook will execute before the container ENTRYPOINT. See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks  |\n| jira.readinessProbe.customProbe | object | `{}` | Custom readinessProbe to override the default /status httpGet  |\n| jira.readinessProbe.enabled | bool | `true` | Whether to apply the readinessProbe check to pod.  |\n| jira.readinessProbe.failureThreshold | int | `10` | The number of consecutive failures of the Jira container readiness probe before the pod fails readiness checks.  |\n| jira.readinessProbe.initialDelaySeconds | int | `10` | The initial delay (in seconds) for the Jira container readiness probe, after which the probe will start running.  |\n| jira.readinessProbe.periodSeconds | int | `5` | How often (in seconds) the Jira container readiness probe will run  |\n| jira.readinessProbe.timeoutSeconds | int | `1` | Number of seconds after which the probe times out  |\n| jira.resources.container.requests.cpu | string | `\"2\"` | Initial CPU request by Jira pod  |\n| jira.resources.container.requests.memory | string | `\"2G\"` | Initial Memory request by Jira pod  |\n| jira.resources.jvm.maxHeap | string | `\"768m\"` | The maximum amount of heap memory that will be used by the Jira JVM  |\n| jira.resources.jvm.minHeap | string | `\"384m\"` | The minimum amount of heap memory that will be used by the Jira JVM  |\n| jira.resources.jvm.reservedCodeCache | string | `\"512m\"` | The memory reserved for the Jira JVM code cache  |\n| jira.s3Storage.attachments.bucketName | string | `nil` | Bucket name to store attachments. If a bucket name and region (see below) are defined, Jira will automatically use AWS S3 to store attachments. Only bucket name is required, not the full arn. If you provide the same bucket name for both avatars and attachments, they will be stored in the same bucket  |\n| jira.s3Storage.attachments.bucketRegion | string | `nil` | AWS region where the S3 bucket is located.  |\n| jira.s3Storage.attachments.endpointOverride | string | `nil` | Override the default AWS API endpoint with a custom one  |\n| jira.s3Storage.avatars.bucketName | string | `nil` | Bucket name to store avatars. If a bucket name and region (see below) are defined, Jira will automatically use AWS S3 to store avatars. Only bucket name is required, not the full arn.  |\n| jira.s3Storage.avatars.bucketRegion | string | `nil` | AWS region where the S3 bucket is located.  |\n| jira.s3Storage.avatars.endpointOverride | string | `nil` | Override the default AWS API endpoint with a custom one  |\n| jira.s3Storage.backups.bucketName | string | `nil` | Bucket name to store backups. If a bucket name and region (see below) are defined, Jira will automatically use AWS S3 to store backups. Only bucket name is required, not the full arn. If you provide the same bucket name for both avatars and backups, they will be stored in the same bucket  |\n| jira.s3Storage.backups.bucketRegion | string | `nil` | AWS region where the S3 bucket is located.  |\n| jira.s3Storage.backups.endpointOverride | string | `nil` | Override the default AWS API endpoint with a custom one  |\n| jira.securityContext.fsGroup | int | `2001` | The GID used by the Jira docker image GID will default to 2001 if not supplied and securityContextEnabled is set to true. This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Jira container. However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260  |\n| jira.securityContext.fsGroupChangePolicy | string | `\"OnRootMismatch\"` | fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod. This field only applies to volume types that support fsGroup controlled ownership and permissions. https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods  |\n| jira.securityContextEnabled | bool | `true` | Whether to apply security context to pod.  |\n| jira.seraphConfig | object | `{\"autoLoginCookieAge\":\"1209600\",\"generateByHelm\":false}` | By default seraph-config.xml is generated in the container entrypoint from a template shipped with an official Jira image. However, seraph-config.xml generation may fail if container is not run as root, which is a common case if Jira is deployed to OpenShift.  |\n| jira.seraphConfig.generateByHelm | bool | `false` | Mount seraph-config.xml as a ConfigMap. Override configuration elements if necessary  |\n| jira.service.annotations | object | `{}` | Additional annotations to apply to the Service  |\n| jira.service.contextPath | string | `nil` | The Tomcat context path that Jira will use. The ATL_TOMCAT_CONTEXTPATH will be set automatically.  |\n| jira.service.loadBalancerIP | string | `nil` | Use specific loadBalancerIP. Only applies to service type LoadBalancer.  |\n| jira.service.nodePort | string | `nil` | Only applicable if service.type is NodePort. NodePort for Jira service  |\n| jira.service.port | int | `80` | The port on which the Jira K8s Service will listen  |\n| jira.service.sessionAffinity | string | `\"None\"` | Session affinity type. If you want to make sure that connections from a particular client are passed to the same pod each time, set sessionAffinity to ClientIP. See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity  |\n| jira.service.sessionAffinityConfig | object | `{\"clientIP\":{\"timeoutSeconds\":null}}` | Session affinity configuration  |\n| jira.service.sessionAffinityConfig.clientIP.timeoutSeconds | string | `nil` | Specifies the seconds of ClientIP type session sticky time. The value must be > 0 && <= 86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).  |\n| jira.service.type | string | `\"ClusterIP\"` | The type of K8s service to use for Jira  |\n| jira.session.autologinCookieAge | string | `nil` | The maximum time a user can remain logged-in with 'Remember Me'. Defaults to 1209600; two weeks, in seconds  |\n| jira.session.timeout | string | `nil` | User session timeout. Set to 30 minutes in web.xml  |\n| jira.setPermissions | bool | `true` | Boolean to define whether to set local home directory permissions on startup of Jira container. Set to 'false' to disable this behaviour.  |\n| jira.shutdown.command | string | `\"/shutdown-wait.sh\"` | By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/), using a script supplied by the Docker image. If any other shutdown behaviour is needed it can be achieved by overriding this value. Note that the shutdown command needs to wait for the application shutdown completely before exiting; see [the default command](https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/shutdown-wait.sh) for details.  |\n| jira.shutdown.terminationGracePeriodSeconds | int | `30` | The termination grace period for pods during shutdown. This should be set to the internal grace period, plus a small buffer to allow the JVM to fully terminate.  |\n| jira.startupProbe.enabled | bool | `false` | Whether to apply the startupProbe check to pod.  |\n| jira.startupProbe.failureThreshold | int | `120` | The number of consecutive failures of the Jira container startup probe before the pod fails startup checks.  |\n| jira.startupProbe.initialDelaySeconds | int | `60` | Time to wait before starting the first probe  |\n| jira.startupProbe.periodSeconds | int | `5` | How often (in seconds) the Jira container startup probe will run  |\n| jira.tomcatConfig | object | `{\"acceptCount\":\"100\",\"accessLogMaxDays\":\"-1\",\"accessLogPattern\":\"%a %{jira.request.id}r %{jira.request.username}r %t &quot;%m %U%q %H&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; &quot;%{jira.request.assession.id}r&quot;\",\"connectionTimeout\":\"20000\",\"customServerXml\":\"\",\"enableLookups\":\"false\",\"generateByHelm\":false,\"maxHttpHeaderSize\":\"8192\",\"maxThreads\":\"100\",\"mgmtPort\":\"8005\",\"minSpareThreads\":\"10\",\"port\":\"8080\",\"protocol\":\"HTTP/1.1\",\"proxyName\":null,\"proxyPort\":null,\"redirectPort\":\"8443\",\"requestAttributesEnabled\":\"false\",\"scheme\":null,\"secure\":null,\"stuckThreadDetectionValveThreshold\":\"120\"}` | By default Tomcat's server.xml is generated in the container entrypoint from a template shipped with an official Jira image. However, server.xml generation may fail if container is not run as root, which is a common case if Jira is deployed to OpenShift.  |\n| jira.tomcatConfig.customServerXml | string | `\"\"` | Custom server.xml to be mounted into /opt/atlassian/jira/conf  |\n| jira.tomcatConfig.generateByHelm | bool | `false` | Mount server.xml as a ConfigMap. Override configuration elements if necessary  |\n| jira.topologySpreadConstraints | list | `[]` | Defines topology spread constraints for Jira pods. See details: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/  |\n| jira.tunnel | object | `{\"additionalConnector\":{\"URIEncoding\":\"UTF-8\",\"acceptCount\":\"10\",\"connectionTimeout\":\"20000\",\"enableLookups\":\"false\",\"maxThreads\":\"50\",\"minSpareThreads\":\"10\",\"port\":null,\"secure\":false}}` | Configure additional Tomcat connector to set up tunnel. Define the connector port and optional additional attributes. When 'tunnel.additionalConnector.port' is defined, an additional connector is added to server.xml and '-Dsecure.tunnel.upstream.port=<port_number>' is added to JVM args  |\n| jira.useHelmReleaseNameAsContainerName | bool | `false` | Whether the main container should acquire helm release name. The default, the container name is jira (Helm chart name)  |\n| monitoring.exposeJmxMetrics | bool | `false` | Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter  |\n| monitoring.fetchJmxExporterJar | bool | `true` | Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar to shared home and provide an absolute path in jmxExporterCustomJarLocation  |\n| monitoring.grafana.createDashboards | bool | `false` | Create ConfigMaps with Grafana dashboards  |\n| monitoring.grafana.dashboardAnnotations | object | `{}` | Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage  |\n| monitoring.grafana.dashboardLabels | object | `{}` | Label selector for Grafana dashboard importer sidecar  |\n| monitoring.jmxExporterCustomConfig | object | `{}` | Custom JMX config with the rules  |\n| monitoring.jmxExporterCustomJarLocation | string | `nil` | Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home  |\n| monitoring.jmxExporterImageRepo | string | `\"bitnamilegacy/jmx-exporter\"` | Image repository with jmx_exporter jar  |\n| monitoring.jmxExporterImageTag | string | `\"0.18.0\"` |  |\n| monitoring.jmxExporterInitContainer | object | `{\"customSecurityContext\":{},\"jmxJarLocation\":null,\"resources\":{},\"runAsRoot\":true}` | JMX exporter init container configuration  |\n| monitoring.jmxExporterInitContainer.customSecurityContext | object | `{}` | Custom SecurityContext for the jmx exporter init container  |\n| monitoring.jmxExporterInitContainer.jmxJarLocation | string | `nil` | The location of the JMX exporter jarfile in the JMX exporter image Leave blank for default bitnami image  |\n| monitoring.jmxExporterInitContainer.resources | object | `{}` | Resources requests and limits for the JMX exporter init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| monitoring.jmxExporterInitContainer.runAsRoot | bool | `true` | Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume. Set to false if running containers as root is not allowed in the cluster.  |\n| monitoring.jmxExporterPort | int | `9999` | Port number on which metrics will be available  |\n| monitoring.jmxExporterPortType | string | `\"ClusterIP\"` | JMX exporter port type  |\n| monitoring.jmxServiceAnnotations | object | `{}` | Annotations added to the jmx service  |\n| monitoring.serviceMonitor.create | bool | `false` | Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.  |\n| monitoring.serviceMonitor.prometheusLabelSelector | object | `{}` | ServiceMonitorSelector of the prometheus instance.  |\n| monitoring.serviceMonitor.scrapeIntervalSeconds | int | `30` | Scrape interval for the JMX service.  |\n| monitoring.serviceMonitor.scrapeTimeoutSeconds | int | `20` | How long until a scrape request times out. It cannot be greater than the scrape interval.  |\n| nodeSelector | object | `{}` | Standard K8s node-selectors that will be applied to all Jira pods  |\n| opensearch.credentials.createSecret | bool | `true` | Let the Helm chart create a secret with an auto generated initial admin password  |\n| opensearch.credentials.existingSecretRef | object | `{\"name\":null}` | Use an existing secret with the key OPENSEARCH_INITIAL_ADMIN_PASSWORD holding the initial admin password  |\n| opensearch.enabled | bool | `false` | Deploy OpenSearch Helm chart and Configure Jira to use it as a search platform  |\n| opensearch.envFrom[0].secretRef.name | string | `\"opensearch-initial-password\"` | If using a pre-created secret, make sure to change secret name to match opensearch.credentials.existingSecretRef.name  |\n| opensearch.extraEnvs[0].name | string | `\"plugins.security.ssl.http.enabled\"` |  |\n| opensearch.extraEnvs[0].value | string | `\"false\"` |  |\n| opensearch.persistence.size | string | `\"10Gi\"` |  |\n| opensearch.resources.requests.cpu | int | `1` |  |\n| opensearch.resources.requests.memory | string | `\"1Gi\"` |  |\n| opensearch.singleNode | bool | `true` | OpenSearch helm specific values, see: https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch/values.yaml  |\n| openshift.runWithRestrictedSCC | bool | `false` | When set to true, the containers will run with a restricted Security Context Constraint (SCC). See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server configuration files as ConfigMaps.  |\n| ordinals | object | `{\"enabled\":false,\"start\":0}` | Set a custom start ordinal number for the K8s stateful set. Note that this depends on the StatefulSetStartOrdinal K8s feature gate, which has entered beta state with K8s version 1.27.  |\n| ordinals.enabled | bool | `false` | Enable only if StatefulSetStartOrdinal K8s feature gate is available.  |\n| ordinals.start | int | `0` | Set start ordinal to a positive integer, defaulting to 0.  |\n| podAnnotations | object | `{}` | Custom annotations that will be applied to all Jira pods  |\n| podDisruptionBudget | object | `{\"annotations\":{},\"enabled\":false,\"labels\":{},\"maxUnavailable\":null,\"minAvailable\":null}` | PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.  |\n| podLabels | object | `{}` | Custom labels that will be applied to all Jira pods  |\n| priorityClassName | string | `nil` | Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster. For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass  |\n| replicaCount | int | `1` | The initial number of Jira pods that should be started at deployment time. Note that Jira requires manual configuration via the browser post deployment after the first pod is deployed. This configuration must be completed before scaling up additional pods. As such this value should always be kept as 1, but can be altered once manual configuration is complete.  |\n| schedulerName | string | `nil` | Standard K8s schedulerName that will be applied to all Jira pods. Check Kubernetes documentation on how to configure multiple schedulers: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods  |\n| serviceAccount.annotations | object | `{}` | Annotations to add to the ServiceAccount (if created)  |\n| serviceAccount.create | bool | `true` | Set to 'true' if a ServiceAccount should be created, or 'false' if it already exists.  |\n| serviceAccount.eksIrsa.roleArn | string | `nil` |  |\n| serviceAccount.imagePullSecrets | list | `[]` | For Docker images hosted in private registries, define the list of image pull secrets that should be utilized by the created ServiceAccount https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod  |\n| serviceAccount.name | string | `nil` | The name of the ServiceAccount to be used by the pods. If not specified, but the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name will be auto-generated, otherwise the 'default' ServiceAccount will be used. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server  |\n| testPods | object | `{\"affinity\":{},\"annotations\":{},\"image\":{\"permissionsTestContainer\":\"debian:stable-slim\",\"statusTestContainer\":\"alpine:latest\"},\"labels\":{},\"nodeSelector\":{},\"resources\":{},\"schedulerName\":null,\"tolerations\":[]}` | Metadata and pod spec for pods started in Helm tests  |\n| tolerations | list | `[]` | Standard K8s tolerations that will be applied to all Jira pods  |\n| updateStrategy | object | `{}` | StatefulSet update strategy. When unset defaults to Rolling update. See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets  |\n| volumes.additional | list | `[]` | Defines additional volumes that should be applied to all Jira pods. Note that this will not create any corresponding volume mounts; those needs to be defined in jira.additionalVolumeMounts  |\n| volumes.localHome.customVolume | object | `{}` | Static provisioning of local-home using K8s PVs and PVCs  NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for pods is not recommended. Dynamic provisioning described above is the prescribed approach.  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the local-home volume(s). If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static  |\n| volumes.localHome.mountPath | string | `\"/var/atlassian/application-data/jira\"` | Specifies the path in the Jira container to which the local-home volume will be mounted.  |\n| volumes.localHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically created for each pod based on the 'StorageClassName' supplied below.  |\n| volumes.localHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the local-home volume claims.  |\n| volumes.localHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the local-home volume claim.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted | string | `nil` | Configures the volume retention behavior that applies when the StatefulSet is deleted.  |\n| volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled | string | `nil` | Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.  |\n| volumes.localHome.subPath | string | `nil` | Specifies the sub-directory of the local-home volume that will be mounted in to the Jira container.  |\n| volumes.sharedHome.customVolume | object | `{}` | Static provisioning of shared-home using K8s PVs and PVCs  When 'persistentVolumeClaim.create' is 'false', then this value can be used to define a standard K8s volume that will be used for the shared-home volume. If not defined, then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/  |\n| volumes.sharedHome.mountPath | string | `\"/var/atlassian/application-data/shared-home\"` | Specifies the path in the Jira container to which the shared-home volume will be mounted.  |\n| volumes.sharedHome.nfsPermissionFixer.command | string | `nil` | By default, the fixer will change the group ownership of the volume's root directory to match the Jira container's GID (2001), and then ensures the directory is group-writeable. If this is not the desired behaviour, command used can be specified here.  |\n| volumes.sharedHome.nfsPermissionFixer.enabled | bool | `true` | If 'true', this will alter the shared-home volume's root directory so that Jira can write to it. This is a workaround for a K8s bug affecting NFS volumes: https://github.com/kubernetes/examples/issues/260  |\n| volumes.sharedHome.nfsPermissionFixer.imageRepo | string | `\"alpine\"` | Image repository for the permission fixer init container. Defaults to alpine  |\n| volumes.sharedHome.nfsPermissionFixer.imageTag | string | `\"latest\"` | Image tag for the permission fixer init container. Defaults to latest  |\n| volumes.sharedHome.nfsPermissionFixer.mountPath | string | `\"/shared-home\"` | The path in the K8s initContainer where the shared-home volume will be mounted  |\n| volumes.sharedHome.nfsPermissionFixer.resources | object | `{}` | Resources requests and limits for nfsPermissionFixer init container See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/  |\n| volumes.sharedHome.persistentVolumeClaim.accessModes | list | `[\"ReadWriteMany\"]` | Specify the access modes that should be used for the 'shared-home' volume claim. Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations. Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes  |\n| volumes.sharedHome.persistentVolumeClaim.create | bool | `false` | If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically created for shared-home based on the 'StorageClassName' supplied below.  |\n| volumes.sharedHome.persistentVolumeClaim.resources | object | `{\"requests\":{\"storage\":\"1Gi\"}}` | Specifies the standard K8s resource requests and/or limits for the shared-home volume claims.  |\n| volumes.sharedHome.persistentVolumeClaim.storageClassName | string | `nil` | Specify the name of the 'StorageClass' that should be used for the 'shared-home' volume claim.  |\n| volumes.sharedHome.subPath | string | `nil` | Specifies the sub-directory of the shared-home volume that will be mounted in to the Jira container.  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/main/charts/jira/grafana-dashboards/cache-clearing.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"expr\": \"\",\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"iconSize\": 0,\n        \"lineColor\": \"\",\n        \"name\": \"Annotations & Alerts\",\n        \"query\": \"\",\n        \"showLine\": false,\n        \"step\": \"\",\n        \"tagKeys\": \"\",\n        \"tagsField\": \"\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"textField\": \"\",\n        \"textFormat\": \"\",\n        \"titleFormat\": \"\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657596877967,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Indicates that all caches are being flushed by a plugin. This is an operation which should not be triggered by external plugins and can lead to product slowdowns\\n\\n \\n\\nDetermine who invoked this, this can be determined by the invokerPluginKey tag. Reach out to the app vendor and flag this issue to them. \\n\\nAdditionally, the className tag refers to the implementation of CacheManager invoked and may be helpful. \",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cacheManager\\\",name=\\\"flushAll\\\"}[5m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Flush All Caches Rate (per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Indicates that a single cache has all of its entries removed. This may or may not cause slowdowns in products or plugins. \\n\\nCheck the frequency at which these cache removals occur and from which product. You can find out what plugin created the cache using the pluginKeyAtCreation tag. Additionally, the className tag refers to the implementation of Cache, which may be helpful. If the frequency is excessive, consider reaching out to the app vendor and flag this issue to them. \",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 5,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (tag_pluginKeyAtCreation) (rate(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cache\\\",name=\\\"removeAll\\\"}[5m]))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Remove all entries rate (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measure how many times a plugin has been disabled/enabled since uptime.\\n\\nSome caches are cleared when plugin is disabled/ enabled and this may have a short term performance impact. To understand what has been disabled/enabled, check the Universal Plugin Manager audit logs.\\nhttps://confluence.atlassian.com/upm/viewing-installed-apps-273875714.html\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 8,\n            \"gradientMode\": \"hue\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"stepBefore\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 2,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"plugin\\\",name=\\\"counter\\\",category01=\\\"enabled\\\"})\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"enabled\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"plugin\\\",name=\\\"counter\\\",category01=\\\"disabled\\\"})\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"disabled\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Plugin enabled/disabled events (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Indicates that a single entry in a cache has been reset. This may or may not cause slowdowns in products or plugins. \\n\\nCheck the frequency at which these cache resets occur and from which product. You can find out what plugin created the cache using the pluginKeyAtCreation tag. Additionally, the className tag refers to the implementation of CacedReference, which may be helpful. If the frequency is excessive, consider reaching out to the app vendor and flag this issue to them. \",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 6,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (tag_pluginKeyAtCreation) (rate(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cachedReference\\\",name=\\\"reset\\\"}[5m]))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Reset cache rate (cluster wide)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"jira\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Jira Cache Clearing\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/jira/grafana-dashboards/cluster-locks.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"expr\": \"\",\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"iconSize\": 0,\n        \"lineColor\": \"\",\n        \"name\": \"Annotations & Alerts\",\n        \"query\": \"\",\n        \"showLine\": false,\n        \"step\": \"\",\n        \"tagKeys\": \"\",\n        \"tagsField\": \"\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"textField\": \"\",\n        \"textFormat\": \"\",\n        \"titleFormat\": \"\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657798524347,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was held for. Used by Jira in a clustered environment.\\n\\nLock contention can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue. It maybe normal to have a thread holding onto a lock for a long time, if there aren\\u2019t any threads waiting for the lock - see db.cluster.lock.waited.duration to find out if there are any threads waiting for the lock.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance,tag_pluginKeyAtCreation,tag_implementation,tag_lockName) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Cluster Locks Held (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was held for. Used by Jira in a clustered environment.\\n\\nLock contention can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue. It maybe normal to have a thread holding onto a lock for a long time, if there aren\\u2019t any threads waiting for the lock - see db.cluster.lock.waited.duration to find out if there are any threads waiting for the lock.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 7,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance,tag_pluginKeyAtCreation,tag_implementation,tag_lockName) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Locks Waiting (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was held for. Used by Jira in a clustered environment.\\n\\nLock contention can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue. It maybe normal to have a thread holding onto a lock for a long time, if there aren\\u2019t any threads waiting for the lock - see db.cluster.lock.waited.duration to find out if there are any threads waiting for the lock.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 5,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without(instance,implementation, tag_lockName) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_pluginKeyAtCreation}} \",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Cluster Locks Held (over time - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a database cluster lock was waited for. Used by Jira in a clustered environment.\\n\\nIf there many threads waiting for the same lock, it can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 9\n      },\n      \"id\": 6,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without(instance,implementation, tag_lockName) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Locks Waiting (over time - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"* Average heavily weights timers from the last 5 minutes\\n\\nMeasures how long a database cluster lock was held for. Used by Jira in a clustered environment.\\n\\nIf there many threads waiting for the same lock, it can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"lock name\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 350\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Count\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 211\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"plugin key\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 383\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Avg\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 242\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 3,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"99th Percentile time\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max by (tag_lockName, tag_pluginKeyAtCreation)  (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"held\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Most locks held (cluster wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value #A\": false,\n              \"category00\": true,\n              \"category01\": true,\n              \"category02\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_lockName\": false,\n              \"tag_pluginKeyAtCreation\": false\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value #A\": \"Avg* time\",\n              \"Value #B\": \"Count\",\n              \"Value #C\": \"99th Percentile time\",\n              \"tag_lockName\": \"lock name\",\n              \"tag_pluginKeyAtCreation\": \"plugin key\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"* Average heavily weights timers from the last 5 minutes\\nMeasures how long a database cluster lock was waited for. Used by Jira in a clustered environment.\\n\\nIf there many threads waiting for the same lock, it can lead to performance degradation. Contact the vendor responsible to flag and investigate the issue.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"lock name\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 518\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Count\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 79\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"plugin key\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 278\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Avg\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 121\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 18\n      },\n      \"id\": 11,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"99th Percentile\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum by (tag_lockName, tag_pluginKeyAtCreation) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max by (tag_lockName, tag_pluginKeyAtCreation)  (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"cluster\\\",category01=\\\"lock\\\",category02=\\\"waited\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Most locks waited (cluster wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value #A\": false,\n              \"category00\": true,\n              \"category01\": true,\n              \"category02\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_lockName\": false,\n              \"tag_pluginKeyAtCreation\": false\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value #A\": \"Avg* time\",\n              \"Value #B\": \"Count\",\n              \"Value #C\": \"99th Percentile time\",\n              \"tag_lockName\": \"lock name\",\n              \"tag_pluginKeyAtCreation\": \"plugin key\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"jira\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Jira Cluster Locks\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/jira/grafana-dashboards/database-load.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"expr\": \"\",\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"iconSize\": 0,\n        \"lineColor\": \"\",\n        \"name\": \"Annotations & Alerts\",\n        \"query\": \"\",\n        \"showLine\": false,\n        \"step\": \"\",\n        \"tagKeys\": \"\",\n        \"tagsField\": \"\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"textField\": \"\",\n        \"textFormat\": \"\",\n        \"titleFormat\": \"\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657798523164,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 22,\n      \"panels\": [],\n      \"title\": \"Overall DB Execution Times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how much load a plugin is putting on the database\\n\\nThis underpins all DB operations in Jira, which means the db.ao and the db.sal metrics here are a subset.\\n\\nIf a plugin triggers SQL queries that are abnormal in quantity or duration, contact the app vendor to investigate. The invokerPluginKey tag shows which plugin is doing something that results in database queries being executed.\\n\\nThere is an optional tag that can be enabled sql which can be used for debugging exactly what the database queries are. It\\u2019s not recommended to enable this optional tag in production, it will lead to rapidly growing memory consumption.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 15,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 30,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\nsum without (instance) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"}[5m])))\\n\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Overall DB Load (last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a DB Query to be executed from being provided a SQL statement to providing the results. \\n\\nThis underpins all DB operations in Jira, which means the db.ao and the db.sal metrics here are a subset.\\n\\nIf a plugin triggers SQL queries that are abnormal in quantity or duration, contact the app vendor to investigate. The invokerPluginKey tag shows which plugin is doing something that results in database queries being executed.\\n\\nThere is an optional tag that can be enabled sql which can be used for debugging exactly what the database queries are. It\\u2019s not recommended to enable this optional tag in production, it will lead to rapidly growing memory consumption.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 14,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 24,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"Number of DB Core Executions\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg without (instance, tag_query, category00, category01) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance, tag_query, category00, category01) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance, tag_query, category00, category01) (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"DB Execution Times (Cluster Wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_templateRenderer\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value #A\": 5,\n              \"Value #B\": 6,\n              \"Value #C\": 7,\n              \"job\": 1,\n              \"name\": 2,\n              \"tag_fromPluginKey\": 4,\n              \"tag_templateRenderer\": 3\n            },\n            \"renameByName\": {\n              \"Value #A\": \"Avg* response time (ms)\",\n              \"Value #B\": \"Number of DB executions\",\n              \"Value #C\": \"99th response time (ms)\",\n              \"tag_fromPluginKey\": \"Plugin key\",\n              \"tag_invokerPluginKey\": \"Plugin Key\",\n              \"tag_templateName\": \"\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a DB Query to be executed from being provided a SQL statement to providing the results. \\n\\nThis underpins all DB operations in Jira, which means the db.ao and the db.sal metrics here are a subset.\\n\\nIf a plugin triggers SQL queries that are abnormal in quantity or duration, contact the app vendor to investigate. The invokerPluginKey tag shows which plugin is doing something that results in database queries being executed.\\n\\nThere is an optional tag that can be enabled sql which can be used for debugging exactly what the database queries are. It\\u2019s not recommended to enable this optional tag in production, it will lead to rapidly growing memory consumption.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 14,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 16\n      },\n      \"id\": 26,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_invokerPluginKey}} - {{ pod }}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"DB Execution Time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a DB Query to be executed from being provided a SQL statement to providing the results. \\n\\nThis underpins all DB operations in Jira, which means the db.ao and the db.sal metrics here are a subset.\\n\\nIf a plugin triggers SQL queries that are abnormal in quantity or duration, contact the app vendor to investigate. The invokerPluginKey tag shows which plugin is doing something that results in database queries being executed.\\n\\nThere is an optional tag that can be enabled sql which can be used for debugging exactly what the database queries are. It\\u2019s not recommended to enable this optional tag in production, it will lead to rapidly growing memory consumption.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 14,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 30\n      },\n      \"id\": 29,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_entityType) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"core\\\", name=\\\"executionTime\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cumulative count of DB executions (cluster wide) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a DB Query to be executed from being provided a SQL statement to providing the results. \\n\\nThis underpins all DB operations in Jira, which means the db.ao and the db.sal metrics here are a subset.\\n\\nIf a plugin triggers SQL queries that are abnormal in quantity or duration, contact the app vendor to investigate. The invokerPluginKey tag shows which plugin is doing something that results in database queries being executed.\\n\\nThere is an optional tag that can be enabled sql which can be used for debugging exactly what the database queries are. It\\u2019s not recommended to enable this optional tag in production, it will lead to rapidly growing memory consumption.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 14,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 30\n      },\n      \"id\": 28,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"}[5m]))) /\\n(sum without (instance) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"executionTime\\\", category00=\\\"db\\\", category01=\\\"core\\\"}[5m]))))\\n\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"DB Execution Times (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"UKZbfKl7k\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 44\n      },\n      \"id\": 15,\n      \"isNew\": false,\n      \"span\": 0,\n      \"title\": \"AO's EntityManager by method\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 45\n      },\n      \"id\": 2,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"}[5m]))))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}} - {{name}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Load via AO's EntityManager (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 45\n      },\n      \"id\": 31,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"}[5m])))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}} - {{name}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via AO's EntityManager (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures the total count of AO operations (create, find, delete, deleteWithSQL, get, stream, count) by the plugins.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 53\n      },\n      \"id\": 20,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_entityType) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}} - {{name}} \",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cumulative count using AO's EntityManager (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 53\n      },\n      \"id\": 6,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", category02=\\\"entityManager\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}} - {{name}} - {{tag_entityType}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via AO's EntityManager (p99)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 61\n      },\n      \"id\": 13,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"AO's executeInTransaction\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 62\n      },\n      \"id\": 32,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m]))))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Load via AO's executeInTransaction (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 62\n      },\n      \"id\": 33,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))) /\\n(sum without (instance, tag_taskName) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via AO's executeInTransaction (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 70\n      },\n      \"id\": 34,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cumulative count using AO's executeInTransaction (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 70\n      },\n      \"id\": 35,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}} - {{tag_taskName}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via AO's executeInTransaction (p99)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO transaction takes, when executed inside the TransactionCallBack. This is mainly used by Confluence plugins.\\n\\nThe transaction can have many AO operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 78\n      },\n      \"id\": 3,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName, tag_invokerPluginKey) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"executeInTransaction\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total active operations running  via AO's executeInTransaction (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO transaction takes, when executed inside the TransactionCallBack. This is mainly used by Confluence plugins.\\n\\nThe transaction can have many AO operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 78\n      },\n      \"id\": 8,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"executeInTransaction\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active operations running via AO's executeInTransaction (over time - active count)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 86\n      },\n      \"id\": 17,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"SAL's transactionalExecutor\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 87\n      },\n      \"id\": 36,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"}[5m]))))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Load via SAL's transactionalExecutor (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 87\n      },\n      \"id\": 38,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_taskName) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))) /\\n(sum without (instance, tag_taskName) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"ao\\\", name=\\\"executeInTransaction\\\"}[5m])))\\n\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via SAL's transactionalExecutor (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 95\n      },\n      \"id\": 37,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cumulative count using SAL's transactionalExecutor (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an AO operation (create, find, delete, deleteWithSQL, get, stream, count) that uses the Entity Manager takes.\\n\\nThe operation query might be long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 5000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 95\n      },\n      \"id\": 39,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"sal\\\", name=\\\"transactionalExecutor\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Operation times via SAL's transactionalExecutor (p99)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an SAL transaction takes, when executed inside the DefaultTransactionalExecutor.\\n\\nThe transaction can have many SAL operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 103\n      },\n      \"id\": 18,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_taskName, tag_invokerPluginKey) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"sal\\\",name=\\\"transactionalExecutor\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total active operations running  via SAL's transactionalExecutor (current - cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an SAL transaction takes, when executed inside the DefaultTransactionalExecutor.\\n\\nThe transaction can have many SAL operations, it can be either there are too many operations or the query is long running, or the database is under load. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 103\n      },\n      \"id\": 19,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"sal\\\",name=\\\"transactionalExecutor\\\",tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active operations using SAL's transactionalExecutor (over time - active count)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 111\n      },\n      \"id\": 11,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"AO upgrade tasks\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an App is taking to upgrade a part of the data that it stores in the database.\\n\\nUpgrade tasks happen when an App is both updated and enabled, during this time the App\\u2019s functionality will probably be unavailable, and it may temporarily increase load on the database and the node the upgrade task is running on.\\n\\nIf an App stores a lot of data in database then this may take a while to run, if possible, try to schedule upgrading Apps with large amounts of data in off-peak hours.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 112\n      },\n      \"id\": 7,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance, tag_fromPluginKey, tag_taskName) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"upgradeTask\\\",tag_statistic=\\\"active\\\",tag_subCategory=\\\"current\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"AO Upgrade Tasks - (current - active count)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long an App is taking to upgrade a part of the data that it stores in the database.\\n\\nUpgrade tasks happen when an App is both updated and enabled, during this time the App\\u2019s functionality will probably be unavailable, and it may temporarily increase load on the database and the node the upgrade task is running on.\\n\\nIf an App stores a lot of data in database then this may take a while to run, if possible, try to schedule upgrading Apps with large amounts of data in off-peak hours.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 112\n      },\n      \"id\": 9,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\",category01=\\\"ao\\\",name=\\\"upgradeTask\\\",tag_statistic=\\\"active\\\",tag_subCategory=\\\"current\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{ tag_invokerPluginKey }} - {{tag_taskName}} (task)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"AO Upgrade Tasks - (over time - active count)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"jira\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Jira Database Load\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/jira/grafana-dashboards/general.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"expr\": \"\",\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"iconSize\": 0,\n        \"lineColor\": \"\",\n        \"name\": \"Annotations & Alerts\",\n        \"query\": \"\",\n        \"showLine\": false,\n        \"step\": \"\",\n        \"tagKeys\": \"\",\n        \"tagsField\": \"\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"textField\": \"\",\n        \"textFormat\": \"\",\n        \"titleFormat\": \"\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657599555120,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"decimals\": 0,\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"0\": {\n                  \"color\": \"red\",\n                  \"index\": 1,\n                  \"text\": \"DOWN\"\n                },\n                \"1\": {\n                  \"color\": \"green\",\n                  \"index\": 0,\n                  \"text\": \"UP\"\n                }\n              },\n              \"type\": \"value\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"format\": \"\",\n      \"gauge\": {\n        \"maxValue\": 0,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 22,\n      \"isNew\": false,\n      \"nullPointMode\": \"\",\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"content\": \"\",\n        \"displayMode\": \"\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"mode\": \"\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"sparkline\": {},\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"up{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Status\",\n      \"type\": \"stat\",\n      \"valueFontSize\": \"\",\n      \"valueName\": \"\"\n    },\n    {\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"decimals\": 0,\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"dthms\"\n        },\n        \"overrides\": []\n      },\n      \"format\": \"\",\n      \"gauge\": {\n        \"maxValue\": 0,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 21,\n      \"isNew\": false,\n      \"nullPointMode\": \"\",\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"content\": \"\",\n        \"displayMode\": \"\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"mode\": \"\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"sparkline\": {},\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"time() - process_start_time_seconds{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Uptime\",\n      \"type\": \"stat\",\n      \"valueFontSize\": \"\",\n      \"valueName\": \"\"\n    },\n    {\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"decimals\": 0,\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"dateTimeAsIso\"\n        },\n        \"overrides\": []\n      },\n      \"format\": \"\",\n      \"gauge\": {\n        \"maxValue\": 0,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 23,\n      \"isNew\": false,\n      \"nullPointMode\": \"\",\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"content\": \"\",\n        \"displayMode\": \"\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"mode\": \"\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"sparkline\": {},\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_Runtime_StartTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Start time\",\n      \"type\": \"stat\",\n      \"valueFontSize\": \"\",\n      \"valueName\": \"\"\n    },\n    {\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"decimals\": 0,\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"format\": \"\",\n      \"gauge\": {\n        \"maxValue\": 0,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 0\n      },\n      \"id\": 24,\n      \"isNew\": false,\n      \"nullPointMode\": \"\",\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"content\": \"\",\n        \"displayMode\": \"\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"mode\": \"\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"sparkline\": {},\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"java_lang_OperatingSystem_AvailableProcessors{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"CPU Cores\",\n      \"type\": \"stat\",\n      \"valueFontSize\": \"\",\n      \"valueName\": \"\"\n    },\n    {\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 5,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 28,\n      \"isNew\": false,\n      \"options\": {\n        \"alertName\": \"\",\n        \"dashboardAlerts\": true,\n        \"dashboardTitle\": \"\",\n        \"maxItems\": 10,\n        \"showOptions\": \"changes\",\n        \"sortOrder\": 5,\n        \"stateFilter\": {\n          \"alerting\": false,\n          \"execution_error\": false,\n          \"no_data\": false,\n          \"ok\": false,\n          \"paused\": false,\n          \"pending\": false\n        },\n        \"tags\": []\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"exemplar\": true,\n          \"expr\": \"java_lang_OperatingSystem_AvailableProcessors{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          }\n        }\n      ],\n      \"title\": \"Recent Alerts\",\n      \"type\": \"alertlist\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 8,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 0\n      },\n      \"id\": 33,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(jvm_gc_collection_seconds_sum{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[5m])\",\n          \"format\": \"time_series\",\n          \"interval\": \"60s\",\n          \"legendFormat\": \"{{gc}} - {{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"GC Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"alert\": {\n        \"conditions\": [\n          {\n            \"evaluator\": {\n              \"params\": [\n                80\n              ],\n              \"type\": \"gt\"\n            },\n            \"operator\": {\n              \"type\": \"and\"\n            },\n            \"query\": {\n              \"params\": [\n                \"A\",\n                \"5m\",\n                \"now\"\n              ]\n            },\n            \"reducer\": {\n              \"type\": \"avg\"\n            },\n            \"type\": \"query\"\n          }\n        ],\n        \"executionErrorState\": \"alerting\",\n        \"for\": \"5m\",\n        \"frequency\": \"1m\",\n        \"handler\": 1,\n        \"message\": \"CPU > 80%\",\n        \"name\": \"CPU alert\",\n        \"noDataState\": \"no_data\",\n        \"notifications\": [\n          {\n            \"disableResolveMessage\": false,\n            \"frequency\": \"\",\n            \"isDefault\": false,\n            \"name\": \"\",\n            \"sendReminder\": false,\n            \"type\": \"\"\n          }\n        ]\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 40\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 6,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(java_lang_OperatingSystem_ProcessCpuLoad{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} * 1000)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"cpu load - {{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"alert\": {\n        \"conditions\": [\n          {\n            \"evaluator\": {\n              \"params\": [\n                80\n              ],\n              \"type\": \"gt\"\n            },\n            \"operator\": {\n              \"type\": \"and\"\n            },\n            \"query\": {\n              \"params\": [\n                \"A\",\n                \"5m\",\n                \"now\"\n              ]\n            },\n            \"reducer\": {\n              \"type\": \"avg\"\n            },\n            \"type\": \"query\"\n          }\n        ],\n        \"executionErrorState\": \"alerting\",\n        \"for\": \"5m\",\n        \"frequency\": \"1m\",\n        \"handler\": 1,\n        \"message\": \"Memory > 80%\",\n        \"name\": \"Heap Used % alert\",\n        \"noDataState\": \"no_data\",\n        \"notifications\": [\n          {\n            \"disableResolveMessage\": false,\n            \"frequency\": \"\",\n            \"isDefault\": false,\n            \"name\": \"\",\n            \"sendReminder\": false,\n            \"type\": \"\"\n          }\n        ]\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 7\n      },\n      \"id\": 8,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"100*(jvm_memory_bytes_used{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"}/jvm_memory_bytes_max{namespace=\\\"$namespace\\\", service=\\\"$service\\\", area=\\\"heap\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Used {{ area }} - {{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Heap Used %\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 60\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 7,\n        \"x\": 17,\n        \"y\": 10\n      },\n      \"id\": 34,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(jvm_gc_collection_seconds_count{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[5m])\",\n          \"format\": \"time_series\",\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{gc}} - {{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"GC Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"index\": 0,\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 10\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 5,\n        \"x\": 12,\n        \"y\": 11\n      },\n      \"id\": 18,\n      \"isNew\": false,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"text\": {}\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"jvm_threads_state{namespace=\\\"$namespace\\\", service=\\\"$service\\\", state=\\\"BLOCKED\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{ state }}\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Blocked Threads\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"collapsed\": false,\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 32,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"Tomcat\",\n      \"type\": \"row\"\n    },\n    {\n      \"alert\": {\n        \"conditions\": [\n          {\n            \"evaluator\": {\n              \"params\": [\n                90\n              ],\n              \"type\": \"gt\"\n            },\n            \"operator\": {\n              \"type\": \"and\"\n            },\n            \"query\": {\n              \"params\": [\n                \"A\",\n                \"5m\",\n                \"now\"\n              ]\n            },\n            \"reducer\": {\n              \"type\": \"avg\"\n            },\n            \"type\": \"query\"\n          }\n        ],\n        \"executionErrorState\": \"alerting\",\n        \"for\": \"5m\",\n        \"frequency\": \"1m\",\n        \"handler\": 1,\n        \"message\": \"Tomcat threads available < 10%\",\n        \"name\": \"Tomcat Threads alert\",\n        \"noDataState\": \"no_data\",\n        \"notifications\": [\n          {\n            \"disableResolveMessage\": false,\n            \"frequency\": \"\",\n            \"isDefault\": false,\n            \"name\": \"\",\n            \"sendReminder\": false,\n            \"type\": \"\"\n          }\n        ]\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 80\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 20,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 19,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"( Catalina_ThreadPool_currentThreadCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"} / Catalina_ThreadPool_maxThreads{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}) * 100\",\n          \"interval\": \"\",\n          \"legendFormat\": \"used - {{ pod }} ({{name}})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat Threads\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 20\n      },\n      \"id\": 25,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[5m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} count - {{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat Request Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 20\n      },\n      \"id\": 37,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_errorCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[5m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} error - {{ pod }}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Tomcat Error Count\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 31\n      },\n      \"id\": 26,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"increase(Catalina_GlobalRequestProcessor_processingTime{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m]) / increase(Catalina_GlobalRequestProcessor_requestCount{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[10m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{name}} - {{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tomcat Request Processing Time\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 18,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 31\n      },\n      \"id\": 27,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"Catalina_Manager_activeSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"active sessions: {{ pod }}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"Catalina_Manager_rejectedSessions{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"rejected sessions: {{ pod }}\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Tomcat Sessions\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 40\n      },\n      \"id\": 30,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"Database\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"alert\": {\n        \"alertRuleTags\": {},\n        \"conditions\": [\n          {\n            \"evaluator\": {\n              \"params\": [\n                80\n              ],\n              \"type\": \"gt\"\n            },\n            \"operator\": {\n              \"type\": \"and\"\n            },\n            \"query\": {\n              \"params\": [\n                \"A\",\n                \"5m\",\n                \"now\"\n              ]\n            },\n            \"reducer\": {\n              \"params\": [],\n              \"type\": \"avg\"\n            },\n            \"type\": \"query\"\n          }\n        ],\n        \"executionErrorState\": \"alerting\",\n        \"for\": \"5m\",\n        \"frequency\": \"1m\",\n        \"handler\": 1,\n        \"message\": \"Connection Pool utilisation > 80%\",\n        \"name\": \"Connection Pool Utilisation alert\",\n        \"noDataState\": \"no_data\",\n        \"notifications\": [\n          {\n            \"disableResolveMessage\": false,\n            \"frequency\": \"\",\n            \"isDefault\": false,\n            \"name\": \"\",\n            \"sendReminder\": false,\n            \"type\": \"\"\n          }\n        ]\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {\n            \"drawStyle\": \"line\",\n            \"lineInterpolation\": \"linear\",\n            \"barAlignment\": 0,\n            \"lineWidth\": 1,\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"spanNulls\": false,\n            \"showPoints\": \"never\",\n            \"pointSize\": 5,\n            \"stacking\": {\n              \"mode\": \"none\",\n              \"group\": \"A\"\n            },\n            \"axisPlacement\": \"auto\",\n            \"axisLabel\": \"\",\n            \"axisColorMode\": \"text\",\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"axisCenteredZero\": false,\n            \"hideFrom\": {\n              \"tooltip\": false,\n              \"viz\": false,\n              \"legend\": false\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            },\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            }\n          },\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 41\n      },\n      \"id\": 10,\n      \"isNew\": false,\n      \"options\": {\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        },\n        \"legend\": {\n          \"showLegend\": true,\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"calcs\": []\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"(com_atlassian_jira_BasicDataSource_NumActive{namespace=\\\"$namespace\\\", service=\\\"$service\\\", connectionpool=\\\"connections\\\"} / com_atlassian_jira_BasicDataSource_MaxTotal{namespace=\\\"$namespace\\\", service=\\\"$service\\\", connectionpool=\\\"connections\\\"}) * 100\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [\n        {\n          \"colorMode\": \"critical\",\n          \"op\": \"gt\",\n          \"value\": 80,\n          \"visible\": true\n        }\n      ],\n      \"title\": \"Connection Pool Utilisation\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {\n            \"drawStyle\": \"line\",\n            \"lineInterpolation\": \"linear\",\n            \"barAlignment\": 0,\n            \"lineWidth\": 1,\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"spanNulls\": false,\n            \"showPoints\": \"never\",\n            \"pointSize\": 5,\n            \"stacking\": {\n              \"mode\": \"none\",\n              \"group\": \"A\"\n            },\n            \"axisPlacement\": \"auto\",\n            \"axisLabel\": \"\",\n            \"axisColorMode\": \"text\",\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"axisCenteredZero\": false,\n            \"hideFrom\": {\n              \"tooltip\": false,\n              \"viz\": false,\n              \"legend\": false\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            },\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            }\n          },\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 41\n      },\n      \"id\": 35,\n      \"isNew\": false,\n      \"options\": {\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        },\n        \"legend\": {\n          \"showLegend\": true,\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"calcs\": []\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_BasicDataSource_NumActive{namespace=\\\"$namespace\\\", service=\\\"$service\\\", connectionpool=\\\"connections\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"active - {{ pod }}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_BasicDataSource_NumIdle{namespace=\\\"$namespace\\\", service=\\\"$service\\\", connectionpool=\\\"connections\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"idle - {{ pod }}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Connection Pool\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {\n            \"drawStyle\": \"line\",\n            \"lineInterpolation\": \"linear\",\n            \"barAlignment\": 0,\n            \"lineWidth\": 1,\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"spanNulls\": false,\n            \"showPoints\": \"never\",\n            \"pointSize\": 5,\n            \"stacking\": {\n              \"mode\": \"none\",\n              \"group\": \"A\"\n            },\n            \"axisPlacement\": \"auto\",\n            \"axisLabel\": \"\",\n            \"axisColorMode\": \"text\",\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"axisCenteredZero\": false,\n            \"hideFrom\": {\n              \"tooltip\": false,\n              \"viz\": false,\n              \"legend\": false\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            },\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            }\n          },\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 41\n      },\n      \"id\": 36,\n      \"isNew\": false,\n      \"options\": {\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        },\n        \"legend\": {\n          \"showLegend\": true,\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"calcs\": []\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"delta(com_atlassian_jira_db_reads_invocation_count{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[5m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"reads - {{ pod }}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"delta(com_atlassian_jira_db_writes_invocation_count{namespace=\\\"$namespace\\\", service=\\\"$service\\\"}[5m])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"writes - {{ pod }}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Reads / Writes\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {\n            \"drawStyle\": \"line\",\n            \"lineInterpolation\": \"linear\",\n            \"barAlignment\": 0,\n            \"lineWidth\": 1,\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"spanNulls\": false,\n            \"showPoints\": \"auto\",\n            \"pointSize\": 5,\n            \"stacking\": {\n              \"mode\": \"none\",\n              \"group\": \"A\"\n            },\n            \"axisPlacement\": \"auto\",\n            \"axisLabel\": \"\",\n            \"axisColorMode\": \"text\",\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"axisCenteredZero\": false,\n            \"hideFrom\": {\n              \"tooltip\": false,\n              \"viz\": false,\n              \"legend\": false\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 41\n      },\n      \"id\": 41,\n      \"options\": {\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        },\n        \"legend\": {\n          \"showLegend\": true,\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"calcs\": []\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"builder\",\n          \"expr\": \"com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"db\\\", category01=\\\"connection\\\", category02=\\\"latency\\\"}\",\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Database Latency\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"jira\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Jira General\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/jira/grafana-dashboards/indexing.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657798901462,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 15,\n      \"panels\": [],\n      \"title\": \"Issue indexing\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for an Issue to be reindexed across the cluster\\n\\nIf a plugin triggers Issue reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Issue reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"ReIndex\\\", category00=\\\"issue\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"ReIndex\\\", category00=\\\"issue\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"ReIndex\\\", category00=\\\"issue\\\"}[5m])))\\n\",\n          \"interval\": \"\",\n          \"legendFormat\": \"ReIndex operation\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Issue Reindex (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a Comment to be reindexed by a plugin.\\n\\n\\t\\nIf a plugin triggers Comment reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Comment reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 1\n      },\n      \"id\": 18,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"comment\\\", name=\\\"reindexing\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"comment\\\", name=\\\"reindexing\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"comment\\\", name=\\\"reindexing\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Comment Reindexing by Plugin (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes on average for Issues to be reindexed across the cluster.\\n\\nIf a plugin triggers Issue reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Issue reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 11\n      },\n      \"id\": 13,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"reindexing\\\", category00=\\\"issue\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"reindexing\\\", category00=\\\"issue\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"reindexing\\\", category00=\\\"issue\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Issue Reindexing by Plugin (mean last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a Comment to be reindexed by a plugin.\\n\\n\\t\\nIf a plugin triggers Comment reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Comment reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 11\n      },\n      \"id\": 17,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"comment\\\", name=\\\"reindexing\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Comment Reindexing by Plugin (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a Comment to be reindexed by a plugin.\\n\\n\\t\\nIf a plugin triggers Comment reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Comment reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 11\n      },\n      \"id\": 16,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"avg without (instance) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"comment\\\", name=\\\"reindexing\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Comment Reindexing by Plugin (count - cluster wide)\",\n      \"transformations\": [],\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for an Issue to be reindexed per node\\n\\nIf a plugin triggers Issue reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Issue reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 21\n      },\n      \"id\": 12,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"issue\\\", name=\\\"reindexing\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Issue Reindexing by Plugin (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for an Issue to be reindexed across the cluster\\n\\nIf a plugin triggers Issue reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Issue reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 21\n      },\n      \"id\": 19,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"issue\\\", name=\\\"reindexing\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Issue Reindexing by Plugin (count - cluster wide)\",\n      \"transformations\": [],\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Shows how many Comment operations are currently active.\\n\\nIf a plugin triggers Comment reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Comment reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 21\n      },\n      \"id\": 21,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without(instance, tag_invokerPluginKey) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"comment\\\", name=\\\"reindexing\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Comment Reindexing Operations - (cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Shows how many Issue operations are currently active.\\n\\nIf a plugin triggers Comment reindexing that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the Comment reindexing using the invokerPluginKey tag.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 10,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 22,\n      \"options\": {\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without(instance, tag_invokerPluginKey) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"issue\\\", name=\\\"reindexing\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Active Issue Reindexing Operations - (cluster wide)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 41\n      },\n      \"id\": 6,\n      \"panels\": [],\n      \"title\": \"Custom fields indexing\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long custom field indexing takes and it's impact on indexing in general. High indexing times means the plugin has introduced a field that is impacting the performance of Jira and should be investigated.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 42\n      },\n      \"id\": 2,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg without (instance) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"addIndex\\\", category01=\\\"field\\\"})\\n\\n\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance) (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"addIndex\\\", category01=\\\"field\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Custom fields indexing times (cluster-wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"__name__\": true,\n              \"category00\": true,\n              \"category01\": true,\n              \"instance\": false,\n              \"job\": true,\n              \"name\": true\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value #A\": \"Avg indexing time\",\n              \"Value #B\": \"99th percentile indexing time\",\n              \"name\": \"\",\n              \"tag_fieldId\": \"Field Id\",\n              \"tag_fieldName\": \"Field Name\",\n              \"tag_fromPluginKey\": \"Plugin key\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long custom field indexing takes and it's impact on indexing in general. High indexing times means the plugin has introduced a field that is impacting the performance of Jira and should be investigated.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 42\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"addIndex\\\", category01=\\\"field\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"addIndex\\\", category01=\\\"field\\\"}[5m])))) /\\n(sum without (instance) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"addIndex\\\", category01=\\\"field\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} - {{tag_fromPluginKey}} - {{tag_fieldId}} \",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Custom field indexing time (mean last 5 minutes - cluster wide) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures the total accumulated indexing time per plugin by summing all the custom fields indexing metrics. \\n\\nHigh indexing time needs to be investigated and flagged to the app vendor.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 51\n      },\n      \"id\": 10,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (tag_fromPluginKey) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"addIndex\\\", category01=\\\"field\\\"}) + sum by (tag_fromPluginKey) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"isFieldIndexableForIssue\\\", category01=\\\"field\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \" {{ pod }} {{tag_fromPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Custom field total indexing time by plugin (cluster wide)\",\n      \"transformations\": [],\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"jira\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Jira Indexing\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/jira/grafana-dashboards/response-times.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"expr\": \"\",\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"iconSize\": 0,\n        \"lineColor\": \"\",\n        \"name\": \"Annotations & Alerts\",\n        \"query\": \"\",\n        \"showLine\": false,\n        \"step\": \"\",\n        \"tagKeys\": \"\",\n        \"tagsField\": \"\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"textField\": \"\",\n        \"textFormat\": \"\",\n        \"titleFormat\": \"\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657798955387,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 36,\n      \"panels\": [],\n      \"title\": \"Search (backed by Lucene) evaluation times\",\n      \"type\": \"row\"\n    },\n    {\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 45,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\nsum without (instance) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\",name=\\\"index\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\",name=\\\"index\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Search load - (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a Lucene index search to take place. \\n\\nIf a plugin triggers searches that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the index searches using the invokerPluginKey tag \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 1\n      },\n      \"id\": 41,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"Number of template renders\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg without (instance, tag_query, category00) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"index\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance, tag_query, category00) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"index\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance, tag_query, category00) (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"index\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Search evaluations (cluster-wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_templateRenderer\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value #A\": 5,\n              \"Value #B\": 6,\n              \"Value #C\": 7,\n              \"job\": 1,\n              \"name\": 2,\n              \"tag_fromPluginKey\": 4,\n              \"tag_templateRenderer\": 3\n            },\n            \"renameByName\": {\n              \"Value #A\": \"Avg* evaluation time (ms)\",\n              \"Value #B\": \"Number of searches\",\n              \"Value #C\": \"99th evaluation time (ms)\",\n              \"tag_fromPluginKey\": \"Plugin key\",\n              \"tag_invokerPluginKey\": \"Plugin key\",\n              \"tag_templateName\": \"\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 47,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum without (instance) (increase(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"index\\\"}[5m]))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{ tag_invokerPluginKey }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Searches count (last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long it takes for a Lucene index search to take place. \\n\\nIf a plugin triggers searches that are abnormal in quantity or duration then contact the app vendor to investigate. You can find out which plugin is responsible for the index searches using the invokerPluginKey tag \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 9\n      },\n      \"id\": 38,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"search\\\", name=\\\"index\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_invokerPluginKey}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Search evaluation times (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 16,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"Web fragment condition evaluation times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long web fragment condition will take to determine whether a web fragment should be displayed or not.\\n\\nWeb fragments conditions determine whether a link or a section on a page should be displayed. Slow web fragment conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 17,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}[5m])))) /\\n(sum without (instance) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Web fragment condition evaluation time (mean - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long web fragment condition will take to determine whether a web fragment should be displayed or not.\\n\\nWeb fragments conditions determine whether a link or a section on a page should be displayed. Slow web fragment conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 19\n      },\n      \"id\": 6,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"fragment\\\", name=\\\"condition\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Web fragment condition evaluation time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 28\n      },\n      \"id\": 31,\n      \"panels\": [],\n      \"title\": \"Soy web panel render times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a Soy Template web panel is taking to render.\\n\\nThe template renderer might be long-running. If there is a plugin with a slow Soy renderer it might be worth adding (tag__templateName) to the query and contacting the vendor responsible to investigate if long-running queries are expected.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 18,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 29\n      },\n      \"id\": 25,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"Number of template renders\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"avg without (instance, tag_templateName) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance, tag_templateName) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance, tag_templateName) (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Soy web panel render times (cluster-wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_templateRenderer\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value #A\": 5,\n              \"Value #B\": 6,\n              \"Value #C\": 7,\n              \"job\": 1,\n              \"name\": 2,\n              \"tag_fromPluginKey\": 4,\n              \"tag_templateRenderer\": 3\n            },\n            \"renameByName\": {\n              \"Value #A\": \"Avg* response time (ms)\",\n              \"Value #B\": \"Number of template renders\",\n              \"Value #C\": \"99th response time (ms)\",\n              \"tag_fromPluginKey\": \"Plugin key\",\n              \"tag_templateName\": \"\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a Soy Template web panel is taking to render.\\n\\nThe template renderer might be long running. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 29\n      },\n      \"id\": 3,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_templateName}} (template)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Soy web panel render time (mean of last 5 minutes - cluster wide) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a Soy Template web panel is taking to render.\\n\\nThe template renderer might be long running. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 38\n      },\n      \"id\": 18,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"soy\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{tag_fromPluginKey}} - {{tag_templateName}}__{{ pod }} (template)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Soy web panel render time (p99 - per node) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 47\n      },\n      \"id\": 12,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"Web panel render times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a Velocity template web panel is taking to render.\\n\\nThe template renderer might be long running. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 18,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 48\n      },\n      \"id\": 34,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": []\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"topk(500, avg without (instance, tag_templateName) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"velocity\\\"}) )\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance, tag_templateName) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"velocity\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance, tag_templateName) (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"velocity\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Velocity web panel render times (cluster-wide)\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_templateRenderer\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value #A\": 5,\n              \"Value #B\": 6,\n              \"Value #C\": 7,\n              \"job\": 1,\n              \"name\": 2,\n              \"tag_fromPluginKey\": 4,\n              \"tag_templateRenderer\": 3\n            },\n            \"renameByName\": {\n              \"Value #A\": \"Avg* response time (ms)\",\n              \"Value #B\": \"Number of template renders\",\n              \"Value #C\": \"99th response time (ms)\",\n              \"tag_fromPluginKey\": \"Plugin key\",\n              \"tag_templateName\": \"\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a Velocity template web panel is taking to render.\\n\\nThe template renderer might be long running. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": [\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"com.green.alien - admin.vm (template)\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 48\n      },\n      \"id\": 13,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"velocity\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"velocity\\\"}[5m])))) /\\n(sum without (instance) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"velocity\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_templateName}} (template)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"velocity web panel response time (mean of last 5 minutes - cluster wide) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a Velocity template web panel is taking to render.\\n\\nThe template renderer might be long running. Contact the vendor responsible and investigate if long running queries are expected.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 57\n      },\n      \"id\": 14,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"topk(5, com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"webTemplateRenderer\\\",tag_templateRenderer=\\\"velocity\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_templateName}} (template)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"velocity web panel response time (p99 - per node) \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 66\n      },\n      \"id\": 10,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"Web resource evaluation times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long web resource condition will take to determine whether a resource should be displayed or not.\\n\\nSlow web resource conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 67\n      },\n      \"id\": 5,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"avg without (instance) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"resource\\\", name=\\\"condition\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"web resource condition evaluation time (mean - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long web resource condition will take to determine whether a resource should be displayed or not.\\n\\nSlow web resource conditions lead to slow page load times especially if they are not cached. Reach out to the app vendor responsible to flag and investigate. \",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 60000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 67\n      },\n      \"id\": 19,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"topk(5, com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"web\\\", category01=\\\"resource\\\", name=\\\"condition\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_conditionClassName}} (condition)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"web resource condition evaluation time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"editable\": false,\n      \"error\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 76\n      },\n      \"id\": 21,\n      \"isNew\": false,\n      \"panels\": [],\n      \"span\": 0,\n      \"title\": \"REST response times\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Use this table to quickly identify the slowest calls and some outliers using the 99th percentile response time. Use this table to figure out which endpoint to investigate then correlate it with the other timeseries panels for more detailed diagnosis \",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"displayMode\": \"auto\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 26,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 77\n      },\n      \"id\": 27,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"Requests count\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"8.3.6\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"topk(500, avg without (instance) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max without (instance) (com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Most requested endpoints & response time\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"category00\": true,\n              \"category01\": true,\n              \"job\": true,\n              \"name\": true,\n              \"tag_path\": true\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value #A\": \"AVG response time (ms)\",\n              \"Value #B\": \"Requests count\",\n              \"Value #C\": \"99th response time (ms)\",\n              \"job\": \"\",\n              \"tag_action\": \"Action\",\n              \"tag_fromPluginKey\": \"Plugin Key\",\n              \"tag_path\": \"Path\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures HTTP responses of the REST APIs that uses the atlassian-rest module.\\n\\nCheck the frequency and duration of the rest requests. If excessive or very slow, consider reaching out to the app vendor and flag this issue to them.\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 30000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 77\n      },\n      \"id\": 22,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_entityType) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}[5m])))) /\\n(sum without (instance, tag_entityType) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"}[5m])))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_path}} (path)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP REST response time (mean of last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures HTTP response of the REST APIs that uses the atlassian-rest module.\\n\\nCheck the frequency and duration of the rest requests. If excessive or very slow, consider reaching out to the app vendor and flag this issue to the\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 30000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 86\n      },\n      \"id\": 23,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"topk(5, com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"rest\\\", name=\\\"request\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}} - {{tag_path}} (path)\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP REST response time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"A timeseries of plugins REST average response times regardless of which node they are running on\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 95\n      },\n      \"id\": 29,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"avg without (instance, tag_path, tag_action) (com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\",category01=\\\"rest\\\", name=\\\"request\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_fromPluginKey}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP REST average response time per plugin\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 103\n      },\n      \"id\": 43,\n      \"panels\": [],\n      \"title\": \"HTTP Requests via SAL\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures HTTP requests of the given unique URL that uses atlassian-sal module. \\n\\nCheck the frequency and duration of the http requests. If excessive or very slow, consider reaching out to the app vendor and flag this issue to them. You could also enable url optional tag to identify which urls are causing the issue, you can do so by setting a system variable like so atlassian.metrics.optional.tags.http.sal.request=url\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 30000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 104\n      },\n      \"id\": 32,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# We do this because the average of averages is not the real average. We must weigh them by the count\\n(sum without (instance, tag_action) ((com_atlassian_jira_metrics_Mean{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"sal\\\", name=\\\"request\\\"}) * \\n(delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"sal\\\", name=\\\"request\\\"}[5m])))) /\\n(sum without (instance, tag_action) (delta(com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"sal\\\", name=\\\"request\\\"}[5m])))\\n\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP SAL request time (mean of last 5 minutes - cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures HTTP requests of the given unique URL that uses atlassian-sal module. \\n\\nCheck the frequency and duration of the http requests. If excessive or very slow, consider reaching out to the app vendor and flag this issue to them. You could also enable url optional tag to identify which urls are causing the issue, you can do so by setting a system variable like so atlassian.metrics.optional.tags.http.sal.request=url\",\n      \"editable\": false,\n      \"error\": false,\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 5,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 30000\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 104\n      },\n      \"id\": 33,\n      \"isNew\": false,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"span\": 0,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"topk(5, com_atlassian_jira_metrics_99thPercentile{namespace=\\\"$namespace\\\", service=\\\"$service\\\", category00=\\\"http\\\", category01=\\\"sal\\\", name=\\\"request\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{ pod }} {{tag_pluginKeyAtCreation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"HTTP SAL request time (p99 - per node)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"jira\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Jira Response Times\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/jira/grafana-dashboards/tasks.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1657599968575,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long a task in queue is taking. Generally used for email queues or specific short running task\\n\\nCheck the duration of the task and if it\\u2019s taking too long look for the queueName and pluginKey to identify the source then react out to app vendor to flag this issue.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Count{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"task\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Task Count (cluster wide)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Measures how long the long running tasks are taking.\\n\\nCheck the duration of the task and if it\\u2019s taking too long, look for the taskClass and pluginKey to identify the source then react out to app vendor to flag this issue.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\"\n        },\n        \"tooltip\": {\n          \"mode\": \"single\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"sum without (instance) (com_atlassian_jira_metrics_Value{namespace=\\\"$namespace\\\", service=\\\"$service\\\", name=\\\"longRunningTask\\\", tag_statistic=\\\"active\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Long Running Task Count (cluster wide)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"jira\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Data Source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/namespace=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"com_atlassian_jira_issue_assigned_count_Value\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"com_atlassian_jira_issue_assigned_count_Value\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"/service=\\\"([^\\\"]*)\\\"/\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Jira Tasks\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "src/main/charts/jira/templates/NOTES.txt",
    "content": "Thank you for installing {{ title .Chart.Name }}.\n\nYour release is named {{ .Release.Name }}, and resides in namespace {{ .Release.Namespace }}.\n\nPlease run sanity tests against the release to verify it's healthy:\n\n  $ helm test {{ .Release.Name }} -n {{ .Release.Namespace }}\n\nIf the Kubernetes resources in the release are still starting up, then the tests may fail, so it\nis advisable to wait for the tests to pass before continuing.\n\nTo see the custom values you used for this release:\n\n  $ helm get values {{ .Release.Name }} -n {{ .Release.Namespace }}\n\n{{- if eq (include \"common.gateway.isConfigured\" .) \"true\" -}}\n{{ title .Chart.Name }} service URL: {{ include \"common.gateway.origin\" . }}{{ include \"jira.path\" . }}\n{{- else }}\nGet the {{ title .Chart.Name }} URL by running these commands in the same shell:\n{{- if contains \"NodePort\" .Values.jira.service.type }}\n  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ .Release.Name }})\n  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n  echo http://$NODE_IP:$NODE_PORT\n{{- else if contains \"LoadBalancer\" .Values.jira.service.type }}\n  NOTE: It may take a few minutes for the LoadBalancer hostname to be available.\n        You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ .Release.Name }}'\n\n  export SERVICE_HOSTNAME=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ .Release.Name }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n  echo http://$SERVICE_HOSTNAME:{{ .Values.jira.service.port }}\n{{- else if contains \"ClusterIP\" .Values.jira.service.type }}\n  Step 1: Get the pod name\n    $ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"app.kubernetes.io/instance={{ .Release.Name }}\" -o jsonpath=\"{.items[0].metadata.name}\")\n  Step 2 (Optional): Check if the pod name has been exported successfully and the pod status\n    $ echo POD_NAME: $POD_NAME && echo POD_STATUS: $(kubectl get pod $POD_NAME -o jsonpath='{.status.phase}')\n  Step 3: Wait for pods up and running, then forward pod port to localhost\n    $ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME {{ .Values.jira.ports.http }}\n  Step 4: Access {{ title .Chart.Name }} on localhost:\n    http://localhost:{{ .Values.jira.ports.http }}\n{{- end }}\n{{- end }}\n{{- if not ( or .Values.volumes.localHome.persistentVolumeClaim.create .Values.volumes.localHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Local Home!!!        #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{- if not ( or .Values.volumes.sharedHome.persistentVolumeClaim.create .Values.volumes.sharedHome.customVolume ) }}\n\n#################################################################################\n######      WARNING: Persistent volume is not used for Shared Home!!!       #####\n######            Data will be lost when the pod is terminated.             #####\n#################################################################################\n{{- end }}\n{{- if ( or .Values.jira.securityContext.enabled .Values.jira.securityContext.gid ) }}\n\n#################################################################################\n######         DEPRECATION WARNING: jira.securityContext deprecation        #####\n######       Update your values to the new jira.securityContext format      #####\n#################################################################################\n{{- end}}\n\nFor further documentation, see https://atlassian.github.io/data-center-helm-charts/"
  },
  {
    "path": "src/main/charts/jira/templates/_fluentd_templates.tpl",
    "content": "{{- define \"fluentd.container\" -}}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd\n  image: {{ .Values.fluentd.imageRepo }}:{{ .Values.fluentd.imageTag }}\n  command: [\"sh\", \"-c\", {{ include \"fluentd.start.command\" . | quote }}]\n{{- if .Values.fluentd.resources }}\n  resources:\n  {{- with .Values.fluentd.resources }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- end }}\n  volumeMounts:\n    - name: fluentd-config\n      mountPath: /fluentd/etc\n      readOnly: true\n{{- if .Values.fluentd.extraVolumes }}\n  {{ toYaml .Values.fluentd.extraVolumes | nindent 4}}\n{{- end }}\n  env:\n    - name: POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: POD_NAMESPACE\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.namespace\n    - name: POD_IP\n      valueFrom:\n        fieldRef:\n          fieldPath: status.podIP\n    - name: HELM_RELEASE_NAME\n      value: {{ include \"common.names.fullname\" . }}\n{{ end }}\n{{ end }}\n\n{{- define \"fluentd.config.volume\" }}\n{{ if .Values.fluentd.enabled }}\n- name: fluentd-config\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-fluentd-config\n{{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n\n{{/* Define a sanitized list of additionalEnvironmentVariables */}}\n{{- define \"jira.sanitizedAdditionalEnvVars\" -}}\n{{- range .Values.jira.additionalEnvironmentVariables }}\n- name: {{ .name }}\n  value: {{ if regexMatch \"(?i)(secret|token|password)\" .name }}\"Sanitized by Support Utility\"{{ else}}{{ .value }}{{ end }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.sessionVars\"}}\n{{- if .Values.jira.session.timeout }}\n- name: ATL_JIRA_SESSION_TIMEOUT\n  value: {{ .Values.jira.session.timeout | int | quote }}\n{{- end }}\n{{- if .Values.jira.session.autologinCookieAge }}\n- name: ATL_AUTOLOGIN_COOKIE_AGE\n  value: {{ .Values.jira.session.autologinCookieAge | int| quote }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.tunnelVars\"}}\n{{- if .Values.jira.tunnel.additionalConnector.port }}\n{{- with .Values.jira.tunnel.additionalConnector.port }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_PORT\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.jira.tunnel.additionalConnector.connectionTimeout }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_CONNECTION_TIMEOUT\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.jira.tunnel.additionalConnector.maxThreads }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_MAX_THREADS\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.jira.tunnel.additionalConnector.minSpareThreads }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_MIN_SPARE_THREADS\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.jira.tunnel.additionalConnector.enableLookups }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_ENABLE_LOOKUPS\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.jira.tunnel.additionalConnector.acceptCount }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_ACCEPT_COUNT\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.jira.tunnel.additionalConnector.secure }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_SECURE\n  value: {{ . | quote }}\n{{- end }}\n{{- with .Values.jira.tunnel.additionalConnector.URIEncoding }}\n- name: ATL_TOMCAT_ADDITIONAL_CONNECTOR_URI_ENCODING\n  value: {{ . | quote }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{/* Define a sanitized list of additionalJvmArgs */}}\n{{- define \"jira.sanitizedAdditionalJvmArgs\" -}}\n{{- range .Values.jira.additionalJvmArgs }}\n {{- $jvmArgs := regexSplit \"=\" . -1 }}\n   {{- if regexMatch \"(?i)(secret|token|password).*$\" (first $jvmArgs) }}\n-  {{ first $jvmArgs }}=Sanitized by Support Utility{{ else}}\n-  {{ . }}\n{{ end }}\n{{- end }}\n{{- end }}\n\n{{/* Define sanitized Helm values */}}\n{{- define \"jira.sanitizedValues\" -}}\n{{- $sanitizedAdditionalEnvs := dict .Chart.Name (dict \"additionalEnvironmentVariables\" (include \"jira.sanitizedAdditionalEnvVars\" .)) }}\n{{- $sanitizedAdditionalJvmArgs := dict .Chart.Name (dict \"additionalJvmArgs\" (include \"jira.sanitizedAdditionalJvmArgs\" .)) }}\n{{- $mergedValues := merge $sanitizedAdditionalEnvs $sanitizedAdditionalJvmArgs .Values }}\n{{- toYaml $mergedValues | replace \" |2-\" \"\" | replace \" |-\" \"\" |  replace \"|2\" \"\" | nindent 4 }}\n{{- end }}\n\n{{- define \"jira.analyticsJson\" -}}\n{\n  \"imageTag\": {{ if or (eq .Values.image.tag \"\") (eq .Values.image.tag nil) }}{{ .Chart.AppVersion | quote }}{{ else }}{{ regexSplit \"-\" .Values.image.tag -1 | first |  quote }}{{ end }},\n  \"replicas\": {{ .Values.replicaCount }},\n  \"isJmxEnabled\": {{ .Values.monitoring.exposeJmxMetrics }},\n  \"ingressType\": {{ if not .Values.ingress.create }}\"NONE\"{{ else }}{{ if .Values.ingress.nginx }}\"NGINX\"{{ else }}\"OTHER\"{{ end }}{{ end }},\n{{- $sanitizedMinorVersion := regexReplaceAll \"[^0-9]\" .Capabilities.KubeVersion.Minor \"\" }}\n  \"k8sVersion\": \"{{ .Capabilities.KubeVersion.Major }}.{{ $sanitizedMinorVersion }}\",\n  \"isS3AvatarsEnabled\": {{ if and .Values.jira.s3Storage.avatars.bucketName .Values.jira.s3Storage.avatars.bucketRegion }}true{{ else }}false{{ end }},\n  \"serviceType\": {{ if regexMatch \"^(ClusterIP|NodePort|LoadBalancer|ExternalName)$\" .Values.jira.service.type }}{{ snakecase .Values.jira.service.type | upper | quote }}{{ else }}\"UNKNOWN\"{{ end }},\n{{- if eq .Values.database.type nil }}\n  \"dbType\": \"UNKNOWN\",\n{{- else }}\n{{- $databaseTypeMap := dict \"postgres\" \"POSTGRES\" \"mssql\" \"MSSQL\" \"sqlserver\" \"SQLSERVER\" \"oracle\" \"ORACLE\" \"mysql\" \"MYSQL\" }}\n{{- $dbTypeInValues := .Values.database.type }}\n{{- $dbType := \"UNKNOWN\" | quote }}\n{{- range $key, $value := $databaseTypeMap }}\n{{- if regexMatch (printf \"(?i)%s\" $key) $dbTypeInValues }}\n  {{- $dbType = $value | quote }}\n{{- end }}\n{{- end }}\n  \"dbType\": {{ $dbType }},\n{{- end }}\n  \"isClusteringEnabled\": {{ .Values.jira.clustering.enabled }},\n  \"isSharedHomePVCCreated\": {{ .Values.volumes.sharedHome.persistentVolumeClaim.create }},\n  \"isServiceMonitorCreated\": {{ .Values.monitoring.serviceMonitor.create }},\n  \"isGrafanaDashboardsCreated\": {{ .Values.monitoring.grafana.createDashboards }},\n  \"isRunOnOpenshift\": {{ .Capabilities.APIVersions.Has \"route.openshift.io/v1/Route\" }},\n  \"isRunWithRestrictedSCC\": {{ .Values.openshift.runWithRestrictedSCC }},\n  \"isOpenshiftRouteCreated\": {{ .Values.ingress.openShiftRoute}}\n}\n{{- end }}\n\n{{/*\nCreate default value for the service path.\n*/}}\n{{- define \"jira.path\" -}}\n{{- include \"common.gateway.path\" (dict\n  \"useGatewayMode\" (include \"common.gateway.useGatewayMode\" .)\n  \"gatewayPath\"   .Values.gateway.path\n  \"ingressPath\"   .Values.ingress.path\n  \"contextPath\"   .Values.jira.service.contextPath\n) -}}\n{{- end }}\n\n{{/*\nAlias for backward compatibility with ingress templates.\n*/}}\n{{- define \"jira.ingressPath\" -}}\n{{- include \"jira.path\" . -}}\n{{- end }}\n\n{{/*\nThe name of the service account to be used.\nIf the name is defined in the chart values, then use that,\nelse if we're creating a new service account then use the name of the Helm release,\nelse just use the \"default\" service account.\n*/}}\n{{- define \"jira.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.name -}}\n{{- .Values.serviceAccount.name -}}\n{{- else -}}\n{{- if .Values.serviceAccount.create -}}\n{{- include \"common.names.fullname\" . -}}\n{{- else -}}\ndefault\n{{- end -}}\n{{- end -}}\n{{- end }}\n\n{{/*\nPod labels\n*/}}\n{{- define \"jira.podLabels\" -}}\n{{ with .Values.podLabels }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe command that should be run by the nfs-fixer init container to correct the permissions of the shared-home root directory.\n*/}}\n{{- define \"jira.sharedHome.permissionFix.command\" -}}\n{{- $securityContext := .Values.jira.securityContext }}\n{{- with .Values.volumes.sharedHome.nfsPermissionFixer }}\n    {{- if .command }}\n        {{ .command }}\n    {{- else }}\n        {{- if and $securityContext.gid $securityContext.enabled }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.gid .mountPath .mountPath }}\n        {{- else if $securityContext.fsGroup }}\n            {{- printf \"(chgrp %v %s; chmod g+w %s)\" $securityContext.fsGroup .mountPath .mountPath }}\n        {{- else }}\n            {{- printf \"(chgrp 2001 %s; chmod g+w %s)\" .mountPath .mountPath }}\n        {{- end }}\n    {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nThe command that should be run to start the fluentd service\n*/}}\n{{- define \"fluentd.start.command\" -}}\n{{- if .Values.fluentd.command }}\n{{ .Values.fluentd.command }}\n{{- else }}\n{{- print \"exec fluentd -c /fluentd/etc/fluent.conf -v\" }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.image\" -}}\n{{- if .Values.image.registry -}}\n{{ .Values.image.registry}}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- else -}}\n{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefines the volume mounts used by the Jira container.\nNote that the local-home volume is mounted twice, once for the local-home directory itself, and again\non Tomcat's logs directory. THis ensures that Tomcat+Jira logs get captured in the same volume.\n*/}}\n{{ define \"jira.volumeMounts\" }}\n- name: local-home\n  mountPath: {{ .Values.volumes.localHome.mountPath | quote }}\n  {{- if .Values.volumes.localHome.subPath }}\n  subPath: {{ .Values.volumes.localHome.subPath | quote }}\n  {{- end }}\n- name: local-home\n  mountPath: {{ .Values.jira.accessLog.mountPath | quote }}\n  subPath: {{ .Values.jira.accessLog.localHomeSubPath | quote }}\n- name: shared-home\n  mountPath: {{ .Values.volumes.sharedHome.mountPath | quote }}\n  {{- if .Values.volumes.sharedHome.subPath }}\n  subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n  {{- end }}\n{{- if or .Values.jira.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  mountPath: /opt/atlassian/jira/conf/server.xml\n  subPath: server.xml\n- name: temp\n  mountPath: /opt/atlassian/jira/temp\n- name: work\n  mountPath: /opt/atlassian/jira/work\n{{- end }}\n{{- if or .Values.jira.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: seraph-config-xml\n  mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/seraph-config.xml\n  subPath: seraph-config.xml\n{{- end }}\n{{- if or .Values.jira.additionalCertificates.secretName .Values.jira.additionalCertificates.secretList }}\n- name: keystore\n  mountPath: /var/ssl\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  mountPath: /opt/atlassian/helm\n{{- end }}\n{{- end }}\n\n{{/*\nDefine pod annotations here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"jira.podAnnotations\" -}}\n{{- range $key, $value := .Values.podAnnotations }}\n{{ $key }}: {{ tpl $value $ | quote }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional init containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"jira.additionalInitContainers\" -}}\n{{- with .Values.additionalInitContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional containers here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"jira.additionalContainers\" -}}\n{{- with .Values.additionalContainers }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional ports here instead of in values.yaml to allow template overrides\n*/}}\n{{- define \"jira.additionalPorts\" -}}\n{{- with .Values.jira.additionalPorts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional volume mounts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"jira.additionalVolumeMounts\" -}}\n{{- with .Values.jira.additionalVolumeMounts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nDefine additional environment variables here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"jira.additionalEnvironmentVariables\" -}}\n{{- with .Values.jira.additionalEnvironmentVariables }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{/*\nRenders ADDITIONAL_JIRA_CONFIG_* environment variables from additionalConfigProperties values\n*/}}\n{{- define \"jira.additionalConfigProperties\" -}}\n{{- range $index, $prop := .Values.jira.additionalConfigProperties }}\n- name: {{ printf \"ADDITIONAL_JIRA_CONFIG_HELM_%03d\" $index }}\n  value: {{ $prop | quote }}\n{{- end }}\n{{- range $index, $prop := .Values.jira.additionalConfigPropertiesExpandEnv }}\n- name: {{ printf \"ADDITIONAL_JIRA_CONFIG_HELM_%03d__EXPAND_ENV\" $index }}\n  value: {{ $prop | quote }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional library declared, generate a volume mount that injects that library into the Jira lib directory\n*/}}\n{{- define \"jira.additionalLibraries\" -}}\n{{- range .Values.jira.additionalLibraries }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/jira/lib/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nFor each additional plugin declared, generate a volume mount that injects that library into the Jira plugins directory\n*/}}\n{{- define \"jira.additionalBundledPlugins\" -}}\n{{- range .Values.jira.additionalBundledPlugins }}\n- name: {{ .volumeName }}\n  mountPath: \"/opt/atlassian/jira/atlassian-jira/WEB-INF/atlassian-bundled-plugins/{{ .fileName }}\"\n  {{- if .subDirectory }}\n  subPath: {{ printf \"%s/%s\" .subDirectory .fileName | quote }}\n  {{- else }}\n  subPath: {{ .fileName | quote }}\n  {{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.volumes\" -}}\n{{ if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n{{ include \"jira.volumes.localHome\" . }}\n{{- end }}\n{{ include \"jira.volumes.sharedHome\" . }}\n{{- with .Values.volumes.additional }}\n{{- toYaml . | nindent 0 }}\n{{- end }}\n{{- if or .Values.jira.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: server-xml\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-server-config\n    items:\n      - key: server.xml\n        path: server.xml\n- name: temp\n  emptyDir: {}\n- name: work\n  emptyDir: {}\n{{- end }}\n{{- if or .Values.jira.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n- name: seraph-config-xml\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-server-config\n    items:\n      - key: seraph-config.xml\n        path: seraph-config.xml\n{{- end }}\n{{- if or .Values.jira.additionalCertificates.secretName .Values.jira.additionalCertificates.secretList }}\n- name: keystore\n  emptyDir: {}\n{{- if .Values.jira.additionalCertificates.secretName }}\n- name: certs\n  secret:\n    secretName: {{ .Values.jira.additionalCertificates.secretName }}\n{{- else }}\n{{- range .Values.jira.additionalCertificates.secretList }}\n- name: {{ .name }}\n  secret:\n    secretName: {{ .name }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n- name: helm-values\n  configMap:\n    name: {{ include \"common.names.fullname\" . }}-helm-values\n{{- end }}\n{{- end }}\n\n{{- define \"jira.volumes.localHome\" -}}\n{{- if not .Values.volumes.localHome.persistentVolumeClaim.create }}\n- name: local-home\n{{ if .Values.volumes.localHome.customVolume }}\n{{- toYaml .Values.volumes.localHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.volumes.sharedHome\" -}}\n- name: shared-home\n{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\n  persistentVolumeClaim:\n    claimName: {{ include \"common.names.fullname\" . }}-shared-home\n{{ else }}\n{{ if .Values.volumes.sharedHome.customVolume }}\n{{- toYaml .Values.volumes.sharedHome.customVolume | nindent 2 }}\n{{ else }}\n  emptyDir: {}\n{{- end }}\n{{- end }}\n{{- end }}\n\n\n{{/*\nDefine additional hosts here to allow template overrides when used as a sub chart\n*/}}\n{{- define \"jira.additionalHosts\" -}}\n{{- with .Values.additionalHosts }}\n{{- toYaml . }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.volumeClaimTemplates\" -}}\n{{- if or .Values.volumes.localHome.persistentVolumeClaim.create .Values.jira.additionalVolumeClaimTemplates }}\n{{- if and .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted .Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled }}\npersistentVolumeClaimRetentionPolicy:\n    whenDeleted: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted}}\n    whenScaled: {{.Values.volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled}}\n{{- end}}\nvolumeClaimTemplates:\n{{- if .Values.volumes.localHome.persistentVolumeClaim.create }}\n- apiVersion: v1\n  kind: PersistentVolumeClaim\n  metadata:\n    name: local-home\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .Values.volumes.localHome.persistentVolumeClaim.storageClassName }}\n    storageClassName: {{ .Values.volumes.localHome.persistentVolumeClaim.storageClassName | quote }}\n    {{- end }}\n    {{- with .Values.volumes.localHome.persistentVolumeClaim.resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- range .Values.jira.additionalVolumeClaimTemplates }}\n- metadata:\n    name: {{ .name }}\n  spec:\n    accessModes: [ \"ReadWriteOnce\" ]\n    {{- if .storageClassName }}\n    storageClassName: {{ .storageClassName | quote }}\n    {{- end }}\n    {{- with .resources }}\n    resources:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.s3StorageEnvVars\" -}}\n{{- if and .Values.jira.s3Storage.avatars.bucketName .Values.jira.s3Storage.avatars.bucketRegion }}\n- name: ATL_S3AVATARS_BUCKET_NAME\n  value: {{ .Values.jira.s3Storage.avatars.bucketName | quote }}\n- name: ATL_S3AVATARS_REGION\n  value: {{ .Values.jira.s3Storage.avatars.bucketRegion | quote }}\n{{- if .Values.jira.s3Storage.avatars.endpointOverride }}\n- name: ATL_S3AVATARS_ENDPOINT_OVERRIDE\n  value: {{ .Values.jira.s3Storage.avatars.endpointOverride | quote }}\n{{- end }}\n{{- end }}\n{{- if and .Values.jira.s3Storage.attachments.bucketName .Values.jira.s3Storage.attachments.bucketRegion }}\n- name: ATL_S3ATTACHMENTS_BUCKET_NAME\n  value: {{ .Values.jira.s3Storage.attachments.bucketName | quote }}\n- name: ATL_S3ATTACHMENTS_REGION\n  value: {{ .Values.jira.s3Storage.attachments.bucketRegion | quote }}\n{{- if .Values.jira.s3Storage.attachments.endpointOverride }}\n- name: ATL_S3ATTACHMENTS_ENDPOINT_OVERRIDE\n  value: {{ .Values.jira.s3Storage.attachments.endpointOverride | quote }}\n{{- end }}\n{{- end }}\n{{- if and .Values.jira.s3Storage.backups.bucketName .Values.jira.s3Storage.backups.bucketRegion }}\n- name: ATL_S3BACKUPS_BUCKET_NAME\n  value: {{ .Values.jira.s3Storage.backups.bucketName | quote }}\n- name: ATL_S3BACKUPS_REGION\n  value: {{ .Values.jira.s3Storage.backups.bucketRegion | quote }}\n{{- if .Values.jira.s3Storage.backups.endpointOverride }}\n- name: ATL_S3BACKUPS_ENDPOINT_OVERRIDE\n  value: {{ .Values.jira.s3Storage.backups.endpointOverride | quote }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"jira.databaseEnvVars\" -}}\n{{- if .Values.jira.forceConfigUpdate }}\n- name: ATL_FORCE_CFG_UPDATE\n  value: \"true\"\n{{- end }}\n{{ with .Values.database.type }}\n- name: ATL_DB_TYPE\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.driver }}\n- name: ATL_DB_DRIVER\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.url }}\n- name: ATL_JDBC_URL\n  value: {{ . | quote }}\n{{ end }}\n{{ with .Values.database.credentials.secretName }}\n- name: ATL_JDBC_USER\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.usernameSecretKey }}\n- name: ATL_JDBC_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ . }}\n      key: {{ $.Values.database.credentials.passwordSecretKey }}\n{{ end }}\n{{ end }}\n\n{{- define \"jira.clusteringEnvVars\" -}}\n{{ if .Values.jira.clustering.enabled }}\n- name: CLUSTERED\n  value: \"true\"\n- name: JIRA_NODE_ID\n  valueFrom:\n    fieldRef:\n      fieldPath: metadata.name\n- name: EHCACHE_LISTENER_HOSTNAME\n  valueFrom:\n    fieldRef:\n      fieldPath: status.podIP\n- name: EHCACHE_LISTENER_PORT\n  value: {{ .Values.jira.ports.ehcache | quote }}\n- name: EHCACHE_OBJECT_PORT\n  value: {{ .Values.jira.ports.ehcacheobject | quote }}\n{{ end }}\n{{ end }}\n\n{{- define \"jira.sysprop.fluentdAppender\" -}}\n-Datlassian.logging.cloud.enabled={{ if and .Values.fluentd.enabled (not .Values.fluentd.customConfigFile ) }}{{.Values.fluentd.enabled }}{{ else }}false{{ end }}\n{{- end }}\n\n{{- define \"flooredCPU\" -}}\n    {{- if hasSuffix \"m\" (. | toString) }}\n    {{- div (trimSuffix \"m\" .) 1000 | default 1 }}\n    {{- else }}\n    {{- . }}\n    {{- end }}\n{{- end}}\n\n{{- define \"jira.addCrtToKeystoreCmd\" }}\n{{- if .Values.jira.additionalCertificates.customCmd}}\n{{ .Values.jira.additionalCertificates.customCmd}}\n{{- else }}\nset -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \"Adding $crt to keystore\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\n{{- end }}\n{{- end }}\n\n{{- define \"generate_static_password_b64enc\" -}}\n{{- if not (index .Release \"temp_vars\") -}}\n{{-   $_ := set .Release \"temp_vars\" dict -}}\n{{- end -}}\n{{- $key := printf \"%s_%s\" .Release.Name \"password\" -}}\n{{- if not (index .Release.temp_vars $key) -}}\n{{-   $_ := set .Release.temp_vars $key (randAlphaNum 40 | b64enc ) -}}\n{{- end -}}\n{{- index .Release.temp_vars $key -}}\n{{- end -}}\n\n{{- define \"opensearch.initial.admin.password\" }}\n{{- $defaultSecretName := \"opensearch-initial-password\" }}\n{{- $secretName := default $defaultSecretName .Values.opensearch.credentials.existingSecretRef.name }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace $secretName) }}\n{{- if $secretData.data }}\n{{- index $secretData.data \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\" }}\n{{- else }}\n{{ include \"generate_static_password_b64enc\" . }}\n{{- end }}\n{{- end }}\n\n{{- define \"opensearch.env.vars\" }}\n{{- if .Values.opensearch.enabled }}\n- name: ADDITIONAL_JIRA_CONFIG_SEARCH_PLATFORM\n  value: \"search.platform=opensearch\"\n- name: ADDITIONAL_JIRA_CONFIG_SEARCH_URL\n  value: \"opensearch.http.url=http://opensearch-cluster-master:9200\"\n- name: ADDITIONAL_JIRA_CONFIG_SEARCH_USERNAME\n  value: \"opensearch.username=admin\"\n- name: OPENSEARCH_ADMIN_PASSWORD\n  valueFrom:\n    secretKeyRef:\n      name: {{ .Values.opensearch.credentials.existingSecretRef.name | default \"opensearch-initial-password\" }}\n      key: OPENSEARCH_INITIAL_ADMIN_PASSWORD\n- name: ADDITIONAL_JIRA_CONFIG_SEARCH_PASSWORD__EXPAND_ENV\n  value: \"opensearch.password={OPENSEARCH_ADMIN_PASSWORD}\"\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/config-jvm.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jvm-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  additional_jvm_args: >-\n    {{ include \"jira.sysprop.fluentdAppender\" . }}\n    {{- range .Values.jira.additionalJvmArgs }}\n    {{ . }}\n    {{- end }}\n    -XX:ActiveProcessorCount={{ max 1 (include \"flooredCPU\" .Values.jira.resources.container.requests.cpu | float64  | int) }}\n    {{- if .Values.serviceAccount.eksIrsa.roleArn }}\n    -Daws.webIdentityTokenFile=/var/run/secrets/eks.amazonaws.com/serviceaccount/token\n    {{- end }}\n    {{- if or .Values.jira.additionalCertificates.secretName .Values.jira.additionalCertificates.secretList }}\n    -Djavax.net.ssl.trustStore=/var/ssl/cacerts\n    {{- end }}\n    {{- if .Values.jira.tunnel.additionalConnector.port }}\n    -Dsecure.tunnel.upstream.port={{ .Values.jira.tunnel.additionalConnector.port }}\n    {{- end }}\n  max_heap: {{ .Values.jira.resources.jvm.maxHeap }}\n  min_heap: {{ .Values.jira.resources.jvm.minHeap }}\n  reserved_code_cache: {{ .Values.jira.resources.jvm.reservedCodeCache }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/configmap-additional-config.yaml",
    "content": "{{- range $i, $key := .Values.additionalConfigMaps -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-{{ $key.name }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- range $key.keys }}\n  {{ .fileName -}}: |\n{{  .content | trim | indent 4 }}\n{{- end }}\n---\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/configmap-fluentd.yaml",
    "content": "{{ if .Values.fluentd.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-fluentd-config\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{ if .Values.fluentd.customConfigFile }}\n{{- range $key, $value := .Values.fluentd.fluentdCustomConfig }}\n  {{ $key }}: |\n{{ $value | indent 4 }}\n  {{- end }}\n  {{ else }}\n  fluent.conf: |\n    <source>\n      @type http\n      port {{ .Values.fluentd.httpPort }}\n      bind 0.0.0.0\n    </source>\n    <filter **>\n      @type record_transformer\n      <record>\n        podname \"#{ENV['POD_NAME']}\"\n        podnamespace \"#{ENV['POD_NAMESPACE']}\"\n        podip \"#{ENV['POD_IP']}\"\n        helmrelease \"#{ENV['HELM_RELEASE_NAME']}\"\n      </record>\n    </filter>\n    <filter **>\n      @type stdout\n    </filter>\n    {{ if .Values.fluentd.elasticsearch.enabled }}\n    <match **>\n      @type elasticsearch\n      host {{ .Values.fluentd.elasticsearch.hostname }}\n      logstash_format true\n      logstash_prefix {{ .Values.fluentd.elasticsearch.indexNamePrefix }}\n    </match>\n    {{ end }}\n  {{ end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/configmap-jmx-config.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n  {{- if .Values.monitoring.jmxExporterCustomConfig }}\n  jmx-config.yaml: |\n  {{- with .Values.monitoring.jmxExporterCustomConfig }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- else }}\n  jmx-config.yaml: |\n    ---\n    startDelaySeconds: 0\n\n    rules:\n      - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n        name: java_lang_$2_$3\n      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n        name: java_lang_Memory_HeapMemoryUsage_$1\n      - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n        name: java_lang_G1_$1_Generation_$2\n      - pattern: '.*'\n\n    blacklistObjectNames:\n      - 'com.atlassian.jira:connectionpool=connections,connection=*,name=BasicDataSource'\n  {{- end }}\n{{- end}}\n"
  },
  {
    "path": "src/main/charts/jira/templates/configmap-server-config.yaml",
    "content": "{{ if or .Values.jira.tomcatConfig.generateByHelm .Values.jira.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-server-config\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if or .Values.jira.tomcatConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n  server.xml: |\n{{- if .Values.jira.tomcatConfig.customServerXml }}\n{{- .Values.jira.tomcatConfig.customServerXml | nindent 6 }}\n{{- else }}\n    <?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <Server port=\"{{ .Values.jira.tomcatConfig.mgmtPort | default \"8005\" }}\"\n            shutdown=\"SHUTDOWN\">\n\n      <Listener className=\"org.apache.catalina.startup.VersionLoggerListener\"/>\n      <Listener className=\"org.apache.catalina.core.AprLifecycleListener\"\n                SSLEngine=\"on\"/>\n      <Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\"/>\n      <Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\"/>\n      <Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\"/>\n\n      <Service name=\"Catalina\">\n\n        <Connector port=\"{{ .Values.jira.tomcatConfig.port | default \"8080\" }}\"\n                   maxThreads=\"{{ .Values.jira.tomcatConfig.maxThreads | default \"100\" }}\"\n                   minSpareThreads=\"{{ .Values.jira.tomcatConfig.minSpareThreads | default \"10\" }}\"\n                   connectionTimeout=\"{{ .Values.jira.tomcatConfig.connectionTimeout | default \"20000\" }}\"\n                   enableLookups=\"{{ .Values.jira.tomcatConfig.enableLookups | default \"false\" }}\"\n                   protocol=\"{{ .Values.jira.tomcatConfig.protocol | default \"HTTP/1.1\" }}\"\n                   redirectPort=\"{{ .Values.jira.tomcatConfig.redirectPort | default \"8443\" }}\"\n                   acceptCount=\"{{ .Values.jira.tomcatConfig.acceptCount | default \"100\" }}\"\n                   secure=\"{{ default (include \"common.gateway.https\" .) .Values.jira.tomcatConfig.secure }}\"\n                   scheme=\"{{ default (include \"common.gateway.scheme\" .) .Values.jira.tomcatConfig.scheme }}\"\n                   proxyName=\"{{ .Values.jira.tomcatConfig.proxyName | default (include \"common.gateway.hostname\" .)  }}\"\n                   proxyPort=\"{{ .Values.jira.tomcatConfig.proxyPort | default (include \"common.gateway.externalPort\" .)  }}\"\n\n                   relaxedPathChars=\"[]|\"\n                   relaxedQueryChars=\"[]|{}^\\`&quot;&lt;&gt;\"\n                   bindOnInit=\"false\"\n                   maxHttpHeaderSize=\"{{ .Values.jira.tomcatConfig.maxHttpHeaderSize | default \"8192\" }}\"\n                   useBodyEncodingForURI=\"true\"\n                   disableUploadTimeout=\"true\" />\n\n     {{- if .Values.jira.tunnel.additionalConnector.port }}\n     <Connector port=\"{{ .Values.jira.tunnel.additionalConnector.port }}\"\n                connectionTimeout=\"{{ .Values.jira.tunnel.additionalConnector.connectionTimeout }}\"\n                maxThreads=\"{{ .Values.jira.tunnel.additionalConnector.maxThreads }}\"\n                minSpareThreads=\"{{ .Values.jira.tunnel.additionalConnector.minSpareThreads }}\"\n                enableLookups=\"{{ .Values.jira.tunnel.additionalConnector.enableLookups }}\"\n                acceptCount=\"{{ .Values.jira.tunnel.additionalConnector.acceptCount }}\"\n                {{- if .Values.jira.tunnel.additionalConnector.secure }}\n                secure=\"true\"\n                {{- end }}\n                URIEncoding=\"{{ .Values.jira.tunnel.additionalConnector.URIEncoding }}\"\n                relaxedPathChars=\"[]|\"\n                relaxedQueryChars=\"[]|{}^&#x5c;&#x60;&quot;&lt;&gt;\" />\n     {{- end }}\n\n        <Engine name=\"Catalina\"\n                defaultHost=\"localhost\">\n\n          <Host name=\"localhost\"\n                appBase=\"webapps\"\n                unpackWARs=\"true\"\n                autoDeploy=\"true\">\n            <Valve className=\"org.apache.catalina.valves.ErrorReportValve\" showReport=\"false\" showServerInfo=\"false\" />\n            <!--\n            suspendWrappedResponseAfterForward preserves the behavior from Tomcat 10 in Tomcat 11+ regarding the handling of wrapped responses.\n            See the changelog https://tomcat.apache.org/tomcat-11.0-doc/changelog.html#Tomcat_11.0.0-M18_(markt)/Catalina\n            -->\n            <Context path=\"{{ .Values.jira.service.contextPath | default \"\" }}\"\n                     docBase=\"${catalina.home}/atlassian-jira\"\n                     reloadable=\"false\"\n                     useHttpOnly=\"true\"\n                     suspendWrappedResponseAfterForward=\"false\">\n              <Resource name=\"UserTransaction\"\n                        auth=\"Container\"\n                        type=\"javax.transaction.UserTransaction\"\n                        factory=\"org.objectweb.jotm.UserTransactionFactory\"\n                        jotm.timeout=\"60\"/>\n              <Manager pathname=\"\"/>\n              <JarScanner scanManifest=\"false\"/>\n              <Valve className=\"org.apache.catalina.valves.StuckThreadDetectionValve\"\n                     threshold=\"{{ .Values.jira.tomcatConfig.stuckThreadDetectionValveThreshold | default \"120\" }}\" />\n            </Context>\n\n          </Host>\n          <Valve className=\"org.apache.catalina.valves.AccessLogValve\"\n                 maxDays=\"{{ .Values.jira.tomcatConfig.accessLogMaxDays | default \"-1\" }}\"\n                 requestAttributesEnabled=\"{{ .Values.jira.tomcatConfig.requestAttributesEnabled | default \"false\" }}\"\n                 pattern=\"{{ .Values.jira.tomcatConfig.accessLogPattern }}\"/>\n        </Engine>\n\n      </Service>\n    </Server>\n{{- end }}\n{{- end }}\n{{- if or .Values.jira.seraphConfig.generateByHelm .Values.openshift.runWithRestrictedSCC }}\n  seraph-config.xml: |\n    <security-config>\n        <parameters>\n            <init-param>\n                <!--\n                  The login URL to redirect to when the user tries to access a protected resource (rather than clicking on\n                  an explicit login link). Most of the time, this will be the same value as 'link.login.url'.\n                    - if the URL is absolute (contains '://'), then redirect that URL (for SSO applications)\n                    - else the context path will be prepended to this URL\n\n                    If '${originalurl}' is present in the URL, it will be replaced with the URL that the user requested.\n                    This gives SSO login pages the chance to redirect to the original page\n\n                    '${pageCaps}' should be supported accordingly to com.atlassian.sal.api.page.PageCapability\n\n                    '${userRole}' when specified, should cause logout after login to an user with privileges lesser than requested\n                -->\n                <param-name>login.url</param-name>\n                <param-value>/login.jsp?permissionViolation=true&amp;os_destination=${originalurl}&amp;page_caps=${pageCaps}&amp;user_role=${userRole}</param-value>\n                <!--<param-value>http://sso.mycompany.com/login?redirectTo=${originalurl}</param-value>-->\n            </init-param>\n            <init-param>\n                <!--\n                  the URL to redirect to when the user explicitly clicks on a login link (rather than being redirected after\n                  trying to access a protected resource). Most of the time, this will be the same value as 'login.url'.\n                    - same properties as login.url above\n                -->\n                <param-name>link.login.url</param-name>\n                <param-value>/login.jsp?os_destination=${originalurl}</param-value>\n                <!--<param-value>/secure/Dashboard.jspa?os_destination=${originalurl}</param-value>-->\n                <!--<param-value>http://sso.mycompany.com/login?redirectTo=${originalurl}</param-value>-->\n            </init-param>\n            <init-param>\n                <!-- URL for logging out.\n                     - If relative, Seraph just redirects to this URL, which is responsible for calling Authenticator.logout().\n                     - If absolute (eg. SSO applications), Seraph calls Authenticator.logout() and redirects to the URL\n                     -->\n                <param-name>logout.url</param-name>\n                <param-value>/secure/Logout!default.jspa</param-value>\n                <!--<param-value>http://sso.mycompany.com/logout</param-value>-->\n            </init-param>\n            <!--\n              The path to *forward* to when the user tries to POST to a protected resource (rather than clicking on\n              an explicit login link). Note that this is done using a servlet FORWARD, not a redirect. Information\n              about the original request can be gotten from the javax.servlet.forward.* request attributes.\n\n              At this point you will probably want to save the user's POST params so he can log in again and retry\n              the POST.\n\n              Defaults to undefined, in which case Seraph will just do a redirect instead of a FORWARD.\n            -->\n            <init-param>\n                <param-name>login.forward.path</param-name>\n                <param-value>/secure/XsrfErrorAction.jspa</param-value>\n            </init-param>\n            <!-- The key that the original URL is stored with in the session -->\n            <init-param>\n                <param-name>original.url.key</param-name>\n                <param-value>os_security_originalurl</param-value>\n            </init-param>\n            <init-param>\n                <param-name>login.cookie.key</param-name>\n                <param-value>seraph.rememberme.cookie</param-value>\n            </init-param>\n            <!-- This property sets the default remember me cookie max age in seconds.  It is currently set to 2 weeks -->\n            <init-param>\n                <param-name>autologin.cookie.age</param-name>\n                <param-value>{{ .Values.jira.seraphConfig.autoLoginCookieAge | default \"1209600\" }}</param-value>\n            </init-param>\n            <!-- Basic Authentication can be enabled by passing the authentication type as a configurable url parameter.\n            With this example, you will need to pass http://mycompany.com/anypage?os_authType=basic in the url to enable Basic Authentication -->\n            <init-param>\n                <param-name>authentication.type</param-name>\n                <param-value>os_authType</param-value>\n            </init-param>\n            <!--  If this parameter is set to true, the cookie will never be set secure.  This is useful if you're logging\n                  into JIRA via https, but want to browse JIRA over http.  This flag will ensure that the remember me option\n                  works correctly.\n            <init-param>\n                <param-name>insecure.cookie</param-name>\n                <param-value>true</param-value>\n            </init-param> -->\n\n            <init-param>\n                <param-name>invalidate.session.on.login</param-name>\n                <param-value>true</param-value>\n            </init-param>\n            <init-param>\n                <param-name>invalidate.session.exclude.list</param-name>\n                <param-value>ASESSIONID,jira.websudo.timestamp,jira.user.project.admin</param-value>\n            </init-param>\n        </parameters>\n\n        <!-- CROWD:START - If enabling Crowd SSO integration uncomment the following SSOSeraphAuthenticator and comment out the JiraSeraphAuthenticator below -->\n        <!--\n        <authenticator class=\"com.atlassian.jira.security.login.SSOSeraphAuthenticator\"/>\n        -->\n        <!-- CROWD:END -->\n\n        <!-- CROWD:START - The authenticator below here will need to be commented out for Crowd SSO integration -->\n        <authenticator class=\"com.atlassian.jira.security.login.JiraSeraphAuthenticator\"/>\n        <!-- CROWD:END -->\n\n        <!-- NB: the URL to redirect to is now specified by login.url above -->\n        <services>\n            <service class=\"com.atlassian.jira.security.JiraPathService\" />\n\n            <service class=\"com.atlassian.seraph.service.WebworkService\">\n                <init-param>\n                    <param-name>action.extension</param-name>\n                    <param-value>jspa</param-value>\n                </init-param>\n            </service>\n\n            <service class=\"com.atlassian.jira.plugin.webwork.JiraSeraphSecurityService\" />\n        </services>\n\n        <rolemapper class=\"com.atlassian.jira.security.JiraRoleMapper\"/>\n\n        <elevatedsecurityguard class=\"com.atlassian.jira.security.login.JiraElevatedSecurityGuard\"/>\n\n        <interceptors>\n            <interceptor class=\"com.atlassian.jira.web.filters.JiraLoginInterceptor\" />\n        </interceptors>\n    </security-config>\n{{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/configmap-values-analytics.yaml",
    "content": "{{- if or .Values.atlassianAnalyticsAndSupport.analytics.enabled .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-helm-values\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ndata:\n{{- if .Values.atlassianAnalyticsAndSupport.helmValues.enabled }}\n  values.yaml: |\n  {{- include \"jira.sanitizedValues\" . }}\n{{- end }}\n{{- if .Values.atlassianAnalyticsAndSupport.analytics.enabled }}\n  analytics.json: |\n  {{- include \"jira.analyticsJson\" . | nindent 4 }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/configmaps-grafana-dashboards.yaml",
    "content": "{{- if .Values.monitoring.grafana.createDashboards }}\n{{- $grafanaDashboards := .Files.Glob \"grafana-dashboards/*.json\" -}}\n{{- range $index, $grafanaDashboard := $grafanaDashboards -}}\n{{- with $ }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n{{- $fileName := split \"/\" $index }}\n  name: {{ include \"common.names.fullname\" . }}-{{ $fileName._1 | trimSuffix \".json\" }}-dashboard\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.monitoring.grafana.dashboardLabels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- if .Values.monitoring.grafana.dashboardAnnotations }}\n  annotations:\n    {{- with .Values.monitoring.grafana.dashboardAnnotations}}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- end }}\ndata:\n  {{ include \"common.names.fullname\" . }}-{{ .Release.Namespace}}-{{ $fileName._1}}: |\n{{ .Files.Get $index | indent 4 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}"
  },
  {
    "path": "src/main/charts/jira/templates/httproute.yaml",
    "content": "{{- if .Values.gateway.create }}\n{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: gateway.networking.k8s.io/v1\nkind: HTTPRoute\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.gateway.labels }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.gateway.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  # Reference to the Gateway\n  parentRefs:\n  {{- toYaml .Values.gateway.parentRefs | nindent 2 }}\n  \n  # Hostnames to match\n  hostnames:\n  {{- range .Values.gateway.hostnames }}\n  - {{ . | quote }}\n  {{- end }}\n  \n  # Routing rules\n  rules:\n  # Default rule - routes to Jira service\n  - matches:\n    - path:\n        type: {{ .Values.gateway.pathType }}\n        value: {{ include \"jira.path\" . }}\n    {{- with .Values.gateway.timeouts }}\n    timeouts:\n      {{- toYaml . | nindent 6 }}\n    {{- end }}\n    {{- with .Values.gateway.filters }}\n    filters:\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\n    backendRefs:\n    - name: {{ include \"common.names.fullname\" . }}\n      port: {{ .Values.jira.service.port }}\n      weight: 100\n  \n  {{- with .Values.gateway.additionalRules }}\n  {{- toYaml . | nindent 2 }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/ingress.yaml",
    "content": "{{- if and .Values.ingress.create (not .Values.ingress.openShiftRoute) }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{ if .Values.ingress.nginx }}\n    \"nginx.ingress.kubernetes.io/affinity\": \"cookie\"\n    \"nginx.ingress.kubernetes.io/affinity-mode\": \"persistent\"\n    \"nginx.ingress.kubernetes.io/proxy-body-size\": {{ .Values.ingress.maxBodySize }}\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": {{ .Values.ingress.proxyConnectTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": {{ .Values.ingress.proxyReadTimeout|quote }}\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": {{ .Values.ingress.proxySendTimeout|quote }}\n    {{- end }}\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{ if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n    - hosts:\n        - {{ .Values.ingress.host }}\n      {{ if .Values.ingress.tlsSecretName }}\n      secretName: {{ .Values.ingress.tlsSecretName }}\n      {{ end }}\n{{ end }}\n  ingressClassName: {{ default \"nginx\" .Values.ingress.className }}\n  rules:\n    - host: {{ .Values.ingress.host }}\n      http:\n        paths:\n          - path: {{ include \"jira.ingressPath\" . }}\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ include \"common.names.fullname\" $ }}\n                port:\n                  number: {{ $.Values.jira.service.port }}\n         {{- range $path := .Values.ingress.additionalPaths }}\n          - path: {{ $path.path }}\n            pathType: {{ $path.pathType | default \"Prefix\" }}\n            backend:\n              service:\n                name: {{ $path.service }}\n                port:\n                  number: {{ $path.portNumber }}\n         {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/pdb.yaml",
    "content": "{{- if .Values.podDisruptionBudget.enabled }}\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- with .Values.podDisruptionBudget.labels }}\n      {{- toYaml . | nindent 4 }}\n    {{- end }}\n  {{- with .Values.podDisruptionBudget.annotations }}\n  annotations:\n    {{- range $key, $value := . }}\n    {{ $key }}: {{ $value | quote }}\n    {{- end }}\n  {{- end }}\nspec:\n  {{- with .Values.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ . }}\n  {{- else }}\n  minAvailable: {{ .Values.podDisruptionBudget.minAvailable | default 0 }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/route.yaml",
    "content": "{{- if and .Values.ingress.create .Values.ingress.openShiftRoute }}\nkind: Route\napiVersion: route.openshift.io/v1\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.ingress.annotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n{{- if .Values.ingress.routeHttpHeaders }}\n  httpHeaders:\n{{- with .Values.ingress.routeHttpHeaders }}\n{{- toYaml . | nindent 4 }}\n{{- end }}\n{{- end }}\n  host: {{ .Values.ingress.host }}\n  path: {{ include \"jira.ingressPath\" . }}\n  to:\n    kind: Service\n    name: {{ include \"common.names.fullname\" . }}\n    weight: 100\n  port:\n    targetPort: http\n{{- if and (.Values.ingress.https) (.Values.ingress.host) }}\n  tls:\n{{- if .Values.ingress.tlsSecretName }}\n{{- $secretData := (lookup \"v1\" \"Secret\" .Release.Namespace .Values.ingress.tlsSecretName) }}\n{{- if $secretData }}\n{{- if hasKey $secretData.data \"tls.crt\" }}\n    certificate: |\n      {{- index $secretData.data \"tls.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"tls.key\" }}\n    key: |\n      {{- index $secretData.data \"tls.key\" | b64dec | nindent 6 }}\n{{- end }}\n{{- if hasKey $secretData.data \"ca.crt\" }}\n    caCertificate: |\n      {{- index $secretData.data \"ca.crt\" | b64dec | nindent 6 }}\n{{- end }}\n{{- end }}\n{{- end }}\n    termination: edge\n    insecureEdgeTerminationPolicy: Redirect\n  wildcardPolicy: None\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/secret-opensearch.yaml",
    "content": "{{- if and .Values.opensearch.enabled .Values.opensearch.credentials.createSecret (empty .Values.opensearch.credentials.existingSecretRef.name) }}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: opensearch-initial-password\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\ntype: Opaque\ndata:\n  OPENSEARCH_INITIAL_ADMIN_PASSWORD: {{- include \"opensearch.initial.admin.password\" . | indent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/service-jmx.yaml",
    "content": "{{- if .Values.monitoring.exposeJmxMetrics}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-jmx\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n  {{- with .Values.monitoring.jmxServiceAnnotations }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  type: {{ .Values.monitoring.jmxExporterPortType }}\n  ports:\n    - port: {{ .Values.monitoring.jmxExporterPort}}\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n  {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/service-monitor.yaml",
    "content": "{{- if .Values.monitoring.serviceMonitor.create }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-service-monitor\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.monitoring.serviceMonitor.prometheusLabelSelector }}\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  endpoints:\n  - interval: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeIntervalSeconds }}\n    path: /metrics\n    port: jmx\n    scheme: http\n    relabelings:\n      - action: replace\n        sourceLabels:\n          - __meta_kubernetes_pod_name\n        targetLabel: instance\n    scrapeTimeout: {{ printf \"%.0fs\" .Values.monitoring.serviceMonitor.scrapeTimeoutSeconds }}\n  selector:\n    matchLabels:\n    {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n{{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.jira.service.annotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  type: {{ .Values.jira.service.type }}\n  sessionAffinity: {{ .Values.jira.service.sessionAffinity }}\n  {{- if .Values.jira.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  sessionAffinityConfig:\n    clientIP:\n      timeoutSeconds: {{ .Values.jira.service.sessionAffinityConfig.clientIP.timeoutSeconds }}\n  {{- end }}\n  {{- if and (eq .Values.jira.service.type \"LoadBalancer\") (not (empty .Values.jira.service.loadBalancerIP)) }}\n  loadBalancerIP: {{ .Values.jira.service.loadBalancerIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.jira.service.port }}\n      targetPort: http\n      protocol: TCP\n      name: http\n      {{- if and (eq .Values.jira.service.type \"NodePort\") .Values.jira.service.nodePort}}\n      nodePort: {{ .Values.jira.service.nodePort }}\n      {{- end }}\n  selector:\n    {{- include \"common.labels.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"jira.serviceAccountName\" . }}\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- if .Values.serviceAccount.eksIrsa.roleArn }}\n  {{- if not .Values.serviceAccount.annotations }}\n  annotations:\n  {{- end }}\n    eks.amazonaws.com/role-arn: {{ .Values.serviceAccount.eksIrsa.roleArn }}\n  {{- end }}\n{{- with .Values.serviceAccount.imagePullSecrets }}\nimagePullSecrets:\n  {{- toYaml . | nindent 2 }}\n{{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "src/main/charts/jira/templates/shared-home-pvc.yaml",
    "content": "{{- if .Values.volumes.sharedHome.persistentVolumeClaim.create }}\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}-shared-home\n  labels:\n  {{- include \"common.labels.commonLabels\" . | nindent 4 }}\nspec:\n  accessModes:\n  {{ range .Values.volumes.sharedHome.persistentVolumeClaim.accessModes }}\n    - {{ . }}\n  {{ end }}\n  {{- if .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName }}\n  storageClassName: {{ .Values.volumes.sharedHome.persistentVolumeClaim.storageClassName | quote }}\n  {{- end }}\n  {{- with .Values.volumes.sharedHome.persistentVolumeClaim.resources }}\n  resources:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/statefulset.yaml",
    "content": "{{- include \"common.gateway.validateConfig\" . -}}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"common.names.fullname\" . }}\n  labels:\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n  annotations:\n    {{- with .Values.jira.additionalAnnotations }}\n    {{- toYaml . | nindent 4 }}\n    {{- end }}\nspec:\n  {{- if .Values.updateStrategy }}\n  {{- with .Values.updateStrategy }}\n  updateStrategy:\n  {{- toYaml . | nindent 4 }}\n  {{- end }}\n  {{- end }}\n  {{ if .Values.ordinals.enabled }}\n  ordinals:\n    start: {{ .Values.ordinals.start }}\n  {{ end }}\n  replicas: {{ .Values.replicaCount }}\n  serviceName: {{ include \"common.names.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"common.labels.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: {{ include (print $.Template.BasePath \"/config-jvm.yaml\") . | sha256sum }}\n        {{- if .Values.additionalConfigMaps }}\n        checksum/config-additional: {{ include (print $.Template.BasePath \"/configmap-additional-config.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- if .Values.fluentd.enabled }}\n        checksum/config-fluentd: {{ include (print $.Template.BasePath \"/configmap-fluentd.yaml\") . | sha256sum }}\n        {{- end }}\n        {{- include \"jira.podAnnotations\" . | nindent 8 }}\n      labels:\n        {{- include \"common.labels.commonLabels\" . | nindent 8 }}\n        {{- include \"jira.podLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.hostNamespaces }}\n      {{- toYaml . | nindent 6 }}\n      {{- end }}\n      serviceAccountName: {{ include \"jira.serviceAccountName\" . }}\n      terminationGracePeriodSeconds: {{ .Values.jira.shutdown.terminationGracePeriodSeconds }}\n      hostAliases:\n      {{- include \"jira.additionalHosts\" . | nindent 8 }}\n      {{- if .Values.openshift.runWithRestrictedSCC }}\n      {{- else }}\n      {{- if .Values.jira.securityContextEnabled }}\n      {{- with .Values.jira.securityContext }}\n      securityContext:\n        {{ toYaml . | nindent 8 }}\n        {{- if not .fsGroup }}\n        fsGroup: 2001\n        {{- end }}\n      {{- end }}\n      {{- end }}\n      {{- end }}\n      initContainers:\n        {{- if .Values.opensearch.enabled }}\n        - name: opensearch-check\n          image: {{ include \"jira.image\" . | quote }}\n          command: ['sh', '-c']\n          args:\n          - |\n            timeout=300\n            end=$(($(date +%s) + timeout))\n            while [ $(date +%s) -lt $end ]; do\n              if curl -s -o /dev/null -w \"%{http_code}\" http://opensearch-cluster-master:9200 | grep -qE '^(200|401|403)$'; then\n                echo \"OpenSearch is ready\"\n                exit 0\n              fi\n              echo \"OpenSearch server not ready or not reachable. Waiting...\"\n              sleep 5\n            done\n            echo \"OpenSearch did not become ready in ${timeout} seconds. Exiting\"\n            exit 1\n        {{- end }}\n        {{- include \"jira.additionalInitContainers\" . | nindent 8 }}\n        {{- if and .Values.volumes.sharedHome.nfsPermissionFixer.enabled (not .Values.openshift.runWithRestrictedSCC) }}\n        - name: nfs-permission-fixer\n          image: {{ .Values.volumes.sharedHome.nfsPermissionFixer.imageRepo }}:{{ .Values.volumes.sharedHome.nfsPermissionFixer.imageTag }}\n          imagePullPolicy: IfNotPresent\n          {{- if .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          resources:\n          {{- with .Values.volumes.sharedHome.nfsPermissionFixer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          {{- end }}\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: {{ .Values.volumes.sharedHome.nfsPermissionFixer.mountPath | quote }}\n              {{- if .Values.volumes.sharedHome.subPath }}\n              subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n              {{- end }}\n          command: [\"sh\", \"-c\", {{ include \"jira.sharedHome.permissionFix.command\" . | quote }}]\n        {{- end }}\n        {{- include \"common.jmx.initContainer\" . | nindent 8 }}\n        {{- if or .Values.jira.additionalCertificates.secretName .Values.jira.additionalCertificates.secretList }}\n        - name: import-certs\n          image: {{ include \"jira.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          volumeMounts:\n            - name: keystore\n              mountPath: /var/ssl\n          {{- if.Values.jira.additionalCertificates.secretName }}\n            - name: certs\n              mountPath: /tmp/crt\n          {{- else }}\n          {{- range .Values.jira.additionalCertificates.secretList }}\n            {{- $secretName := .name }}\n            {{- range .keys }}\n            - name: {{ $secretName }}\n              mountPath: /tmp/crt/{{$secretName}}-{{ . }}\n              subPath: {{ . }}\n            {{- end }}\n          {{- end }}\n          {{- end }}\n          command: [\"/bin/bash\"]\n          args: [\"-c\", {{ include \"jira.addCrtToKeystoreCmd\" . }}]\n          resources:\n          {{- with .Values.jira.additionalCertificates.initContainer.resources }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n          securityContext:\n          {{- with .Values.jira.additionalCertificates.initContainer.securityContext }}\n          {{- toYaml . | nindent 12 }}\n          {{- end }}\n        {{- end }}\n      containers:\n        - name: {{ if .Values.jira.useHelmReleaseNameAsContainerName}}{{ include \"common.names.fullname\" . }}{{ else }}{{ .Chart.Name }}{{ end }}\n          image: {{ include \"jira.image\" . | quote }}\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          env:\n            {{- include \"jira.sessionVars\" . | nindent 12 }}\n            {{- include \"jira.tunnelVars\" . | nindent 12 }}\n            {{ if eq (include \"common.gateway.https\" .) \"true\" }}\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            {{ end }}\n            {{ if .Values.jira.service.contextPath }}\n            - name: ATL_TOMCAT_CONTEXTPATH\n              value: {{ .Values.jira.service.contextPath | quote }}\n            {{ end }}\n            - name: ATL_TOMCAT_PORT\n              value: {{ .Values.jira.ports.http | quote }}\n            {{ if eq (include \"common.gateway.isConfigured\" .) \"true\" }}\n            - name: ATL_PROXY_NAME\n              value: {{ include \"common.gateway.hostname\" . | quote }}\n            - name: ATL_PROXY_PORT\n              value: {{ include \"common.gateway.externalPort\" . | quote }}\n            {{ end }}\n            {{- include \"jira.s3StorageEnvVars\" . | nindent 12 }}\n            {{- include \"jira.databaseEnvVars\" . | nindent 12 }}\n            {{- include \"jira.clusteringEnvVars\" . | nindent 12 }}\n            - name: SET_PERMISSIONS\n              value: {{ .Values.jira.setPermissions | quote }}\n            - name: JIRA_SHARED_HOME\n              value: {{ .Values.volumes.sharedHome.mountPath | quote }}\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            - name: JVM_RESERVED_CODE_CACHE_SIZE\n              valueFrom:\n                configMapKeyRef:\n                  key: reserved_code_cache\n                  name: {{ include \"common.names.fullname\" . }}-jvm-config\n            {{- if .Values.monitoring.exposeJmxMetrics }}\n            - name: CATALINA_OPTS\n              value: {{ include \"common.jmx.javaagent\" . | replace \"\\n\" \"\" | quote }}\n            {{- end }}\n            {{- include \"opensearch.env.vars\" . | nindent 12 }}\n            {{- include \"jira.additionalConfigProperties\" . | nindent 12 }}\n            {{- include \"jira.additionalEnvironmentVariables\" . | nindent 12 }}\n          ports:\n            - name: http\n              containerPort: {{ .Values.jira.ports.http }}\n              protocol: TCP\n            - name: ehcache\n              containerPort: {{ .Values.jira.ports.ehcache }}\n              protocol: TCP\n            - name: ehcacheobject\n              containerPort: {{ .Values.jira.ports.ehcacheobject }}\n              protocol: TCP\n            {{- include \"jira.additionalPorts\" . | nindent 12 }}\n            {{- include \"common.jmx.port\" . | nindent 12 }}\n          {{- if .Values.jira.readinessProbe.enabled }}\n          readinessProbe:\n            {{- if .Values.jira.readinessProbe.customProbe}}\n            {{- with .Values.jira.readinessProbe.customProbe }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n            {{- else }}\n            httpGet:\n              port: {{ .Values.jira.ports.http }}\n              path: {{ .Values.jira.service.contextPath }}/status\n            initialDelaySeconds: {{ .Values.jira.readinessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.jira.readinessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.jira.readinessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.jira.readinessProbe.failureThreshold }}\n            {{- end }}\n          {{- end }}\n          {{- if .Values.jira.startupProbe.enabled }}\n          startupProbe:\n            tcpSocket:\n              port: {{ .Values.jira.ports.http }}\n            initialDelaySeconds: {{ .Values.jira.startupProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.jira.startupProbe.periodSeconds }}\n            failureThreshold: {{ .Values.jira.startupProbe.failureThreshold }}\n          {{- end }}\n          {{- if .Values.jira.livenessProbe.enabled }}\n          livenessProbe:\n            {{- if .Values.jira.livenessProbe.customProbe}}\n            {{- with .Values.jira.livenessProbe.customProbe }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n            {{- else }}\n            tcpSocket:\n              port: {{ .Values.jira.ports.http }}\n            initialDelaySeconds: {{ .Values.jira.livenessProbe.initialDelaySeconds }}\n            periodSeconds: {{ .Values.jira.livenessProbe.periodSeconds }}\n            timeoutSeconds: {{ .Values.jira.livenessProbe.timeoutSeconds }}\n            failureThreshold: {{ .Values.jira.livenessProbe.failureThreshold }}\n          {{- end }}\n          {{- end }}\n          {{- with .Values.jira.containerSecurityContext}}\n          securityContext:\n          {{- toYaml . | nindent 12}}\n          {{- end}}\n          {{- with .Values.jira.resources.container }}\n          resources:\n            {{- toYaml . | nindent 12 }}\n          {{- end }}\n          volumeMounts:\n            {{- include \"jira.volumeMounts\" . | nindent 12 }}\n            {{- include \"common.jmx.config.volumeMounts\" . | nindent 12 }}\n            {{- include \"jira.additionalVolumeMounts\" . | nindent 12 }}\n            {{- include \"jira.additionalLibraries\" . | nindent 12 }}\n            {{- include \"jira.additionalBundledPlugins\" . | nindent 12 }}\n            {{- range $i, $n := .Values.additionalFiles }}\n            - name: {{ .name }}-{{$i}}\n              mountPath: {{ .mountPath }}/{{ .key }}\n              subPath: {{ .key }}\n            {{ end }}\n            {{- range $i, $n := .Values.additionalConfigMaps }}\n            {{- range .keys }}\n            - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n              mountPath: {{ .mountPath }}/{{ .fileName }}\n              subPath: {{ .fileName }}\n            {{ end }}\n            {{- end }}\n          lifecycle:\n          {{- if .Values.jira.postStart.command }}\n            postStart:\n              exec:\n                command: [\"/bin/sh\", \"-c\", {{- .Values.jira.postStart.command | quote }}]\n          {{- end }}\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", {{ .Values.jira.shutdown.command | quote }}]\n        {{- include \"fluentd.container\" . | nindent 8 }}\n        {{- include \"jira.additionalContainers\" . | nindent 8 }}\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.jira.topologySpreadConstraints }}\n      topologySpreadConstraints:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n      {{- end }}\n      {{- if .Values.schedulerName }}\n      schedulerName: {{ .Values.schedulerName  | quote }}\n      {{- end }}\n      volumes:\n        {{- range $i, $n := .Values.additionalFiles }}\n        - name: {{ .name }}-{{$i}}\n          {{ .type }}:\n            {{ if hasPrefix .type \"secret\" }}{{ .type}}Name{{ else }}name{{ end }}: {{ .name }}\n            items:\n              - key: {{ .key }}\n                path: {{ .key }}\n        {{ end }}\n        {{- range $i, $key := .Values.additionalConfigMaps }}\n        {{- with $ }}\n        {{- range $key.keys }}\n        - name: {{ .fileName | replace \"_\" \"-\" | replace \".\" \"-\" }}\n          configMap:\n            name: {{ include \"common.names.fullname\" $ }}-{{ $key.name }}\n            {{- if .defaultMode }}\n            defaultMode: {{ .defaultMode }}\n            {{- end }}\n            items:\n              - key: {{ .fileName }}\n                path: {{ .fileName }}\n            {{- end }}\n        {{ end }}\n        {{- end }}\n        {{ include \"jira.volumes\" . | nindent 8 }}\n        {{ include \"fluentd.config.volume\" . | nindent 8 }}\n        {{ include \"common.jmx.config.volume\" . | nindent 8 }}\n  {{ include \"jira.volumeClaimTemplates\" . | nindent 2 }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/tests/test-application-status.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"jira.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.statusTestContainer }}\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: STATUS_URL\n          value: \"http://{{ include \"common.names.fullname\" . }}:{{ .Values.jira.service.port }}/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/tests/test-database-connectivity.yaml",
    "content": "{{ if .Values.database.credentials.secretName }}\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-db-connectivity-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"jira.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  serviceAccountName: {{ include \"jira.serviceAccountName\" . }}\n  containers:\n    - name: test\n      image: {{ include \"jira.image\" . | quote }}\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: JDBC_DRIVER\n          value: {{ .Values.database.driver | quote }}\n        - name: JDBC_URL\n          value: {{ .Values.database.url | quote }}\n        - name: JDBC_USER\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.usernameSecretKey }}\n        - name: JDBC_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: {{ .Values.database.credentials.secretName }}\n              key: {{ .Values.database.credentials.passwordSecretKey }}\n        - name: CLASSPATH\n          value: \"/opt/atlassian/jira/lib/*\"\n      command:\n        - /bin/bash\n        - -ec\n        - |\n          cat <<EOF | jshell - > output.txt\n          var jdbcDriver = System.getenv(\"JDBC_DRIVER\");\n          var jdbcUrl = System.getenv(\"JDBC_URL\");\n          var jdbcUsername = System.getenv(\"JDBC_USER\");\n          var jdbcPassword = System.getenv(\"JDBC_PASSWORD\");\n\n          System.out.println(\"Loading driver \" + jdbcDriver);\n          Class.forName(jdbcDriver);\n\n          System.out.println(\"Establishing connection to \" + jdbcUrl);\n          try (var c = java.sql.DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)) {\n             System.out.println(\"Connection established OK, \" + c.getClass());\n          }\n          EOF\n          cat output.txt\n          grep -q \"Connection established OK\" output.txt\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n{{ end }}\n"
  },
  {
    "path": "src/main/charts/jira/templates/tests/test-shared-home-permissions.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"common.names.fullname\" . }}-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n    {{- if not .Values.testPods.annotations }}\n    {{- include \"jira.podAnnotations\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.annotations }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\n  labels:\n    {{- if not .Values.testPods.labels }}\n    {{- include \"common.labels.commonLabels\" . | nindent 4 }}\n    {{- else }}\n    {{- range $key, $value := .Values.testPods.labels }}\n    {{ $key | quote }}: {{ tpl $value $ | quote }}\n    {{- end }}\n    {{- end }}\nspec:\n  containers:\n    - name: test\n      image: {{ .Values.testPods.image.permissionsTestContainer }}\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        {{- with .Values.jira.securityContext }}\n        {{- if and .enabled .gid }}\n        runAsUser: {{ .gid }}\n        runAsGroup: {{ .gid }}\n        {{- else if .fsGroup }}\n        runAsUser: {{ .fsGroup }}\n        runAsGroup: {{ .fsGroup }}\n        {{- else }}\n        runAsUser: {{ 2001 }}\n        runAsGroup: {{ 2001 }}\n        {{- end }}\n        {{- end }}\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n          {{- if .Values.volumes.sharedHome.subPath }}\n          subPath: {{ .Values.volumes.sharedHome.subPath | quote }}\n          {{- end }}\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n      {{- with .Values.testPods.resources }}\n      resources:\n      {{- toYaml . | nindent 8 }}\n      {{- end }}\n  volumes:\n    {{ include \"jira.volumes.sharedHome\" . | nindent 4 }}\n  restartPolicy: Never\n  {{- with .Values.testPods.nodeSelector }}\n  nodeSelector:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.affinity }}\n  affinity:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- with .Values.testPods.tolerations }}\n  tolerations:\n  {{- toYaml . | nindent 8 }}\n  {{- end }}\n  {{- if .Values.testPods.schedulerName }}\n  schedulerName: {{ .Values.testPods.schedulerName  | quote }}\n  {{- end }}\n"
  },
  {
    "path": "src/main/charts/jira/values.yaml",
    "content": "## Atlassian Jira Data Center Helm values\n#\n# HEADS UP!\n#\n# Data loss will occur if sections declared as 'REQUIRED' are not configured appropriately!\n# These sections are:\n# - database\n# - volumes\n#\n# Additional details on pre-provisioning these required resources can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#3-configure-database\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#5-configure-persistent-storage\n#\n# To manage external access to the Jira instance, a Gateway API HTTPRoute or an Ingress\n# resource can be configured under the 'gateway' or 'ingress' stanza respectively.\n# This requires a pre-provisioned gateway/ingress controller to be present.\n#\n# Additional details on configuring external access can be found here:\n# https://atlassian.github.io/data-center-helm-charts/userguide/INSTALLATION/#4-configure-ingress\n#\n##\n\n\n# -- The initial number of Jira pods that should be started at deployment time.\n# Note that Jira requires manual configuration via the browser post deployment\n# after the first pod is deployed. This configuration must be completed before\n# scaling up additional pods. As such this value should always be kept as 1,\n# but can be altered once manual configuration is complete.\n#\nreplicaCount: 1\n\n# -- Set a custom start ordinal number for the K8s stateful set.\n# Note that this depends on the StatefulSetStartOrdinal K8s feature gate,\n# which has entered beta state with K8s version 1.27.\n#\nordinals:\n\n  # -- Enable only if StatefulSetStartOrdinal K8s feature gate is available.\n  #\n  enabled: false\n\n  # -- Set start ordinal to a positive integer, defaulting to 0.\n  #\n  start: 0\n\n# -- StatefulSet update strategy. When unset defaults to Rolling update.\n# See: https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets\n#\nupdateStrategy: {}\n  # type: OnDelete\n\n# Image configuration\n#\nimage:\n\n  # -- The Jira Docker image to use\n  # https://hub.docker.com/r/atlassian/jira-software\n  #\n  repository: atlassian/jira-software\n\n  # -- Image pull policy\n  #\n  pullPolicy: IfNotPresent\n\n  # -- The docker image tag to be used - defaults to the Chart appVersion\n  #\n  tag: \"\"\n\n# K8s ServiceAccount configuration. Give fine-grained identity and authorization\n# to Pods\n#\nserviceAccount:\n\n  # -- Set to 'true' if a ServiceAccount should be created, or 'false' if it\n  # already exists.\n  #\n  create: true\n\n  # -- The name of the ServiceAccount to be used by the pods. If not specified, but\n  # the \"serviceAccount.create\" flag is set to 'true', then the ServiceAccount name\n  # will be auto-generated, otherwise the 'default' ServiceAccount will be used.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server\n  #\n  name:\n\n  # -- For Docker images hosted in private registries, define the list of image pull\n  # secrets that should be utilized by the created ServiceAccount\n  # https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod\n  #\n  imagePullSecrets: []\n  # - name: secretName\n\n  # -- Annotations to add to the ServiceAccount (if created)\n  #\n  annotations: {}\n\n  # Use EKS IRSA. See: https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html\n  #\n  eksIrsa:\n\n    # Defining a full arn of AWS role to assume will automatically annotate jira,\n    # e.g. `eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/S3Access`.\n    # \"-Daws.webIdentityTokenFile=/var/run/secrets/eks.amazonaws.com/serviceaccount/token\" will be automatically added to Jira JVM arguments\n    roleArn:\n\n\n# REQUIRED - Database configuration\n#\n# Jira requires a backend database. The configuration below can be used to define the\n# database to use and its connection details.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#database-connectivity\n#\ndatabase:\n\n  # -- The database type that should be used. If not specified, then it will need to be\n  # provided via the browser during manual configuration post deployment. Valid values\n  # include:\n   # * 'postgres72'\n   # * 'mysql57'\n   # * 'mysql8'\n   # * 'oracle10g'\n   # * 'mssql'\n   # * 'postgresaurora96'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasetype\n  #\n  type:\n\n  # -- The jdbc URL of the database. If not specified, then it will need to be provided\n  # via the browser during manual configuration post deployment. Example URLs include:\n   # * 'jdbc:postgresql://<dbhost>:5432/<dbname>'\n   # * 'jdbc:mysql://<dbhost>/<dbname>'\n   # * 'jdbc:sqlserver://<dbhost>:1433;databaseName=<dbname>'\n   # * 'jdbc:oracle:thin:@<dbhost>:1521:<SID>'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databaseurl\n  #\n  url:\n\n  # -- The Java class name of the JDBC driver to be used. If not specified, then it will\n  # need to be provided via the browser during manual configuration post deployment.\n  # Valid drivers are:\n   # * 'org.postgresql.Driver'\n   # * 'com.mysql.jdbc.Driver'\n   # * 'oracle.jdbc.OracleDriver'\n   # * 'com.microsoft.sqlserver.jdbc.SQLServerDriver'\n  # https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#databasedriver:\n  #\n  driver:\n\n  # JDBC connection credentials\n  #\n  credentials:\n\n    # -- The name of the K8s Secret that contains the database login credentials.\n    # If the secret is specified, then the credentials will be automatically utilised on\n    # Jira startup. If the secret is not provided, then the credentials will need to be\n    # provided via the browser during manual configuration post deployment.\n    #\n    # Example of creating a database credentials K8s secret below:\n    # 'kubectl create secret generic <secret-name> --from-literal=username=<username> \\\n    # --from-literal=password=<password>'\n    # https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets\n    #\n    secretName:\n\n    # -- The key ('username') in the Secret used to store the database login username\n    #\n    usernameSecretKey: username\n\n    # -- The key ('password') in the Secret used to store the database login password\n    #\n    passwordSecretKey: password\n\n# REQUIRED - Volume configuration\n#\n# By default, the charts will configure the local-home and shared-home as ephemeral\n# volumes i.e. 'emptyDir: {}'. This is fine for evaluation purposes but for production\n# deployments this is not ideal and so local-home and shared-home should both be configured\n# appropriately.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#volumes\n#\nvolumes:\n\n  # Each pod requires its own volume for 'local-home'. This is needed for key data\n  # that help define how Jira works.\n  # https://confluence.atlassian.com/adminjiraserver/jira-application-home-directory-938847746.html\n  #\n  localHome:\n\n    # Dynamic provisioning of local-home using the K8s Storage Classes\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/LOCAL_STORAGE/\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolume' and 'PersistentVolumeClaim' will be dynamically\n      # created for each pod based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the name of the 'StorageClass' that should be used for the local-home\n      # volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests and/or limits for the local-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # This field controls if and how PVCs are deleted during the lifecycle of a StatefulSet.\n    # Only configure the below two attributes when your Kubernetes version is 1.27+, and\n    # feature gate StatefulSetAutoDeletePVC is enabled.\n    #\n    # For each policy that you can configure, you can set the value to either Delete or Retain.\n    #\n    # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention\n    #\n    persistentVolumeClaimRetentionPolicy:\n\n      # -- Configures the volume retention behavior that applies when the StatefulSet is deleted.\n      #\n      whenDeleted:\n\n      # -- Configures the volume retention behavior that applies when the replica count of the StatefulSet is reduced.\n      #\n      whenScaled:\n\n    # -- Static provisioning of local-home using K8s PVs and PVCs\n    #\n    # NOTE: Due to the ephemeral nature of pods this approach to provisioning volumes for\n    # pods is not recommended. Dynamic provisioning described above is the prescribed\n    # approach.\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the local-home volume(s). If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Jira container to which the local-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/jira\"\n\n    # -- Specifies the sub-directory of the local-home volume that will be mounted in to the\n    # Jira container.\n    #\n    subPath:\n\n  # A volume for 'shared-home' is required by Jira to effectively operate in multi-node\n  # environment\n  # https://confluence.atlassian.com/adminjiraserver/set-up-a-jira-data-center-cluster-993929600.html\n  #\n  sharedHome:\n\n    # Dynamic provisioning of shared-home using the K8s Storage Class\n    #\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic\n    #\n    persistentVolumeClaim:\n\n      # -- If 'true', then a 'PersistentVolumeClaim' and 'PersistentVolume' will be dynamically\n      # created for shared-home based on the 'StorageClassName' supplied below.\n      #\n      create: false\n\n      # -- Specify the access modes that should be used for the 'shared-home' volume claim.\n      # Note: 'ReadWriteOnce' (RWO) is suitable only for single-node installations.\n      # Be aware that changing the access mode of an existing PVC might be impossible, as the PVC spec is immutable.\n      # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes\n      #\n      accessModes:\n        - ReadWriteMany\n\n      # -- Specify the name of the 'StorageClass' that should be used for the 'shared-home'\n      #volume claim.\n      #\n      storageClassName:\n\n      # -- Specifies the standard K8s resource requests and/or limits for the shared-home\n      # volume claims.\n      #\n      resources:\n        requests:\n          storage: 1Gi\n\n    # -- Static provisioning of shared-home using K8s PVs and PVCs\n    #\n    # When 'persistentVolumeClaim.create' is 'false', then this value can be used to define\n    # a standard K8s volume that will be used for the shared-home volume. If not defined,\n    # then an 'emptyDir' volume is utilised. Having provisioned a 'PersistentVolume', specify\n    # the bound 'persistentVolumeClaim.claimName' for the 'customVolume' object.\n    # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#static\n    # https://atlassian.github.io/data-center-helm-charts/examples/storage/aws/SHARED_STORAGE/\n    #\n    customVolume: {}\n    # persistentVolumeClaim:\n    #   claimName: \"<pvc>\"\n\n    # -- Specifies the path in the Jira container to which the shared-home volume will be\n    # mounted.\n    #\n    mountPath: \"/var/atlassian/application-data/shared-home\"\n\n    # -- Specifies the sub-directory of the shared-home volume that will be mounted in to the\n    # Jira container.\n    #\n    subPath:\n\n    # Modify permissions on shared-home\n    #\n    nfsPermissionFixer:\n\n      # -- If 'true', this will alter the shared-home volume's root directory so that Jira\n      # can write to it. This is a workaround for a K8s bug affecting NFS volumes:\n      # https://github.com/kubernetes/examples/issues/260\n      #\n      enabled: true\n\n      # -- The path in the K8s initContainer where the shared-home volume will be mounted\n      #\n      mountPath: \"/shared-home\"\n\n      # -- Image repository for the permission fixer init container. Defaults to alpine\n      #\n      imageRepo: alpine\n\n      # -- Image tag for the permission fixer init container. Defaults to latest\n      #\n      imageTag: latest\n\n      # -- Resources requests and limits for nfsPermissionFixer init container\n      # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n      #\n      resources: {}\n      #  requests:\n      #    cpu: \"1m\"\n      #    memory: \"20Mi\"\n      #  limits:\n      #    cpu: \"1\"\n      #    memory: \"1G\"\n\n      # -- By default, the fixer will change the group ownership of the volume's root directory\n      # to match the Jira container's GID (2001), and then ensures the directory is\n      # group-writeable. If this is not the desired behaviour, command used can be specified\n      # here.\n      #\n      command:\n\n  # -- Defines additional volumes that should be applied to all Jira pods.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in jira.additionalVolumeMounts\n  #\n  additional: []\n\n# Ingress configuration\n#\n# Use this section when routing external traffic to Jira via a Kubernetes Ingress\n# resource (K8s Ingress API). Requires a pre-provisioned Ingress Controller.\n# If using the Gateway API instead, see the 'gateway' section below.\n# https://atlassian.github.io/data-center-helm-charts/userguide/CONFIGURATION/#ingress\n#\ningress:\n\n  # -- Set to 'true' if an Ingress Resource should be created. This depends on a\n  # pre-provisioned Ingress Controller being available.\n  #\n  create: false\n\n  # -- The fully-qualified hostname (FQDN) of the Jira instance. This value is used\n  # to configure the product's proxy settings and, when ingress.create is true,\n  # the Ingress resource routing rules.\n  #\n  host:\n\n  # -- Whether users access the application over HTTPS. Set to 'false' if not\n  # using TLS, e.g. when reaching the service via localhost port-forwarding.\n  #\n  https: true\n\n  # -- The base path for the application, e.g. '/jira'.\n  # Defaults to 'jira.service.contextPath'.\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when ingress.create is true.\n  # They configure the Ingress resource itself and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Set to true if you want to create an OpenShift Route instead of an Ingress\n  #\n  openShiftRoute: false\n\n  # -- routeHttpHeaders defines policy for HTTP headers. Applicable to OpenShift Routes only\n  #\n  routeHttpHeaders: {}\n\n  # -- The class name used by the ingress controller if it's being used.\n  #\n  # Please follow documentation of your ingress controller. If the cluster\n  # contains multiple ingress controllers, this setting allows you to control\n  # which of them is used for Atlassian application traffic.\n  #\n  className: \"nginx\"\n\n  # -- Set to 'true' if the Ingress Resource is to use the K8s 'ingress-nginx'\n  # controller.\n  # https://kubernetes.github.io/ingress-nginx/\n  #\n  # This will populate the Ingress Resource with annotations that are specific to\n  # the K8s ingress-nginx controller. Set to 'false' if a different controller is\n  # to be used, in which case the appropriate annotations for that controller must\n  # be specified below under 'ingress.annotations'.\n  #\n  nginx: true\n\n  # -- The max body size to allow. Requests exceeding this size will result\n  # in an HTTP 413 error being returned to the client.\n  #\n  maxBodySize: 250m\n\n  # -- Defines a timeout for establishing a connection with a proxied server. It should\n  # be noted that this timeout cannot usually exceed 75 seconds.\n  #\n  proxyConnectTimeout: 60\n\n  # -- Defines a timeout for reading a response from the proxied server. The timeout is\n  # set only between two successive read operations, not for the transmission of the\n  # whole response. If the proxied server does not transmit anything within this time,\n  # the connection is closed.\n  #\n  proxyReadTimeout: 60\n\n  # -- Sets a timeout for transmitting a request to the proxied server. The timeout is set\n  # only between two successive write operations, not for the transmission of the whole\n  # request. If the proxied server does not receive anything within this time, the\n  # connection is closed.\n  #\n  proxySendTimeout: 60\n\n  # -- The custom annotations that should be applied to the Ingress Resource.\n  # If using an ingress-nginx controller be sure that the annotations you add\n  # here are compatible with those already defined in the 'ingess.yaml' template\n  #\n  annotations: {}\n\n  # -- The name of the K8s Secret that contains the TLS private key and corresponding\n  # certificate. When utilised, TLS termination occurs at the ingress point where\n  # traffic to the Service, and it's Pods is in plaintext.\n  #\n  # Usage is optional and depends on your use case. The Ingress Controller itself\n  # can also be configured with a TLS secret for all Ingress Resources.\n  # https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets\n  # https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n  #\n  tlsSecretName:\n\n  # -- Additional paths to be added to the Ingress resource to point to different backend services\n  #\n  additionalPaths: []\n    #- path: /static-content\n    #  pathType: Prefix\n    #  service: static-content-svc\n    #  portNumber: 80\n\n# Gateway API configuration\n#\n# Use this section when routing external traffic to Jira via the Kubernetes\n# Gateway API, or when using an external proxy/load balancer without creating\n# any K8s routing resource. Only one of 'ingress' or 'gateway' should be used.\n# https://gateway-api.sigs.k8s.io/\n#\ngateway:\n\n  # -- Set to 'true' if an HTTPRoute Resource should be created. This depends on a\n  # pre-provisioned Gateway API controller being available and a Gateway resource.\n  # Cannot be enabled if ingress.create is true.\n  #\n  create: false\n\n  # -- The hostnames that should be routed to Jira. At least one hostname\n  # is required when gateway.create is true. Setting hostnames activates gateway\n  # mode for product configuration even when gateway.create is false, allowing\n  # use with a pre-existing Gateway or external proxy.\n  # The first entry is used as the canonical hostname for base URL, proxy\n  # settings, and NOTES output — list the primary/public hostname first.\n  #\n  hostnames: []\n  # - jira.example.com\n  # - jira-prod.example.com\n\n  # -- Whether users access the application over HTTPS.\n  # This does not configure TLS on the Gateway or load balancer — it must match\n  # how traffic is actually routed to the application.\n  #\n  https: true\n\n  # -- The port users connect on. Defaults to 443 (https) or 80 (http).\n  # This does not change the Gateway or load balancer port — it must match\n  # the port that is actually used. Only set for non-standard ports.\n  #\n  # externalPort:\n\n  # -- The base path for routing. When empty, falls back to the product's\n  # service.contextPath (same behavior as ingress). Set explicitly to\n  # override, e.g. \"/jira\".\n  #\n  path:\n\n  # ---------------------------------------------------------------------------\n  # The options below apply only when gateway.create is true.\n  # They configure the HTTPRoute resource and have no effect otherwise.\n  # ---------------------------------------------------------------------------\n\n  # -- Reference to the parent Gateway resource. Supports any standard\n  # parentRef fields (name, namespace, sectionName, etc.).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.ParentReference\n  #\n  parentRefs: []\n    # - name: example-gateway\n    #   namespace: example-gateway-namespace\n    #   sectionName: https\n\n  # -- Path matching type. Can be \"PathPrefix\", \"Exact\", or \"RegularExpression\".\n  # PathPrefix is recommended for most use cases.\n  #\n  pathType: \"PathPrefix\"\n\n  # -- Annotations to add to the HTTPRoute resource.\n  #\n  annotations: {}\n  # kubernetes.io/ingress.class: gateway\n  # cert-manager.io/cluster-issuer: letsencrypt\n\n  # -- Labels to add to the HTTPRoute resource.\n  #\n  labels: {}\n  # environment: production\n  # team: platform\n\n  # -- HTTP filters to apply to requests. Can be used to add/remove headers,\n  # perform redirects, or rewrite URLs.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteFilter\n  #\n  filters: []\n  # - type: RequestHeaderModifier\n  #   requestHeaderModifier:\n  #     add:\n  #     - name: X-Forwarded-Proto\n  #       value: https\n\n  # -- Advanced routing rules. Use this for complex routing scenarios like\n  # header-based routing, traffic splitting, or multiple backends.\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteRule\n  #\n  additionalRules: []\n  # - matches:\n  #   - path:\n  #       type: PathPrefix\n  #       value: /api\n  #   backendRefs:\n  #   - name: jira-api\n  #     port: 8080\n\n  # -- Session affinity (sticky sessions) is required for Atlassian DC products but\n  # is not part of the standard Gateway API HTTPRoute spec. It must be configured\n  # separately through your Gateway implementation's own policy resources.\n  # See docs/docs/examples/ingress/GATEWAY_API_SESSION_AFFINITY.md for working examples.\n\n  # -- Timeout configuration for HTTPRoute rules.\n  # Note: when migrating from Ingress, these replace proxyReadTimeout and\n  # proxySendTimeout. There is no Gateway API equivalent for\n  # proxyConnectTimeout or maxBodySize — those require controller-specific\n  # policies (e.g. Envoy Gateway BackendTrafficPolicy).\n  # See: https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1.HTTPRouteTimeouts\n  #\n  timeouts:\n    request: \"60s\"\n    backendRequest: \"60s\"\n\n# Jira configuration\n#\njira:\n\n  # -- Whether the main container should acquire helm release name. The default, the container name is jira (Helm chart name)\n  #\n  useHelmReleaseNameAsContainerName: false\n\n  # K8s Service configuration\n  #\n  service:\n\n    # -- The port on which the Jira K8s Service will listen\n    #\n    port: 80\n\n    # -- The type of K8s service to use for Jira\n    #\n    type: ClusterIP\n\n    # --  Only applicable if service.type is NodePort. NodePort for Jira service\n    #\n    nodePort:\n\n    # -- Session affinity type. If you want to make sure that connections from a particular client\n    # are passed to the same pod each time, set sessionAffinity to ClientIP.\n    # See: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity\n    #\n    sessionAffinity: None\n\n    # -- Session affinity configuration\n    #\n    sessionAffinityConfig:\n\n      clientIP:\n\n        # -- Specifies the seconds of ClientIP type session sticky time.\n        # The value must be > 0 && <= 86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800 (for 3 hours).\n        #\n        timeoutSeconds:\n\n    # -- Use specific loadBalancerIP. Only applies to service type LoadBalancer.\n    #\n    loadBalancerIP:\n\n    # -- The Tomcat context path that Jira will use. The ATL_TOMCAT_CONTEXTPATH\n    # will be set automatically.\n    #\n    contextPath:\n\n    # -- Additional annotations to apply to the Service\n    #\n    annotations: {}\n\n  # Standard K8s field that holds pod-level security attributes and common container settings.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  # Do not populate when deploying to OpenShift, unless anyuid policy is attached to a service account.\n  #\n\n  # -- Whether to apply security context to pod.\n  #\n  securityContextEnabled: true\n\n  securityContext:\n\n    # -- The GID used by the Jira docker image\n    # GID will default to 2001 if not supplied and securityContextEnabled is set to true.\n    # This is intended to ensure that the shared-home volume is group-writeable by the GID used by the Jira container.\n    # However, this doesn't appear to work for NFS volumes due to a K8s bug: https://github.com/kubernetes/examples/issues/260\n    #\n    fsGroup: 2001\n\n    # -- fsGroupChangePolicy defines behavior for changing ownership and permission of the volume before being exposed inside a Pod.\n    # This field only applies to volume types that support fsGroup controlled ownership and permissions.\n    # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#configure-volume-permission-and-ownership-change-policy-for-pods\n    #\n    fsGroupChangePolicy: \"OnRootMismatch\"\n\n  # -- Standard K8s field that holds security configurations that will be applied to a container.\n  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n  #\n  containerSecurityContext: {}\n\n  # -- Boolean to define whether to set local home directory permissions on startup\n  # of Jira container. Set to 'false' to disable this behaviour.\n  #\n  setPermissions: true\n\n  # Port definitions\n  #\n  ports:\n\n    # -- The port on which the Jira container listens for HTTP traffic\n    #\n    http: 8080\n\n    # -- Ehcache port\n    #\n    ehcache: 40001\n\n    # -- Ehcache object port\n    #\n    ehcacheobject: 40011\n\n  # Confirm that Jira is available with a ReadinessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes\n  #\n  readinessProbe:\n\n    # -- Whether to apply the readinessProbe check to pod.\n    #\n    enabled: true\n\n    # -- The initial delay (in seconds) for the Jira container readiness probe,\n    # after which the probe will start running.\n    #\n    initialDelaySeconds: 10\n\n    # -- How often (in seconds) the Jira container readiness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Jira container readiness probe\n    # before the pod fails readiness checks.\n    #\n    failureThreshold: 10\n\n    # -- Custom readinessProbe to override the default /status httpGet\n    #\n    customProbe: {}\n#      tcpSocket:\n#        port: 8080\n#      periodSeconds: 5\n#      failureThreshold: 120\n\n  # Confirm that Jira is up and running with a StartupProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-startup-probes\n  #\n  startupProbe:\n\n    # -- Whether to apply the startupProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Jira container startup probe will run\n    #\n    periodSeconds: 5\n\n    # -- The number of consecutive failures of the Jira container startup probe\n    # before the pod fails startup checks.\n    #\n    failureThreshold: 120\n\n  # Ensure that the server responds with a LivenessProbe\n  # https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-tcp-liveness-probe\n  #\n  livenessProbe:\n\n    # -- Whether to apply the livenessProbe check to pod.\n    #\n    enabled: false\n\n    # -- Time to wait before starting the first probe\n    #\n    initialDelaySeconds: 60\n\n    # -- How often (in seconds) the Jira container liveness probe will run\n    #\n    periodSeconds: 5\n\n    # -- Number of seconds after which the probe times out\n    #\n    timeoutSeconds: 1\n\n    # -- The number of consecutive failures of the Jira container liveness probe\n    # before the pod fails liveness checks.\n    #\n    failureThreshold: 12\n\n    # -- Custom livenessProbe to override the default tcpSocket probe\n    #\n    customProbe: {}\n\n  # Jira log configuration\n  #\n  accessLog:\n\n    # -- The path within the Jira container where the local-home volume should be\n    # mounted in order to capture access logs.\n    #\n    mountPath: \"/opt/atlassian/jira/logs\"\n\n    # -- The subdirectory within the local-home volume where access logs should be\n    # stored.\n    #\n    localHomeSubPath: \"log\"\n\n  # Use AWS S3 to store avatars and attachments. From Jira 9.9 onwards.\n  #\n\n  s3Storage:\n\n    avatars:\n      # -- Bucket name to store avatars. If a bucket name and region (see below) are defined, Jira will automatically\n      # use AWS S3 to store avatars. Only bucket name is required, not the full arn.\n      #\n      bucketName:\n\n      # -- AWS region where the S3 bucket is located.\n      #\n      bucketRegion:\n\n      # -- Override the default AWS API endpoint with a custom one\n      #\n      endpointOverride:\n\n    attachments:\n      # -- Bucket name to store attachments. If a bucket name and region (see below) are defined, Jira will automatically\n      # use AWS S3 to store attachments. Only bucket name is required, not the full arn.\n      # If you provide the same bucket name for both avatars and attachments, they will be stored in the same bucket\n      #\n      bucketName:\n\n      # -- AWS region where the S3 bucket is located.\n      #\n      bucketRegion:\n\n      # -- Override the default AWS API endpoint with a custom one\n      #\n      endpointOverride:\n\n    backups:\n      # -- Bucket name to store backups. If a bucket name and region (see below) are defined, Jira will automatically\n      # use AWS S3 to store backups. Only bucket name is required, not the full arn.\n      # If you provide the same bucket name for both avatars and backups, they will be stored in the same bucket\n      #\n      bucketName:\n\n      # -- AWS region where the S3 bucket is located.\n      #\n      bucketRegion:\n\n      # -- Override the default AWS API endpoint with a custom one\n      #\n      endpointOverride:\n\n  session:\n\n    # -- User session timeout. Set to 30 minutes in web.xml\n    #\n    timeout:\n\n    # -- The maximum time a user can remain logged-in with 'Remember Me'. Defaults to 1209600; two weeks, in seconds\n    #\n    autologinCookieAge:\n\n  # Data Center clustering\n  #\n  clustering:\n\n    # -- Set to 'true' if Data Center clustering should be enabled\n    # This will automatically configure cluster peer discovery between cluster nodes.\n    #\n    enabled: false\n\n  shutdown:\n\n    # -- The termination grace period for pods during shutdown. This\n    # should be set to the internal grace period, plus a small buffer\n    # to allow the JVM to fully terminate.\n    #\n    terminationGracePeriodSeconds: 30\n\n    # -- By default pods will be stopped via a [preStop hook](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/),\n    # using a script supplied by the Docker image. If any other\n    # shutdown behaviour is needed it can be achieved by overriding\n    # this value. Note that the shutdown command needs to wait for the\n    # application shutdown completely before exiting; see [the default\n    # command](https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/shutdown-wait.sh)\n    # for details.\n    #\n    command: \"/shutdown-wait.sh\"\n\n  # -- PostStart is executed immediately after a container is created.\n  # However, there is no guarantee that the hook will execute before the container ENTRYPOINT.\n  # See: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n  #\n  postStart:\n    command:\n\n  # Pod resource requests\n  #\n  resources:\n\n    # JVM Memory / Heap Size definitions. The values below are based on the\n    # defaults defined for the Jira docker container.\n    # https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/#markdown-header-memory-heap-size\n    #\n    jvm:\n\n      # -- The maximum amount of heap memory that will be used by the Jira JVM\n      #\n      maxHeap: \"768m\"\n\n      # -- The minimum amount of heap memory that will be used by the Jira JVM\n      #\n      minHeap: \"384m\"\n\n      # -- The memory reserved for the Jira JVM code cache\n      #\n      reservedCodeCache: \"512m\"\n\n    # Specifies the standard K8s resource requests and/or limits for the Jira\n    # container. It is important that if the memory resources are specified here,\n    # they must allow for the size of the Jira JVM. That means the maximum heap\n    # size, the reserved code cache size, plus other JVM overheads, must be\n    # accommodated. Allowing for (maxHeap+codeCache)*1.5 would be an example.\n    #\n    container:\n\n      requests:\n\n        # -- Initial CPU request by Jira pod\n        #\n        cpu: \"2\"\n\n        # -- Initial Memory request by Jira pod\n        #\n        memory: \"2G\"\n\n      # limits:\n      #   cpu: \"2\"\n      #   memory: \"2G\"\n\n  # -- The Docker entrypoint.py generates application configuration on\n  # first start; not all of these files are regenerated on subsequent starts.\n  # By default, dbconfig.xml is generated only once. Set `forceConfigUpdate` to true\n  # to change this behavior.\n  #\n  forceConfigUpdate: false\n  # Specifies a list of additional arguments that can be passed to the Jira JVM, e.g.\n  # system properties.\n  #\n  additionalJvmArgs: []\n\n  # -- By default Tomcat's server.xml is generated in the container entrypoint from a template\n  # shipped with an official Jira image. However, server.xml generation may fail if container\n  # is not run as root, which is a common case if Jira is deployed to OpenShift.\n  #\n  tomcatConfig:\n\n    # -- Mount server.xml as a ConfigMap. Override configuration elements if necessary\n    #\n    generateByHelm: false\n\n    mgmtPort: \"8005\"\n    port: \"8080\"\n    maxThreads: \"100\"\n    minSpareThreads: \"10\"\n    connectionTimeout: \"20000\"\n    enableLookups: \"false\"\n    protocol: \"HTTP/1.1\"\n    redirectPort: \"8443\"\n    acceptCount: \"100\"\n    # secure is set based on the https setting (gateway.https or ingress.https)\n    secure:\n    # scheme is set based on the https setting (http if false, https if true)\n    scheme:\n    # proxyName is set to the configured hostname (gateway.hostnames[0] or ingress.host)\n    proxyName:\n    # proxyPort is set to the external port (defaults to 443 for https, 80 for http)\n    proxyPort:\n    maxHttpHeaderSize: \"8192\"\n    stuckThreadDetectionValveThreshold: \"120\"\n    accessLogMaxDays: \"-1\"\n    accessLogPattern: \"%a %{jira.request.id}r %{jira.request.username}r %t &quot;%m %U%q %H&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; &quot;%{jira.request.assession.id}r&quot;\"\n    requestAttributesEnabled: \"false\"\n\n    # -- Custom server.xml to be mounted into /opt/atlassian/jira/conf\n    #\n    customServerXml: |\n#      <?xml version='1.0' encoding='utf-8'?>\n#      <Server port=\"8005\" shutdown=\"SHUTDOWN\">\n#      </Server>\n\n  # -- By default seraph-config.xml is generated in the container entrypoint from a template\n  # shipped with an official Jira image. However, seraph-config.xml generation may fail if container\n  # is not run as root, which is a common case if Jira is deployed to OpenShift.\n  #\n  seraphConfig:\n\n    # -- Mount seraph-config.xml as a ConfigMap. Override configuration elements if necessary\n    #\n    generateByHelm: false\n\n    autoLoginCookieAge: \"1209600\"\n\n  # -- Specifies a list of additional Java libraries that should be added to the\n  # Jira container. Each item in the list should specify the name of the volume\n  # that contains the library, as well as the name of the library file within that\n  # volume's root directory. Optionally, a subDirectory field can be included to\n  # specify which directory in the volume contains the library file. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  additionalLibraries: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n  # -- Specifies a list of additional Jira plugins that should be added to the\n  # Jira container. Note plugins installed via this method will appear as\n  # bundled plugins rather than user plugins. These should be specified in the same\n  # manner as the 'additionalLibraries' property. Additional details:\n  # https://atlassian.github.io/data-center-helm-charts/examples/external_libraries/EXTERNAL_LIBS/\n  #\n  # NOTE: only .jar files can be loaded using this approach. OBR's can be extracted\n  # (unzipped) to access the associated .jar\n  #\n  # An alternative to this method is to install the plugins via \"Manage Apps\" in the\n  # product system administration UI.\n  #\n  additionalBundledPlugins: []\n  #  - volumeName:\n  #    subDirectory:\n  #    fileName:\n\n  # -- Defines any additional volumes mounts for the Jira container. These\n  # can refer to existing volumes, or new volumes can be defined via\n  # 'volumes.additional'.\n  #\n  additionalVolumeMounts: []\n\n  # -- Additional properties to inject into jira-config.properties at container\n  # startup via ADDITIONAL_JIRA_CONFIG_* environment variables.\n  # Each entry is a \"key=value\" property line. Environment variable names are\n  # sorted for consistent file generation; order has no effect on runtime behavior.\n  #\n  # Requires a Jira container image version that supports ADDITIONAL_JIRA_CONFIG_*.\n  #\n  additionalConfigProperties: []\n  #  - \"jira.websudo.is.disabled=true\"\n  #  - \"jira.lf.top.bgcolour=#003366\"\n\n  # -- Additional properties requiring environment variable expansion at\n  # container startup. Values containing {VAR_NAME} placeholders will be\n  # replaced with the corresponding environment variable value.\n  # Useful for injecting secrets without hardcoding them in values.\n  #\n  additionalConfigPropertiesExpandEnv: []\n  #  - \"opensearch.password={OPENSEARCH_ADMIN_PASSWORD}\"\n\n  # -- Defines any additional environment variables to be passed to the Jira\n  # container. See https://hub.docker.com/r/atlassian/jira-software for\n  # supported variables.\n  #\n  additionalEnvironmentVariables: []\n\n  # -- Defines additional annotations to the Jira StateFulSet. This might be required when deploying using a GitOps approach\n  additionalAnnotations: {}\n  #  argocd.argoproj.io/sync-wave: \"10\"\n\n  # -- Defines any additional ports for the Jira container.\n  #\n  additionalPorts: []\n  #  - name: jmx\n  #    containerPort: 5555\n  #    protocol: TCP\n\n  # -- Defines additional volumeClaimTemplates that should be applied to the Jira pod.\n  # Note that this will not create any corresponding volume mounts;\n  # those needs to be defined in jira.additionalVolumeMounts\n  #\n  additionalVolumeClaimTemplates: []\n  #  - name: myadditionalvolumeclaim\n  #    storageClassName:\n  #    resources:\n  #      requests:\n  #        storage: 1Gi\n\n  # -- Defines topology spread constraints for Jira pods. See details:\n  # https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/\n  #\n  topologySpreadConstraints: []\n  # - maxSkew: 1\n  #   topologyKey: kubernetes.io/hostname\n  #   whenUnsatisfiable: ScheduleAnyway\n  #   labelSelector:\n  #     matchLabels:\n\n  # -- Certificates to be added to Java truststore. Provide reference to a secret that contains the certificates\n  #\n  additionalCertificates:\n    # -- Name of the Kubernetes secret with certificates in its data. All secret keys in the secret data\n    # will be treated as certificates to be added to Java truststore. If defined, this takes precedence over secretList.\n    #\n    secretName:\n    # -- A list of secrets with their respective keys holding certificates to be added to the Java truststore.\n    # It is mandatory to specify which keys from secret data need to be mounted as files to the init container.\n    #\n    secretList: []\n    #- name: self-signed-ca\n    #  keys:\n    #    - ca.crt\n    #    - intermediate.crt\n    #- name: stg-intermediate\n    #  keys:\n    #    - stg.crt\n\n    # -- Custom command to be executed in the init container to import certificates\n    #\n    customCmd:\n\n    initContainer:\n      # -- Resources allocated to the import-certs init container\n      #\n\n      resources: {}\n      # -- Custom SecurityContext for the import-certs init container\n      #\n      securityContext: {}\n\n  # -- Configure additional Tomcat connector to set up tunnel. Define the connector port and optional additional attributes.\n  # When 'tunnel.additionalConnector.port' is defined, an additional connector is added to server.xml\n  # and '-Dsecure.tunnel.upstream.port=<port_number>' is added to JVM args\n  #\n  tunnel:\n    additionalConnector:\n      port:\n      connectionTimeout: \"20000\"\n      maxThreads: \"50\"\n      minSpareThreads: \"10\"\n      enableLookups: \"false\"\n      acceptCount: \"10\"\n      URIEncoding: \"UTF-8\"\n      secure: false\n\n# Monitoring\n#\nmonitoring:\n\n  # -- Expose JMX metrics with jmx_exporter https://github.com/prometheus/jmx_exporter\n  #\n  exposeJmxMetrics: false\n\n  # --  JMX exporter init container configuration\n  #\n  jmxExporterInitContainer:\n\n    # -- The location of the JMX exporter jarfile in the JMX exporter image\n    # Leave blank for default bitnami image\n    #\n    jmxJarLocation:\n\n    # -- Whether to run JMX exporter init container as root to copy JMX exporter binary to shared home volume.\n    # Set to false if running containers as root is not allowed in the cluster.\n    #\n    runAsRoot: true\n\n    # -- Custom SecurityContext for the jmx exporter init container\n    #\n    customSecurityContext: {}\n\n    # -- Resources requests and limits for the JMX exporter init container\n    # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n    #\n    resources: {}\n    #  requests:\n    #    cpu: \"1m\"\n    #    memory: \"20Mi\"\n    #  limits:\n    #    cpu: \"1\"\n    #    memory: \"1G\"\n\n  # -- Annotations added to the jmx service\n  #\n  jmxServiceAnnotations: {}\n\n  # -- Fetch jmx_exporter jar from the image. If set to false make sure to manually copy the jar\n  # to shared home and provide an absolute path in jmxExporterCustomJarLocation\n  #\n  fetchJmxExporterJar: true\n\n  # -- Image repository with jmx_exporter jar\n  #\n  jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n  jmxExporterImageTag: 0.18.0\n\n\n\n  # -- Port number on which metrics will be available\n  #\n  jmxExporterPort: 9999\n\n  # -- JMX exporter port type\n  #\n  jmxExporterPortType: ClusterIP\n\n  # -- Location of jmx_exporter jar file if mounted from a secret or manually copied to shared home\n  #\n  jmxExporterCustomJarLocation:\n\n  # -- Custom JMX config with the rules\n  #\n  jmxExporterCustomConfig: {}\n  #  rules:\n  #   - pattern: \".*\"\n\n  serviceMonitor:\n\n    # -- Create ServiceMonitor to start scraping metrics. ServiceMonitor CRD needs to be created in advance.\n    #\n    create: false\n\n    # -- ServiceMonitorSelector of the prometheus instance.\n    #\n    prometheusLabelSelector: {}\n      # release: prometheus\n\n    # -- Scrape interval for the JMX service.\n    #\n    scrapeIntervalSeconds: 30\n\n    # -- How long until a scrape request times out. It cannot be greater than the scrape interval.\n    #\n    scrapeTimeoutSeconds: 20\n\n  grafana:\n\n    # -- Create ConfigMaps with Grafana dashboards\n    #\n    createDashboards: false\n\n    # -- Label selector for Grafana dashboard importer sidecar\n    #\n    dashboardLabels: {}\n      # grafana_dashboard: dc_monitoring\n\n    # -- Annotations added to Grafana dashboards ConfigMaps. See: https://github.com/kiwigrid/k8s-sidecar#usage\n    #\n    dashboardAnnotations: {}\n      # k8s-sidecar-target-directory: /tmp/dashboards/example-folder\n\n# Fluentd configuration\n#\n# Jira log collection and aggregation can be enabled using Fluentd. This config\n# assumes an existing ELK stack has been stood up and is available.\n# https://www.fluentd.org/\n#\nfluentd:\n\n  # -- Set to 'true' if the Fluentd sidecar (DaemonSet) should be added to each pod\n  #\n  enabled: false\n\n  # -- The Fluentd sidecar image repository\n  #\n  imageRepo: fluent/fluentd-kubernetes-daemonset\n\n  # -- The Fluentd sidecar image tag\n  #\n  imageTag: v1.11.5-debian-elasticsearch7-1.2\n\n  # -- Resources requests and limits for fluentd sidecar container\n  # See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n  #\n  resources: {}\n  #  requests:\n  #    cpu: \"1m\"\n  #    memory: \"20Mi\"\n  #  limits:\n  #    cpu: \"1\"\n  #    memory: \"1G\"\n\n  # -- The command used to start Fluentd. If not supplied the default command\n  # will be used: \"fluentd -c /fluentd/etc/fluent.conf -v\"\n  #\n  # Note: The custom command can be free-form, however pay particular attention to\n  # the process that should ultimately be left running in the container. This process\n  # should be invoked with 'exec' so that signals are appropriately propagated to it,\n  # for instance SIGTERM. An example of how such a command may look is:\n  # \"<command 1> && <command 2> && exec <primary command>\"\n  command:\n\n  # -- Set to 'true' if a custom config (see 'configmap-fluentd.yaml' for default)\n  # should be used for Fluentd. If enabled this config must be supplied via the\n  # 'fluentdCustomConfig' property below. If your custom config forces fluentd to run in a server mode,\n  # add `-Datlassian.logging.cloud.enabled=true` to `jira.AdditionalJvmArgs` stanza in values file\n  #\n  customConfigFile: false\n\n  # -- Custom fluent.conf file\n  #\n  fluentdCustomConfig: {}\n  # fluent.conf: |\n    # <source>\n    #   @type tail\n    #   <parse>\n    #   @type multiline\n    #   format_firstline /\\d{4}-\\d{1,2}-\\d{1,2}/\n    #   </parse>\n    #   path /opt/atlassian/jira/logs/access_log.*\n    #   pos_file /tmp/jiralog.pos\n    #   tag jira-access-logs\n    # </source>\n\n  # -- The port on which the Fluentd sidecar will listen\n  #\n  httpPort: 9880\n\n  # Elasticsearch config based on your ELK stack\n  #\n  elasticsearch:\n\n    # -- Set to 'true' if Fluentd should send all log events to an Elasticsearch service.\n    #\n    enabled: true\n\n    # -- The hostname of the Elasticsearch service that Fluentd should send logs to.\n    #\n    hostname: elasticsearch\n\n    # -- The prefix of the Elasticsearch index name that will be used\n    #\n    indexNamePrefix: jira\n\n  # -- Specify custom volumes to be added to Fluentd container (e.g. more log sources)\n  #\n  extraVolumes: []\n  # - name: local-home\n  #   mountPath: /opt/atlassian/jira/logs\n  #   subPath: log\n  #   readOnly: true\n\n\n# -- Custom annotations that will be applied to all Jira pods\n#\npodAnnotations: {}\n#  name: <value>\n\n# -- Custom labels that will be applied to all Jira pods\n#\npodLabels: {}\n#  name: <value>\n\n# -- Standard K8s node-selectors that will be applied to all Jira pods\n#\nnodeSelector: {}\n#  name: <value>\n\n# -- Standard K8s tolerations that will be applied to all Jira pods\n#\ntolerations: []\n# - effect: <name>\n#   operator: <operator>\n#   key: <key>\n\n# -- Standard K8s affinities that will be applied to all Jira pods\n#\naffinity: {}\n#  name: <value>\n\n# -- Standard K8s schedulerName that will be applied to all Jira pods.\n# Check Kubernetes documentation on how to configure multiple schedulers:\n# https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#specify-schedulers-for-pods\n#\nschedulerName:\n\n# -- Priority class for the application pods. The PriorityClass with this name needs to be available in the cluster.\n# For details see https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass\n#\npriorityClassName:\n\n# -- Share host namespaces which may include hostNetwork, hostIPC, and hostPID\n#\nhostNamespaces: {}\n\n# -- Additional container definitions that will be added to all Jira pods\n#\nadditionalContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional initContainer definitions that will be added to all Jira pods\n#\nadditionalInitContainers: []\n#  - name: <name>\n#    image: <image>:<tag>\n\n# -- Additional labels that should be applied to all resources\n#\nadditionalLabels: {}\n#  name: <value>\n\n# -- Additional existing ConfigMaps and Secrets not managed by Helm that should be\n# mounted into service container. Configuration details below (camelCase is important!):\n  # 'name'      - References existing ConfigMap or secret name.\n  # 'type'      - 'configMap' or 'secret'\n  # 'key'       - The file name.\n  # 'mountPath' - The destination directory in a container.\n# VolumeMount and Volumes are added with this name and index position, for example;\n# custom-config-0, keystore-2\n#\nadditionalFiles: []\n#  - name: custom-config\n#    type: configMap\n#    key: log4j.properties\n#    mountPath:  /var/atlassian\n#  - name: custom-config\n#    type: configMap\n#    key: web.xml\n#    mountPath: /var/atlassian\n#  - name: keystore\n#    type: secret\n#    key: keystore.jks\n#    mountPath: /var/ssl\n\n# -- Additional host aliases for each pod, equivalent to adding them to the /etc/hosts file.\n# https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\nadditionalHosts: []\n#  - ip: \"127.0.0.1\"\n#    hostnames:\n#    - \"foo.local\"\n#    - \"bar.local\"\n\n# -- PodDisruptionBudget: https://kubernetes.io/docs/tasks/run-application/configure-pdb/\n# You can specify only one of maxUnavailable and minAvailable in a single PodDisruptionBudget. When both minAvailable and maxUnavailable are set, maxUnavailable takes precedence.\n#\npodDisruptionBudget:\n  enabled: false\n  labels: {}\n  annotations: {}\n  minAvailable:\n  maxUnavailable:\n\n# -- Create additional ConfigMaps with given names, keys and content. Ther Helm release name will be used as a prefix\n# for a ConfigMap name, fileName is used as subPath\n#\nadditionalConfigMaps: []\n#  - name: extra-configmap\n#    keys:\n#      - fileName: hello.properties\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        defaultMode:\n#        content: |\n#          foo=bar\n#          hello=world\n#      - fileName: hello.xml\n#        mountPath: /opt/atlassian/jira/atlassian-jira/WEB-INF/classes\n#        defaultMode:\n#        content: |\n#          <xml>\n#          </xml>\n\natlassianAnalyticsAndSupport:\n\n  analytics:\n\n    # -- Mount ConfigMap with selected Helm chart values as a JSON\n    # which DC products will read and send analytics events to Atlassian data pipelines\n    #\n    enabled: true\n\n  helmValues:\n\n    # -- Mount ConfigMap with selected Helm chart values as a YAML file\n    # which can be optionally including to support.zip\n    #\n    enabled: true\n\n# -- Metadata and pod spec for pods started in Helm tests\n#\ntestPods:\n  resources: {}\n  labels: {}\n  annotations: {}\n  nodeSelector: {}\n  tolerations: []\n  affinity: {}\n  schedulerName:\n  image:\n    permissionsTestContainer: debian:stable-slim\n    statusTestContainer: alpine:latest\n\nopenshift:\n\n  # -- When set to true, the containers will run with a restricted Security Context Constraint (SCC).\n  # See: https://docs.openshift.com/container-platform/4.14/authentication/managing-security-context-constraints.html\n  # This configuration property unsets pod's SecurityContext, nfs-fixer init container (which runs as root), and mounts server\n  # configuration files as ConfigMaps.\n  #\n  runWithRestrictedSCC: false\n\nopensearch:\n\n  # -- Deploy OpenSearch Helm chart and Configure Jira to use it as a search platform\n  #\n  enabled: false\n\n  credentials:\n    # -- Let the Helm chart create a secret with an auto generated initial admin password\n    #\n    createSecret: true\n\n    # -- Use an existing secret with the key OPENSEARCH_INITIAL_ADMIN_PASSWORD holding the initial admin password\n    #\n    existingSecretRef:\n      name:\n\n  # -- OpenSearch helm specific values, see: https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch/values.yaml\n  #\n  singleNode: true\n  resources:\n    requests:\n      cpu: 1\n      memory: 1Gi\n  persistence:\n    size: 10Gi\n  extraEnvs:\n    - name: plugins.security.ssl.http.enabled\n      value: \"false\"\n  envFrom:\n    - secretRef:\n         # -- If using a pre-created secret, make sure to change secret name to match opensearch.credentials.existingSecretRef.name\n         #\n         name: opensearch-initial-password\n"
  },
  {
    "path": "src/main/common_templates/README.md",
    "content": "# Common Templates\n\nShared Helm template helpers that are symlinked into each product chart's `templates/` directory.\n\nThis directory lives at `src/main/common_templates/`, outside of any individual chart.\n\n## Why this pattern?\n\nThe existing `common/` library chart is published as a remote Helm dependency. Any change to it\nrequires a **two-step rollout**: publish the library first, then update each product chart's\n`Chart.yaml` to reference the new version.\n\nThis `common_templates/` directory avoids that by using **symlinks**. Each product chart has a\nsymlink at `templates/common_templates → ../../../common_templates`, so Helm picks up these templates\ndirectly. Changes here take effect immediately across all products — no publishing, no version\nbumps, single PR.\n\n## When to use this vs `common/`\n\n**All new shared templates should go in `common_templates/` (this directory).**\n\nThe `common/` library chart is a legacy pattern that requires a two-step release process for\nevery change. It should not be used for new shared templates. Existing templates in `common/`\n(`_labels.tpl`, `_names.tpl`, `_jmx.tpl`) should be incrementally migrated here when they are\nnext modified — there is no technical reason to keep them in the library chart.\n\n## How it works\n\nEach product chart has a symlink:\n\n```\nsrc/main/charts/<product>/templates/common_templates → ../../../common_templates\n```\n\nHelm follows symlinks during `helm template` and `helm package`, so:\n\n- **Local development**: templates are resolved via the symlink\n- **Published charts**: `helm package` embeds the actual file content in the `.tgz` — consumers see regular files, not\n  symlinks\n\n## Adding a new shared template\n\n1. Create your `.tpl` file in this directory\n2. That's it — all product charts pick it up automatically via the existing symlink\n\n## Platform note\n\nGit on Windows doesn't enable symlinks by default. Contributors on Windows need\n`git config core.symlinks true` (or run Git as admin) for symlinks to work correctly.\n\n"
  },
  {
    "path": "src/main/common_templates/_gateway.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n\n{{/*\nReturns \"true\" if external access is configured via either ingress or gateway.\nTrue when ingress.host is set or gateway.hostnames is non-empty.\n*/}}\n{{- define \"common.gateway.isConfigured\" -}}\n    {{- ternary \"true\" \"false\" (or (not (empty .Values.ingress.host)) (not (empty .Values.gateway.hostnames))) -}}\n{{- end -}}\n\n{{/*\nReturns \"true\" if gateway mode should be used (vs ingress mode) for product setup.\nTrue when gateway.hostnames is non-empty, regardless of whether an HTTPRoute is created.\nThis allows using gateway config with a pre-existing Gateway/proxy without gateway.create.\n*/}}\n{{- define \"common.gateway.useGatewayMode\" -}}\n    {{- ternary \"true\" \"false\" (not (empty .Values.gateway.hostnames)) -}}\n{{- end -}}\n\n{{/*\nValidates gateway/ingress configuration.\nEnsures mutual exclusion and required fields.\n*/}}\n{{- define \"common.gateway.validateConfig\" -}}\n    {{- if and .Values.gateway.create .Values.ingress.create -}}\n        {{- fail \"ERROR: Cannot enable both gateway.create and ingress.create\" -}}\n    {{- end -}}\n    {{- if and (not (empty .Values.gateway.hostnames)) (not (empty .Values.ingress.host)) -}}\n        {{- fail \"ERROR: Cannot set both gateway.hostnames and ingress.host — use one or the other\" -}}\n    {{- end -}}\n    {{- if and .Values.gateway.create (empty .Values.gateway.parentRefs) -}}\n        {{- fail \"ERROR: gateway.parentRefs is required when gateway.create is true\" -}}\n    {{- end -}}\n    {{- if and .Values.gateway.create (not (empty .Values.gateway.parentRefs)) (not (index .Values.gateway.parentRefs 0).name) -}}\n        {{- fail \"ERROR: gateway.parentRefs[0].name is required when gateway.create is true\" -}}\n    {{- end -}}\n    {{- if and .Values.gateway.create (not .Values.gateway.hostnames) -}}\n        {{- fail \"ERROR: gateway.hostnames must contain at least one hostname when gateway.create is true\" -}}\n    {{- end -}}\n{{- end -}}\n\n{{/*\nReturns \"true\" or \"false\" string for whether HTTPS is enabled.\nUses gateway.https if gateway config is active, otherwise ingress.https.\n*/}}\n{{- define \"common.gateway.https\" -}}\n    {{- $useGateway := eq (include \"common.gateway.useGatewayMode\" .) \"true\" -}}\n    {{- ternary .Values.gateway.https .Values.ingress.https $useGateway -}}\n{{- end -}}\n\n{{/*\nReturns \"https\" or \"http\" based on the current ingress/gateway HTTPS setting.\n*/}}\n{{- define \"common.gateway.scheme\" -}}\n    {{- ternary \"https\" \"http\" (eq (include \"common.gateway.https\" .) \"true\") -}}\n{{- end -}}\n\n{{/*\nReturns the canonical hostname for the service.\nUses first gateway hostname if gateway config is active, otherwise ingress.host.\n*/}}\n{{- define \"common.gateway.hostname\" -}}\n    {{- if eq (include \"common.gateway.useGatewayMode\" .) \"true\" -}}\n        {{- index .Values.gateway.hostnames 0 -}}\n    {{- else -}}\n        {{- .Values.ingress.host -}}\n    {{- end -}}\n{{- end -}}\n\n{{/*\nReturns the external port the application is accessed on.\nDefaults to \"443\" (https) or \"80\" (http).\n*/}}\n{{- define \"common.gateway.externalPort\" -}}\n    {{- if eq (include \"common.gateway.useGatewayMode\" .) \"true\" -}}\n        {{- default (ternary \"443\" \"80\" .Values.gateway.https) .Values.gateway.externalPort -}}\n    {{- else -}}\n        {{- default (ternary \"443\" \"80\" .Values.ingress.https) .Values.ingress.port -}}\n    {{- end -}}\n{{- end -}}\n\n{{/*\nReturns the service path. Handles gateway vs ingress mode with a contextPath fallback.\nUsage:\ninclude \"common.gateway.path\" (dict\n    \"useGatewayMode\" (include \"common.gateway.useGatewayMode\" .)\n    \"gatewayPath\" .Values.gateway.path\n    \"ingressPath\" .Values.ingress.path\n    \"contextPath\" .Values.<product>.service.contextPath\n)\n*/}}\n{{- define \"common.gateway.path\" -}}\n{{- $explicitPath := ternary .gatewayPath .ingressPath (eq .useGatewayMode \"true\") -}}\n{{- if $explicitPath -}}\n    {{- $explicitPath -}}\n{{- else -}}\n    {{- .contextPath | default \"/\" -}}\n{{- end -}}\n{{- end -}}\n\n{{/*\nReturns the origin (scheme + host + port) for the service.\nDefault ports (443/https, 80/http) are omitted from the URL.\nUsage: include \"common.gateway.origin\" .\n*/}}\n{{- define \"common.gateway.origin\" -}}\n{{- $scheme := include \"common.gateway.scheme\" . -}}\n{{- $host := include \"common.gateway.hostname\" . -}}\n{{- $port := include \"common.gateway.externalPort\" . -}}\n{{- printf \"%s://%s\" $scheme $host -}}\n{{- if ne $port (ternary \"443\" \"80\" (eq $scheme \"https\")) -}}:{{ $port }}{{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "src/main/scripts/generate_chart_repo.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\nset -x\n\n# The directory, relative to the git repository root, where the Helm charts are stored\nCHARTS_SRC_DIR=\"src/main/charts\"\n\n# The directory that will contain the generated chart repo files\n# docs/docs repository is transformed with MKDocs and served with Github Pages.\n# When the index.yaml is located there, it will be accessible on the GH pages URL:\n# https://atlassian.github.io/data-center-helm-charts/\nPUBLISH_DIR=\"docs/docs\"\n\nPACKAGE_DIR=\"target/helm\"\n\nGITHUB_TOKEN=$1\n\nif [[ -z $GITHUB_TOKEN ]]\nthen\n  echo \"Must supply a github token\"\n  exit 1\nfi\n\nrm -rf \"$PACKAGE_DIR\"\n\nfor chart in \"$CHARTS_SRC_DIR\"/*/\n  do\n    echo \"Packaging chart $chart\"\n    helm package --sign --key \"${HELM_SIGNING_KEY_ID}\" --keyring ~/.gnupg/secring.gpg \"$chart\" --destination \"$PACKAGE_DIR\"\n  done\n\necho \"Uploading chart packages as Github releases\"\n# This will scan $PACKAGE_DIR for the tgz files that 'helm package' just generated, and upload them to the GitHub\n# repo as Release artifacts. GitHub will create corresponding git tags for each chart.\ndocker run -v \"$(pwd)/$PACKAGE_DIR:/releases\" \\\n  --rm \\\n  quay.io/helmpack/chart-releaser:v1.5.0 \\\n  upload \\\n  --skip-existing \\\n  --package-path /releases \\\n  --release-notes-file RELEASE_NOTES.md \\\n  --owner atlassian \\\n  --git-repo data-center-helm-charts \\\n  --token \"$GITHUB_TOKEN\"\n\necho \"Regenerating chart repo index.yaml\"\n# This will fetch the index.yaml from the chart repo (NOT the local copy in this git repo), then fetch the list of\n# release artifacts on GitHub, and add any missing releases to the index.yaml file. The updated file is then left in\n# $PUBLISH_DIR for committing to git.\ndocker run \\\n  --user \"$(id -u):$(id -g)\" \\\n  -v \"$(pwd):/index\" \\\n  -v \"$(pwd)/$PACKAGE_DIR:/packages\" \\\n  --workdir=\"/index\" \\\n  --rm \\\n  quay.io/helmpack/chart-releaser:v1.5.0 \\\n  index \\\n  --owner atlassian \\\n  --git-repo data-center-helm-charts \\\n  --index-path /index/docs/docs/index.yaml \\\n  --package-path /packages \\\n  --token \"$GITHUB_TOKEN\"\n\ngit add $PUBLISH_DIR/index.yaml\n"
  },
  {
    "path": "src/main/scripts/github_asset_uploader.sh",
    "content": "#!/bin/bash\nset -e\n\nif [[ -z $GH_TOKEN ]]; then\n  echo \"Must supply a github token. Export GH_TOKEN env variable in the shell where the script is executed\"\n  exit 1\nfi\n\nRELEASE_VERSION=$1\nif [[ -z $RELEASE_VERSION ]]; then\n  echo \"Must pass release version as an argument, e.g. 1.10.2\"\n  exit 1\nfi\n\nif [[ -z $GITHUB_REPOSITORY ]]; then\n  echo \"GITHUB_REPOSITORY env var is not set. Using the default ${GITHUB_REPOSITORY}\"\n  export GITHUB_REPOSITORY=\"${GITHUB_REPOSITORY}\"\nfi\n\nPRODUCTS=(bamboo bamboo-agent bitbucket confluence crowd jira)\n\necho \"[INFO]: Release version is: ${RELEASE_VERSION}\"\n\nfor PRODUCT in ${PRODUCTS[@]}; do\n  \n  echo \"[INFO]: Uploading public key to ${PRODUCT}-${RELEASE_VERSION} release assets\"\n  \n  RELEASE_ID=$(curl -s -H \"Accept: application/vnd.github+json\" -H \"Authorization: Bearer ${GH_TOKEN}\" -H \"X-GitHub-Api-Version: 2022-11-28\" https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/tags/${PRODUCT}-\"${RELEASE_VERSION}\" | jq .id)\n  \n  curl -s -o /dev/null \\\n       -w \"%{http_code}\" \\\n       -X POST \\\n       -H \"Accept: application/vnd.github+json\" \\\n       -H \"Authorization: Bearer ${GH_TOKEN}\"\\\n       -H \"X-GitHub-Api-Version: 2022-11-28\" \\\n       -H \"Content-Type: application/octet-stream\" \\\n       https://uploads.github.com/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=helm_key.pub \\\n       --data-binary \"@helm_key.pub\"\n  echo -e \"\\n\"\ndone\n\n\n"
  },
  {
    "path": "src/main/scripts/prepare_release.py",
    "content": "# This script prepares Helm charts for a new release (release version is an argument to the script):\n#\n# * for each Helm chart collect commits, sanitize commit messages to remove Jira keys,\n#   drop commits we don't need in release notes,\n#   remove commits with identical commit messages\n#\n# * update Changelog.md for each Helm chart with new version's release notes\n#\n# * update Chart.yaml for each Helm chart with a new chart(release) version\n#\n# * convert changelog into a list of strings in the acceptable artifacthub.io annotations format\n#\n# * update Helm output for unit tests\n\nimport git\nimport logging as log\nimport os\nimport re\nimport subprocess\nimport sys\nfrom argparse import ArgumentParser\nfrom datetime import datetime\nfrom ruamel.yaml import YAML\nfrom tempfile import mkstemp\n\nproducts = [\"bamboo\", \"bamboo-agent\",\n            \"bitbucket\", \"confluence\", \"crowd\", \"jira\"]\nprod_base = \"src/main/charts\"\n\njira_keys_pattern = r'(CLIP|DCCLIP)-[0-9]{1,5}(?![0-9]): '\ndrop_commits_pattern = r'^\\* Prepare release [0-9].{1,4}'\nupdate_app_versions_commit_msg = r\"^\\* Update appVersions for DC apps.*\"\n\n# parse Chart.yaml to get K8s version, app version and Helm chart version\n# to use those when generating changelog/release notes\ndef get_chart_versions(path=prod_base):\n    versions = {}\n    for prod in products:\n        prod_dir = f\"{path}/{prod}\"\n        chart_file = f\"{prod_dir}/Chart.yaml\"\n\n        with open(chart_file, 'r') as chart:\n            yaml = YAML()\n            chart_yaml = yaml.load(chart)\n\n        versions[prod] = {}\n        versions[prod]['kubeVersion'] = chart_yaml['kubeVersion']\n        versions[prod]['appVersion'] = chart_yaml['appVersion']\n        versions[prod]['version'] = chart_yaml['version']\n\n        log.info(f\"Product {prod} versions: {versions[prod]['kubeVersion']}, {versions[prod]['appVersion']}\")\n\n    return versions\n\n\ndef gen_changelog(product, path, changelog=None, test=False):\n    repo = git.Repo(path)\n    cli = git.Git(path)\n    tags = sorted(repo.tags, key=lambda t: t.commit.committed_datetime)\n\n    last_tag = tags[-1]\n    tag_ver = re.sub(r'^[^-]+-', '', last_tag.name)\n    log.info(f'Generating {product} changelog since {tag_ver}')\n\n    # git log will pick up commits in src/main/charts/$product directory only\n    if not changelog and not test:\n        changelog = cli.log(f'{last_tag}..main', \"--\", prod_base + '/' + product, graph=True, pretty='format:%s',\n                            abbrev_commit=True, date='relative', )\n    changelog = changelog.split('\\n')\n    pattern = re.compile(drop_commits_pattern)\n    # we don't need pre-release commits that update chart.yamls and changelogs\n    # this pattern is based on the commit message from a GitHub action that prepares Helm release\n    filtered_changelog = list(filter(lambda x: not pattern.match(x), changelog))\n\n    # if there are multiple commits with identical message but different PR number, e.g.\n    # Update appVersions for DC apps (#123), Update appVersions for DC apps (#124)\n    # we need to leave just one - the latest.\n    matching_messages = []\n    for message in filtered_changelog:\n        match = re.search(update_app_versions_commit_msg, message)\n        if match:\n            matching_messages.append(message)\n\n    if matching_messages:\n        highest_message = sorted(matching_messages, key=lambda x: int(re.search(r'#(\\d+)', x).group(1)), reverse=True)[\n            0]\n        filtered_changelog = [m for m in filtered_changelog if\n                              m == highest_message or 'Update appVersions for DC apps' not in m]\n\n    if len(filtered_changelog) == 0 or filtered_changelog.count(''):\n        # It is possible that there are no commits to the Helm chart, but we still need to release\n        # in this case we just write a generic git log\n        log.info(f'No commits to {product} Helm chart found')\n        default_git_log = '* Update Helm chart version'\n        filtered_changelog = [default_git_log]\n\n    # remove Jira keys from commit messages. This substitution assumes the commit message has the following format:\n    # CLIP-1234: Here is my message\n    # DCCLIP-1234: Here is my message\n    sanitized_changelog = map(lambda c: re.sub(jira_keys_pattern, '', c), filtered_changelog)\n    return list(dict.fromkeys(sanitized_changelog))\n\n\ndef format_changelog_yaml(changelog):\n    # The ArtifactHub annotations are a single string, but formatted\n    # like YAML. Replacing the leading '*' with '-'  and wrapping\n    # strings in double quotes should be sufficient.\n    sanitized_changelog = []\n    for string in changelog:\n        # append `\"` to the end of the string\n        string = string + '\"'\n        sanitized_changelog.append(string)\n    # replace '* ' with '- \"' to have changelog in the following format:\n    # - \"String1\"\n    # - \"String2\"\n    c2 = map(lambda c: re.sub(r'^\\* ', '- \"', c), sanitized_changelog)\n    return '\\n'.join(c2)\n\n\n# add new version changelog at the top of the Changelog.md file for each Helm chart\ndef update_changelog_file(product, version, changelog, chartversions):\n    log.info(f\"Updating {product} Changelog.md to {version}\")\n    prod_dir = f\"{prod_base}/{product}\"\n    changelog_file = f\"{prod_dir}/Changelog.md\"\n    (tmp_fd, tmp_name) = mkstemp(dir=prod_dir, text=True)\n\n    found_first = False\n    with open(changelog_file, 'r') as clfd:\n        for line in clfd:\n            # process the first line and look for a line that matches ## <version>\n            if not found_first and re.match(r'^## [0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}', line) is not None:\n                # First version line, inject ours before it\n                found_first = True\n                k8s_version = chartversions[product]['kubeVersion']\n                app_version = chartversions[product]['appVersion']\n                now = datetime.now()\n                os.write(tmp_fd, (\"## %s\\n\\n\" % version).encode())\n                os.write(tmp_fd, (\"**Release date:** %s-%s-%s\\n\\n\" % (now.year, now.month, now.day)).encode())\n                os.write(tmp_fd, (\n                        '![AppVersion: %s](https://img.shields.io/static/v1?label=AppVersion&message=%s&color=success'\n                        '&logo=)\\n' % (\n                            app_version, app_version)).encode())\n                os.write(tmp_fd, (\n                        '![Kubernetes: %s](https://img.shields.io/static/v1?label=Kubernetes&message=%s&color'\n                        '=informational&logo=kubernetes)\\n' % (\n                            k8s_version, k8s_version)).encode())\n                os.write(tmp_fd,\n                         '![Helm: v3](https://img.shields.io/static/v1?label=Helm&message=v3&color=informational&logo'\n                         '=helm)\\n\\n'.encode())\n                for change in changelog:\n                    os.write(tmp_fd, ('%s\\n' % change).encode())\n                os.write(tmp_fd, '\\n'.encode())\n\n            os.write(tmp_fd, line.encode())\n\n    os.close(tmp_fd)\n    os.rename(tmp_name, changelog_file)\n\n\n# updating dependencies is required to run mvn command that updates test output\ndef update_helm_dependencies(product):\n    log.info(f\"Updating Helm dependencies for {product}\")\n    path = f\"{prod_base}/{product}\"\n\n    update_o = subprocess.run(['helm', 'dependency', 'update', path], capture_output=True)\n    if update_o.returncode != 0:\n        log.error(\"Failed to update Helm dependencies: \\n%s\", re.sub(r'\\\\n', '\\n', str(update_o.stderr)))\n        sys.exit(-1)\n\n\ndef update_charts_yaml(product, version, changelog):\n    log.info(f\"Updating {product} Chart.yaml to {version}\")\n    prod_dir = f\"{prod_base}/{product}\"\n    chart_file = f\"{prod_dir}/Chart.yaml\"\n\n    with open(chart_file, 'r') as chart:\n        yaml = YAML()\n        yaml.preserve_quotes = True\n        chart_yaml = yaml.load(chart)\n\n    chart_yaml['version'] = version\n    chart_yaml['annotations']['artifacthub.io/changes'] = format_changelog_yaml(changelog)\n\n    with open(chart_file, 'w') as chart:\n        yaml.dump(chart_yaml, chart)\n\n    update_helm_dependencies(product)\n\n\ndef update_output_tests():\n    log.info(\"Running Maven to update the unit test output\")\n\n    update_o = subprocess.run(\n        ['mvn', 'test', '-B', '-Dtest=test.HelmOutputComparisonTest#record_helm_template_output_matches_expectations',\n         '-DrecordOutput=true'],\n        capture_output=True)\n    if update_o.returncode != 0:\n        log.error(\"Failed to update the unittest comparison data: \\n%s\", re.sub(r'\\\\n', '\\n', str(update_o.stdout)))\n        sys.exit(-1)\n\n\ndef parse_args():\n    parser = ArgumentParser()\n    parser.add_argument(\"version\", help=\"The version to release\")\n    args = parser.parse_args()\n\n    return args\n\n\ndef main():\n    log.basicConfig(level=log.DEBUG)\n\n    args = parse_args()\n    log.info(f\"Updating Helm charts to release {args.version}\")\n\n    chartversions = get_chart_versions()\n    for product in products:\n        changelog = gen_changelog(product, \".\", None, False)\n        log.info(product + ' changelog:\\n%s' % '\\n'.join(changelog))\n        update_changelog_file(product, args.version, changelog, chartversions)\n        update_charts_yaml(product, args.version, changelog)\n\n    update_output_tests()\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "src/main/scripts/prepare_release_test.py",
    "content": "import unittest\nimport logging\nfrom prepare_release import gen_changelog, format_changelog_yaml\n\nupdate_versions_message = \"* Update appVersions for DC apps\"\njira_key1 = \"CLIP-1234\"\njira_key2 = \"DCCLIP-1234\"\n\ntest_git_log = \"* Something got updated\\n\" \\\n               + update_versions_message + \" (#589)\\n\" \\\n               + update_versions_message + \" (#589)\\n\" \\\n                                           \"* Prepare release 1.10.12\\n\" \\\n                                           \"* \" + jira_key1 + \": Fixing a bug\\n\" \\\n                                           \"* \" + jira_key2 + \": Developing a feature\\n\" \\\n               + update_versions_message + \" (#535)\\n\" \\\n               + update_versions_message + \" (#543)\"\n\nno_git_log_messages = \"\"\n\nprint('Test git log:\\n' + test_git_log)\ngit_log = gen_changelog(\"bamboo\", \".\", test_git_log, True)\nempty_git_log = gen_changelog(\"bamboo\", \".\", no_git_log_messages, True)\n\nprint('\\nProcessed git log:')\nfor message in git_log:\n    print(message)\nprint('\\n')\n\n\nclass TestGitLog(unittest.TestCase):\n\n    def setUp(self):\n        self.logger = logging.getLogger(__name__)\n        self.logger.setLevel(logging.INFO)\n        self.logger.info(\"Running test: {}\".format(self._testMethodName))\n\n    def test_remove_messages_with_smaller_pr_numbers(self):\n        # asset that only commit message that starts with '* Update appVersions for DC apps'\n        # and has the most recent commit in brackets is left in git log\n        self.assertNotIn(update_versions_message + \" (#533)\", git_log)\n        self.assertNotIn(update_versions_message + \" (#543)\", git_log)\n        self.assertTrue(any(update_versions_message + \" (#589)\" in element for element in git_log))\n\n    def test_remove_messages_matching_pattern(self):\n        # assert commit messages that match the pattern are dropped\n        self.assertNotIn('* Prepare release', git_log)\n\n    def test_remove_jira_keys_from_messages(self):\n        # assert Jira keys are removed from git log\n        self.assertNotIn(jira_key1, git_log)\n        self.assertNotIn(jira_key2, git_log)\n        # asset the rest of the commit message makes it in the git log\n        self.assertTrue(any('Developing a feature' in element for element in git_log))\n        self.assertTrue(any('Fixing a bug' in element for element in git_log))\n\n    def test_duplicate_messages(self):\n        # set(git_log) will automatically remove duplicates from a list which will fail the assertion if that's the case\n        self.assertCountEqual(git_log, set(git_log))\n\n    def test_empty_git_log(self):\n        # assert that if there are no commits, the default git log is returned\n        self.assertEqual(empty_git_log[0], '* Update Helm chart version')\n\n    def test_formatting(self):\n        formatted_changelog = format_changelog_yaml(git_log)\n        # assert '*' chars are removed and replaced with '-',\n        # as well as string are wrapped in double quotes\n        self.assertNotIn('*', formatted_changelog)\n        self.assertIn('- \"Fixing a bug\"', formatted_changelog)\n        self.assertIn('- \"Developing a feature\"', formatted_changelog)\n        self.assertIn('- \"Update appVersions for DC apps (#589)\"', formatted_changelog)\n\n\nif __name__ == '__main__':\n    unittest.main(verbosity=2)\n"
  },
  {
    "path": "src/main/scripts/process_dashboard.py",
    "content": "\"\"\"\nThis script fetches JSON files, processes them and writes the resulting files to a local destination.\nIts main function is to convert dashboard jsons https://github.com/atlassian-labs/data-center-grafana-dashboards\nto a K8s friendly format. In particular:\n* add namespace and service environment variables to templating\n* add namespace and service environment variables to every expression\n* remove non k8s specific labels if any\n* replace instance with pod in panel legends\n* remove extra commas\n* in case of Bitbucket, set endpoint=jmx to all expressions in the dashboards\n* in case of Bitbucket, set endpoint=jmx-mesh-sidecar to all expressions in the dashboards processed with --mesh sidecar\n\"\"\"\n\nimport json\nimport re\nimport sys\nimport urllib.request\nimport argparse\n\nparser = argparse.ArgumentParser(description=\"Read remote JSON file\")\nparser.add_argument(\"--source\", help=\"URL of the target remote JSON file\")\nparser.add_argument(\"--dest\", help=\"Local path of the destination processed json\")\nparser.add_argument(\"--product\", help=\"Product\")\nparser.add_argument(\"--mesh\", help=\"sidecar\")\nargs = parser.parse_args()\n\nif args.source is None:\n    print(\"Error: --source argument is required. This must be URL of a raw JSON file.\")\n    sys.exit(1)\n\nif args.dest is None:\n    print(\"Error: --dest argument is required. This must be an absolute path to the destination json file.\")\n    sys.exit(1)\n\nif args.product is None:\n    print(\"Error: --product argument is required. This must be the product of the dashboard to be converted.\")\n    sys.exit(1)\n\nprint('Fetching a remote file ' + args.source)\nfile = urllib.request.urlopen(args.source)\ndata = json.load(file)\nfile.close()\n\nif args.product == 'jira':\n    product_unique_metric = 'com_atlassian_jira_issue_assigned_count_Value'\nelif args.product == 'confluence':\n    product_unique_metric = 'Confluence_MailTaskQueue_ErrorQueueSize'\nelif args.product == 'bitbucket':\n    product_unique_metric = 'com_atlassian_bitbucket_Repositories_Count'\nelif args.product == 'bitbucket-mesh':\n    product_unique_metric = 'metrics_grpc_Value'\nelif args.product == 'bamboo':\n    product_unique_metric = 'java_lang_Memory_HeapMemoryUsage_committed{product=\\\\\"bamboo\\\\\"}'\nelif args.product == 'crowd':\n    product_unique_metric = 'java_lang_Runtime_Uptime{product=\\\\\"crowd\\\\\"}'\n\n# mind double escaping // in regex\ntemplating_string = '{\"list\":[{\"current\":{\"selected\":true,\"text\":\"default\",\"value\":\"default\"},\"hide\":0,' \\\n                    '\"includeAll\":false,\"label\":\"Data Source\",\"multi\":false,\"name\":\"datasource\",\"options\":[],' \\\n                    '\"query\":\"prometheus\",\"queryValue\":\"\",\"refresh\":1,\"regex\":\"\",\"skipUrlSync\":false,' \\\n                    '\"type\":\"datasource\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"$datasource\"},' \\\n                    '\"definition\":\"' + product_unique_metric + '\",\"hide\":0,\"includeAll\":false,' \\\n                    '\"multi\":false,\"name\":\"namespace\",\"options\":[],\"query\":{' \\\n                    '\"query\":\"' + product_unique_metric + '\",\"refId\":\"StandardVariableQuery\"},\"refresh\":1,' \\\n                    '\"regex\":\"/namespace=\\\\\"([^\\\\\"]*)\\\\\"/\",\"skipUrlSync\":false,\"sort\":0,\"type\":\"query\"},' \\\n                    '{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"$datasource\"},' \\\n                    '\"definition\":\"' + product_unique_metric + '\",\"hide\":0,\"includeAll\":false,' \\\n                    '\"multi\":false,\"name\":\"service\",\"options\":[],\"query\":{' \\\n                    '\"query\":\"' + product_unique_metric + '\",\"refId\":\"StandardVariableQuery\"},\"refresh\":1,' \\\n                    '\"regex\":\"/service=\\\\\"([^\\\\\"]*)\\\\\"/\",\"skipUrlSync\":false,\"sort\":0,\"type\":\"query\"}]} '\n\n# add datasource, namespace and service variables\ntemplating = json.loads(templating_string)\ndata['templating'] = templating\n\n\n# Finding and replacing values\ndef process_panels(panels):\n    for panel in panels:\n        if panel['type'] != 'row':\n            print('Processing panel ' + panel['title'])\n            for target in panel.get('targets', []):\n                print('Processing expression ' + target['expr'])\n                # make sure datasource is templated and there is no hardcoded ID\n                datasource = json.loads('{\"type\":\"prometheus\",\"uid\":\"$datasource\"}')\n                target['datasource'] = datasource\n                # we don't need product labels in K8s except for Bamboo\n                remove_product_label = re.sub(r'product=\"[^\"]*\"', '', target['expr'])\n                target['expr'] = remove_product_label\n                # we don't need instance labels in K8s because pod IPs are dynamic\n                remove_instance_label = re.sub(r'instance=\"[^\"]*\"', '', target['expr'])\n                target['expr'] = remove_instance_label\n                # In the legend, a pod makes more sense than instance\n                # which is IP that will change. Replace {{instance}} with {{ pod }}, regex is used\n                # to match {{ instance }}, {{instance }} and {{ instance}}\n                replace_instance_with_pod = re.sub(r'{{\\s*instance\\s*}}', '{{ pod }}', target['legendFormat'])\n                target['legendFormat'] = replace_instance_with_pod\n                expr = target['expr']\n                expr = expr.replace('{{instance}}', '{{ pod }}')\n                # bitbucket server has 2 endpoints - the server itself and Mesh sidecar, we need to add\n                # endpoint=\"jmx\" to all expressions in dashboards that are being processed without --mesh sidecar arg\n                if args.product == \"bitbucket\":\n                    jmx_endpoint = \"jmx\"\n                    if args.mesh == \"sidecar\":\n                        jmx_endpoint = \"jmx-mesh-sidecar\"\n                    expr = expr.replace('{', '{endpoint=\"' + jmx_endpoint + '\", ')\n                # we need namespace and service filters in all expressions to make dashboards flexible\n                # we assume that the expression has the following format: expression{},\n                # i.e. it has an opening curly bracket. Make sure all expressions in the source json have those\n                expr = expr.replace('{', '{namespace=\"$namespace\", service=\"$service\", ')\n                expr = expr.replace(', }', '}')\n                target['expr'] = expr\n\n        nested_panels = panel.get('panels', [])\n        if nested_panels:\n            process_panels(nested_panels)\n\n\nprocess_panels(data['panels'])\n\nprint('Saving the file to ' + args.dest)\nwith open(args.dest, 'w') as file:\n    json.dump(data, file, indent=2)\n"
  },
  {
    "path": "src/main/scripts/process_dashboard_test.py",
    "content": "import json\nimport subprocess\nimport tempfile\nimport os\n\nscript_dir = os.path.dirname(os.path.abspath(__file__))\nscript_path = os.path.join(script_dir, 'process_dashboard.py')\ntemp_dir = tempfile.TemporaryDirectory()\nfile_path = temp_dir.name + '/general.json'\nargs = ['--source', 'https://raw.githubusercontent.com/atlassian-labs/data-center-grafana-dashboards/main/jira'\n                    '/general.json', '--dest', file_path, '--product', 'jira']\n\nsubprocess.call(['python', script_path] + args)\n\nwith open(file_path) as json_file:\n    # Load the JSON data\n    data = json.load(json_file)\n\n\n# we expect 3 variables - prometheus, namespace and service\n\njira_query = 'com_atlassian_jira_issue_assigned_count_Value'\nassert len(data['templating']['list']) == 3, f\"Assertion failed. Expected 3, got {len(data['templating']['list'])}\"\nassert data['templating']['list'][0]['query'] == \"prometheus\", f\"Assertion failed. Expected query prometheus, got {data['templating']['list'][0]}\"\nassert data['templating']['list'][1]['query']['query'] == jira_query, f\"Assertion failed. Expected query {jira_query}, got {data['templating']['list'][0]}\"\n\nassert data['templating']['list'][1]['name'] == \"namespace\", f\"Assertion failed. No 'name': 'namespace' in {data['templating']['list'][1]}\"\nassert data['templating']['list'][2]['name'] == \"service\", f\"Assertion failed. No 'name': 'service' in {data['templating']['list'][2]}\"\n\nexpected_datasource = json.loads('{\"type\":\"prometheus\",\"uid\":\"$datasource\"}')\n\nfor panel in data['panels']:\n    if panel['type'] != 'row':\n        for target in panel.get('targets', []):\n            assert target[\n                       'datasource'] == expected_datasource, f\"Assertion failed. Expected {expected_datasource}, got {target['datasource']}\"\n            assert \"product=\" not in target[\n                'expr'], f\"Assertion failed, product template variable in not expected. Got {target['expr']}\"\n            assert \"namespace=\\\"$namespace\\\"\" in target['expr'], f\"Assertion failed, namespace template variable not \" \\\n                                                                 f\"found in {target['expr']}\"\n            assert \"service=\\\"$service\\\"\" in target['expr'], f\"Assertion failed, service template variable not \" \\\n                                                                 f\"found in {target['expr']}\""
  },
  {
    "path": "src/main/scripts/update_grafana_dashboards.sh",
    "content": "#!/bin/bash\nset -e\n\n: ${PATH_TO_SCRIPT:=\"src/main/scripts/process_dashboard.py\"}\n: ${GITHUB_DASHBOARDS_REPOSITORY:=\"atlassian-labs/data-center-grafana-dashboards\"}\n: ${GIT_BRANCH:=\"main\"}\n: ${HELM_CHARTS_BASE_DIR:=\"src/main/charts\"}\n: ${CHART_DASHBOARDS_BASE_DIR:=\"grafana-dashboards\"}\n\nif [ $# -gt 0 ]; then\n    # Use the custom arguments as the array:\n    # ./update_grafana_dashboards.sh jira\n    # ./update_grafana_dashboards.sh jira bamboo\n    PRODUCTS=(\"$@\")\nelse\n    # if no arguments are passed, use the default array\n    # When dashboards for a new DC product are added\n    # makes sure it is added in this array\n    PRODUCTS=(\"bitbucket\" \"bitbucket-mesh\" \"confluence\" \"jira\" \"bamboo\" \"crowd\")\nfi\n\nfor PRODUCT in ${PRODUCTS[@]}; do \\\n  CHART_DASHBOARDS_DEST_DIR=${CHART_DASHBOARDS_BASE_DIR}\n  PRODUCT_DIR=${PRODUCT}\n  JSONS=$(echo $(curl -s https://api.github.com/repos/${GITHUB_DASHBOARDS_REPOSITORY}/contents/${PRODUCT}) | jq -r '.[].name' | grep \".json\")\n  if [[ ${PRODUCT} == \"bitbucket-mesh\" ]]; then\n    CHART_DASHBOARDS_DEST_DIR=\"${CHART_DASHBOARDS_BASE_DIR}/bitbucket-mesh\"\n    PRODUCT_DIR=\"bitbucket\"\n  fi\n  mkdir -p ${HELM_CHARTS_BASE_DIR}/${PRODUCT_DIR}/${CHART_DASHBOARDS_DEST_DIR}\n  for JSON in ${JSONS[@]}; \\\n      do \\\n      if [ ${PRODUCT} == \"bitbucket\" ] && [ ${JSON} == \"ticket-status.json\" ]; then\n        MESH_SIDECAR_ARG=\"--mesh sidecar\"\n      fi\n      python3 ${PATH_TO_SCRIPT} \\\n      --source \\\n        https://raw.githubusercontent.com/${GITHUB_DASHBOARDS_REPOSITORY}/${GIT_BRANCH}/${PRODUCT}/$JSON \\\n      --dest \\\n        ${HELM_CHARTS_BASE_DIR}/${PRODUCT_DIR}/${CHART_DASHBOARDS_DEST_DIR}/$JSON \\\n      --product ${PRODUCT} ${MESH_SIDECAR_ARG};\n      done\ndone\n"
  },
  {
    "path": "src/test/charts/functest/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "src/test/charts/functest/Chart.yaml",
    "content": "apiVersion: v2\nname: functest\ndescription: A chart that we use for functional testing\ntype: application\nversion: 0.1.0\n"
  },
  {
    "path": "src/test/charts/functest/README.md",
    "content": "# functest\n\n![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square)\n\nA chart that we use for functional testing\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| clusterType | string | `\"\"` |  |\n| ingressDomain | string | `\"\"` |  |\n| product | string | `\"\"` |  |\n| productReleaseName | string | `\"\"` |  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/test/charts/functest/templates/ingress-KITT.yaml",
    "content": "{{- if eq \"KITT\" .Values.clusterType }}\n{{- range $serviceName := .Values.ingressNames }}\napiVersion: projectcontour.io/v1\nkind: HTTPProxy\nmetadata:\n  name: {{ $serviceName }}\n  annotations:\n    kubernetes.io/ingress.class: \"ingress-internal-01\"\n  labels:\n    \"app.kubernetes.io/managed-by\": \"Helm\"\n    \"meta.helm.sh/release-name\": {{ $.Release.Name | quote }}\n    \"meta.helm.sh/release-namespace\": {{ $.Release.Namespace | quote }}\nspec:\n  virtualhost:\n    fqdn: {{ printf \"%s.%s\" $serviceName $.Values.ingressDomain }}\n  routes:\n    - conditions:\n        - prefix: /\n      services:\n        - name: {{ $serviceName }}\n          port: 80\n          {{- if eq \"bitbucket\" $.Values.product }}\n          requestHeadersPolicy:\n            remove:\n              # we need https and this header would be set to http to match the service port (80). We rely on the SERVER_SCHEME instead\n              - x-forwarded-proto\n          {{ end }}\n      loadBalancerPolicy:\n        strategy: Cookie\n      timeoutPolicy:\n        response: 60s\n    {{- if eq \"confluence\" $.Values.product }}\n    - conditions:\n        - prefix: /synchrony\n      services:\n        - name: {{ $serviceName }}-synchrony\n          port: 80\n      timeoutPolicy:\n        response: 120s\n      loadBalancerPolicy:\n        strategy: Cookie\n    {{ end }}\n---\n{{ end }}\n{{ end }}"
  },
  {
    "path": "src/test/charts/functest/templates/ingress-expose-node-EKS.yaml",
    "content": "{{- if and (eq \"EKS\" .Values.clusterType) .Values.backdoorServiceNames }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: {{ .Release.Name | quote }}\n  labels:\n    \"app.kubernetes.io/managed-by\": \"Helm\"\n    \"meta.helm.sh/release-name\": {{ .Release.Name | quote }}\n    \"meta.helm.sh/release-namespace\": {{ .Release.Namespace | quote }}\n  annotations:\n    \"kubernetes.io/ingress.class\": nginx\n    \"nginx.ingress.kubernetes.io/affinity\": cookie\n    \"nginx.ingress.kubernetes.io/affinity-mode\": persistent\n    \"nginx.ingress.kubernetes.io/proxy-connect-timeout\": \"60\"\n    \"nginx.ingress.kubernetes.io/proxy-read-timeout\": \"60\"\n    \"nginx.ingress.kubernetes.io/proxy-send-timeout\": \"60\"\nspec:\n  rules:\n    {{- range $serviceName := .Values.backdoorServiceNames }}\n    - host: {{ printf \"%s.%s\" $serviceName $.Values.ingressDomain }}\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: {{ $serviceName }}\n                port:\n                  number: 80\n    {{ end }}\n{{ end }}"
  },
  {
    "path": "src/test/charts/functest/templates/ingress-expose-node-KITT.yaml",
    "content": "{{- if eq \"KITT\" .Values.clusterType }}\n{{- range $serviceName := .Values.backdoorServiceNames }}\napiVersion: projectcontour.io/v1\nkind: HTTPProxy\nmetadata:\n  name: {{ $serviceName }}\n  annotations:\n    kubernetes.io/ingress.class: \"ingress-internal-01\"\n  labels:\n    \"app.kubernetes.io/managed-by\": \"Helm\"\n    \"meta.helm.sh/release-name\": {{ $.Release.Name | quote }}\n    \"meta.helm.sh/release-namespace\": {{ $.Release.Namespace | quote }}\nspec:\n  virtualhost:\n    fqdn: {{ printf \"%s.%s\" $serviceName $.Values.ingressDomain }}\n  routes:\n    - conditions:\n        - prefix: /\n      services:\n        - name: {{ $serviceName }}\n          port: 80\n      timeoutPolicy:\n        response: 60s\n---\n{{ end }}\n{{ end }}"
  },
  {
    "path": "src/test/charts/functest/templates/service-expose-node.yaml",
    "content": "{{- $ingressDomain := .Values.ingressDomain -}}\n{{- range $index, $podName :=  .Values.backdoorServiceNames -}}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ $podName }}\nspec:\n  type: NodePort\n  ports:\n    - port: 80\n      protocol: TCP\n      targetPort: http\n      {{- if eq \"localhost\" $ingressDomain }}\n      nodePort: {{ add 31970 $index }}\n      {{- end }}\n  selector:\n    statefulset.kubernetes.io/pod-name: {{ $podName }}\n---\n{{- end }}"
  },
  {
    "path": "src/test/charts/functest/values.yaml",
    "content": "clusterType: \"\"\ningressDomain: \"\"\nproductReleaseName: \"\"\nproduct: \"\""
  },
  {
    "path": "src/test/config/bamboo/helm_parameters",
    "content": "RELEASE_PREFIX=${helm.release.prefix}\nCHART_SRC_PATH=${helm.src.path}/bamboo\nCHART_TEST_VALUES_BASEDIR=${chart.testValues.basedir}\nPRODUCT_NAME=bamboo\nDB_NAME=bamboo\nPOSTGRES_CHART_VERSION=11.6.2\nPOSTGRES_APP_VERSION=11\nLOG_DOWNLOAD_DIR=${project.build.directory}/logs\nTARGET_NAMESPACE=${kubernetes.target.namespace}\nDOCKER_IMAGE_REGISTRY=${dockerImage.registry}\nDOCKER_IMAGE_REPOSITORY=${dockerImage.repository}\nDOCKER_IMAGE_VERSION=${dockerImage.version}\nINGRESS_DOMAIN_AKS=${aks.ingress.domain}\nINGRESS_DOMAIN_EKS=${eks.ingress.domain}\nINGRESS_DOMAIN_GKE=${gke.ingress.domain}\nINGRESS_DOMAIN_KITT=${kitt.ingress.domain}\n# .Values.replicaCount=1, Bamboo in K8S can only run with 1 Bamboo server pod\nTARGET_REPLICA_COUNT=1\nDB_INIT_SCRIPT_FILE=${db.init.script.file}\nHELM_DEBUG=${helm.debug}\n\n# Bamboo pre-seed values. We also require BAMBOO_ADMIN_PASSWORD and BAMBOO_LICENSE.\n\nSECURITY_TOKEN=1234567890123456789012345678901234567890\nBAMBOO_ADMIN_USERNAME=admin\nBAMBOO_ADMIN_FULLNAME=Admin\nBAMBOO_ADMIN_EMAIL=admin@atlassian.com\n\n# Agent deployment setup\nPRODUCT_AGENT_CHART=src/main/charts/bamboo-agent/\n"
  },
  {
    "path": "src/test/config/bamboo/values-AKS.yaml",
    "content": "# This file contains overrides for the Bamboo Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-bamboo.${aks.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-bamboo # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/bamboo/values-EKS.yaml",
    "content": "# This file contains overrides for the Bamboo Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-bamboo.${eks.ingress.domain}\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-bamboo # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/bamboo/values-GKE.yaml",
    "content": "# This file contains overrides for the Bamboo Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-bamboo.${gke.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-bamboo # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/bamboo/values-KITT.yaml",
    "content": "# This file contains overrides for the Bamboo Helm chart's values.yaml file\n\n# Use the pre-created service account and role binding provided by KITT.\nserviceAccount:\n  name: \"namespace-admin\"\n  create: false\n  clusterRole:\n    create: false\n  clusterRoleBinding:\n    create: false\n\n# KITT requires these annotations on all pods\npodAnnotations:\n  \"atlassian.com/business_unit\": \"server_engineering\"\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-bamboo # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nfluentd:\n  enabled: true\n  elasticsearch:\n    hostname: elasticsearch-master\n"
  },
  {
    "path": "src/test/config/bamboo/values-agent.yaml",
    "content": "\nagent:\n  server: \"${helm.release.prefix}-bamboo.${kubernetes.target.namespace}.svc.cluster.local\"\n\n  securityToken:\n    secretName: bamboo-security-token\n\n  additionalEnvironmentVariables:\n    # While the agent can contact the server, the server is not yet\n    # configured so the handshake cannot complete and the agent\n    # quits. The wrapper will then restart the agent. This is all\n    # expected behaviour, but until we have full Bamboo\n    # auto-configuration we need to be a bit more permissive about\n    # what Kubernetes considers a valid pod state.\n    - name: \"BAMBOO_AGENT_PERMISSIVE_READINESS\"\n      value: \"true\"\n"
  },
  {
    "path": "src/test/config/bamboo/values.yaml",
    "content": "# This file contains overrides for the Bamboo Helm chart's values.yaml file\n\nbamboo:\n\n  unattendedSetup: false\n\n  securityToken:\n    secretName: bamboo-security-token\n\n  disableAgentAuth: true\n\n  import:\n    type: \"clean\"\n\n  additionalJvmArgs:\n    - -XX:ActiveProcessorCount=2\n\n  additionalEnvironmentVariables:\n    - name: ATL_BAMBOO_SKIP_CONFIG\n      value: \"true\"\n\ndatabase:\n  type: postgresql\n  url: jdbc:postgresql://${helm.release.prefix}-bamboo-pgsql:5432/bamboo\n  credentials:\n    secretName: bamboo-database-credentials\n\nmonitoring:\n  exposeJmxMetrics: true\n"
  },
  {
    "path": "src/test/config/bitbucket/helm_parameters",
    "content": "RELEASE_PREFIX=${helm.release.prefix}\nCHART_SRC_PATH=${helm.src.path}/bitbucket\nCHART_TEST_VALUES_BASEDIR=${chart.testValues.basedir}\nPRODUCT_NAME=bitbucket\nDB_NAME=bitbucket\nPOSTGRES_CHART_VERSION=11.6.2\nPOSTGRES_APP_VERSION=16\nELASTICSEARCH_DEPLOY=${chart.testValues.es.deploy}\nELASTICSEARCH_CHART_VERSION=7.16.3\nELASTICSEARCH_APP_VERSION=7.16.3\nLOG_DOWNLOAD_DIR=${project.build.directory}/logs\nTARGET_NAMESPACE=${kubernetes.target.namespace}\nDOCKER_IMAGE_REGISTRY=${dockerImage.registry}\nDOCKER_IMAGE_VERSION=${dockerImage.version}\nSKIP_IMAGE_PULL=${skip.dockerImage.pull}\nCUSTOM_INGRESS_URI=\"${custom.ingress.uri}\"\nINGRESS_DOMAIN_CUSTOM=\"${kubernetes.ingress.domain}\"\nINGRESS_DOMAIN_AKS=${aks.ingress.domain}\nINGRESS_DOMAIN_EKS=${eks.ingress.domain}\nINGRESS_DOMAIN_GKE=${gke.ingress.domain}\nINGRESS_DOMAIN_KITT=${kitt.ingress.domain}\nTARGET_REPLICA_COUNT=${target.replica.count}\nDB_INIT_SCRIPT_FILE=${db.init.script.file}\nEXTRA_PARAMETERS=\"${extra.parameters}\"\nHELM_DEBUG=${helm.debug}\n"
  },
  {
    "path": "src/test/config/bitbucket/values-AKS.yaml",
    "content": "# This file contains overrides for the Bitbucket Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-bitbucket.${aks.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome: # no NFS support in AKS for now\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-bitbucket # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n\nnodeSelector:\n  node_purpose: ci\n"
  },
  {
    "path": "src/test/config/bitbucket/values-EKS.yaml",
    "content": "# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  className: \"alb\"\n  nginx: false\n  annotations:\n    external-dns.alpha.kubernetes.io/hostname: ${helm.release.prefix}-bitbucket.${eks.ingress.domain}\n    alb.ingress.kubernetes.io/certificate-arn: ${eks.ingress.certificate}\n    alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=86400\n    alb.ingress.kubernetes.io/target-type: ip\n    alb.ingress.kubernetes.io/healthcheck-path: /status\n    alb.ingress.kubernetes.io/scheme: ${eks.alb.loadbalancer.scheme}\n  host: ${helm.release.prefix}-bitbucket.${eks.ingress.domain}\n\nbitbucket:\n  sshService:\n    enabled: true\n    annotations:\n      external-dns.alpha.kubernetes.io/hostname: ${helm.release.prefix}-bitbucket-ssh.${eks.ingress.domain}\n      service.beta.kubernetes.io/aws-load-balancer-type: external\n      service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip\n      service.beta.kubernetes.io/aws-load-balancer-scheme: ${eks.ssh.loadbalancer.scheme}\n  additionalEnvironmentVariables:\n    - name: PLUGIN_SSH_BASEURL\n      value: ssh://${helm.release.prefix}-bitbucket-ssh.${eks.ingress.domain}/\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    persistentVolume:\n      create: true\n      nfs:\n        path: \"/srv/nfs\"\n    persistentVolumeClaim:\n      create: true\n      storageClassName: \"\"\n      volumeName: ${helm.release.prefix}-bitbucket-shared-home-pv\n    nfsPermissionFixer:\n      enabled: true\n\naffinity:\n  podAffinity:\n    requiredDuringSchedulingIgnoredDuringExecution:\n      - labelSelector:\n          matchLabels:\n            app.kubernetes.io/instance: ${helm.release.prefix}-bitbucket-nfs # needs to be the same value as NFS server deployment\n        topologyKey: topology.kubernetes.io/zone\n\n\nnodeSelector:\n  node_purpose: ci\n"
  },
  {
    "path": "src/test/config/bitbucket/values-GKE.yaml",
    "content": "# This file contains overrides for the Bitbucket Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-bitbucket.${gke.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome: # Google Filestore is NFSv3\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-bitbucket # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci\n"
  },
  {
    "path": "src/test/config/bitbucket/values-KITT.yaml",
    "content": "# Use the pre-created service account and role binding provided by KITT.\nserviceAccount:\n  name: \"namespace-admin\"\n  create: false\n  clusterRole:\n    create: false\n  clusterRoleBinding:\n    create: false\n\n# KITT requires these annotations on all pods\npodAnnotations:\n  \"atlassian.com/business_unit\": \"server_engineering\"\n\ningress:\n  host: ${helm.release.prefix}-bitbucket.${kitt.ingress.domain}\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-bitbucket # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nbitbucket:\n  mesh:\n    podAnnotations:\n      \"atlassian.com/business_unit\": \"server_engineering\"\n"
  },
  {
    "path": "src/test/config/bitbucket/values.yaml",
    "content": "# This file contains overrides for the Bitbucket Helm chart's values.yaml file\n\nreplicaCount: ${replica.count}\n\nimage:\n  tag: 8.0.0\n\ndatabase:\n  url: jdbc:postgresql://${helm.release.prefix}-bitbucket-pgsql:5432/bitbucket\n  driver: org.postgresql.Driver\n  credentials:\n    secretName: bitbucket-database-credentials\n\nbitbucket:\n  clustering:\n    enabled: ${clustering.enabled}\n  mesh:\n    enabled: ${chart.testValues.mesh.deploy}\n    nodeAutoRegistration: true\n    setByDefault: true\n    image:\n      version: ${chart.testValues.mesh.version}\n  license:\n    secretName: bitbucket-license\n  sysadminCredentials:\n    secretName: bitbucket-sysadmin-credentials\n  additionalJvmArgs:\n    - -Dfeature.getting.started.page=false\n    - -Dupm.plugin.upload.enabled=true\n    - -XX:ActiveProcessorCount=2\n  resources:\n    container:\n      requests:\n        memory: 3G\n\nopensearch:\n  install: true\n  extraEnvs:\n    - name: plugins.security.disabled\n      value: \"true\"\n\nmonitoring:\n  exposeJmxMetrics: true\n"
  },
  {
    "path": "src/test/config/confluence/helm_parameters",
    "content": "RELEASE_PREFIX=${helm.release.prefix}\nCHART_SRC_PATH=${helm.src.path}/confluence\nCHART_TEST_VALUES_BASEDIR=${chart.testValues.basedir}\nPRODUCT_NAME=confluence\nDB_NAME=confluence\nPOSTGRES_CHART_VERSION=11.6.2\nPOSTGRES_APP_VERSION=11\nLOG_DOWNLOAD_DIR=${project.build.directory}/logs\nTARGET_NAMESPACE=${kubernetes.target.namespace}\nDOCKER_IMAGE_REGISTRY=${dockerImage.registry}\nDOCKER_IMAGE_VERSION=${dockerImage.version}\nINGRESS_DOMAIN_AKS=${aks.ingress.domain}\nINGRESS_DOMAIN_EKS=${eks.ingress.domain}\nINGRESS_DOMAIN_GKE=${gke.ingress.domain}\nINGRESS_DOMAIN_KITT=${kitt.ingress.domain}\n# .Values.replicaCount=1, but in here we specify how many nodes we are planning to get to prepare ingress rules for each\nTARGET_REPLICA_COUNT=2\nDB_INIT_SCRIPT_FILE=${db.init.script.file}\nHELM_DEBUG=${helm.debug}\nSKIP_IMAGE_PULL=${skip.dockerImage.pull}\nEXTRA_PARAMETERS=\"${extra.parameters}\"\nCUSTOM_INGRESS_URI=\"${custom.ingress.uri}\"\nINGRESS_DOMAIN_CUSTOM=\"${kubernetes.ingress.domain}\"\n"
  },
  {
    "path": "src/test/config/confluence/values-AKS.yaml",
    "content": "# This file contains overrides for the Confluence Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-confluence.${aks.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nsynchrony:\n  ingressUrl: https://${helm.release.prefix}-confluence.${aks.ingress.domain}/synchrony\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-confluence # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/confluence/values-EKS.yaml",
    "content": "# This file contains overrides for the Confluence Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-confluence.${eks.ingress.domain}\n\nsynchrony:\n  ingressUrl: https://${helm.release.prefix}-confluence.${eks.ingress.domain}/synchrony\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-confluence # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/confluence/values-GKE.yaml",
    "content": "# This file contains overrides for the Confluence Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-confluence.${gke.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nsynchrony:\n  ingressUrl: https://${helm.release.prefix}-confluence.${gke.ingress.domain}/synchrony\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-confluence # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/confluence/values-KITT.yaml",
    "content": "# This file contains overrides for the Confluence Helm chart's values.yaml file\n\n# Use the pre-created service account and role binding provided by KITT.\nserviceAccount:\n  name: \"namespace-admin\"\n  create: false\n  clusterRole:\n    create: false\n  clusterRoleBinding:\n    create: false\n\n# KITT requires these annotations on all pods\npodAnnotations:\n  \"atlassian.com/business_unit\": \"server_engineering\"\n\nsynchrony:\n  ingressUrl: https://${helm.release.prefix}-confluence.${kitt.ingress.domain}/synchrony\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-confluence # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nfluentd:\n  enabled: true\n  elasticsearch:\n    hostname: elasticsearch-master\n"
  },
  {
    "path": "src/test/config/confluence/values.yaml",
    "content": "# This file contains overrides for the Confluence Helm chart's values.yaml file\n\nconfluence:\n  clustering:\n    enabled: ${clustering.enabled}\n  license:\n    secretName: confluence-license\n  additionalJvmArgs:\n    - -Datlassian.allow.insecure.url.parameter.login=true\n    - -XX:ActiveProcessorCount=2\n  accessLog:\n    enabled: true\n\ndatabase:\n  type: postgresql\n  url: jdbc:postgresql://${helm.release.prefix}-confluence-pgsql:5432/confluence\n  credentials:\n    secretName: confluence-database-credentials\n\nsynchrony:\n  enabled: true\n\nmonitoring:\n  exposeJmxMetrics: true\n"
  },
  {
    "path": "src/test/config/crowd/helm_parameters",
    "content": "RELEASE_PREFIX=${helm.release.prefix}\nCHART_SRC_PATH=${helm.src.path}/crowd\nCHART_TEST_VALUES_BASEDIR=${chart.testValues.basedir}\nPRODUCT_NAME=crowd\nDB_NAME=crowd\nPOSTGRES_CHART_VERSION=11.6.2\nPOSTGRES_APP_VERSION=11\nLOG_DOWNLOAD_DIR=${project.build.directory}/logs\nTARGET_NAMESPACE=${kubernetes.target.namespace}\nDOCKER_IMAGE_REGISTRY=${dockerImage.registry}\nDOCKER_IMAGE_VERSION=${dockerImage.version}\nINGRESS_DOMAIN_AKS=${aks.ingress.domain}\nINGRESS_DOMAIN_EKS=${eks.ingress.domain}\nINGRESS_DOMAIN_GKE=${gke.ingress.domain}\nINGRESS_DOMAIN_KITT=${kitt.ingress.domain}\n# .Values.replicaCount=1, but in here we specify how many nodes we are planning to get to prepare ingress rules for each\nTARGET_REPLICA_COUNT=${target.replica.count}\nDB_INIT_SCRIPT_FILE=${db.init.script.file}\nHELM_DEBUG=${helm.debug}\n"
  },
  {
    "path": "src/test/config/crowd/values-EKS.yaml",
    "content": "# This file contains overrides for the crowd Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-crowd.${eks.ingress.domain}\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-crowd # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/crowd/values.yaml",
    "content": "# This file contains overrides for the crowd Helm chart's values.yaml file\n\ncrowd:\n  resources:\n    container:\n      requests:\n        memory: 2G\n  accessLog:\n    enabled: true\n\ndatabase:\n  type: postgresql\n  url: jdbc:postgresql://${helm.release.prefix}-crowd-pgsql:5432/crowd\n  credentials:\n    secretName: crowd-database-credentials\n\nmonitoring:\n  exposeJmxMetrics: true\n"
  },
  {
    "path": "src/test/config/jira/helm_parameters",
    "content": "RELEASE_PREFIX=${helm.release.prefix}\nCHART_SRC_PATH=${helm.src.path}/jira\nCHART_TEST_VALUES_BASEDIR=${chart.testValues.basedir}\nPRODUCT_NAME=jira\nDB_NAME=jira\nPOSTGRES_CHART_VERSION=11.6.2\nPOSTGRES_APP_VERSION=14\nLOG_DOWNLOAD_DIR=${project.build.directory}/logs\nTARGET_NAMESPACE=${kubernetes.target.namespace}\nDOCKER_IMAGE_REGISTRY=${dockerImage.registry}\nDOCKER_IMAGE_VERSION=${dockerImage.version}\nINGRESS_DOMAIN_AKS=${aks.ingress.domain}\nINGRESS_DOMAIN_EKS=${eks.ingress.domain}\nINGRESS_DOMAIN_GKE=${gke.ingress.domain}\nINGRESS_DOMAIN_KITT=${kitt.ingress.domain}\n# .Values.replicaCount=1, but in here we specify how many nodes we are planning to get to prepare ingress rules for each\nTARGET_REPLICA_COUNT=${target.replica.count}\nDB_INIT_SCRIPT_FILE=${db.init.script.file}\nHELM_DEBUG=${helm.debug}\n"
  },
  {
    "path": "src/test/config/jira/values-AKS.yaml",
    "content": "# This file contains overrides for the Jira Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-jira.${aks.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-jira # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/jira/values-EKS.yaml",
    "content": "# This file contains overrides for the Jira Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-jira.${eks.ingress.domain}\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-jira # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/jira/values-GKE.yaml",
    "content": "# This file contains overrides for the Jira Helm chart's values.yaml file\n\n# The created service account needs to have the credentials to pull from the Atlassian docker registry\nserviceAccount:\n  imagePullSecrets:\n    - name: regcred\n\ningress:\n  create: true\n  host: ${helm.release.prefix}-jira.${gke.ingress.domain}\n  nginx: true\n  https: true\n  tlsSecretName: ingress-tls\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-jira # Since all of our pods share the same PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nnodeSelector:\n  node_purpose: ci"
  },
  {
    "path": "src/test/config/jira/values-KITT.yaml",
    "content": "# This file contains overrides for the Jira Helm chart's values.yaml file\n\n# Use the pre-created service account and role binding provided by KITT.\nserviceAccount:\n  name: \"namespace-admin\"\n  create: false\n  clusterRole:\n    create: false\n  clusterRoleBinding:\n    create: false\n\n# KITT requires these annotations on all pods\npodAnnotations:\n  \"atlassian.com/business_unit\": \"server_engineering\"\n\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n  sharedHome:\n    customVolume:\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name} # Pre-provisioned, and shared by all of our pods\n    subPath: ${helm.release.prefix}-jira # Since all of our pods share the same EFS PV, we use subpath mounts to prevent interference\n    nfsPermissionFixer:\n      enabled: true\n\nfluentd:\n  enabled: true\n  elasticsearch:\n    hostname: elasticsearch-master\n"
  },
  {
    "path": "src/test/config/jira/values.yaml",
    "content": "# This file contains overrides for the Jira Helm chart's values.yaml file\n\njira:\n  clustering:\n    enabled: ${clustering.enabled}\n  additionalJvmArgs:\n    - -Datlassian.darkfeature.jira.onboarding.feature.disabled=true\n    - -Djira.websudo.is.disabled=true\n    - -Datlassian.allow.insecure.url.parameter.login=true\n    - -XX:ActiveProcessorCount=2\n  readinessProbe:\n    failureThreshold: 30\ndatabase:\n  type: postgres72\n  url: jdbc:postgresql://${helm.release.prefix}-jira-pgsql:5432/jira\n  driver: org.postgresql.Driver\n  credentials:\n    secretName: jira-database-credentials\n\nopensearch:\n  enabled: true\n  extraEnvs:\n    - name: plugins.security.disabled\n      value: \"true\"\n\nmonitoring:\n  exposeJmxMetrics: true\n"
  },
  {
    "path": "src/test/config/kind/backdoor-svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: DC_APP_REPLACEME-0\n  namespace: atlassian\nspec:\n  type: NodePort\n  selector:\n    statefulset.kubernetes.io/pod-name: DC_APP_REPLACEME-0\n  ports:\n    - name: http\n      port: 80\n      targetPort: http\n      protocol: TCP\n      nodePort: 30008\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: DC_APP_REPLACEME-1\n  namespace: atlassian\nspec:\n  type: NodePort\n  selector:\n    statefulset.kubernetes.io/pod-name: DC_APP_REPLACEME-1\n  ports:\n    - name: http\n      port: 80\n      targetPort: http\n      protocol: TCP\n      nodePort: 30009\n"
  },
  {
    "path": "src/test/config/kind/common-values.yaml",
    "content": "DC_APP_REPLACEME:\n  # claim little resources as there are limitations in GitHub actions\n  # we're not setting any limits, so containers will use as much resources as necessary\n  resources:\n    container:\n      requests:\n        cpu: 20m\n        memory: 1G\n  # we want to test scaling to 2 and making sure nodes have joined the cluster\n  # this is also required for DC functional tests\n  clustering:\n    enabled: true\n\n  # this works for Bitbucket and Bamboo only which support unattended setup\n  sysadminCredentials:\n    secretName: DC_APP_REPLACEME-admin\n  displayName: DISPLAY_NAME\n\n  # license secret will be ignored in Jira\n  license:\n    secretName: DC_APP_REPLACEME-app-license\n    secretKey: license\n\n  # this applies to Bamboo only and will be ignored in other Helm charts\n  disableAgentAuth: true\n\n  # check if init container not failing when importing a custom crt into the default Java keystore\n  additionalCertificates:\n    secretList:\n      - name: dev-certificates\n        keys:\n          - stg.crt\n          - dev.crt\n      - name: certificate-internal\n        keys:\n          - internal.crt\n    initContainer:\n      resources:\n        requests:\n          memory: 1Mi\n          cpu: 1m\n        limits:\n          memory: 100Mi\n          cpu: 1\n  # Bitbucket Only\n  sshService:\n    enabled: true\n    type: NodePort\n\n  # 2222 is a mapped Bitbucket SSH port\n  additionalEnvironmentVariables:\n    - name: PLUGIN_SSH_BASEURL\n      value: ssh://bitbucket.172.17.0.1.nip.io:2222\n\n  # non existing props will be ignored, so it's safe to set them for all products\n  # these extra sys properties are mostly for the functional tests\n  additionalJvmArgs:\n    - -Dupm.plugin.upload.enabled=true\n    - -Dfeature.getting.started.page=false\n    - -Datlassian.darkfeature.jira.onboarding.feature.disabled=true\n    - -Djira.websudo.is.disabled=true\n    - -Datlassian.allow.insecure.url.parameter.login=true\n    - -Dcom.atlassian.plugins.authentication.basic.auth.filter.force.allow=true\n\n  # Jira func tests will setup Jira, and during this time status will report 500\n  # to avoid marking container as non-ready, let's bump failureThreshold for a readinessProbe\n  readinessProbe:\n    failureThreshold: 100\n\n  # Bitbucket functional tests expect 3 Mesh nodes,\n  # we're enabling auto-registration jobs to make sure Mesh nodes register with the server\n  mesh:\n    enabled: true\n    nodeAutoRegistration: true\n    setByDefault: true\n    resources:\n      container:\n        requests:\n          cpu: \"10m\"\n          memory: \"1G\"\n    image:\n      tag: \"latest\"\n\ndatabase:\n  type: DB_TYPE_REPLACEME\n  url: jdbc:postgresql://DC_APP_REPLACEME-db-rw:5432/DC_APP_REPLACEME\n  driver: org.postgresql.Driver\n  credentials:\n    secretName: DC_APP_REPLACEME-db-credentials\n\n# nfs volume provisioner and nfs server are deployed to KinD cluster\n# thus we can create PVCs and expect them to be bound to PVs that provisioner will create\nvolumes:\n  localHome:\n    persistentVolumeClaim:\n      create: true\n    persistentVolumeClaimRetentionPolicy:\n      whenDeleted: Delete\n      whenScaled: Retain\n  sharedHome:\n    persistentVolumeClaim:\n      create: true\n      # this is the default storageclass name created when deploying the provisioner\n      storageClassName: nfs-client\n\n# just testing templating annotations\npodAnnotations:\n  annotation: \"{{ \\\"podOfTucuxis\\\" | upper }}\"\n  quote: \"true\"\n  normal: annotation-comes-here\n\n# KinD tests use Gateway API with Envoy Gateway.\n# Envoy proxy is exposed via NodePort(30080) -> hostPort(80); dc-app.test resolves via /etc/hosts.\ngateway:\n  create: true\n  parentRefs:\n    - name: atlassian-gateway\n  hostnames:\n    - dc-app.test\n  https: false\n\nmonitoring:\n  exposeJmxMetrics: true\n  grafana:\n    createDashboards: true\n    dashboardLabels:\n      grafana_dashboard: dc_monitoring\n\nsynchrony:\n  enabled: true\n  resources:\n    container:\n      requests:\n        cpu: 20m\n        memory: 1G\n  additionalCertificates:\n    secretName: certificate\n\n# this is to fix Synchrony when run locally\nadditionalHosts:\n  - ip: 172.17.0.1\n    hostnames:\n    - confluence.172.18.0.2.nip.io\n"
  },
  {
    "path": "src/test/config/kind/envoy-proxy.yaml",
    "content": "# EnvoyProxy tells Envoy Gateway *how* to create the data-plane proxy\n# for any Gateway whose GatewayClass references this resource.\n#\n# Key behaviour:\n#   - The proxy Service is created as NodePort (not the default ClusterIP/LB).\n#   - A strategic-merge patch pins nodePort: 30080 for the HTTP listener,\n#     matching the KinD extraPortMappings (host 80 → node 30080).\n#\n# This removes the need for any post-hoc `kubectl patch` in configure_kind.sh.\napiVersion: gateway.envoyproxy.io/v1alpha1\nkind: EnvoyProxy\nmetadata:\n  name: kind-proxy-config\n  namespace: envoy-gateway-system\nspec:\n  provider:\n    type: Kubernetes\n    kubernetes:\n      envoyService:\n        type: NodePort\n        # Pin the HTTP listener to a fixed NodePort so it aligns with\n        # the KinD extraPortMappings entry (host :80 → node :30080).\n        patch:\n          type: StrategicMerge\n          value:\n            spec:\n              ports:\n                - port: 80\n                  nodePort: 30080\n                  protocol: TCP\n"
  },
  {
    "path": "src/test/config/kind/gateway.yaml",
    "content": "# Gateway API Gateway resource for testing\n# This Gateway is used by the KinD test environment to enable HTTPRoute testing\n# alongside traditional Ingress tests.\n#\n# The Gateway uses the Envoy Gateway controller (gatewayClassName: eg)\n# and listens on port 80 for HTTP traffic.\n#\napiVersion: gateway.networking.k8s.io/v1\nkind: Gateway\nmetadata:\n  name: atlassian-gateway\n  namespace: atlassian\nspec:\n  gatewayClassName: eg\n  listeners:\n  - name: http\n    protocol: HTTP\n    port: 80\n    allowedRoutes:\n      namespaces:\n        from: Same\n"
  },
  {
    "path": "src/test/config/kind/hostpath-pv.yaml",
    "content": "apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: hostpath-shared-home\n  namespace: atlassian\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  persistentVolumeReclaimPolicy: Delete\n  hostPath:\n    path: /mnt/data\n    type: DirectoryOrCreate\n  claimRef:\n    namespace: atlassian\n    name: hostpath-shared-home-pvc\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: hostpath-shared-home-pvc\n  namespace: atlassian\nspec:\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 1Gi\n\n"
  },
  {
    "path": "src/test/config/kind/kind-config.yml",
    "content": "kind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnetworking:\n  apiServerAddress: \"127.0.0.1\"\nnodes:\n- role: control-plane\n  # Previously we mounted /dev + labelled ingress-ready to support ingress-nginx.\n  # KinD tests now run Gateway API via Envoy Gateway, exposed through a fixed NodePort.\n  extraPortMappings:\n  # Route host traffic to Envoy Gateway proxy via NodePort\n  - containerPort: 30080\n    hostPort: 80\n    protocol: TCP\n  # map registry NodePort to host port to be able to\n  # build and push images to an internal registry\n  - containerPort: 32767\n    hostPort: 5001\n    protocol: TCP\n  # this is required for Bitbucket tests to map ssh NodePort to 2222 hostPort\n  - containerPort: 30007\n    hostPort: 2222\n    protocol: TCP\n  # these are so called backdoor services that are used\n  # in dc functional tests when nodes have to be directly accessed\n  - containerPort: 30008\n    hostPort: 81\n    protocol: TCP\n  - containerPort: 30009\n    hostPort: 82\n    protocol: TCP\ncontainerdConfigPatches:\n# configure container runtime to trust an insecure registry\n- |-\n    [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"172.17.0.1:5001\"]\n      endpoint = [\"http://172.17.0.1:5001\"]\n    [plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"172.17.0.1:5001\".tls]\n      insecure_skip_verify = true\n"
  },
  {
    "path": "src/test/config/kind/nfs-values.yaml",
    "content": "# this will go to StorageClass spec to make sure RWX volumes are mounted with the correct settings\nnfs:\n  mountOptions:\n  - rw\n  - lookupcache=pos\n  - noatime\n  - intr\n  - _netdev\n  - nfsvers=3\n  - rsize=32768\n  - wsize=32768\n"
  },
  {
    "path": "src/test/config/kind/registry.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: registry\n  namespace: atlassian\nspec:\n  type: NodePort\n  selector:\n    app: registry\n  ports:\n    - name: registry-tcp\n      protocol: TCP\n      port: 5000\n      targetPort: 5000\n      nodePort: 32767\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: registry\n  name: registry\n  namespace: atlassian\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: registry\n  template:\n    metadata:\n      labels:\n        app: registry\n    spec:\n      containers:\n      - name: registry\n        image: registry:2\n        ports:\n        - containerPort: 5000\n"
  },
  {
    "path": "src/test/config/logging/README.md",
    "content": "For aggregation of all logs deployed by the DC products in a given namespace,\nwe use shared deployments of Kibana and Elasticsearch in that namespace.\n\nEach DC product is configured with a `fluentd` sidecar which forwards the application logs\non to Elasticsearch. \n\nKibana is installed via Helm chart, using the appropriate values file, e.g. for KITT:\n\n    helm install kibana --version 7.10.2 elastic/kibana --values kibana/values-KITT.yaml\n\nSimilarly for Elasticsearch:\n\n    helm install elasticsearch --version 7.10.2 elastic/elasticsearch --values elasticsearch/values-KITT.yaml\n\nFor KITT, you also need to define the HTTPProxy ingress for access to the Kibana UI:\n   \n    kubectl apply -f kibana/ingress-kitt.yaml"
  },
  {
    "path": "src/test/config/logging/elasticsearch/values-KITT.yaml",
    "content": "# https://github.com/elastic/helm-charts/blob/7.x/elasticsearch/README.md\n\npodAnnotations:\n  \"atlassian.com/business_unit\": \"server_engineering\"\n\n# Disable the priviliged initContainer that fixes memory settings, we can't do this in KITT\nsysctlInitContainer:\n  enabled: false\n\n# We just want one replica for now, to avoid excessive resource utilisation.\n# However, because ES will report a single node cluster as having health status \"yellow\", we also\n# need to change the readiness probe to be OK with that, rather than requiring \"green\".\nreplicas: 1\nclusterHealthCheckParams: \"wait_for_status=yellow&timeout=1s\""
  },
  {
    "path": "src/test/config/logging/kibana/ingress-kitt.yaml",
    "content": "apiVersion: projectcontour.io/v1\nkind: HTTPProxy\nmetadata:\n  name: kibana\n  annotations:\n    kubernetes.io/ingress.class: \"ingress-internal-01\"\nspec:\n  virtualhost:\n    fqdn: kibana-dcng.internal.shared-dev.us-west-2.kitt-inf.net\n  routes:\n    - conditions:\n        - prefix: /\n      services:\n        - name: kibana-kibana\n          port: 5601"
  },
  {
    "path": "src/test/config/logging/kibana/values-KITT.yaml",
    "content": "# https://chartcenter.io/elastic/kibana\n\npodAnnotations:\n  \"atlassian.com/business_unit\": \"server_engineering\"\n"
  },
  {
    "path": "src/test/config/openshift/envoy-proxy.yaml",
    "content": "# EnvoyProxy tells Envoy Gateway *how* to create the data-plane proxy\n# for any Gateway whose GatewayClass references this resource.\n#\n# On OpenShift/MicroShift we keep the default ClusterIP and expose\n# Envoy via an OpenShift Route (created in the workflow).\n# This resource exists so the GatewayClass can use a consistent\n# parametersRef pattern across environments.\napiVersion: gateway.envoyproxy.io/v1alpha1\nkind: EnvoyProxy\nmetadata:\n  name: openshift-proxy-config\n  namespace: envoy-gateway-system\nspec:\n  provider:\n    type: Kubernetes\n    kubernetes:\n      envoyService:\n        # ClusterIP is fine here — the OpenShift Route handles external access.\n        type: ClusterIP\n"
  },
  {
    "path": "src/test/config/openshift/gateway.yaml",
    "content": "# Gateway API Gateway resource for OpenShift/MicroShift testing\n# This Gateway is used by the OpenShift test environment to enable HTTPRoute testing\n# alongside traditional Route tests.\n#\n# The Gateway uses a generic Gateway controller\n# and listens on port 80 for HTTP traffic.\n#\napiVersion: gateway.networking.k8s.io/v1\nkind: Gateway\nmetadata:\n  name: atlassian-gateway\n  namespace: atlassian\nspec:\n  gatewayClassName: eg\n  listeners:\n  - name: http\n    protocol: HTTP\n    port: 80\n    allowedRoutes:\n      namespaces:\n        from: Same\n"
  },
  {
    "path": "src/test/config/openshift/openshift.yaml",
    "content": "volumes:\n  localHome:\n    persistentVolumeClaim:\n      storageClassName: topolvm-provisioner\n  sharedHome:\n    persistentVolumeClaim:\n      create: false\n    customVolume:\n      persistentVolumeClaim:\n        claimName: shared-home-pvc\n\nopenshift:\n  runWithRestrictedSCC: true\n\ngateway:\n  create: true\n  parentRefs:\n    - name: atlassian-gateway\n  hostnames:\n    - atlassian.apps.crc.testing\n  https: false\n"
  },
  {
    "path": "src/test/config/openshift/shared-home-pvc.yaml",
    "content": "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: shared-home-pvc\n  namespace: atlassian\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 1Gi\n"
  },
  {
    "path": "src/test/config/shared-home/shared-home-browser.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: shared-home-browser\n  annotations:\n    \"atlassian.com/business_unit\": \"server_engineering\"\nspec:\n  containers:\n    - name: browser\n      image: debian:stable-slim\n      volumeMounts:\n        - mountPath: /shared-home\n          name: shared-home\n      command: [ \"bash\", \"-c\", \"--\" ]\n      args: [ \"while true; do sleep 30; done;\" ]\n  volumes:\n    - name: shared-home\n      persistentVolumeClaim:\n        claimName: ${shared.pvc.name}"
  },
  {
    "path": "src/test/infrastructure/cloudnativepg/README.md",
    "content": "# CloudNativePG Test Infrastructure\n\nConfiguration files for deploying PostgreSQL databases using CloudNativePG operator in test environments.\n\n## Overview\n\nCloudNativePG operator is used to manage PostgreSQL clusters for Data Center application testing.\n\n## Files\n\n### `operator-values.yaml`\nConfiguration for the CloudNativePG operator Helm chart. This includes:\n- Resource limits suitable for test environments\n- Security context configuration\n- Monitoring settings (disabled for tests)\n- RBAC and service account settings\n\n### `cluster-template.yaml`\nTemplate for creating PostgreSQL clusters. Features:\n- Single instance configuration for test environments\n- PostgreSQL 16.2 (matching previous Bitnami version)\n- Resource limits: 256Mi-1Gi memory, 100m-1000m CPU\n- Ephemeral storage (1Gi) suitable for tests\n- Performance optimizations for test environments (fsync disabled)\n- Database and user creation via bootstrap configuration\n\n### `init-scripts/init-db.sql`\nDatabase initialization script that:\n- Creates necessary PostgreSQL extensions\n- Sets up proper permissions for application users\n- Creates health check functions\n- Provides initialization logging\n\n## Usage\n\nThe CloudNativePG deployment is handled automatically by the test scripts:\n\n### Local Testing (KinD)\n```bash\n# Deploy PostgreSQL cluster for Jira\nDC_APP=jira source src/test/scripts/kind/deploy_app.sh\ndeploy_postgres\n```\n\n### CI/CD Testing\nThe GitHub Actions workflows automatically use the updated deployment scripts.\n\n## Database Connection\n\nApplications connect to the database using:\n- **Service Name**: `{app-name}-db-rw` (read-write) or `{app-name}-db-ro` (read-only)\n- **Port**: 5432\n- **Database**: Same as application name\n- **Credentials**: Stored in `{app-name}-db-credentials` secret\n\nExample connection string for Jira:\n```\njdbc:postgresql://jira-db-rw:5432/jira\n```\n\n## Monitoring\n\nMonitoring is disabled in test environments to reduce resource usage. For production deployments, you can enable:\n- Pod monitors for Prometheus integration\n- Grafana dashboards\n- Custom monitoring queries\n\n## Troubleshooting\n\n### Check Operator Status\n```bash\nkubectl get deployment cnpg-operator-controller-manager -n cnpg-system\n```\n\n### Check Cluster Status\n```bash\nkubectl get cluster {app-name}-db -n atlassian\nkubectl describe cluster {app-name}-db -n atlassian\n```\n\n### Check Pod Status\n```bash\nkubectl get pods -l cnpg.io/cluster={app-name}-db -n atlassian\n```\n\n### Access Database\n```bash\n# Get primary pod name\nPRIMARY_POD=$(kubectl get pods -n atlassian -l cnpg.io/cluster={app-name}-db,role=primary -o jsonpath='{.items[0].metadata.name}')\n\n# Connect to database\nkubectl exec -it ${PRIMARY_POD} -n atlassian -- psql -U {app-name} -d {app-name}\n```\n\n## Performance Considerations\n\nThe test configuration includes several performance optimizations:\n- `fsync=off` - Disables synchronous writes (safe for ephemeral test data)\n- `synchronous_commit=off` - Allows asynchronous commits\n- `full_page_writes=off` - Reduces I/O for test workloads\n\n**Warning**: These settings are only suitable for test environments with ephemeral data.\n\n## Migration Notes\n\nKey differences from Bitnami PostgreSQL:\n1. **Service Names**: Changed from `postgres` to `{app-name}-db-rw`\n2. **Pod Names**: Changed from `postgres-0` to `{app-name}-db-1`\n3. **Operator Management**: Clusters are managed by the CloudNativePG operator\n4. **Configuration**: Uses Kubernetes CRDs instead of Helm values\n5. **Monitoring**: Native Prometheus integration available\n\n## Resources\n\n- [CloudNativePG Documentation](https://cloudnative-pg.io/documentation/)\n- [CloudNativePG Helm Chart](https://github.com/cloudnative-pg/charts)\n- [PostgreSQL Configuration Reference](https://www.postgresql.org/docs/current/runtime-config.html)"
  },
  {
    "path": "src/test/infrastructure/cloudnativepg/cluster-template.yaml",
    "content": "apiVersion: postgresql.cnpg.io/v1\nkind: Cluster\nmetadata:\n  name: ${DC_APP}-db\n  namespace: ${NAMESPACE}\n  labels:\n    app.kubernetes.io/name: postgresql\n    app.kubernetes.io/instance: ${DC_APP}-db\n    app.kubernetes.io/component: database\n    app.kubernetes.io/part-of: ${DC_APP}\nspec:\n  instances: 1\n  imageName: ghcr.io/cloudnative-pg/postgresql:16.2\n  \n  resources:\n    requests:\n      memory: \"256Mi\"\n      cpu: \"25m\"\n    limits:\n      memory: \"1024Mi\"\n      cpu: \"250m\"\n  \n  storage:\n    size: 256Mi\n    storageClass: standard\n  \n  bootstrap:\n    initdb:\n      database: ${DC_APP}\n      owner: ${DC_APP}\n      secret:\n        name: ${DC_APP}-db-credentials\n      postInitSQL:\n        - \"ALTER USER ${DC_APP} CREATEDB;\"\n        - \"ALTER USER ${DC_APP} WITH PASSWORD '${DC_APP}pwd' VALID UNTIL 'infinity';\"\n  \n  postgresql:\n    parameters:\n      max_connections: \"100\"\n      shared_buffers: \"32MB\"\n      work_mem: \"1MB\"\n      maintenance_work_mem: \"16MB\"\n      effective_cache_size: \"128MB\"\n      fsync: \"off\"\n      synchronous_commit: \"off\"\n      full_page_writes: \"off\"\n      # WAL configuration\n      wal_level: \"replica\"\n      max_wal_senders: \"2\"\n      min_wal_size: \"32MB\"\n      max_wal_size: \"64MB\"\n      checkpoint_timeout: \"15min\"\n      # Authentication\n      password_encryption: \"scram-sha-256\"\n      # Reduce logging\n      log_statement: \"none\"\n      log_min_duration_statement: \"-1\""
  },
  {
    "path": "src/test/infrastructure/cloudnativepg/init-scripts/init-db.sql",
    "content": "-- Database initialization script for CloudNativePG\n\n-- Create additional extensions that might be needed by DC apps\nCREATE EXTENSION IF NOT EXISTS pg_stat_statements;\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\n\n-- Grant additional permissions to the application user\nGRANT CREATE ON SCHEMA public TO ${DC_APP};\nGRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ${DC_APP};\nGRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ${DC_APP};\n\n-- Set default privileges for future objects\nALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ${DC_APP};\nALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ${DC_APP};\n\n-- Create a simple health check function\nCREATE OR REPLACE FUNCTION health_check() RETURNS text AS $$\nBEGIN\n    RETURN 'OK';\nEND;\n$$ LANGUAGE plpgsql;\n\n-- Log initialization completion\nDO $$\nBEGIN\n    RAISE NOTICE 'Database initialization completed for application: %', '${DC_APP}';\nEND $$;"
  },
  {
    "path": "src/test/infrastructure/cloudnativepg/operator-values.yaml",
    "content": "# CloudNativePG Operator configuration optimized for CI/test environments\n\nreplicaCount: 1\n\nimage:\n  repository: ghcr.io/cloudnative-pg/cloudnative-pg\n  pullPolicy: IfNotPresent\n  tag: \"1.27.0\"\n\n# Minimal resource limits for CI\nresources:\n  limits:\n    cpu: 500m\n    memory: 512Mi\n  requests:\n    cpu: 100m\n    memory: 128Mi\n\n# Disable monitoring for CI\nmonitoring:\n  podMonitorEnabled: false\n  grafanaDashboard:\n    create: false\n\n# Security context - compatible with microshift/OpenShift SCC\ncontainerSecurityContext:\n  runAsUser: null\n  runAsGroup: null\n  allowPrivilegeEscalation: false\n  readOnlyRootFilesystem: true\n  capabilities:\n    drop:\n      - ALL\n\npodSecurityContext:\n  runAsNonRoot: true\n  seccompProfile:\n    type: RuntimeDefault\n\n# Service account\nserviceAccount:\n  create: true\n\n# RBAC\nrbac:\n  create: true\n\n# CRDs\ncrds:\n  create: true"
  },
  {
    "path": "src/test/infrastructure/elasticsearch/elasticsearch-values.yaml",
    "content": "persistence:\n  enabled: false\n\nsecret:\n  enabled: false\n\ncreateCert: false\n\nsysctlInitContainer:\n  enabled: false\n\npodAnnotations:\n  \"atlassian.com/business_unit\": \"Engineering: Enterprise DC\"\n\nmaxUnavailable: \"\""
  },
  {
    "path": "src/test/infrastructure/nfs-server/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n.vscode/\n"
  },
  {
    "path": "src/test/infrastructure/nfs-server/Chart.yaml",
    "content": "apiVersion: v2\nname: nfs-server\ndescription: A NFS server used to run integration tests. Do not use in production.\n\ntype: application\nversion: 0.1.0\nappVersion: \"2.1\"\n"
  },
  {
    "path": "src/test/infrastructure/nfs-server/README.md",
    "content": "# nfs-server\n\n![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.1](https://img.shields.io/badge/AppVersion-2.1-informational?style=flat-square)\n\nA NFS server used to run integration tests. Do not use in production.\n\n## Values\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| affinity | object | `{}` |  |\n| exportPath | string | `\"/srv/nfs\"` |  |\n| fullnameOverride | string | `\"\"` |  |\n| image.pullPolicy | string | `\"IfNotPresent\"` |  |\n| image.repository | string | `\"atlassian/nfs-server-test\"` |  |\n| image.tag | string | `\"\"` |  |\n| imagePullSecrets | list | `[]` |  |\n| nameOverride | string | `\"\"` |  |\n| nodeSelector | object | `{}` |  |\n| persistence.annotations | object | `{}` |  |\n| persistence.size | string | `\"5Gi\"` |  |\n| persistence.storageClassName | string | `nil` |  |\n| podAnnotations | object | `{}` |  |\n| podEnvironmentVariables | list | `[]` |  |\n| podSecurityContext | object | `{}` |  |\n| replicaCount | int | `1` |  |\n| resources.requests.cpu | string | `\"500m\"` |  |\n| resources.requests.memory | string | `\"256Mi\"` |  |\n| securityContext.capabilities.add[0] | string | `\"DAC_READ_SEARCH\"` |  |\n| securityContext.capabilities.add[1] | string | `\"SYS_RESOURCE\"` |  |\n| service.lockdPort | int | `32767` |  |\n| service.mountdPort | int | `20048` |  |\n| service.nfsPort | int | `2049` |  |\n| service.rpcbindPort | int | `111` |  |\n| service.statdOutgoingPort | int | `32766` |  |\n| service.statdPort | int | `32765` |  |\n| service.type | string | `\"ClusterIP\"` |  |\n| serviceAccount.annotations | object | `{}` |  |\n| serviceAccount.create | bool | `true` |  |\n| serviceAccount.name | string | `\"\"` |  |\n| tolerations | list | `[]` |  |\n\n----------------------------------------------\nAutogenerated from chart metadata using [helm-docs v1.12.0](https://github.com/norwoodj/helm-docs/releases/v1.12.0)\n"
  },
  {
    "path": "src/test/infrastructure/nfs-server/templates/NOTES.txt",
    "content": "NFS Server installed."
  },
  {
    "path": "src/test/infrastructure/nfs-server/templates/_helpers.tpl",
    "content": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"nfs-server.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\nIf release name contains chart name it will be used as a full name.\n*/}}\n{{- define \"nfs-server.fullname\" -}}\n{{- if .Values.fullnameOverride }}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- $name := default .Chart.Name .Values.nameOverride }}\n{{- if contains $name .Release.Name }}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"nfs-server.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCommon labels\n*/}}\n{{- define \"nfs-server.labels\" -}}\nhelm.sh/chart: {{ include \"nfs-server.chart\" . }}\n{{ include \"nfs-server.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{- end }}\n\n{{/*\nSelector labels\n*/}}\n{{- define \"nfs-server.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"nfs-server.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n\n{{/*\nCreate the name of the service account to use\n*/}}\n{{- define \"nfs-server.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.create }}\n{{- default (include \"nfs-server.fullname\" .) .Values.serviceAccount.name }}\n{{- else }}\n{{- default \"default\" .Values.serviceAccount.name }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/test/infrastructure/nfs-server/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"nfs-server.fullname\" . }}\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\nspec:\n  type: {{ .Values.service.type }}\n  {{- if contains \"ClusterIP\" .Values.service.type }}\n  clusterIP: {{ .Values.service.clusterIP }}\n  {{- end }}\n  ports:\n    - port: {{ .Values.service.nfsPort }}\n      targetPort: nfs\n      protocol: TCP\n      name: nfs\n    - port: {{ .Values.service.nfsPort }}\n      targetPort: nfs-udp\n      protocol: UDP\n      name: nfs-udp\n    - port: {{ .Values.service.mountdPort }}\n      targetPort: mountd\n      protocol: TCP\n      name: mountd\n    - port: {{ .Values.service.mountdPort }}\n      targetPort: mountd-udp\n      protocol: UDP\n      name: mountd-udp\n    - port: {{ .Values.service.rpcbindPort }}\n      targetPort: rpcbind\n      protocol: TCP\n      name: rpcbind\n    - port: {{ .Values.service.rpcbindPort }}\n      targetPort: rpcbind-udp\n      protocol: UDP\n      name: rpcbind-udp\n    - port: {{ .Values.service.statdPort }}\n      targetPort: statd\n      protocol: TCP\n      name: statd\n    - port: {{ .Values.service.statdPort }}\n      targetPort: statd-udp\n      protocol: UDP\n      name: statd-udp\n    - port: {{ .Values.service.statdOutgoingPort }}\n      targetPort: statd-out\n      protocol: TCP\n      name: statd-out\n    - port: {{ .Values.service.statdOutgoingPort }}\n      targetPort: statd-out-udp\n      protocol: UDP\n      name: statd-out-udp\n    - port: {{ .Values.service.lockdPort }}\n      targetPort: lockd\n      protocol: TCP\n      name: lockd\n    - port: {{ .Values.service.lockdPort }}\n      targetPort: lockd-udp\n      protocol: UDP\n      name: lockd-udp\n  selector:\n    {{- include \"nfs-server.selectorLabels\" . | nindent 4 }}\n"
  },
  {
    "path": "src/test/infrastructure/nfs-server/templates/serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"nfs-server.serviceAccountName\" . }}\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\n  {{- with .Values.serviceAccount.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\n{{- end }}\n"
  },
  {
    "path": "src/test/infrastructure/nfs-server/templates/statefulset.yaml",
    "content": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ include \"nfs-server.fullname\" . }}\n  labels:\n    {{- include \"nfs-server.labels\" . | nindent 4 }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  serviceName: {{ include \"nfs-server.fullname\" . }}\n  selector:\n    matchLabels:\n      {{- include \"nfs-server.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      {{- with .Values.podAnnotations }}\n      annotations:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      labels:\n        {{- include \"nfs-server.selectorLabels\" . | nindent 8 }}\n    spec:\n      {{- with .Values.imagePullSecrets }}\n      imagePullSecrets:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      serviceAccountName: {{ include \"nfs-server.serviceAccountName\" . }}\n      securityContext:\n        {{- toYaml .Values.podSecurityContext | nindent 8 }}\n      containers:\n        - name: {{ .Chart.Name }}\n          securityContext:\n            {{- toYaml .Values.securityContext | nindent 12 }}\n          image: \"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\"\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          env:\n            - name: MOUNTD_PORT\n              value: \"{{ .Values.service.mountdPort }}\"\n            - name: NFS_PORT\n              value: \"{{ .Values.service.nfsPort }}\"\n            - name: STATD_PORT\n              value: \"{{ .Values.service.statdPort }}\"\n            - name: STATD_PORT_OUT\n              value: \"{{ .Values.service.statdOutgoingPort }}\"\n            - name: LOCKD_PORT\n              value: \"{{ .Values.service.lockdPort }}\"\n            - name: EXPORT_PATH\n              value: \"{{ .Values.exportPath }}\"\n            {{- with .Values.podEnvironmentVariables }}\n            {{- toYaml . | nindent 12 }}\n            {{- end }}\n          ports:\n          - name: nfs\n            containerPort: {{ .Values.service.nfsPort }}\n            protocol: TCP\n          - name: nfs-udp\n            containerPort: {{ .Values.service.nfsPort }}\n            protocol: UDP\n          - name: mountd\n            containerPort: {{ .Values.service.mountdPort }}\n            protocol: TCP\n          - name: mountd-udp\n            containerPort: {{ .Values.service.mountdPort }}\n            protocol: UDP\n          - name: rpcbind\n            containerPort: 111\n            protocol: TCP\n          - name: rpcbind-udp\n            containerPort: 111\n            protocol: UDP\n          - name: statd\n            containerPort: {{ .Values.service.statdPort }}\n            protocol: TCP\n          - name: statd-udp\n            containerPort: {{ .Values.service.statdPort }}\n            protocol: UDP\n          - name: statd-out\n            containerPort: {{ .Values.service.statdOutgoingPort }}\n            protocol: TCP\n          - name: statd-out-udp\n            containerPort: {{ .Values.service.statdOutgoingPort }}\n            protocol: UDP\n          - name: lockd\n            containerPort: {{ .Values.service.lockdPort }}\n            protocol: TCP\n          - name: lockd-udp\n            containerPort: {{ .Values.service.lockdPort }}\n            protocol: UDP\n          livenessProbe:\n            exec:\n              command:\n                - /usr/local/bin/docker-entrypoint.sh\n                - healthcheck\n            initialDelaySeconds: 30\n            periodSeconds: 10\n          startupProbe:\n            exec:\n              command:\n                - /usr/local/bin/docker-entrypoint.sh\n                - healthcheck\n            failureThreshold: 30\n            periodSeconds: 1\n          resources:\n            {{- toYaml .Values.resources | nindent 12 }}\n          volumeMounts:\n            - name: data\n              mountPath: /srv/nfs\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n  volumeClaimTemplates:\n    - metadata:\n        name: data\n        {{- with .Values.persistence.annotations }}\n        annotations:\n          {{- toYaml . | indent 10 }}\n        {{- end }}\n      spec:\n        accessModes: [ \"ReadWriteOnce\" ]\n        {{- if not (kindIs \"invalid\" .Values.persistence.storageClassName) }}\n        storageClassName: {{ .Values.persistence.storageClassName | quote }}\n        {{- end }}\n        resources:\n          requests:\n            storage: {{ .Values.persistence.size | default \"1Gi\" }}"
  },
  {
    "path": "src/test/infrastructure/nfs-server/values.yaml",
    "content": "# Default values for nfs-server.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\n\nreplicaCount: 1\n\nimage:\n  repository: atlassian/nfs-server-test\n  pullPolicy: IfNotPresent\n  # Overrides the image tag whose default is the chart appVersion.\n  tag: \"\"\n\nimagePullSecrets: []\nnameOverride: \"\"\nfullnameOverride: \"\"\n\n# The path that should be exported by the NFS server\nexportPath: /srv/nfs\n\nserviceAccount:\n  # Specifies whether a service account should be created\n  create: true\n  # Annotations to add to the service account\n  annotations: {}\n  # The name of the service account to use.\n  # If not set and create is true, a name is generated using the fullname template\n  name: \"\"\n\npodAnnotations: {}\n\npodSecurityContext: {}\n  # fsGroup: 2000\n\npodEnvironmentVariables: []\n#  - name: DEBUG\n#    value: 'true'\n\nsecurityContext:\n  capabilities:\n    add:\n      - DAC_READ_SEARCH\n      - SYS_RESOURCE\n\nservice:\n  # ClusterIP is required\n  type: ClusterIP\n  # If you want to run `helm test`, set this to a specific IP so the test can mount the NFS export at the correct IP\n  # clusterIP: \"172.16.0.1\"\n  nfsPort: 2049\n  mountdPort: 20048\n  rpcbindPort: 111\n  statdPort: 32765\n  statdOutgoingPort: 32766\n  lockdPort: 32767\n\npersistence:\n  annotations: {}\n  size: 5Gi\n  # If set to non-empty string value, this will specify the storage class to be used.\n  # If left without value, the default Storage Class will be utilised.\n  # Alternatively, can be set to the empty string \"\", to indicate that no Storage Class should be used here.\n  storageClassName:\n\nresources:\n  # limits:\n  #   cpu: 100m\n  #   memory: 128Mi\n  requests:\n    cpu: 500m\n    memory: 256Mi\n\nnodeSelector: {}\n\ntolerations: []\n\naffinity: {}\n"
  },
  {
    "path": "src/test/infrastructure/postgres/postgres-values.yaml",
    "content": "# DEPRECATED: This file is no longer used. CloudNativePG is now used instead of Bitnami PostgreSQL.\n# See src/test/infrastructure/cloudnativepg/ for the new configuration files.\n\nprimary:\n  podAnnotations:\n   # This annotation is required for all pods in the KITT kubernetes clusters\n   \"atlassian.com/business_unit\": \"server_engineering\"\n\n  persistence:\n    # We don't want or need persistent data for this postgres installation\n    enabled: false\n"
  },
  {
    "path": "src/test/java/test/AdditionalCertificatesTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.ConfigMap;\n\npublic class AdditionalCertificatesTest {\n    private Helm helm;\n    String expectedCmd = \"set -e; cp $JAVA_HOME/lib/security/cacerts /var/ssl/cacerts; chmod 664 /var/ssl/cacerts; for crt in /tmp/crt/*.*; do echo \\\"Adding $crt to keystore\\\"; keytool -import -keystore /var/ssl/cacerts -storepass changeit -noprompt -alias $(echo $(basename $crt)) -file $crt; done;\";\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_jvm_prop(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretName\", \"mycrt\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n        final var jvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-jvm-config\");\n        assertThat(jvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"-Djavax.net.ssl.trustStore=/var/ssl/cacerts\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificate_list_jvm_prop(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                product.name() + \".additionalCertificates.secretList[1].name\", \"custom-ca\",\n                product.name() + \".additionalCertificates.secretList[1].keys[0]\", \"custom.crt\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n        final var jvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-jvm-config\");\n        assertThat(jvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"-Djavax.net.ssl.trustStore=/var/ssl/cacerts\");\n    }\n\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_jvm_prop_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var jvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-synchrony-entrypoint\");\n        assertThat(jvmConfigMap.getConfigMapData().path(\"start-synchrony.sh\")).hasTextContaining(\"-Djavax.net.ssl.trustStore=/var/ssl/cacerts\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificate_list_jvm_prop_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                \"synchrony.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                \"synchrony.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                \"synchrony.additionalCertificates.secretList[1].name\", \"custom-ca\",\n                \"synchrony.additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n        ));\n        final var jvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-synchrony-entrypoint\");\n        assertThat(jvmConfigMap.getConfigMapData().path(\"start-synchrony.sh\")).hasTextContaining(\"-Djavax.net.ssl.trustStore=/var/ssl/cacerts\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_jvm_prop_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var bitbucketMeshJvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-jvm-config-mesh\");\n        assertThat(bitbucketMeshJvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"-Djavax.net.ssl.trustStore=/var/ssl/cacerts\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificate_list_jvm_prop_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                product.name() + \".mesh.additionalCertificates.secretList[1].name\", \"custom-ca\",\n                product.name() + \".mesh.additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n        ));\n        final var bitbucketMeshJvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-jvm-config-mesh\");\n        assertThat(bitbucketMeshJvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"-Djavax.net.ssl.trustStore=/var/ssl/cacerts\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_init_container(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretName\", \"mycrt\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainers().get(1).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(0).get(\"name\")).hasTextEqualTo(\"keystore\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(0).get(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"args\").path(1)).hasTextEqualTo(expectedCmd);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_init_container_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-synchrony\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(0).get(\"name\")).hasTextEqualTo(\"keystore\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(0).get(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"args\").path(1)).hasTextEqualTo(expectedCmd);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_init_container_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-mesh\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(0).get(\"name\")).hasTextEqualTo(\"keystore\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(0).get(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"args\").path(1)).hasTextEqualTo(expectedCmd);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_volumeMounts(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode keystoreVolumeMount = statefulSet.getContainer(product.name()).getVolumeMount(\"keystore\");\n        assertThat(keystoreVolumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificate_list_volumeMounts(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                product.name() + \".additionalCertificates.secretList[1].name\", \"custom-ca\",\n                product.name() + \".additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode keystoreVolumeMount = statefulSet.getContainer(product.name()).getVolumeMount(\"keystore\");\n        assertThat(keystoreVolumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_volumeMounts_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-mesh\");\n        JsonNode keystoreVolumeMount = statefulSet.getContainer(product.name()+\"-mesh\").getVolumeMount(\"keystore\");\n        assertThat(keystoreVolumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificate_list_volumeMounts_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                product.name() + \".mesh.additionalCertificates.secretList[1].name\", \"custom-ca\",\n                product.name() + \".mesh.additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-mesh\");\n        JsonNode keystoreVolumeMount = statefulSet.getContainer(product.name()+\"-mesh\").getVolumeMount(\"keystore\");\n        assertThat(keystoreVolumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_volumeMounts_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-synchrony\");\n        JsonNode keystoreVolumeMount = statefulSet.getContainer(\"synchrony\").getVolumeMount(\"keystore\");\n        assertThat(keystoreVolumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificate_list_volumeMounts_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                \"synchrony.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                \"synchrony.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                \"synchrony.additionalCertificates.secretList[1].name\", \"custom-ca\",\n                \"synchrony.additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-synchrony\");\n        JsonNode keystoreVolumeMount = statefulSet.getContainer(\"synchrony\").getVolumeMount(\"keystore\");\n        assertThat(keystoreVolumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/ssl\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_volumes(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getVolume(\"keystore\").get().path(\"emptyDir\")).isEmpty();\n        assertThat(statefulSet.getVolume(\"certs\").get().path(\"secret\").path(\"secretName\")).hasTextEqualTo(\"mycrt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_volumes_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-mesh\");\n        assertThat(statefulSet.getVolume(\"keystore\").get().path(\"emptyDir\")).isEmpty();\n        assertThat(statefulSet.getVolume(\"certs\").get().path(\"secret\").path(\"secretName\")).hasTextEqualTo(\"mycrt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_volumes_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretName\", \"mycrt\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-synchrony\");\n        assertThat(statefulSet.getVolume(\"keystore\").get().path(\"emptyDir\")).isEmpty();\n        assertThat(statefulSet.getVolume(\"certs\").get().path(\"secret\").path(\"secretName\")).hasTextEqualTo(\"mycrt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_custom_cmd(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretName\", \"mycrt\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                product.name() + \".additionalCertificates.customCmd\", \"echo \\\"My custom command\\\"\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainers().get(1).path(\"args\").path(1)).hasTextEqualTo(\"echo \\\"My custom command\\\"\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_custom_cmd_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretName\", \"mycrt\",\n                product.name() + \".mesh.additionalCertificates.customCmd\", \"echo \\\"My custom command\\\"\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-mesh\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"args\").path(1)).hasTextEqualTo(\"echo \\\"My custom command\\\"\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_synchrony_custom_cmd(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretName\", \"mycrt\",\n                \"synchrony.additionalCertificates.customCmd\", \"echo \\\"My custom command\\\"\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-synchrony\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"args\").path(1)).hasTextEqualTo(\"echo \\\"My custom command\\\"\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_init_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                product.name() + \".additionalCertificates.secretName\", \"mycrt\",\n                product.name() + \".additionalCertificates.initContainer.resources.requests.memory\", \"1Gi\",\n                product.name() + \".additionalCertificates.initContainer.resources.requests.cpu\", \"20m\",\n                product.name() + \".additionalCertificates.initContainer.resources.limits.memory\", \"1Gi\",\n                product.name() + \".additionalCertificates.initContainer.resources.limits.cpu\", \"20m\"\n\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainers().get(1).path(\"resources\").path(\"requests\").path(\"memory\")).hasTextEqualTo(\"1Gi\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"resources\").path(\"requests\").path(\"cpu\")).hasTextEqualTo(\"20m\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"resources\").path(\"limits\").path(\"memory\")).hasTextEqualTo(\"1Gi\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"resources\").path(\"limits\").path(\"cpu\")).hasTextEqualTo(\"20m\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_synchrony_init_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretName\", \"mycrt\",\n                \"synchrony.additionalCertificates.initContainer.resources.requests.memory\", \"1Gi\",\n                \"synchrony.additionalCertificates.initContainer.resources.requests.cpu\", \"20m\",\n                \"synchrony.additionalCertificates.initContainer.resources.limits.memory\", \"1Gi\",\n                \"synchrony.additionalCertificates.initContainer.resources.limits.cpu\", \"20m\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-synchrony\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"requests\").path(\"memory\")).hasTextEqualTo(\"1Gi\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"requests\").path(\"cpu\")).hasTextEqualTo(\"20m\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"limits\").path(\"memory\")).hasTextEqualTo(\"1Gi\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"limits\").path(\"cpu\")).hasTextEqualTo(\"20m\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_bitbucket_mesh_init_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretName\", \"mycrt\",\n                product.name() + \".mesh.additionalCertificates.initContainer.resources.requests.memory\", \"1Gi\",\n                product.name() + \".mesh.additionalCertificates.initContainer.resources.requests.cpu\", \"20m\",\n                product.name() + \".mesh.additionalCertificates.initContainer.resources.limits.memory\", \"1Gi\",\n                product.name() + \".mesh.additionalCertificates.initContainer.resources.limits.cpu\", \"20m\"        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName()+\"-mesh\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"requests\").path(\"memory\")).hasTextEqualTo(\"1Gi\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"requests\").path(\"cpu\")).hasTextEqualTo(\"20m\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"limits\").path(\"memory\")).hasTextEqualTo(\"1Gi\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"resources\").path(\"limits\").path(\"cpu\")).hasTextEqualTo(\"20m\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_multi_volumes(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                product.name() + \".additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".additionalCertificates.secretList[0].keys[1]\", \"stg.crt\"\n\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getVolume(\"keystore\").get().path(\"emptyDir\")).isEmpty();\n        assertThat(statefulSet.getVolume(\"self-signed-ca\").get().path(\"secret\").path(\"secretName\")).hasTextEqualTo(\"self-signed-ca\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_multi_volume_mounts(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                product.name() + \".additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                product.name() + \".additionalCertificates.secretList[1].name\", \"custom-ca\",\n                product.name() + \".additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainers().get(1).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(1).get(\"name\")).hasTextEqualTo(\"self-signed-ca\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(1).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/self-signed-ca-ca.crt\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(1).get(\"subPath\")).hasTextEqualTo(\"ca.crt\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(2).get(\"name\")).hasTextEqualTo(\"self-signed-ca\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(2).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/self-signed-ca-stg.crt\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(2).get(\"subPath\")).hasTextEqualTo(\"stg.crt\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(3).get(\"name\")).hasTextEqualTo(\"custom-ca\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(3).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/custom-ca-custom.crt\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"volumeMounts\").path(3).get(\"subPath\")).hasTextEqualTo(\"custom.crt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_multi_volume_mounts_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                \"synchrony.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                \"synchrony.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                \"synchrony.additionalCertificates.secretList[1].name\", \"custom-ca\",\n                \"synchrony.additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(1).get(\"name\")).hasTextEqualTo(\"self-signed-ca\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(1).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/self-signed-ca-ca.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(1).get(\"subPath\")).hasTextEqualTo(\"ca.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(2).get(\"name\")).hasTextEqualTo(\"self-signed-ca\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(2).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/self-signed-ca-stg.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(2).get(\"subPath\")).hasTextEqualTo(\"stg.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(3).get(\"name\")).hasTextEqualTo(\"custom-ca\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(3).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/custom-ca-custom.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(3).get(\"subPath\")).hasTextEqualTo(\"custom.crt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_multi_volumes_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                \"synchrony.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                \"synchrony.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\"\n\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        assertThat(statefulSet.getVolume(\"keystore\").get().path(\"emptyDir\")).isEmpty();\n        assertThat(statefulSet.getVolume(\"self-signed-ca\").get().path(\"secret\").path(\"secretName\")).hasTextEqualTo(\"self-signed-ca\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_multi_volumes_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\"\n\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        assertThat(statefulSet.getVolume(\"keystore\").get().path(\"emptyDir\")).isEmpty();\n        assertThat(statefulSet.getVolume(\"self-signed-ca\").get().path(\"secret\").path(\"secretName\")).hasTextEqualTo(\"self-signed-ca\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_certificates_multi_volume_mounts_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.mesh.enabled\", \"true\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].name\", \"self-signed-ca\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[0]\", \"ca.crt\",\n                product.name() + \".mesh.additionalCertificates.secretList[0].keys[1]\", \"stg.crt\",\n                product.name() + \".mesh.additionalCertificates.secretList[1].name\", \"custom-ca\",\n                product.name() + \".mesh.additionalCertificates.secretList[1].keys[0]\", \"custom.crt\"\n\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(1).get(\"name\")).hasTextEqualTo(\"self-signed-ca\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(1).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/self-signed-ca-ca.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(1).get(\"subPath\")).hasTextEqualTo(\"ca.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(2).get(\"name\")).hasTextEqualTo(\"self-signed-ca\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(2).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/self-signed-ca-stg.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(2).get(\"subPath\")).hasTextEqualTo(\"stg.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(3).get(\"name\")).hasTextEqualTo(\"custom-ca\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(3).get(\"mountPath\")).hasTextEqualTo(\"/tmp/crt/custom-ca-custom.crt\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"volumeMounts\").path(3).get(\"subPath\")).hasTextEqualTo(\"custom.crt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_certificates_init_container_security_context(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalCertificates.secretName\", \"mycrt\",\n                product.name() + \".additionalCertificates.initContainer.securityContext.runAsUser\", \"2002\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainers().get(1).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(1).path(\"securityContext\").get(\"runAsUser\")).hasValueEqualTo(2002);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_crt_init_container_security_context_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalCertificates.secretName\", \"mycrt\",\n                \"synchrony.additionalCertificates.initContainer.securityContext.runAsUser\", \"2002\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"securityContext\").get(\"runAsUser\")).hasValueEqualTo(2002);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_crt_init_container_security_context_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.mesh.enabled\", \"true\",\n                \"bitbucket.mesh.additionalCertificates.secretName\", \"mycrt\",\n                \"bitbucket.mesh.additionalCertificates.initContainer.securityContext.runAsUser\", \"2002\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"name\")).hasTextEqualTo(\"import-certs\");\n        assertThat(statefulSet.getInitContainers().get(0).path(\"securityContext\").get(\"runAsUser\")).hasValueEqualTo(2002);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/AdditionalConfigMapsTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.*;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\npublic class AdditionalConfigMapsTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_configmap_configmap_exists(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalConfigMaps[0].name\", \"extra-configmap\",\n                \"additionalConfigMaps[0].keys[0].fileName\", \"hello.txt\",\n                \"additionalConfigMaps[0].keys[0].mountPath\", \"/opt/files\",\n                \"additionalConfigMaps[0].keys[0].content\", \"helloworld\"\n        ));\n\n        // assert ConfigMap is created and has expected content in data.key\n        KubeResource additionalConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-extra-configmap\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"hello.txt\")).hasTextContaining(\"helloworld\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_configmap_sts_annotation(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalConfigMaps[0].name\", \"extra-configmap\",\n                \"additionalConfigMaps[0].keys[0].fileName\", \"hello.txt\",\n                \"additionalConfigMaps[0].keys[0].mountPath\", \"/opt/files\",\n                \"additionalConfigMaps[0].keys[0].content\", \"helloworld\"\n        ));\n\n        // assert there's checksum annotation in spec.template.metadata to make sure sts is restarted when a ConfigMap changes\n        StatefulSet statefulset = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulset.getSpec().get(\"template\").get(\"metadata\").get(\"annotations\").get(\"checksum/config-additional\")).isNotNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_configmap_volumes(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalConfigMaps[0].name\", \"extra-configmap\",\n                \"additionalConfigMaps[0].keys[0].fileName\", \"hello.txt\",\n                \"additionalConfigMaps[0].keys[0].mountPath\", \"/opt/files\",\n                \"additionalConfigMaps[0].keys[0].content\", \"helloworld\"\n        ));\n\n        StatefulSet statefulset = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulset.getVolumes().get(0).get(\"name\")).hasTextEqualTo(\"hello-txt\");\n\n        JsonNode configMapVolume = getStsVolume(statefulset, \"configMap\");\n        assertThat(configMapVolume.path(\"name\")).hasTextEqualTo(product.getHelmReleaseName() + \"-extra-configmap\");\n        assertThat(configMapVolume.path(\"defaultMode\")).isEmpty();\n        assertThat(configMapVolume.path(\"items\").path(0).path(\"key\")).hasTextEqualTo(\"hello.txt\");\n        assertThat(configMapVolume.path(\"items\").path(0).path(\"path\")).hasTextEqualTo(\"hello.txt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_configmap_volumes_default_mode(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalConfigMaps[0].name\", \"extra-configmap\",\n                \"additionalConfigMaps[0].keys[0].defaultMode\", \"487\",\n                \"additionalConfigMaps[0].keys[0].fileName\", \"hello.txt\",\n                \"additionalConfigMaps[0].keys[0].mountPath\", \"/opt/files\",\n                \"additionalConfigMaps[0].keys[0].content\", \"helloworld\"\n        ));\n\n        StatefulSet statefulset = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulset.getVolumes().get(0).get(\"name\")).hasTextEqualTo(\"hello-txt\");\n\n        JsonNode configMapVolume = getStsVolume(statefulset, \"configMap\");\n        assertThat(configMapVolume.path(\"name\")).hasTextEqualTo(product.getHelmReleaseName() + \"-extra-configmap\");\n        assertThat(configMapVolume.path(\"defaultMode\")).hasValueEqualTo(487);\n        assertThat(configMapVolume.path(\"items\").path(0).path(\"key\")).hasTextEqualTo(\"hello.txt\");\n        assertThat(configMapVolume.path(\"items\").path(0).path(\"path\")).hasTextEqualTo(\"hello.txt\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additional_configmap_volume_mounts(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalConfigMaps[0].name\", \"extra-configmap\",\n                \"additionalConfigMaps[0].keys[0].fileName\", \"hello.txt\",\n                \"additionalConfigMaps[0].keys[0].mountPath\", \"/opt/files\",\n                \"additionalConfigMaps[0].keys[0].content\", \"helloworld\"\n        ));\n\n        StatefulSet statefulset = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode volumeMount = statefulset.getContainer(product.name()).getVolumeMount(\"hello-txt\");\n\n        assertThat(volumeMount.path(\"name\")).hasTextEqualTo(\"hello-txt\");\n        assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/opt/files/hello.txt\");\n        assertThat(volumeMount.path(\"subPath\")).hasTextEqualTo(\"hello.txt\");\n    }\n\n    private JsonNode getStsVolume(StatefulSet statefulSet, String secret) {\n        return statefulSet\n                .getVolume(\"hello-txt\")\n                .getOrElseThrow(() -> new AssertionError(\"custom config map is missing\"))\n                .path(secret);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/AdditionalConfigPropertiesTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass AdditionalConfigPropertiesTest {\n\n    private static final Product JIRA = Product.jira;\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @Test\n    void no_additional_config_properties_by_default() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of());\n\n        final var statefulSet = resources.getStatefulSet(JIRA.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertDoesNotHaveAnyOf(\n                \"ADDITIONAL_JIRA_CONFIG_HELM_000\",\n                \"ADDITIONAL_JIRA_CONFIG_HELM_000__EXPAND_ENV\"\n        );\n    }\n\n    @Test\n    void additional_config_properties_are_set() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of(\n                \"jira.additionalConfigProperties[0]\", \"jira.websudo.is.disabled=true\",\n                \"jira.additionalConfigProperties[1]\", \"jira.lf.top.bgcolour=#003366\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(JIRA.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_HELM_000\", \"jira.websudo.is.disabled=true\");\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_HELM_001\", \"jira.lf.top.bgcolour=#003366\");\n    }\n\n    @Test\n    void additional_config_properties_expand_env_are_set() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of(\n                \"jira.additionalConfigPropertiesExpandEnv[0]\", \"opensearch.password={OPENSEARCH_INITIAL_ADMIN_PASSWORD}\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(JIRA.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_HELM_000__EXPAND_ENV\", \"opensearch.password={OPENSEARCH_INITIAL_ADMIN_PASSWORD}\");\n    }\n\n    @Test\n    void both_config_properties_and_expand_env_are_set() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of(\n                \"jira.additionalConfigProperties[0]\", \"some.property=value1\",\n                \"jira.additionalConfigPropertiesExpandEnv[0]\", \"secret.property={MY_SECRET}\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(JIRA.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_HELM_000\", \"some.property=value1\");\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_HELM_000__EXPAND_ENV\", \"secret.property={MY_SECRET}\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/AdditionalFilesTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Deployment;\nimport test.model.Product;\nimport test.model.StatefulSet;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\n/**\n * Tests the various permutations of the \"<product>.service\" value structure in the Helm charts\n */\nclass AdditionalFilesTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class)\n    void additional_files_config_map_creates_volumes(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalFiles[0].name\", \"custom-config-test\",\n                \"additionalFiles[0].type\", \"configMap\",\n                \"additionalFiles[0].key\", \"log4j.properties\",\n                \"additionalFiles[0].mountPath\", \"/var/atlassian\"\n        ));\n\n        JsonNode configMap;\n        if (product.name().equals(\"bamboo_agent\")) {\n            Deployment deployment = resources.getDeployment(product.getHelmReleaseName());\n            configMap = getDeploymentVolume(deployment, \"configMap\");\n        } else {\n            StatefulSet statefulset = resources.getStatefulSet(product.getHelmReleaseName());\n            configMap = getStsVolume(statefulset, \"configMap\");\n        }\n\n        assertThat(configMap.path(\"name\")).hasTextEqualTo(\"custom-config-test\");\n        assertThat(configMap.path(\"items\").path(0).path(\"key\")).hasTextEqualTo(\"log4j.properties\");\n        assertThat(configMap.path(\"items\").path(0).path(\"path\")).hasTextEqualTo(\"log4j.properties\");\n    }\n\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class)\n    void additional_files_secret_creates_new_secrets(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.mesh.enabled\", \"true\",\n                \"additionalFiles[0].name\", \"custom-config-test\",\n                \"additionalFiles[0].type\", \"secret\",\n                \"additionalFiles[0].key\", \"secretKey\",\n                \"additionalFiles[0].mountPath\", \"/var/secret\",\n                \"bitbucket.mesh.additionalFiles[0].name\", \"custom-config-test\",\n                \"bitbucket.mesh.additionalFiles[0].type\", \"secret\",\n                \"bitbucket.mesh.additionalFiles[0].key\", \"secretKey\",\n                \"bitbucket.mesh.additionalFiles[0].mountPath\", \"/var/secret\"\n        ));\n\n        if (product.name().equals(\"bamboo_agent\")) {\n            Deployment deployment = resources.getDeployment(product.getHelmReleaseName());\n            JsonNode configMap = getDeploymentVolume(deployment, \"secret\");\n            assertThat(configMap.path(\"secretName\")).hasTextEqualTo(\"custom-config-test\");\n            assertThat(configMap.path(\"items\").path(0).path(\"key\")).hasTextEqualTo(\"secretKey\");\n            assertThat(configMap.path(\"items\").path(0).path(\"path\")).hasTextEqualTo(\"secretKey\");\n        } else {\n            StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n            StatefulSet[] stsToCheck = {statefulSet};\n            if (product.name().contains(\"bitbucket\")) {\n                StatefulSet meshStatefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n                stsToCheck = new StatefulSet[]{statefulSet, meshStatefulSet};\n            }\n            for (var sts : stsToCheck) {\n                JsonNode configMap = getStsVolume(sts, \"secret\");\n                assertThat(configMap.path(\"secretName\")).hasTextEqualTo(\"custom-config-test\");\n                assertThat(configMap.path(\"items\").path(0).path(\"key\")).hasTextEqualTo(\"secretKey\");\n                assertThat(configMap.path(\"items\").path(0).path(\"path\")).hasTextEqualTo(\"secretKey\");\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class)\n    void additional_files_configMap_create_volume_mounts(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.mesh.enabled\", \"true\",\n                \"additionalFiles[0].name\", \"custom-config-test\",\n                \"additionalFiles[0].type\", \"secret\",\n                \"additionalFiles[0].key\", \"secretKey\",\n                \"additionalFiles[0].mountPath\", \"/var/secret\",\n                \"bitbucket.mesh.additionalFiles[0].name\", \"custom-config-test\",\n                \"bitbucket.mesh.additionalFiles[0].type\", \"secret\",\n                \"bitbucket.mesh.additionalFiles[0].key\", \"secretKey\",\n                \"bitbucket.mesh.additionalFiles[0].mountPath\", \"/var/secret\"\n        ));\n\n        String name = \"custom-config-test-0\";\n        if (product.name().equals(\"bamboo_agent\")) {\n            Deployment deployment = resources.getDeployment(product.getHelmReleaseName());\n            JsonNode volumeMount = deployment.getContainer(\"bamboo-agent\").getVolumeMount(name);\n            assertThat(volumeMount.path(\"name\")).hasTextEqualTo(\"custom-config-test-0\");\n            assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/secret/secretKey\");\n            assertThat(volumeMount.path(\"subPath\")).hasTextEqualTo(\"secretKey\");\n        } else {\n            StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n            StatefulSet[] stsToCheck = {statefulSet};\n            if (product.name().contains(\"bitbucket\")) {\n                StatefulSet meshStatefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n                stsToCheck = new StatefulSet[]{statefulSet, meshStatefulSet};\n            }\n\n            for (var sts : stsToCheck) {\n                String[] containers = {product.name()};\n                if (product.name().contains(\"bitbucket\") && sts.getName().contains(\"mesh\")) {\n                    containers = new String[]{product.name() + \"-mesh\"};\n                }\n                for (var container : containers) {\n                    JsonNode volumeMount = sts.getContainer(container).getVolumeMount(name);\n                    assertThat(volumeMount.path(\"name\")).hasTextEqualTo(\"custom-config-test-0\");\n                    assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/secret/secretKey\");\n                    assertThat(volumeMount.path(\"subPath\")).hasTextEqualTo(\"secretKey\");\n                }\n            }\n        }\n    }\n\n    private JsonNode getStsVolume(StatefulSet statefulSet, String secret) {\n        return statefulSet\n                .getVolume(\"custom-config-test-0\")\n                .getOrElseThrow(() -> new AssertionError(\"custom config map is missing\"))\n                .path(secret);\n    }\n    private JsonNode getDeploymentVolume(Deployment deployment, String secret) {\n        return deployment\n                .getVolume(\"custom-config-test-0\")\n                .getOrElseThrow(() -> new AssertionError(\"custom config map is missing\"))\n                .path(secret);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/AdditionalHostsTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Deployment;\nimport test.model.Product;\nimport test.model.StatefulSet;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass AdditionalHostsTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class)\n    void additional_hosts_included_in_confluence_and_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"bitbucket.mesh.enabled\", \"true\",\n                \"additionalHosts[0].ip\", \"127.0.0.1\",\n                \"additionalHosts[0].hostnames[0]\", \"foo.local\",\n                \"additionalHosts[0].hostnames[1]\", \"bar.local\"\n        ));\n\n        if (product.name().equals(\"bamboo_agent\")) {\n            Deployment bambooAgent = resources.getDeployment(product.getHelmReleaseName());\n            JsonNode hostAliases = bambooAgent.getPodSpec().get(\"hostAliases\");\n            assertThat(hostAliases.get(0).get(\"hostnames\")).isArrayWithChildren(\"foo.local\", \"bar.local\");\n            assertThat(hostAliases.get(0).get(\"ip\")).hasTextEqualTo(\"127.0.0.1\");\n        } else {\n            StatefulSet dcProduct = resources.getStatefulSet(product.getHelmReleaseName());\n            JsonNode hostAliases = dcProduct.getPodSpec().get(\"hostAliases\");\n            assertThat(hostAliases.get(0).get(\"hostnames\")).isArrayWithChildren(\"foo.local\", \"bar.local\");\n            assertThat(hostAliases.get(0).get(\"ip\")).hasTextEqualTo(\"127.0.0.1\");\n        }\n\n        if (product.name().equals(\"confluence\")) {\n            StatefulSet synchronySts = resources.getStatefulSet(\"unittest-confluence-synchrony\");\n            JsonNode synchronyHostAliases = synchronySts.getPodSpec().get(\"hostAliases\");\n            assertThat(synchronyHostAliases.get(0).get(\"hostnames\")).isArrayWithChildren(\"foo.local\", \"bar.local\");\n            assertThat(synchronyHostAliases.get(0).get(\"ip\")).hasTextEqualTo(\"127.0.0.1\");\n        }\n\n        if (product.name().equals(\"bitbucket\")) {\n            StatefulSet bitbucketMeshSts = resources.getStatefulSet(\"unittest-bitbucket-mesh\");\n            JsonNode bitbucketMeshHostAliases = bitbucketMeshSts.getPodSpec().get(\"hostAliases\");\n            assertThat(bitbucketMeshHostAliases.get(0).get(\"hostnames\")).isArrayWithChildren(\"foo.local\", \"bar.local\");\n            assertThat(bitbucketMeshHostAliases.get(0).get(\"ip\")).hasTextEqualTo(\"127.0.0.1\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/AdditionalLibrariesTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport test.helm.Helm;\nimport test.model.Product;\nimport test.model.StatefulSet;\nimport test.model.Synchrony;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Synchrony.synchronyStatefulSetName;\n\npublic class AdditionalLibrariesTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @Test\n    void additional_libraries_synchrony() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(Product.confluence, Map.of(\n                \"synchrony.enabled\",\"true\",\n                \"synchrony.additionalLibraries[0].volumeName\",\"my-custom-volume\",\n                \"synchrony.additionalLibraries[0].subDirectory\",\"mylib\",\n                \"synchrony.additionalLibraries[0].fileName\",\"mysql-connector-java-8.0.25.jar\"\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n        JsonNode volumeMount = statefulSet.getContainer(\"synchrony\").getVolumeMount(\"my-custom-volume\");\n\n        assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-8.0.25.jar\");\n        assertThat(volumeMount.path(\"subPath\")).hasTextEqualTo(\"mylib/mysql-connector-java-8.0.25.jar\");\n    }\n\n    @Test\n    void additional_libraries_synchrony_withoutSubDirectory() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(Product.confluence, Map.of(\n                \"synchrony.enabled\",\"true\",\n                \"synchrony.additionalLibraries[0].volumeName\",\"my-custom-volume\",\n                \"synchrony.additionalLibraries[0].fileName\",\"mysql-connector-java-8.0.25.jar\"\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n        JsonNode volumeMount = statefulSet.getContainer(\"synchrony\").getVolumeMount(\"my-custom-volume\");\n\n        assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-java-8.0.25.jar\");\n        assertThat(volumeMount.path(\"subPath\")).hasTextEqualTo(\"mysql-connector-java-8.0.25.jar\");\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/BambooAgentTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.CsvSource;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Deployment;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass BambooAgentTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void baseUrlSet(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.server\", \"bamboo.bamboo.svc.cluster.local\"\n        ));\n\n        final var deployment = resources.getDeployment(product.getHelmReleaseName());\n        final var env = deployment.getContainer().getEnv();\n        env.assertHasValue(\"BAMBOO_SERVER\", \"http://bamboo.bamboo.svc.cluster.local\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void serverProtocol(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.server\", \"example.com\",\n                \"agent.serverProtocol\", \"https\"\n        ));\n\n        final var deployment = resources.getDeployment(product.getHelmReleaseName());\n        final var env = deployment.getContainer().getEnv();\n        env.assertHasValue(\"BAMBOO_SERVER\", \"https://example.com\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void bamboo_agent_security_token_secret_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.securityToken.secretName\", \"security_token_secret\",\n                \"agent.securityToken.secretKey\", \"ad447ae88f8a6b1da6c78e1510bf44331ed1f956\"));\n\n        resources.getDeployment(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasSecretRef(\"SECURITY_TOKEN\", \"security_token_secret\", \"ad447ae88f8a6b1da6c78e1510bf44331ed1f956\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void additionalEnvironmentVariables(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.additionalEnvironmentVariables[0].name\", \"MY_ENV_VAR\",\n                \"agent.additionalEnvironmentVariables[0].value\", \"env-value\"\n        ));\n\n        final var deployment = resources.getDeployment(product.getHelmReleaseName());\n        final var env = deployment.getContainer().getEnv();\n        env.assertHasValue(\"MY_ENV_VAR\", \"env-value\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void additionalInitContainers(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalInitContainers[0].name\", \"my_init_container\",\n                \"additionalInitContainers[0].image\", \"my_init_image\"\n        ));\n\n        final var deployment = resources.getDeployment(product.getHelmReleaseName());\n        final var icontainer = deployment.getInitContainer(\"my_init_container\").get();\n        assertThat(icontainer.path(\"image\")).hasTextEqualTo(\"my_init_image\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void additionalContainers(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalContainers[0].name\", \"my_container\",\n                \"additionalContainers[0].image\", \"my_image\"\n        ));\n\n        final var deployment = resources.getDeployment(product.getHelmReleaseName());\n        final var icontainer = deployment.getContainer(\"my_container\");\n        assertThat(icontainer.get(\"image\")).hasTextEqualTo(\"my_image\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void deployment_empty_limits(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        Deployment deployment = resources.getDeployment(product.getHelmReleaseName());\n\n        assertThat(deployment.getContainer(product.toString()).getLimits()).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void deployment_resource_requests_and_limits(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.resources.container.requests.cpu\", \"10\",\n                \"agent.resources.container.requests.memory\", \"10GB\",\n                \"agent.resources.container.limits.cpu\", \"20\",\n                \"agent.resources.container.limits.memory\", \"20GB\"\n        ));\n\n        Deployment deployment = resources.getDeployment(product.getHelmReleaseName());\n\n        // verify requests\n        assertThat(deployment.getContainer(product.toString()).getRequests().path(\"cpu\")).hasValueEqualTo(10);\n        assertThat(deployment.getContainer(product.toString()).getRequests().path(\"memory\")).hasTextEqualTo(\"10GB\");\n\n        // verify limits\n        assertThat(deployment.getContainer(product.toString()).getLimits().path(\"cpu\")).hasValueEqualTo(20);\n        assertThat(deployment.getContainer(product.toString()).getLimits().path(\"memory\")).hasTextEqualTo(\"20GB\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void custom_scheduler(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"schedulerName\", \"second_scheduler\"));\n\n        JsonNode podSpec = resources.getDeployment(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"schedulerName\")).hasTextEqualTo(\"second_scheduler\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void default_scheduler(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"schedulerName\", \"\"));\n\n        JsonNode podSpec = resources.getDeployment(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"schedulerName\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"})\n    void test_pod_security_context(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.securityContext.fsGroup\", \"1000\",\n                \"agent.securityContext.runAsGroup\", \"1000\"));\n\n        JsonNode podSpec = resources.getDeployment(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"securityContext\").path(\"fsGroup\")).hasValueEqualTo(1000);\n        assertThat(podSpec.path(\"securityContext\").path(\"runAsGroup\")).hasValueEqualTo(1000);\n\n    }\n\n    @ParameterizedTest\n    @CsvSource({\n            \"bamboo_agent,2005\"\n    })\n    void test_pod_security_context_without_fsGroup(Product product, int fsGroup) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.securityContext.runAsGroup\", \"1000\"));\n\n        JsonNode podSpec = resources.getDeployment(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"securityContext\").path(\"fsGroup\")).hasValueEqualTo(fsGroup);\n        assertThat(podSpec.path(\"securityContext\").path(\"runAsGroup\")).hasValueEqualTo(1000);\n\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"})\n    void test_container_security_context(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.containerSecurityContext.runAsGroup\", \"2000\"));\n\n        JsonNode containerSecurityContext = resources.getDeployment(product.getHelmReleaseName())\n                .getContainer()\n                .getSecurityContext();\n        assertThat(containerSecurityContext.path(\"runAsGroup\")).hasValueEqualTo(2000);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/BitbucketMeshTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Traversable;\nimport org.assertj.core.api.Assertions;\nimport org.assertj.vavr.api.VavrAssertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport test.helm.Helm;\nimport test.model.*;\n\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static org.junit.jupiter.api.Assertions.assertThrows;\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.ConfigMap;\n\n/**\n * Tests the various permutations of the \"persistence\" value structure in the\n * Helm charts\n */\nclass BitbucketMeshTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @Test\n    void meshEnabledCreatesResources() throws Exception {\n        final var product = Product.bitbucket;\n        final var replicaCount = 2;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.replicaCount\", String.valueOf(replicaCount)));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        final var env = statefulSet.getContainer().getEnv();\n\n        assertEquals(replicaCount, statefulSet.getReplicas());\n        env.assertHasValue(\"MESH_HOME\", \"/var/atlassian/application-data/mesh\");\n\n        // for each replica we have one service\n        assertEquals(resources.getAll(Kind.Service).filter(s -> s.getName().contains(\"-mesh\")).size(), replicaCount);\n        resources.get(Kind.Service, product.getHelmReleaseName() + \"-mesh-0\");\n        resources.get(Kind.Service, product.getHelmReleaseName() + \"-mesh-1\");\n    }\n\n    @Test\n    void meshDisabledNoResources() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"false\"));\n\n        assertThrows(AssertionError.class, () -> {\n            resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        });\n\n        assertEquals(resources.getAll(Kind.Service).filter(s -> s.getName().contains(\"-mesh\")).size(), 0);\n    }\n\n    @Test\n    void postInstallationHooks() throws Exception {\n        final var product = Product.bitbucket;\n        final var replicaCount = 3;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.nodeAutoRegistration\", \"true\",\n                        product + \".mesh.setByDefault\", \"true\",\n                        product + \".mesh.replicaCount\", String.valueOf(replicaCount),\n                        product + \".sysadminCredentials.secretName\", \"secret-name\",\n                        product + \".mesh.podAnnotations.annotation1\", \"mesh1\",\n                        product + \".mesh.podAnnotations.annotation2\", \"mesh2\"\n                        ));\n\n        Traversable<KubeResource> all = resources.getAll(Kind.Job);\n\n        KubeResource configureJob = resources.get(Kind.Job, product.getHelmReleaseName() + \"-mesh-configure-job\");\n        assertEquals(configureJob.getAnnotations().path(\"helm.sh/hook\").asText(), \"post-install\");\n        Traversable<KubeResource> registerJobs = all.filter(j -> j.getName().contains(\"mesh-register-job\"));\n        assertEquals(replicaCount, registerJobs.size());\n        for (var rJob : registerJobs) {\n            assertEquals(rJob.getAnnotations().path(\"helm.sh/hook\").asText(), \"post-install\");\n            assertEquals(rJob.getSpec().path(\"template\").path(\"metadata\").path(\"annotations\").path(\"annotation1\").asText(), \"mesh1\");\n            assertEquals(rJob.getSpec().path(\"template\").path(\"metadata\").path(\"annotations\").path(\"annotation2\").asText(), \"mesh2\");\n        }\n        // ensure current mesh node number in container args\n        assertEquals(replicaCount -1, registerJobs.last().getSpec().path(\"template\").path(\"spec\").path(\"containers\").get(0).path(\"args\").get(0).asInt());\n    }\n\n    @Test\n    void meshJVMConfig() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.additionalJvmArgs[0]\", \"-Dhello=world\",\n                        product + \".mesh.additionalJvmArgs[1]\", \"-Dmesh=true\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasConfigMapRef(\"JVM_MINIMUM_MEMORY\", \"unittest-bitbucket-jvm-config-mesh\", \"min_heap\");\n        env.assertHasConfigMapRef(\"JVM_MAXIMUM_MEMORY\", \"unittest-bitbucket-jvm-config-mesh\", \"max_heap\");\n        env.assertHasConfigMapRef(\"JVM_SUPPORT_RECOMMENDED_ARGS\", \"unittest-bitbucket-jvm-config-mesh\", \"additional_jvm_args\");\n\n        final KubeResource configMap = meshJvmConfigMap(resources);\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\")).hasTextContaining(\"-Dhello=world\");\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\")).hasTextContaining(\"-Dmesh=true\");\n    }\n\n    @Test\n    void meshPodMetadata() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.podAnnotations.podAnnotation1\", \"mesh1\",\n                        product + \".mesh.podAnnotations.podAnnotation2\", \"mesh2\",\n                        product + \".mesh.podLabels.podLabel1\", \"mesh1\",\n                        product + \".mesh.podLabels.podLabel2\", \"mesh2\"\n                ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        final var annotations = statefulSet.getPodMetadata().get(\"annotations\");\n        final var labels = statefulSet.getPodMetadata().get(\"labels\");\n        assertThat(annotations).isObject(Map.of(\n                \"podAnnotation1\", \"mesh1\",\n                \"podAnnotation2\", \"mesh2\"\n        ));\n        assertThat(labels).isObject(Map.of(\n                \"podLabel1\", \"mesh1\",\n                \"podLabel2\", \"mesh2\"\n        ));\n    }\n\n    @Test\n    void meshEnvironmentVariables() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.service.port\", \"9000\",\n                        product + \".mesh.additionalEnvironmentVariables[0].name\", \"GRPC_SERVER_ADDRESS\",\n                        product + \".mesh.additionalEnvironmentVariables[0].value\", \"127.0.0.1\"\n                ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        statefulSet.getContainer(\"bitbucket-mesh\").getEnv().assertHasValue(\"GRPC_SERVER_ADDRESS\",\"127.0.0.1\");\n        statefulSet.getContainer(\"bitbucket-mesh\").getEnv().assertHasValue(\"GRPC_SERVER_PORT\",\"9000\");\n    }\n\n    @Test\n    void meshVolumeClaimTemplates() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.volume.create\", \"true\",\n                        product + \".mesh.volume.storageClass\", \"gp2-mesh\",\n                        product + \".mesh.volume.resources.requests.storage\", \"100Gi\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n\n        assertThat(statefulSet.getVolumeClaimTemplates().get(0).path(\"metadata\").path(\"name\")).hasTextEqualTo(\"mesh-home\");\n        assertThat(statefulSet.getVolumeClaimTemplates().get(0).path(\"spec\").path(\"resources\").path(\"requests\").path(\"storage\")).hasTextEqualTo(\"100Gi\");\n        assertThat(statefulSet.getVolumeClaimTemplates().get(0).path(\"spec\").path(\"storageClassName\")).hasTextEqualTo(\"gp2-mesh\");\n    }\n\n    @Test\n    void meshAffinity() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".sysadminCredentials.secretName\", \"secret-name\",\n                        product + \".mesh.nodeAutoRegistration\", \"true\",\n                        product + \".mesh.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key\", \"kubernetes.io/os\",\n                        product + \".mesh.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator\", \"in\",\n                        product + \".mesh.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]\", \"mesh-os\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        KubeResource registerJob = resources.get(Kind.Job, product.getHelmReleaseName() + \"-mesh-register-job-0\");\n\n        assertThat(statefulSet.getPodSpec().path(\"affinity\").path(\"nodeAffinity\").path(\"requiredDuringSchedulingIgnoredDuringExecution\").path(\"nodeSelectorTerms\").get(0).path(\"matchExpressions\").get(0).path(\"values\").get(0)).hasTextEqualTo(\"mesh-os\");\n        assertThat(registerJob.getSpec().path(\"template\").path(\"spec\").path(\"affinity\").path(\"nodeAffinity\").path(\"requiredDuringSchedulingIgnoredDuringExecution\").path(\"nodeSelectorTerms\").get(0).path(\"matchExpressions\").get(0).path(\"values\").get(0)).hasTextEqualTo(\"mesh-os\");\n    }\n\n    @Test\n    void meshTopologySpreadConstraints() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.nodeAutoRegistration\", \"true\",\n                        product + \".sysadminCredentials.secretName\", \"secret-name\",\n                        product + \".mesh.topologySpreadConstraints[0].maxSkew\", \"1\",\n                        product + \".mesh.topologySpreadConstraints[0].topologyKey\", \"kubernetes.io/hostname\",\n                        product + \".mesh.topologySpreadConstraints[0].whenUnsatisfiable\", \"ScheduleAnyway\",\n                        product + \".mesh.topologySpreadConstraints[0].labelSelector.matchLabels.myLabel\", \"mySelector\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        KubeResource registerJob = resources.get(Kind.Job, product.getHelmReleaseName() + \"-mesh-register-job-0\");\n\n        JsonNode topologySpreadConstraints = statefulSet.getPodSpec()\n                .get(\"topologySpreadConstraints\");\n\n        JsonNode jobTopologySpreadConstraints = registerJob.getSpec().path(\"template\").path(\"spec\").path(\"topologySpreadConstraints\");\n        JsonNode[] resourcesToCheck = {topologySpreadConstraints, jobTopologySpreadConstraints};\n        for (var resource : resourcesToCheck) {\n            assertThat(resource).isArrayWithNumberOfChildren(1);\n            assertThat(resource.get(0).get(\"maxSkew\")).hasValueEqualTo(1);\n            assertThat(resource.get(0).get(\"topologyKey\")).hasTextEqualTo(\"kubernetes.io/hostname\");\n            assertThat(resource.get(0).get(\"whenUnsatisfiable\")).hasTextContaining(\"ScheduleAnyway\");\n            assertThat(resource.get(0).get(\"labelSelector\").get(\"matchLabels\").get(\"myLabel\")).hasTextContaining(\"mySelector\");\n        }\n    }\n\n    @Test\n    void meshTolerations() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.nodeAutoRegistration\", \"true\",\n                        product + \".sysadminCredentials.secretName\", \"secret-name\",\n                        product + \".mesh.tolerations[0].key\", \"mesh\",\n                        product + \".mesh.tolerations[0].operator\", \"Exists\",\n                        product + \".mesh.tolerations[0].effect\", \"NoSchedule\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        KubeResource registerJob = resources.get(Kind.Job, product.getHelmReleaseName() + \"-mesh-register-job-0\");\n\n        JsonNode tolerations = statefulSet.getPodSpec()\n                .get(\"tolerations\");\n\n        JsonNode jobTolerations = registerJob.getSpec().path(\"template\").path(\"spec\").path(\"tolerations\");\n        JsonNode[] resourcesToCheck = {tolerations, jobTolerations};\n        for (var resource : resourcesToCheck) {\n            assertThat(resource).isArrayWithNumberOfChildren(1);\n            assertThat(resource.get(0).get(\"key\")).hasTextEqualTo(\"mesh\");\n            assertThat(resource.get(0).get(\"operator\")).hasTextEqualTo(\"Exists\");\n            assertThat(resource.get(0).get(\"effect\")).hasTextContaining(\"NoSchedule\");\n        }\n    }\n\n    @Test\n    void meshNodeSelector() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.nodeAutoRegistration\", \"true\",\n                        product + \".sysadminCredentials.secretName\", \"secret-name\",\n                        product + \".mesh.nodeSelector.meshnode\", \"special-node\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        KubeResource registerJob = resources.get(Kind.Job, product.getHelmReleaseName() + \"-mesh-register-job-0\");\n\n        assertThat(statefulSet.getNodeSelector().path(\"meshnode\")).hasTextEqualTo(\"special-node\");\n        assertThat(registerJob.getSpec().path(\"template\").path(\"spec\").path(\"nodeSelector\").path(\"meshnode\")).hasTextEqualTo(\"special-node\");\n    }\n\n    @Test\n    void meshSchedulerName() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.schedulerName\", \"mesh\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n\n        assertEquals(\"mesh\", statefulSet.getPodSpec().path(\"schedulerName\").asText());\n    }\n\n    @Test\n    void meshService() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.service.annotations.podAnnotation1\", \"mesh1\",\n                        product + \".mesh.service.port\", \"7778\",\n                        product + \".mesh.service.type\", \"LoadBalancer\"\n                ));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName() + \"-mesh-1\");\n\n        assertThat(service.getType())\n                .hasTextEqualTo(\"LoadBalancer\");\n        VavrAssertions.assertThat(service.getPort(\"mesh\"))\n                .hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(7778));\n        assertThat(service.getMetadata().get(\"annotations\")).isObject(Map.of(\n                \"podAnnotation1\", \"mesh1\"\n        ));\n    }\n\n    @Test\n    void meshRegistrationConfig() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".mesh.service.port\", \"8888\",\n                        product + \".sysadminCredentials.secretName\", \"bb-admin\"\n                ));\n\n        final KubeResource configMap = meshScriptsConfigMap(resources);\n        assertThat(configMap.getNode(\"data\", \"register-mesh-node.sh\")).hasTextContaining(\"Registering mesh node bitbucket-mesh-$1\");\n        assertThat(configMap.getNode(\"data\", \"register-mesh-node.sh\")).hasTextContaining(\"8888\");\n        assertThat(configMap.getNode(\"data\", \"register-mesh-node.sh\")).hasTextContaining(\"BITBUCKET_URL=http://unittest-bitbucket\");\n    }\n\n    @Test\n    void meshBitbucketUrlConfig() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(product + \".mesh.enabled\", \"true\",\n                        product + \".service.contextPath\", \"/mybitbucket\",\n                        product + \".service.port\", \"81\",\n                        product + \".sysadminCredentials.secretName\", \"bb-admin\"\n                ));\n\n        final KubeResource configMap = meshScriptsConfigMap(resources);\n        assertThat(configMap.getNode(\"data\", \"register-mesh-node.sh\")).hasTextContaining(\"BITBUCKET_URL=http://unittest-bitbucket:81/mybitbucket\");\n    }\n\n    @Test\n    void fluentd_sidecar_enabled() throws Exception {\n        final var product = Product.bitbucket;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".mesh.enabled\", \"true\",\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.elasticsearch.hostname\", \"myelastic\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName() +\"-mesh\")\n                .getContainer(\"fluentd\");\n\n        final var fluentdConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-fluentd-config\");\n        final var config = fluentdConfigMap.getNode(\"data\", \"fluent.conf\").asText();\n\n        Assertions.assertThat(config).contains(\"atlassian-mesh.log\");\n        Assertions.assertThat(config).contains(\"tag mesh.log\");\n    }\n\n    private KubeResource meshScriptsConfigMap(KubeResources resources) {\n        final var configMaps = resources.getAll(Kind.ConfigMap)\n                .find(map -> map.getName().endsWith(\"mesh-scripts\"))\n                .collect(Collectors.toList());\n        Assertions.assertThat(configMaps).hasSize(1);\n        return configMaps.get(0);\n    }\n\n    private KubeResource meshJvmConfigMap(KubeResources resources) {\n        final var configMaps = resources.getAll(Kind.ConfigMap)\n                .find(map -> map.getName().endsWith(\"jvm-config-mesh\"))\n                .collect(Collectors.toList());\n        Assertions.assertThat(configMaps).hasSize(1);\n        return configMaps.get(0);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/BitbucketOpenSearchTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.jackson.JsonNodeAssert;\nimport test.model.Product;\n\nimport java.util.Base64;\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertDoesNotThrow;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.ConfigMap;\nimport static test.model.Kind.Secret;\n\nclass BitbucketOpenSearchTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_statefulset_exists(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.install\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(\"opensearch-cluster-master\");\n        assertThat(statefulSet.getSpec()).isNotNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_existing_external(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.baseUrl\", \"https://opensearchinstance.info\",\n                \"bitbucket.clustering.enabled\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasValue(\"PLUGIN_SEARCH_CONFIG_BASEURL\", \"https://opensearchinstance.info\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_container_env_vars_defaults(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.install\", \"true\",\n                \"bitbucket.clustering.enabled\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        // we use an initial admin credentials here\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasValue(\"PLUGIN_SEARCH_CONFIG_BASEURL\", \"http://opensearch-cluster-master:9200\");\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasValue(\"PLUGIN_SEARCH_CONFIG_USERNAME\", \"admin\");\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasSecretRef(\"PLUGIN_SEARCH_CONFIG_PASSWORD\", \"opensearch-initial-password\", \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_container_env_vars_custom_secret(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.install\", \"true\",\n                \"opensearch.credentials.secretName\", \"custom-secret\",\n                \"opensearch.credentials.usernameSecretKey\", \"user\",\n                \"opensearch.credentials.passwordSecretKey\", \"pass\",\n                \"bitbucket.clustering.enabled\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasSecretRef(\"PLUGIN_SEARCH_CONFIG_USERNAME\", \"custom-secret\", \"user\");\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasSecretRef(\"PLUGIN_SEARCH_CONFIG_PASSWORD\", \"custom-secret\", \"pass\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_container_env_vars_custom_url(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.install\", \"true\",\n                \"opensearch.baseUrl\", \"https://opensearch-cluster-master:9200\",\n                \"bitbucket.clustering.enabled\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        // we use an initial admin credentials here\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasValue(\"PLUGIN_SEARCH_CONFIG_BASEURL\", \"https://opensearch-cluster-master:9200\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_secret_has_password(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.install\", \"true\"\n        ));\n        final var secret = resources.get(Secret, \"opensearch-initial-password\");\n        JsonNode password = secret.getConfigMapData().path(\"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n        JsonNodeAssert.assertThat(password).isNotNull();\n        assertDoesNotThrow(() -> {\n            Base64.getDecoder().decode(password.asText());\n        }, \"Password should be a valid Base64 encoded string\");\n        byte[] decodedPassword = Base64.getDecoder().decode(password.asText());\n        assertEquals(40, decodedPassword.length, \"The decoded password should have a length of 40 bytes.\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/BitbucketSshServiceTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Kind;\nimport test.model.Product;\nimport test.model.Service;\nimport test.model.StatefulSet;\n\nimport java.util.Map;\n\nimport static org.assertj.vavr.api.VavrAssertions.assertThat;\nimport static org.junit.jupiter.params.provider.EnumSource.Mode.INCLUDE;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass BitbucketSshServiceTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, mode = INCLUDE, names = \"bitbucket\")\n    void defaults(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.sshService.enabled\", \"true\"));\n\n        var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName() + \"-ssh\");\n\n        assertThat(service.getPort(\"ssh\")).hasValueSatisfying(node -> {\n            assertThat(node.path(\"port\")).hasValueEqualTo(22);\n            assertThat(node.path(\"targetPort\")).hasTextContaining(\"ssh\");\n            assertThat(node.path(\"protocol\")).hasTextContaining(\"TCP\");\n        });\n        assertThat(service.getType()).hasTextEqualTo(\"LoadBalancer\");\n        assertThat(service.getMetadata().path(\"annotations\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, mode = INCLUDE, names = \"bitbucket\")\n    void values_set(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.sshService.enabled\", \"true\",\n                \"bitbucket.sshService.port\", \"7999\",\n                \"bitbucket.sshService.host\", \"hostname\",\n                \"bitbucket.sshService.type\", \"ClusterIP\",\n                \"bitbucket.sshService.annotations.test\" ,\"test\",\n                \"bitbucket.sshService.annotations.test\\\\.property\", \"test\",\n                \"ingress.host\", \"hostname\"));\n\n        var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName() + \"-ssh\");\n\n        assertThat(service.getPort(\"ssh\")).hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(7999));\n        assertThat(service.getType()).hasTextEqualTo(\"ClusterIP\");\n        assertThat(service.getMetadata().path(\"annotations\")).isObject(Map.of(\n                \"test\", \"test\",\n                \"test.property\", \"test\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv().\n                assertHasValue(\"PLUGIN_SSH_BASEURL\", \"ssh://hostname:7999/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, mode = INCLUDE, names = \"bitbucket\")\n    void bitbucket_default_ssh_svc_port(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n        assertThat(service.getPort(\"ssh\")).hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(7999));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, mode = INCLUDE, names = \"bitbucket\")\n    void bitbucket_override_ssh_svc_port(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".service.sshPort\", \"23\"));\n        var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n        assertThat(service.getPort(\"ssh\")).hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(23));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, mode = INCLUDE, names = \"bitbucket\")\n    void bitbucket_default_ssh_listen_port(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasValue(\"PLUGIN_SSH_PORT\", \"7999\");\n        assertThat(statefulSet.getContainer(\"bitbucket\").getPort(\"ssh\").path(\"containerPort\")).hasValueEqualTo(7999);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, mode = INCLUDE, names = \"bitbucket\")\n    void bitbucket_override_ssh_listen_port(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".ports.ssh\", \"7000\"\n        ));\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        statefulSet.getContainer(\"bitbucket\").getEnv().assertHasValue(\"PLUGIN_SSH_PORT\", \"7000\");\n        assertThat(statefulSet.getContainer(\"bitbucket\").getPort(\"ssh\").path(\"containerPort\")).hasValueEqualTo(7000);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/CloudNativePGTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport test.helm.Helm;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\n/**\n * Tests for CloudNativePG integration and database connectivity\n * These tests verify that the database configuration is compatible with CloudNativePG\n */\nclass CloudNativePGTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @Test\n    void test_cloudnativepg_service_name_format() {\n        // Test that the database URL format is compatible with CloudNativePG service naming\n        // CloudNativePG creates services with pattern: {cluster-name}-rw for read-write\n        // and {cluster-name}-ro for read-only\n        \n        String clusterName = \"jira-db\";\n        String expectedRwService = clusterName + \"-rw\";\n        String expectedRoService = clusterName + \"-ro\";\n        \n        assertThat(expectedRwService).isEqualTo(\"jira-db-rw\");\n        assertThat(expectedRoService).isEqualTo(\"jira-db-ro\");\n    }\n\n    @Test\n    void test_postgresql_connection_string_format() {\n        // Test that the JDBC URL format is correct for PostgreSQL\n        String host = \"jira-db-rw\";\n        String port = \"5432\";\n        String database = \"jira\";\n        String expectedUrl = String.format(\"jdbc:postgresql://%s:%s/%s\", host, port, database);\n        \n        assertThat(expectedUrl).isEqualTo(\"jdbc:postgresql://jira-db-rw:5432/jira\");\n    }\n\n    @Test\n    void test_database_credentials_secret_format() {\n        // Test that the secret format is compatible with CloudNativePG expectations\n        String appName = \"jira\";\n        String expectedSecretName = appName + \"-db-credentials\";\n        \n        assertThat(expectedSecretName).isEqualTo(\"jira-db-credentials\");\n    }\n\n    @Test\n    void test_cluster_naming_convention() {\n        // Test that cluster names follow the expected pattern\n        String appName = \"confluence\";\n        String expectedClusterName = appName + \"-db\";\n        \n        assertThat(expectedClusterName).isEqualTo(\"confluence-db\");\n    }\n}"
  },
  {
    "path": "src/test/java/test/ClusteringTest.java",
    "content": "package test;\n\nimport org.assertj.core.internal.Conditions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.*;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.*;\n\nclass ClusteringTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucket_clustering_enabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                \"serviceAccount.clusterRoleBinding.create\", \"true\",\n                \"serviceAccount.clusterRole.create\", \"true\"));\n\n        resources.assertContains(ClusterRole, product.getHelmReleaseName())\n                .assertContains(ClusterRoleBinding, product.getHelmReleaseName());\n\n        test.model.StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        Container container = statefulSet.getContainer();\n        Env env = container.getEnv();\n        env\n                .assertHasFieldRef(\"KUBERNETES_NAMESPACE\", \"metadata.namespace\")\n                .assertHasValue(\"HAZELCAST_KUBERNETES_SERVICE_NAME\", product.getHelmReleaseName())\n                .assertHasValue(\"HAZELCAST_NETWORK_KUBERNETES\", \"true\")\n                .assertHasValue(\"HAZELCAST_PORT\", \"5701\")\n                .assertHasSecretRef(\"HAZELCAST_GROUP_NAME\",\n                        product.getHelmReleaseName() + \"-clustering\", \"name\")\n                .assertHasSecretRef(\"HAZELCAST_GROUP_PASSWORD\",\n                        product.getHelmReleaseName() + \"-clustering\", \"password\");\n        resources.assertContains(Secret, product.getHelmReleaseName() + \"-clustering\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucket_clustering_enabled_custom_group(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                product + \".clustering.group.secretName\", \"hazelcast-group-secret\",\n                product + \".clustering.group.nameSecretKey\", \"name-key\",\n                product + \".clustering.group.passwordSecretKey\", \"password-key\",\n                \"serviceAccount.clusterRoleBinding.create\", \"true\",\n                \"serviceAccount.clusterRole.create\", \"true\"));\n\n        resources.assertContains(ClusterRole, product.getHelmReleaseName())\n                .assertContains(ClusterRoleBinding, product.getHelmReleaseName());\n\n        test.model.StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        Container container = statefulSet.getContainer();\n        Env env = container.getEnv();\n        env\n                .assertHasFieldRef(\"KUBERNETES_NAMESPACE\", \"metadata.namespace\")\n                .assertHasValue(\"HAZELCAST_KUBERNETES_SERVICE_NAME\", product.getHelmReleaseName())\n                .assertHasValue(\"HAZELCAST_NETWORK_KUBERNETES\", \"true\")\n                .assertHasValue(\"HAZELCAST_PORT\", \"5701\")\n                .assertHasSecretRef(\"HAZELCAST_GROUP_NAME\",\n                        \"hazelcast-group-secret\", \"name-key\")\n                .assertHasSecretRef(\"HAZELCAST_GROUP_PASSWORD\",\n                        \"hazelcast-group-secret\", \"password-key\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_clustering_enabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                product + \".ports.hazelcast\", \"5801\",\n                \"synchrony.enabled\",\"true\",\n                \"synchrony.ports.hazelcast\",\"5801\"));\n\n        resources.assertContains(Role, product.getHelmReleaseName())\n                .assertContains(RoleBinding, product.getHelmReleaseName());\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasFieldRef(\"KUBERNETES_NAMESPACE\", \"metadata.namespace\")\n                .assertHasValue(\"HAZELCAST_KUBERNETES_SERVICE_NAME\", product.getHelmReleaseName())\n                .assertHasValue(\"HAZELCAST_KUBERNETES_SERVICE_PORT\", \"5801\")\n                .assertHasValue(\"ATL_CLUSTER_TYPE\", \"kubernetes\")\n                .assertHasValue(\"ATL_CLUSTER_NAME\", product.getHelmReleaseName());\n\n        resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\").getContainer().getEnv()\n                .assertHasValue(\"HAZELCAST_KUBERNETES_SERVICE_PORT\", \"5801\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_role_enabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                \"serviceAccount.clusterRole.create\", \"true\",\n                \"serviceAccount.clusterRoleBinding.create\", \"true\"));\n\n        resources.assertContains(ClusterRole, product.getHelmReleaseName())\n                .assertContains(ClusterRoleBinding, product.getHelmReleaseName());\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasFieldRef(\"KUBERNETES_NAMESPACE\", \"metadata.namespace\")\n                .assertHasValue(\"HAZELCAST_KUBERNETES_SERVICE_NAME\", product.getHelmReleaseName())\n                .assertHasValue(\"ATL_CLUSTER_TYPE\", \"kubernetes\")\n                .assertHasValue(\"ATL_CLUSTER_NAME\", product.getHelmReleaseName());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"jira\")\n    void jira_clustering_enabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"CLUSTERED\", \"true\")\n                .assertHasFieldRef(\"JIRA_NODE_ID\", \"metadata.name\")\n                .assertHasFieldRef(\"EHCACHE_LISTENER_HOSTNAME\", \"status.podIP\")\n                .assertHasValue(\"EHCACHE_LISTENER_PORT\", \"40001\")\n                .assertHasValue(\"EHCACHE_OBJECT_PORT\", \"40011\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"jira\")\n    void jira_clustering_enabled_custom_ehcache(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                product + \".ports.ehcache\", \"12345\",\n                product + \".ports.ehcacheobject\", \"23456\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"CLUSTERED\", \"true\")\n                .assertHasValue(\"EHCACHE_LISTENER_PORT\", \"12345\")\n                .assertHasValue(\"EHCACHE_OBJECT_PORT\", \"23456\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ConfluenceDebugFlagTest.java",
    "content": "package test;\n\nimport org.assertj.core.api.Assertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport test.helm.Helm;\nimport test.model.Kind;\nimport test.model.KubeResource;\nimport test.model.KubeResources;\nimport test.model.Product;\n\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass ConfluenceDebugFlagTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @Test\n    void withoutDebugFlagJvmArgsFormOneString() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(Product.confluence, Map.of(\n                \"confluence.jvmDebug.enabled\", \"false\"));\n\n        final KubeResource configMap = findJvmArgumentsConfigMap(resources);\n\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\"))\n                .hasTextNotContaining(\"\\n\");\n\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\"))\n                .hasTextNotContaining(\"-Xdebug\");\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\"))\n                .hasTextNotContaining(\"-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005\");\n    }\n\n    @Test\n    void debugFlagArgumentsAreWellFormed() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(Product.confluence, Map.of(\n                \"confluence.jvmDebug.enabled\", \"true\"));\n\n        final KubeResource configMap = findJvmArgumentsConfigMap(resources);\n\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\"))\n                .hasTextNotContaining(\"\\n\");\n\n        // The parameter should be surrounded by space characters\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\"))\n                .hasSeparatedTextContaining(\"-Xdebug\");\n\n        assertThat(configMap.getNode(\"data\", \"additional_jvm_args\"))\n                .hasSeparatedTextContaining(\"-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005\");\n    }\n\n    private KubeResource findJvmArgumentsConfigMap(KubeResources resources) {\n        final var jvmConfigMaps = resources.getAll(Kind.ConfigMap)\n                .find(map -> map.getName().endsWith(\"jvm-config\"))\n                .collect(Collectors.toList());\n        Assertions.assertThat(jvmConfigMaps).hasSize(1);\n        return jvmConfigMaps.get(0);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ConfluenceOpenSearchTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.jackson.JsonNodeAssert;\nimport test.model.Product;\n\nimport java.util.Base64;\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.ConfigMap;\nimport static test.model.Kind.Secret;\nimport static org.junit.jupiter.api.Assertions.assertDoesNotThrow;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\nclass ConfluenceOpenSearchTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_statefulset_exists(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.enabled\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(\"opensearch-cluster-master\");\n        assertThat(statefulSet.getSpec()).isNotNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void jvm_config_map_has_opensearch_args(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.enabled\", \"true\"\n        ));\n        final var jvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-jvm-config\");\n        JsonNodeAssert.assertThat(jvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"-Dsearch.platform=opensearch -Dopensearch.http.url=http://opensearch-cluster-master:9200 -Dopensearch.username=admin\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void opensearch_secret_has_password(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.enabled\", \"true\"\n        ));\n        final var secret = resources.get(Secret, \"opensearch-initial-password\");\n        JsonNode password = secret.getConfigMapData().path(\"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n        JsonNodeAssert.assertThat(password).isNotNull();\n        assertDoesNotThrow(() -> {\n            Base64.getDecoder().decode(password.asText());\n        }, \"Password should be a valid Base64 encoded string\");\n        byte[] decodedPassword = Base64.getDecoder().decode(password.asText());\n        assertEquals(40, decodedPassword.length, \"The decoded password should have a length of 40 bytes.\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void confluence_has_opensearch_envs(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.enabled\", \"true\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"ATL_SEARCH_PLATFORM\", \"opensearch\");\n        env.assertHasValue(\"ATL_OPENSEARCH_HTTP_URL\", \"http://opensearch-cluster-master:9200\");\n        env.assertHasValue(\"ATL_OPENSEARCH_USERNAME\", \"admin\");\n        env.assertHasSecretRef(\"ATL_OPENSEARCH_PASSWORD\", \"opensearch-initial-password\", \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void confluence_has_opensearch_env_existing_secret(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"opensearch.enabled\", \"true\",\n                \"opensearch.credentials.existingSecretRef.name\", \"my-opensearch-secret\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasSecretRef(\"ATL_OPENSEARCH_PASSWORD\", \"my-opensearch-secret\", \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ConfluenceS3EnabledTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass ConfluenceS3EnabledTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"})\n    void confluence_s3_storage_env_vars(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product+\".s3AttachmentsStorage.bucketName\", \"my-bucket\",\n                product+\".s3AttachmentsStorage.bucketRegion\", \"my-region\"\n        ));\n\n        final var configMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n        assertThat(configMap).hasTextContaining(\"-Dconfluence.filestore.attachments.s3.bucket.name=my-bucket\");\n        assertThat(configMap).hasTextContaining(\"-Dconfluence.filestore.attachments.s3.bucket.region=my-region\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"})\n    void confluence_s3_storage_endpoint_override(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product+\".s3AttachmentsStorage.bucketName\", \"my-bucket\",\n                product+\".s3AttachmentsStorage.bucketRegion\", \"my-region\",\n                product+\".s3AttachmentsStorage.endpointOverride\", \"http://minio.svc.cluster.local\"\n        ));\n\n        final var configMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n        assertThat(configMap).hasTextContaining(\"-Dconfluence.filestore.attachments.s3.bucket.name=my-bucket\");\n        assertThat(configMap).hasTextContaining(\"-Dconfluence.filestore.attachments.s3.endpoint.override=http://minio.svc.cluster.local\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"})\n    void confluence_s3_storage_no_endpoint_override(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product+\".s3AttachmentsStorage.bucketName\", \"my-bucket\",\n                product+\".s3AttachmentsStorage.bucketRegion\", \"my-region\"\n        ));\n\n        final var configMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n        assertThat(configMap).hasTextNotContaining(\"-Dconfluence.filestore.attachments.s3.endpoint.override\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"})\n    void confluence_s3_storage_missing_env_vars(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product+\".s3AttachmentsStorage.bucketName\", \"my-bucket\"\n        ));\n\n        final var configMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n        assertThat(configMap).hasTextNotContaining(\"-Dconfluence.filestore.attachments.s3.bucket.name=my-bucket\");\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/ContainersTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.assertj.core.api.Assertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.assertj.vavr.api.VavrAssertions.assertThat;\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.PersistentVolumeClaim;\n\n/**\n * Tests the various permutations of the \"persistence\" value structure in the Helm charts\n */\nclass ContainersTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additionalEnvironmentVariables(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                pname+\".additionalEnvironmentVariables[0].name\", \"MY_ENV_VAR\",\n                pname+\".additionalEnvironmentVariables[0].value\", \"env-value\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"MY_ENV_VAR\", \"env-value\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void additionalSynchronyEnvironmentVariables(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalEnvironmentVariables[0].name\", \"MY_ENV_VAR\",\n                \"synchrony.additionalEnvironmentVariables[0].value\", \"env-value\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"MY_ENV_VAR\", \"env-value\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additionalPorts(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                pname+\".additionalPorts[0].name\", \"jmx\",\n                pname+\".additionalPorts[0].port\", \"5555\",\n                pname+\".additionalPorts[0].protocol\", \"TCP\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var port = statefulSet.getContainer().getPort(\"jmx\");\n        assertThat(port.path(\"name\")).hasTextEqualTo(\"jmx\");\n        assertThat(port.path(\"protocol\")).hasTextEqualTo(\"TCP\");\n        assertThat(port.path(\"port\")).hasValueEqualTo(5555);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additionalInitContainers(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalInitContainers[0].name\", \"my_init_container\",\n                \"additionalInitContainers[0].image\", \"my_init_image\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var icontainer = statefulSet.getInitContainer(\"my_init_container\").get();\n        assertThat(icontainer.path(\"image\")).hasTextEqualTo(\"my_init_image\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additionalContainers(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"additionalContainers[0].name\", \"my_container\",\n                \"additionalContainers[0].image\", \"my_image\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var icontainer = statefulSet.getContainer(\"my_container\");\n        assertThat(icontainer.get(\"image\")).hasTextEqualTo(\"my_image\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void defaultContainerNames(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var containerName = statefulSet.getContainer().get(\"name\");\n        assertThat(containerName).hasTextEqualTo(product.name());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void containerNamesAsHelmReleaseName(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".useHelmReleaseNameAsContainerName\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var containerName = statefulSet.getContainer().get(\"name\");\n        assertThat(containerName).hasTextEqualTo(product.getHelmReleaseName());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void nfx_permission_fixer_container_default_no_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n\n        final var nfsPermissionFixerContainer = resources.getStatefulSet(product.getHelmReleaseName()).getInitContainers().get(0);\n        assertThat(nfsPermissionFixerContainer.get(\"resources\")).isNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void nfx_permission_fixer_container_default_custom_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.sharedHome.nfsPermissionFixer.resources.requests.cpu\", \"1\",\n                \"volumes.sharedHome.nfsPermissionFixer.resources.requests.memory\", \"2Gi\",\n                \"volumes.sharedHome.nfsPermissionFixer.resources.limits.cpu\", \"2\",\n                \"volumes.sharedHome.nfsPermissionFixer.resources.limits.memory\", \"3Gi\"\n        ));\n\n        final var nfsPermissionFixerContainer = resources.getStatefulSet(product.getHelmReleaseName()).getInitContainers().get(0);\n        assertThat(nfsPermissionFixerContainer.get(\"resources\").get(\"requests\").get(\"cpu\")).hasValueEqualTo(1);\n        assertThat(nfsPermissionFixerContainer.get(\"resources\").get(\"requests\").get(\"memory\")).hasTextEqualTo(\"2Gi\");\n        assertThat(nfsPermissionFixerContainer.get(\"resources\").get(\"limits\").get(\"cpu\")).hasValueEqualTo(2);\n        assertThat(nfsPermissionFixerContainer.get(\"resources\").get(\"limits\").get(\"memory\")).hasTextEqualTo(\"3Gi\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void test_session_timeout(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"jira.session.timeout\", \"60\",\n                \"confluence.session.timeout\", \"60\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"ATL_\" + pname.toUpperCase() +\"_SESSION_TIMEOUT\", \"60\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void test_autologin_cookie_age(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"jira.session.autologinCookieAge\", \"60\",\n                \"confluence.session.autologinCookieAge\", \"60\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"ATL_AUTOLOGIN_COOKIE_AGE\", \"60\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void session_timeout_default(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertDoesNotHaveAnyOf(\"ATL_JIRA_SESSION_TIMEOUT\");\n        env.assertDoesNotHaveAnyOf(\"ATL_CONFLUENCE_SESSION_TIMEOUT\");\n\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ContextPathTest.java",
    "content": "package test;\n\nimport org.assertj.core.api.Assertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\n/**\n * Tests the various permutations of the \"<product>.contextPath\" value structure in the Helm charts\n */\nclass ContextPathTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"})\n    void test_context_path(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.contextPath\", \"/\" + product.name()));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_TOMCAT_CONTEXTPATH\", \"/\" + product.name());\n        \n            assertEquals(resources.getStatefulSet(\n                    product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"httpGet\").get(\"path\").asText(),\n                    \"/\" + product.name() + \"/status\");\n    }\n    \n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo\"})\n    void test_context_path_bamboo(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.contextPath\", \"/\" + product.name()));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_TOMCAT_CONTEXTPATH\", \"/\" + product.name());\n\n            assertEquals(resources.getStatefulSet(\n                    product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"httpGet\").get(\"path\").asText(),\n                    \"/\" + product.name() + \"/rest/api/latest/status\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"})\n    void test_context_path_bitbucket(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.contextPath\", \"/\" + product.name()));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"SERVER_CONTEXT_PATH\", \"/\" + product.name());\n\n        assertEquals(resources.getStatefulSet(\n                        product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"httpGet\").get(\"path\").asText(),\n                \"/\" + product.name() + \"/status\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/CustomPortTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Container;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass CustomPortTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\", \"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void custom_port_tomcat_server(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".ports.http\", \"1234\"));\n\n        Container container = resources.getStatefulSet(product.getHelmReleaseName()).getContainer();\n\n        container.getEnv().assertHasValue(\"ATL_TOMCAT_PORT\", \"1234\");\n        assertThat(container.getReadinessProbe().get(\"httpGet\").get(\"port\")).hasValueEqualTo(1234);\n    }\n\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void custom_port_bitbucket(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".ports.http\", \"1234\"));\n\n        Container container = resources.getStatefulSet(product.getHelmReleaseName()).getContainer();\n\n        container.getEnv().assertHasValue(\"SERVER_PORT\", \"1234\");\n        assertThat(container.getReadinessProbe().get(\"httpGet\").get(\"port\")).hasValueEqualTo(1234);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/DatabaseTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\n/**\n * Tests the various permutations of the \"database\" value structure in the Helm charts\n */\nclass DatabaseTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"jira\")\n    void jira_database(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.url\", \"myurl\",\n                \"database.type\", \"mytype\",\n                \"database.driver\", \"mydriver\",\n                \"database.credentials.secretName\", \"mysecret\",\n                \"database.credentials.usernameSecretKey\", \"myusername\",\n                \"database.credentials.passwordSecretKey\", \"mypassword\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_JDBC_URL\", \"myurl\")\n                .assertHasValue(\"ATL_DB_TYPE\", \"mytype\")\n                .assertHasValue(\"ATL_DB_DRIVER\", \"mydriver\")\n                .assertHasSecretRef(\"ATL_JDBC_USER\", \"mysecret\", \"myusername\")\n                .assertHasSecretRef(\"ATL_JDBC_PASSWORD\", \"mysecret\", \"mypassword\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucket_database(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.url\", \"myurl\",\n                \"database.driver\", \"mydriver\",\n                \"database.credentials.secretName\", \"mysecret\",\n                \"database.credentials.usernameSecretKey\", \"myusername\",\n                \"database.credentials.passwordSecretKey\", \"mypassword\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"JDBC_URL\", \"myurl\")\n                .assertHasValue(\"JDBC_DRIVER\", \"mydriver\")\n                .assertHasSecretRef(\"JDBC_USER\", \"mysecret\", \"myusername\")\n                .assertHasSecretRef(\"JDBC_PASSWORD\", \"mysecret\", \"mypassword\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_database(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.url\", \"myurl\",\n                \"database.type\", \"mytype\",\n                \"database.driver\", \"mydriver\",\n                \"database.credentials.secretName\", \"mysecret\",\n                \"database.credentials.usernameSecretKey\", \"myusername\",\n                \"database.credentials.passwordSecretKey\", \"mypassword\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_JDBC_URL\", \"myurl\")\n                .assertHasValue(\"ATL_DB_TYPE\", \"mytype\")\n                .assertHasSecretRef(\"ATL_JDBC_USER\", \"mysecret\", \"myusername\")\n                .assertHasSecretRef(\"ATL_JDBC_PASSWORD\", \"mysecret\", \"mypassword\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_database(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.url\", \"myurl\",\n                \"database.type\", \"mytype\",\n                \"database.driver\", \"mydriver\",\n                \"database.credentials.secretName\", \"mysecret\",\n                \"database.credentials.usernameSecretKey\", \"myusername\",\n                \"database.credentials.passwordSecretKey\", \"mypassword\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_JDBC_URL\", \"myurl\")\n                .assertHasValue(\"ATL_DB_TYPE\", \"mytype\")\n                .assertHasSecretRef(\"ATL_JDBC_USER\", \"mysecret\", \"myusername\")\n                .assertHasSecretRef(\"ATL_JDBC_PASSWORD\", \"mysecret\", \"mypassword\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_database_ampersand(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.url\", \"jdbc://mydatabase?ssl=true&param1=1\"));\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_JDBC_URL\", \"jdbc://mydatabase?ssl=true&amp;param1=1\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_database_ampersand_escaped(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.url\", \"jdbc://mydatabase?ssl=true&amp;param1=1\"));\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_JDBC_URL\", \"jdbc://mydatabase?ssl=true&amp;param1=1\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_database_ampersand(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.url\", \"jdbc://mydatabase?ssl=true&amp;param1=1\",\n                \"synchrony.enabled\", \"true\"));\n        resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\")\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"SYNCHRONY_DATABASE_URL\", \"jdbc://mydatabase?ssl=true&param1=1\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ElasticSearchTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nclass ElasticSearchTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void elastic_search_baseUrl(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".elasticSearch.baseUrl\", \"https://foo/\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"SEARCH_ENABLED\", \"false\")\n                .assertHasValue(\"PLUGIN_SEARCH_ELASTICSEARCH_BASEURL\", \"https://foo/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void elastic_search_credentials(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".elasticSearch.credentials.secretName\", \"mysecret\",\n                product + \".elasticSearch.baseUrl\", \"https://foo/\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasSecretRef(\"PLUGIN_SEARCH_ELASTICSEARCH_USERNAME\", \"mysecret\", \"username\")\n                .assertHasSecretRef(\"PLUGIN_SEARCH_ELASTICSEARCH_PASSWORD\", \"mysecret\", \"password\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/FluentdTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.assertj.core.api.Assertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.jackson.JsonNodeAssert;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static test.model.Kind.ConfigMap;\n\nclass FluentdTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_sidecar_enabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.elasticsearch.hostname\", \"myelastic\"));\n\n        final var fluentdContainer = resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer(\"fluentd\");\n        assertThat(fluentdContainer.getResources()).isEmpty();\n\n        final var fluentdConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-fluentd-config\");\n        final var config = fluentdConfigMap.getNode(\"data\", \"fluent.conf\").asText();\n\n        assertThat(config)\n                .contains(\"host myelastic\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_uses_default_start_command(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\"\n        ));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer(\"fluentd\");\n\n        final var fluentdStartCommand = resources.getStatefulSet(product.getHelmReleaseName()).getContainer(\"fluentd\").get(\"command\").toString();\n\n        assertThat(fluentdStartCommand)\n                .contains(\"fluentd -c /fluentd/etc/fluent.conf -v\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_uses_custom_start_command(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.command\", \"gem install fluent-plugin-elasticsearch && fluentd -c /fluentd/etc/fluent.conf -v\"\n        ));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer(\"fluentd\");\n\n        final var fluentdStartCommand = resources.getStatefulSet(product.getHelmReleaseName()).getContainer(\"fluentd\").get(\"command\").toString();\n\n        assertThat(fluentdStartCommand)\n                .contains(\"gem install fluent-plugin-elasticsearch && fluentd -c /fluentd/etc/fluent.conf -v\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_checksum_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"false\"\n        ));\n\n        final var metadata = resources.getStatefulSet(product.getHelmReleaseName()).getPodMetadata();\n        final var checksum = metadata.get(\"annotations\").get(\"checksum/config-fluentd\");\n\n        assertThat(checksum).isNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_changes_annotation_checksum(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\"\n        ));\n\n        final var metadata = resources.getStatefulSet(product.getHelmReleaseName()).getPodMetadata();\n        final var checksum = metadata.get(\"annotations\").get(\"checksum/config-fluentd\");\n\n        assertThat(checksum).isNotNull();\n\n        final var resourcesWithChanges = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.elasticsearch.hostname\", \"myelastic\"));\n\n        final var metadataWithChanges = resourcesWithChanges.getStatefulSet(product.getHelmReleaseName()).getPodMetadata();\n        final var checksumWithChanges = metadataWithChanges.get(\"annotations\").get(\"checksum/config-fluentd\");\n\n        assertThat(checksumWithChanges)\n                .isNotNull()\n                .isNotEqualTo(checksum);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_sidecar_enabled_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.resources.requests.cpu\", \"1\",\n                \"fluentd.resources.requests.memory\", \"2Gi\",\n                \"fluentd.resources.limits.cpu\", \"2\",\n                \"fluentd.resources.limits.memory\", \"3Gi\"));\n\n        final var fluentdContainerResources = resources.getStatefulSet(product.getHelmReleaseName()).getContainer(\"fluentd\").getResources();\n\n        assertThat(fluentdContainerResources.path(\"requests\").path(\"cpu\").toString()).contains(\"1\");\n        assertThat(fluentdContainerResources.path(\"requests\").path(\"memory\").toString()).contains(\"2Gi\");\n        assertThat(fluentdContainerResources.path(\"limits\").path(\"cpu\").toString()).contains(\"2\");\n        assertThat(fluentdContainerResources.path(\"limits\").path(\"memory\").toString()).contains(\"3Gi\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\", \"crowd\"}, mode = EnumSource.Mode.INCLUDE)\n    void fluentd_cloud_logging_property_false(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.customConfigFile\", \"custom\\nconfig\"));\n        final var jvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-jvm-config\");\n        JsonNodeAssert.assertThat(jvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"-Datlassian.logging.cloud.enabled=false\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\", \"crowd\"}, mode = EnumSource.Mode.INCLUDE)\n    void fluentd_cloud_logging_property_true(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\"));\n        final var jvmConfigMap = resources.get(ConfigMap, product.getHelmReleaseName() + \"-jvm-config\");\n        JsonNodeAssert.assertThat(jvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"-Datlassian.logging.cloud.enabled=true\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\", \"jira\", \"confluence\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_local_volumes(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\"));\n\n        final var sts = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode volumeMount = sts.getContainer(\"fluentd\").getVolumeMount(\"local-home\");\n\n        JsonNodeAssert.assertThat(volumeMount.path(\"name\")).hasTextEqualTo(\"local-home\");\n        JsonNodeAssert.assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/application-data/logs\");\n        Assertions.assertThat(volumeMount.path(\"readOnly\").booleanValue()).isEqualTo(true);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fluentd_extra_volumes(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.extraVolumes[0].name\", \"custom\",\n                \"fluentd.extraVolumes[0].mountPath\", \"/var/atlassian/product/logs\",\n                \"fluentd.extraVolumes[0].readOnly\", \"true\"));\n\n        final var sts = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode volumeMount = sts.getContainer(\"fluentd\").getVolumeMount(\"custom\");\n\n        JsonNodeAssert.assertThat(volumeMount.path(\"name\")).hasTextEqualTo(\"custom\");\n        JsonNodeAssert.assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/var/atlassian/product/logs\");\n        Assertions.assertThat(volumeMount.path(\"readOnly\").booleanValue()).isEqualTo(true);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ForcedConfigUpdateTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\n\n/**\n * Tests the various permutations of the \"<product>.license\" value structure in the Helm charts\n */\nclass ForcedConfigUpdateTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"confluence\", \"bamboo\"})\n    void jira_atl_force_config_update_true(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"jira.forceConfigUpdate\", \"true\",\n                \"bamboo.forceConfigUpdate\", \"true\",\n                \"confluence.forceConfigUpdate\", \"true\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_FORCE_CFG_UPDATE\", \"true\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"jira\")\n    void jira_atl_force_config_update_false(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"jira.forceConfigUpdate\", \"false\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertDoesNotHaveAnyOf(\"ATL_FORCE_CFG_UPDATE\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/GatewayTest.java",
    "content": "package test;\n\nimport org.assertj.core.api.AbstractStringAssert;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.api.function.Executable;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Kind;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static org.junit.jupiter.api.Assertions.assertThrows;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass GatewayTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_creates_httproute_with_parent_ref_and_hostname(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\"));\n\n        final var httpRoutes = resources.getAll(Kind.HTTPRoute);\n        assertEquals(1, httpRoutes.size());\n\n        final var httpRoute = httpRoutes.head();\n        assertThat(httpRoute.getNode(\"spec\", \"parentRefs\").required(0).path(\"name\"))\n                .hasTextEqualTo(\"my-gateway\");\n        assertThat(httpRoute.getNode(\"spec\", \"hostnames\").required(0))\n                .hasTextEqualTo(product + \".example.com\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_cannot_coexist_with_ingress(Product product) {\n        assertThrowsAssertionWithMessage(\n                \"ERROR: Cannot enable both gateway.create and ingress.create\",\n                () -> helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                        \"gateway.create\", \"true\",\n                        \"ingress.create\", \"true\",\n                        \"gateway.parentRefs[0].name\", \"my-gateway\",\n                        \"gateway.hostnames[0]\", product + \".example.com\"))\n        );\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_requires_parentRefs_name(Product product) {\n        assertThrowsAssertionWithMessage(\n                \"ERROR: gateway.parentRefs[0].name is required when gateway.create is true\",\n                () -> helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                        \"gateway.create\", \"true\",\n                        \"gateway.parentRefs[0].namespace\", \"gateway-system\",\n                        \"gateway.hostnames[0]\", product + \".example.com\"))\n        );\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_requires_hostnames(Product product) {\n        assertThrowsAssertionWithMessage(\n                \"ERROR: gateway.hostnames must contain at least one hostname when gateway.create is true\",\n                () -> helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                        \"gateway.create\", \"true\",\n                        \"gateway.parentRefs[0].name\", \"my-gateway\"))\n        );\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_custom_path_is_applied_to_route_match(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\",\n                \"gateway.path\", \"/\" + product));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"spec\", \"rules\").required(0)\n                .path(\"matches\").required(0).path(\"path\").path(\"value\"))\n                .hasTextEqualTo(\"/\" + product);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_supports_multiple_hostnames(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\",\n                \"gateway.hostnames[1]\", product + \"-alt.example.com\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"spec\", \"hostnames\").required(0))\n                .hasTextEqualTo(product + \".example.com\");\n        assertThat(httpRoute.getNode(\"spec\", \"hostnames\").required(1))\n                .hasTextEqualTo(product + \"-alt.example.com\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_namespace_is_set_on_parent_ref(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.parentRefs[0].namespace\", \"gateway-system\",\n                \"gateway.hostnames[0]\", product + \".example.com\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"spec\", \"parentRefs\").required(0).path(\"namespace\"))\n                .hasTextEqualTo(\"gateway-system\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_supports_all_path_types(Product product) throws Exception {\n        for (String pathType : new String[]{\"PathPrefix\", \"Exact\", \"RegularExpression\"}) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    \"gateway.create\", \"true\",\n                    \"gateway.parentRefs[0].name\", \"my-gateway\",\n                    \"gateway.hostnames[0]\", product + \".example.com\",\n                    \"gateway.pathType\", pathType));\n\n            final var httpRoute = resources.get(Kind.HTTPRoute);\n            assertThat(httpRoute.getNode(\"spec\", \"rules\").required(0)\n                    .path(\"matches\").required(0).path(\"path\").path(\"type\"))\n                    .hasTextEqualTo(pathType);\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_custom_annotations_are_applied(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\",\n                \"gateway.annotations.cert-manager\\\\.io/cluster-issuer\", \"letsencrypt\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"metadata\", \"annotations\")\n                .path(\"cert-manager.io/cluster-issuer\"))\n                .hasTextEqualTo(\"letsencrypt\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_custom_labels_are_applied(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\",\n                \"gateway.labels.environment\", \"production\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"metadata\", \"labels\").path(\"environment\"))\n                .hasTextEqualTo(\"production\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_backend_ref_targets_product_service(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        final var backendRef = httpRoute.getNode(\"spec\", \"rules\").required(0)\n                .path(\"backendRefs\").required(0);\n\n        assertThat(backendRef.path(\"name\"))\n                .hasTextContaining(product.toString());\n        assertEquals(80, backendRef.path(\"port\").asInt());\n        assertEquals(100, backendRef.path(\"weight\").asInt());\n    }\n\n    @Test\n    void gateway_routes_synchrony_traffic_when_enabled() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(Product.confluence, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", \"confluence.example.com\",\n                \"synchrony.enabled\", \"true\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n\n        assertThat(httpRoute.getNode(\"spec\", \"rules\").required(0)\n                .path(\"backendRefs\").required(0).path(\"name\"))\n                .hasTextContaining(\"synchrony\");\n\n        assertThat(httpRoute.getNode(\"spec\", \"rules\").required(1)\n                .path(\"backendRefs\").required(0).path(\"name\"))\n                .hasTextContaining(\"confluence\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_custom_timeouts_are_applied(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\",\n                \"gateway.timeouts.request\", \"120s\",\n                \"gateway.timeouts.backendRequest\", \"60s\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        final var rule = httpRoute.getNode(\"spec\", \"rules\").required(0);\n        assertThat(rule.path(\"timeouts\").path(\"request\"))\n                .hasTextEqualTo(\"120s\");\n        assertThat(rule.path(\"timeouts\").path(\"backendRequest\"))\n                .hasTextEqualTo(\"60s\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_has_default_timeouts(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        final var rule = httpRoute.getNode(\"spec\", \"rules\").required(0);\n        assertThat(rule.path(\"timeouts\").path(\"request\"))\n                .hasTextEqualTo(\"60s\");\n        assertThat(rule.path(\"timeouts\").path(\"backendRequest\"))\n                .hasTextEqualTo(\"60s\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\", \"crowd\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_default_path_is_root(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"spec\", \"rules\").required(0)\n                .path(\"matches\").required(0).path(\"path\").path(\"value\"))\n                .hasTextEqualTo(\"/\");\n    }\n\n    @Test\n    void gateway_default_path_uses_context_path_for_crowd() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(Product.crowd, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", \"crowd.example.com\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"spec\", \"rules\").required(0)\n                .path(\"matches\").required(0).path(\"path\").path(\"value\"))\n                .hasTextEqualTo(\"/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void gateway_default_path_type_is_prefix(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"gateway.create\", \"true\",\n                \"gateway.parentRefs[0].name\", \"my-gateway\",\n                \"gateway.hostnames[0]\", product + \".example.com\"));\n\n        final var httpRoute = resources.get(Kind.HTTPRoute);\n        assertThat(httpRoute.getNode(\"spec\", \"rules\").required(0)\n                .path(\"matches\").required(0).path(\"path\").path(\"type\"))\n                .hasTextEqualTo(\"PathPrefix\");\n    }\n\n    private static void assertThrowsAssertionWithMessage(String expectedErrorMessage, Executable fn) {\n        assertThatString(\n                assertThrows(AssertionError.class, fn).getMessage()\n        ).contains(expectedErrorMessage);\n    }\n    private static AbstractStringAssert<?> assertThatString(String text) {\n        return org.assertj.core.api.Assertions.assertThat(text);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/HelmLintTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nclass HelmLintTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void helm_template_is_passing_linting(final Product product) throws Exception {\n        helm.assertLintedHelm(product);\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/HelmOutputComparisonTest.java",
    "content": "package test;\n\nimport io.vavr.collection.Array;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.api.condition.EnabledIfSystemProperty;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport org.junit.platform.commons.util.StringUtils;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.nio.file.StandardCopyOption;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nclass HelmOutputComparisonTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    /**\n     * For each product, this test executes \"helm template\" and captures the output, comparing it against an expectation file.\n     * This means that every time the Helm charts change, we need to change the expectation files.\n     */\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void helm_template_output_matches_expectations(final Product product) throws Exception {\n        final var expectedHelmOutput = getExpectedHelmTemplateOutputFile(product);\n        stripBlankLines(expectedHelmOutput);\n        stripChecksumLines(expectedHelmOutput); // checksum lines are covered with JvmResourcesTest\n\n        final var actualOutputFile = helm.captureHelmTemplateOutput(product, getHelmValuesFile(product));\n\n        stripBlankLines(actualOutputFile);\n        stripChecksumLines(actualOutputFile);\n\n        assertThat(expectedHelmOutput.toFile()).exists();\n        assertThat(actualOutputFile.toFile()).exists();\n\n        assertThat(actualOutputFile).hasSameTextualContentAs(expectedHelmOutput);\n    }\n\n    private static void stripBlankLines(Path file) throws IOException {\n        Files.write(file, Array.ofAll(Files.readAllLines(file))\n                .filter(StringUtils::isNotBlank));\n    }\n    private static void stripChecksumLines(Path file) throws IOException {\n        Files.write(file, Array.ofAll(Files.readAllLines(file))\n                .filter(line -> !line.contains(\"checksum/config-jvm\")));\n    }\n\n    private static Path testResources() {\n        return Paths.get(\"src/test/resources\");\n    }\n\n    private static Path expectationFiles(Product product) {\n        return testResources().resolve(\"expected_helm_output\").resolve(product.toString());\n    }\n\n    private static Path getExpectedHelmTemplateOutputFile(Product product) {\n        return expectationFiles(product).resolve(\"output.yaml\");\n    }\n\n    private static Path getHelmValuesFile(Product product) {\n        return expectationFiles(product).resolve(\"values.yaml\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    @EnabledIfSystemProperty(named = \"recordOutput\", matches = \"true\")\n    void record_helm_template_output_matches_expectations(final Product product) throws Exception {\n        final var actualOutputFile = helm.captureHelmTemplateOutput(product, getHelmValuesFile(product));\n        stripBlankLines(actualOutputFile);\n        Path destination = Paths.get(\"src/test/resources/expected_helm_output/\" + product + \"/output.yaml\");\n        Files.copy(actualOutputFile, destination, StandardCopyOption.REPLACE_EXISTING);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/HelmValuesAndAnalyticsTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.AnalyticsData;\nimport test.model.Kind;\nimport test.model.KubeResource;\nimport test.model.Product;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.NoSuchElementException;\n\nimport static org.junit.jupiter.api.Assertions.*;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\npublic class HelmValuesAndAnalyticsTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void support_configmap_created(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        KubeResource additionalConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).isNotNull();\n        assertThat(additionalConfigMap.getConfigMapData().get(\"analytics.json\")).isNotNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void support_configmap_created_with_sanitized_envs(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalEnvironmentVariables[0].name\", \"AWS_TOKEN\",\n                product.name() + \".additionalEnvironmentVariables[0].value\", \"qwerty123\"\n                ));\n        KubeResource additionalConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).hasTextContaining(\"Sanitized by Support Utility\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).hasTextNotContaining(\"qwerty123\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void support_configmap_created_with_sanitized_jvm_args(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".additionalJvmArgs[0]\", \"-DsomeToken=abcde\",\n                product.name() + \".additionalJvmArgs[1]\", \"-Dpassword=123\",\n                product.name() + \".additionalJvmArgs[2]\", \"-DsomeArg=qwerty123\"\n        ));\n        KubeResource additionalConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).hasTextContaining(\"-DsomeToken=Sanitized by Support Utility\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).hasTextContaining(\"-Dpassword=Sanitized by Support Utility\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).hasTextNotContaining(\"-DsomeToken=abcde\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).hasTextNotContaining(\"-Dpassword=123\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).hasTextContaining(\"-DsomeArg=qwerty123\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void support_configmap_created_with_values_only(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n               \"atlassianAnalyticsAndSupport.analytics.enabled\", \"false\"\n        ));\n        KubeResource additionalConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).isNotNull();\n        assertThat(additionalConfigMap.getConfigMapData().get(\"analytics.json\")).isNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void support_configmap_created_with_analytics_only(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"atlassianAnalyticsAndSupport.helmValues.enabled\", \"false\"\n        ));\n\n        KubeResource additionalConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\");\n        assertThat(additionalConfigMap.getConfigMapData().get(\"values.yaml\")).isNull();\n        assertThat(additionalConfigMap.getConfigMapData().get(\"analytics.json\")).isNotNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void support_configmap_not_created(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"atlassianAnalyticsAndSupport.helmValues.enabled\", \"false\",\n                \"atlassianAnalyticsAndSupport.analytics.enabled\", \"false\"\n        ));\n\n        assertThrows(AssertionError.class, () -> {\n            resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\");\n        });\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void volume_mount_is_created(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode volumeMount = statefulSet.getContainer(product.name()).getVolumeMount(\"helm-values\");\n        assertThat(volumeMount.path(\"mountPath\")).hasTextEqualTo(\"/opt/atlassian/helm\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void volume_mount_is_not_created(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"atlassianAnalyticsAndSupport.analytics.enabled\", \"false\",\n                \"atlassianAnalyticsAndSupport.helmValues.enabled\", \"false\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThrows(AssertionError.class, () -> {\n            statefulSet.getContainer(product.name()).getVolumeMount(\"helm-values\");\n        });\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void volume_is_created(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getVolume(\"helm-values\").get().path(\"configMap\").path(\"name\")).hasTextEqualTo(product.getHelmReleaseName() + \"-helm-values\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void volume_is_not_created(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"atlassianAnalyticsAndSupport.analytics.enabled\", \"false\",\n                \"atlassianAnalyticsAndSupport.helmValues.enabled\", \"false\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThrows(NoSuchElementException.class, () -> {\n            statefulSet.getVolume(\"helm-values\").get().path(\"configMap\").path(\"name\");\n        });\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_defaults(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertNotNull(analyticsData.getImageTag());\n        assertEquals(1, analyticsData.getReplicas());\n        assertEquals(\"NONE\", analyticsData.getIngressType());\n        assertEquals(\"UNKNOWN\", analyticsData.getDbType());\n        assertEquals(\"CLUSTER_IP\", analyticsData.getServiceType());\n        assertFalse(analyticsData.isGrafanaDashboardsCreated());\n        assertFalse(analyticsData.isServiceMonitorCreated());\n        assertFalse(analyticsData.isJmxEnabled());\n        assertFalse(analyticsData.isSharedHomePVCCreated());\n        assertFalse(analyticsData.isRunOnOpenshift());\n        assertFalse(analyticsData.isRunWithRestrictedSCC());\n        assertFalse(analyticsData.isOpenshiftRouteCreated());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_booleans(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.serviceMonitor.create\", \"true\",\n                \"monitoring.grafana.createDashboards\", \"true\",\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertTrue(analyticsData.isGrafanaDashboardsCreated());\n        assertTrue(analyticsData.isServiceMonitorCreated());\n        assertTrue(analyticsData.isJmxEnabled());\n        assertTrue(analyticsData.isSharedHomePVCCreated());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\", \"crowd\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_db_type(Product product) throws Exception {\n        Map<String, String> databaseConfigurations;\n        if (product == Product.bitbucket) {\n            databaseConfigurations = Map.of(\n                    \"postgres72\", \"org.postgresql.Driver\",\n                    \"sqlserver11\", \"com.microsoft.sqlserver.jdbc.SQLSDriver\",\n                    \"oracle10\", \"oracle.jdbc.driver.OracleDriver\",\n                    \"mysql7\", \"com.mysql.cj.jdbc.Driver\"\n            );\n        } else {\n            databaseConfigurations = Map.of(\n                    \"postgres72\", \"org.postgresql.Driver\",\n                    \"mssql01\", \"com.microsoft.mssql.jdbc.mssql\",\n                    \"oracle10\", \"oracle.jdbc.driver.OracleDriver\",\n                    \"mysql7\", \"com.mysql.cj.jdbc.Driver\"\n            );\n        }\n        List<String> normalizedDatabaseTypes = List.of(\"POSTGRES\", \"MSSQL\", \"ORACLE\", \"MYSQL\");\n        for (Map.Entry<String, String> entry : databaseConfigurations.entrySet()) {\n            String databaseType = entry.getKey();\n            String databaseDriver = entry.getValue();\n\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    \"database.type\", databaseType,\n                    \"database.driver\", databaseDriver\n            ));\n            String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n            ObjectMapper objectMapper = new ObjectMapper();\n            AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n            assertTrue(normalizedDatabaseTypes.contains(analyticsData.getDbType()));\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\", \"crowd\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_db_unknown(Product product) throws Exception {\n        List<String> unknownDatabaseTypes = List.of(\"mydb\", \"ourdb\", \"notknown\");\n        for (String unknownDbType : unknownDatabaseTypes) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    \"database.type\", unknownDbType,\n                    \"database.driver\", unknownDbType\n            ));\n            String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n            ObjectMapper objectMapper = new ObjectMapper();\n            AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n            assertEquals(\"UNKNOWN\", analyticsData.getDbType());\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\", \"crowd\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_known_service_types(Product product) throws Exception {\n        List<String> knownServiceTypes = List.of(\"ClusterIP\", \"LoadBalancer\", \"NodePort\", \"ExternalName\");\n        for (String svc : knownServiceTypes) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    product.name() + \".service.type\", svc\n            ));\n            String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n            ObjectMapper objectMapper = new ObjectMapper();\n            AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n            assertEquals(svc.replaceAll(\"([a-z])([A-Z]+)\", \"$1_$2\").toUpperCase(), analyticsData.getServiceType());\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_unknown_service_types(Product product) throws Exception {\n        List<String> unknownServiceTypes = List.of(\"ClusterPort\", \"LoadName\", \"NodeIp\", \"ExternalBalancer\");\n        for (String svc : unknownServiceTypes) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    product.name() + \".service.type\", svc\n            ));\n            String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n            ObjectMapper objectMapper = new ObjectMapper();\n            AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n            assertEquals(\"UNKNOWN\", analyticsData.getServiceType());\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_nginx_ingress_type(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertEquals(\"NGINX\", analyticsData.getIngressType());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_non_nginx_ingress_type(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.nginx\", \"false\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertEquals(\"OTHER\", analyticsData.getIngressType());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_image_tag(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"image.tag\", \"007\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertEquals(\"007\", analyticsData.getImageTag());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_assert_sanitized_image_tag(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"image.tag\", \"9.1.3-ubuntu\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertEquals(\"9.1.3\", analyticsData.getImageTag());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void analytics_json_assert_s3_confluence(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"confluence.s3AttachmentsStorage.bucketName\", \"mybucket\",\n                \"confluence.s3AttachmentsStorage.bucketRegion\", \"us-east-1\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertTrue(analyticsData.isS3AttachmentsStorageEnabled());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\"}, mode = EnumSource.Mode.INCLUDE)\n    void analytics_json_assert_s3_jira(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"jira.s3Storage.avatars.bucketName\", \"mybucket\",\n                \"jira.s3Storage.avatars.bucketRegion\", \"us-east-1\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertTrue(analyticsData.isS3AvatarsEnabled());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void analytics_json_assert_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.mesh.enabled\", \"true\"\n        ));\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertTrue(analyticsData.isBitbucketMeshEnabled());\n    }\n\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void analytics_json_openshift(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", \"true\",\n                \"ingress.openShiftRoute\", \"true\"\n        ));\n\n        String analyticsJson = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-helm-values\").getConfigMapData().get(\"analytics.json\").asText();\n        ObjectMapper objectMapper = new ObjectMapper();\n        AnalyticsData analyticsData = objectMapper.readValue(analyticsJson, AnalyticsData.class);\n        assertTrue(analyticsData.isRunWithRestrictedSCC());\n        assertTrue(analyticsData.isOpenshiftRouteCreated());\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/HostNamespacesTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\npublic class HostNamespacesTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void testHostNamespacesNoneSet(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        final var hostNetwork = resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec().path(\"hostNetwork\");\n        final var hostPID = resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec().path(\"hostPID\");\n        assert hostNetwork.isEmpty();\n        assert hostPID.isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void testHostNamespacesSet(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"hostNamespaces.hostNetwork\", \"false\",\n                \"hostNamespaces.hostPID\", \"false\"\n\n        ));\n       final var hostNetwork = resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec().path(\"hostNetwork\");\n       final var hostPID = resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec().path(\"hostPID\");\n       assert hostNetwork.asText().equals(\"false\");\n       assert hostPID.asText().equals(\"false\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ImageTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\n/**\n * Tests the various permutations of the \"image\" value structure in the Helm charts\n */\nclass ImageTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void image_tag(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"image.tag\", \"myversion\"\n        ));\n\n        resources.getStatefulSets()\n                .filter(s -> product.getHelmReleaseName().equals(s.getName()))\n                .forEach(statefulSet -> assertThat(statefulSet.getContainer().get(\"image\"))\n                        .describedAs(\"StatefulSet %s should have the configured image\", statefulSet.getName())\n                        .hasTextEqualTo(\"%s:myversion\", product.getDockerImageName()));\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void image_registry_and_tag(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"image.registry\", \"myregistry.io\",\n                \"image.tag\", \"myversion\"\n        ));\n\n        resources.getStatefulSets()\n                .filter(s -> product.getHelmReleaseName().equals(s.getName()))\n                .forEach(statefulSet -> assertThat(statefulSet.getContainer().get(\"image\"))\n                        .describedAs(\"StatefulSet %s should have the configured image\", statefulSet.getName())\n                        .hasTextEqualTo(\"myregistry.io/%s:myversion\", product.getDockerImageName()));\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void image_registry_repository_tag(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"image.registry\", \"myregistry.io\",\n                \"image.repository\", \"myorg/myimage\",\n                \"image.tag\", \"myversion\"\n        ));\n\n        resources.getStatefulSets()\n                .filter(s -> product.getHelmReleaseName().equals(s.getName()))\n                .forEach(statefulSet -> assertThat(statefulSet.getContainer().get(\"image\"))\n                        .describedAs(\"StatefulSet %s should have the configured image\", statefulSet.getName())\n                        .hasTextEqualTo(\"myregistry.io/myorg/myimage:myversion\"));\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void image_pullPolicy(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"image.pullPolicy\", \"Always\"));\n\n        resources.getStatefulSets()\n                .forEach(statefulSet -> assertThat(statefulSet.getContainer().get(\"imagePullPolicy\"))\n                        .describedAs(\"StatefulSet %s should have the configured imagePullPolicy\", statefulSet.getName())\n                        .hasTextEqualTo(\"Always\"));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"bitbucket\", \"confluence\", \"bamboo\"})\n    void fluentd_custom_image_test(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\",\n                \"fluentd.imageRepo\", \"registry.com\",\n                \"fluentd.imageTag\", \"mytag\"\n        ));\n\n        final var fluentContainerImage = resources.getStatefulSet(product.getHelmReleaseName()).getContainer(\"fluentd\").get(\"image\");\n\n        assertThat(fluentContainerImage).hasTextEqualTo(\"registry.com:mytag\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"bitbucket\", \"confluence\", \"bamboo\"})\n    void fluentd_default_image_test(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"fluentd.enabled\", \"true\"\n        ));\n\n        final var fluentContainerImage = resources.getStatefulSet(product.getHelmReleaseName()).getContainer(\"fluentd\").get(\"image\");\n\n        assertThat(fluentContainerImage).hasTextContaining(\"fluent/fluentd\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"bitbucket\", \"confluence\", \"bamboo\"})\n    void nfs_permission_fixer_custom_image_test(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.sharedHome.nfsPermissionFixer.imageRepo\", \"registry.com\",\n                \"volumes.sharedHome.nfsPermissionFixer.imageTag\", \"mytag\"\n        ));\n\n        final var permissionFixerImage = resources.getStatefulSet(product.getHelmReleaseName()).getInitContainer(\"nfs-permission-fixer\").get().path(\"image\");\n\n        assertThat(permissionFixerImage).hasTextEqualTo(\"registry.com:mytag\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"bitbucket\", \"confluence\", \"bamboo\"})\n    void nfs_permission_fixer_default_image_test(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n                ));\n        final var permissionFixerImage = resources.getStatefulSet(product.getHelmReleaseName()).getInitContainer(\"nfs-permission-fixer\").get().path(\"image\");\n\n        assertThat(permissionFixerImage).hasTextContaining(\"alpine\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/IngressTest.java",
    "content": "package test;\n\nimport io.vavr.collection.Traversable;\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Kind;\nimport test.model.KubeResource;\nimport test.model.Product;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass IngressTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void ingress_create(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.path\", \"/mypath\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n\n        for (KubeResource ingress : ingresses) {\n            assertThat(ingress.getNode(\"spec\", \"rules\").required(0).path(\"host\"))\n                    .hasTextContaining(\"myhost.mydomain\");\n\n            assertThat(ingress.getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                    .hasTextContaining(\"/mypath\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource\n    void ingress_create_with_custom_class_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.className\", \"my-custom-nginx\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n\n        for (KubeResource ingress : ingresses) {\n            assertThat(ingress.getNode(\"spec\").path(\"ingressClassName\"))\n                    .hasTextContaining(\"my-custom-nginx\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void ingress_create_tls (Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.tlsSecretName\", \"tls-secret\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        for (KubeResource ingress : ingresses) {\n            assertThat(ingress.getNode(\"spec\", \"tls\").required(0).path(\"hosts\").required(0))\n                    .hasTextContaining(\"myhost.mydomain\");\n\n            assertThat(ingress.getNode(\"spec\", \"tls\").required(0).path(\"secretName\"))\n                    .hasTextContaining(\"tls-secret\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucket_ingress_host(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"SERVER_PROXY_NAME\", \"myhost.mydomain\")\n                .assertHasValue(\"SERVER_PROXY_PORT\", \"443\")\n                .assertHasValue(\"SETUP_BASEURL\", \"https://myhost.mydomain\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucket_ingress_host_port(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.port\", \"666\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"SERVER_PROXY_NAME\", \"myhost.mydomain\")\n                .assertHasValue(\"SERVER_PROXY_PORT\", \"666\")\n                .assertHasValue(\"SETUP_BASEURL\", \"https://myhost.mydomain:666\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\", \"bitbucket\"}, mode = EnumSource.Mode.EXCLUDE)\n    void https_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.https\", \"false\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertDoesNotHaveAnyOf(\"ATL_TOMCAT_SCHEME\", \"ATL_TOMCAT_SECURE\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void https_disabled_bitbucket(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.https\", \"false\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertDoesNotHaveAnyOf(\"SERVER_SCHEME\", \"SERVER_SECURE\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_has_exactly_2_ingresses(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        // This is because Connie provisions a regular ingress + an ingress for /setup paths with increased timeout\n        Assertions.assertEquals(2, ingresses.size());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"confluence\", \"bamboo\", \"crowd\"})\n    void jira_ingress_host_port(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.port\", \"666\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"ATL_PROXY_NAME\", \"myhost.mydomain\")\n                .assertHasValue(\"ATL_PROXY_PORT\", \"666\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"confluence\", \"bamboo\", \"crowd\"})\n    void jira_ingress_port(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"ATL_PROXY_NAME\", \"myhost.mydomain\")\n                .assertHasValue(\"ATL_PROXY_PORT\", \"443\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"confluence\", \"bamboo\", \"crowd\"})\n    void jira_ingress_port_http(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.https\", \"False\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"ATL_PROXY_NAME\", \"myhost.mydomain\")\n                .assertHasValue(\"ATL_PROXY_PORT\", \"80\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucket_ingress_path_contextPath(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.path\", \"/bitbucket\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/bitbucket\");\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"SERVER_CONTEXT_PATH\", \"/bitbucket\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"bitbucket\"})\n    void jira_ingress_path_contextPath(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                product + \".service.contextPath\", \"/my-path\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/my-path\");\n\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"bitbucket\"})\n    void jira_ingress_path_value(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                product + \".service.contextPath\", \"/context\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/ingress\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\", \"bitbucket\"})\n    void jira_ingress_path_no_context_value(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/ingress\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"jira\")\n    void jira_ingress_path_default(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_ingress_path_contextPath(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"bamboo.service.contextPath\", \"/bamboo-tmp\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/bamboo-tmp\");\n\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_ingress_path_value(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"bamboo.service.contextPath\", \"/context\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/ingress\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_ingress_path_no_context_value(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/ingress\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_ingress_path_default(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_atl_base_path_when_all_ingress_vals(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.https\", \"true\",\n                \"ingress.path\", \"/bamboo\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"ATL_BASE_URL\", \"https://myhost.mydomain/bamboo\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_atl_base_path_when_no_ingress_path(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.https\", \"true\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"ATL_BASE_URL\", \"https://myhost.mydomain/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_atl_base_path_when_no_ingress_host(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.https\", \"true\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"ATL_BASE_URL\", \"http://localhost:8085/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_atl_base_path_when_ingress_host_over_http(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.https\", \"false\",\n                \"ingress.path\", \"/bamboo\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName()).getContainer().getEnv()\n                .assertHasValue(\"ATL_BASE_URL\", \"http://myhost.mydomain/bamboo\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_contextPath(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"confluence.service.contextPath\", \"/confluence-tmp\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(2, ingresses.size());\n\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/confluence-tmp\",\n                \"/synchrony\",\n                \"/confluence-tmp/setup\",\n                \"/confluence-tmp/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_contextPath_synchronyDisabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"false\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"confluence.service.contextPath\", \"/confluence-tmp\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(2, ingresses.size());\n\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/confluence-tmp\",\n                \"/confluence-tmp/setup\",\n                \"/confluence-tmp/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_value(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"confluence.service.contextPath\", \"/context\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/ingress\",\n                \"/synchrony\",\n                \"/ingress/setup\",\n                \"/ingress/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_value_synchronyDisabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"false\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"confluence.service.contextPath\", \"/context\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/ingress\",\n                \"/ingress/setup\",\n                \"/ingress/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_no_context_value(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(2, ingresses.size());\n\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/ingress\",\n                \"/synchrony\",\n                \"/ingress/setup\",\n                \"/ingress/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_no_context_value_synchronyDisabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"false\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.path\", \"/ingress\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(2, ingresses.size());\n\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/ingress\",\n                \"/ingress/setup\",\n                \"/ingress/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_default(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(2, ingresses.size());\n\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/\",\n                \"/synchrony\",\n                \"/setup\",\n                \"/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_ingress_path_default_synchronyDisabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"false\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(2, ingresses.size());\n\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/\",\n                \"/setup\",\n                \"/bootstrap\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_synchrony_dedicated_ingress(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.ingress.path\", \"/custom-synchrony(/|$)(.*)\",\n                \"synchrony.ingress.pathType\", \"ImplementationSpecific\",\n                \"synchrony.ingress.annotations.nginx\\\\.ingress\\\\.kubernetes\\\\.io\\\\/rewrite-target\", \"/$2\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(3, ingresses.size());\n        final List<String> ingressPaths = extractAllPaths(ingresses);\n        org.assertj.core.api.Assertions.assertThat(ingressPaths).containsExactlyInAnyOrder(\n                \"/\",\n                \"/setup\",\n                \"/bootstrap\",\n                \"/custom-synchrony(/|$)(.*)\");\n\n        final var synchronyIngress = resources.get(Kind.Ingress, product.getHelmReleaseName() + \"-synchrony\");\n        final var pathType = synchronyIngress.getSpec().get(\"rules\").get(0).get(\"http\").get(\"paths\").get(0).get(\"pathType\");\n        final var annotations = synchronyIngress.getAnnotations().get(\"nginx.ingress.kubernetes.io/rewrite-target\");\n        assertThat(pathType).hasTextEqualTo(\"ImplementationSpecific\");\n        assertThat(annotations).hasTextContaining(\"/$2\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_no_synchrony_path_confluence_ingress(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.ingress.path\", \"/custom-synchrony(/|$)(.*)\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var confluenceIngress = resources.get(Kind.Ingress, product.getHelmReleaseName());\n        final var paths = confluenceIngress.getSpec().get(\"rules\").get(0).get(\"http\").get(\"paths\");\n        assert paths.size() == 1;\n        assertThat(paths.get(0).get(\"path\")).hasTextEqualTo(\"/\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_custom_synchrony_context_system_property(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.ingress.path\", \"/custom-synchrony(/|$)(.*)\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\"));\n\n        final var jvmConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\");\n        assertThat(jvmConfigMap.getConfigMapData().path(\"additional_jvm_args\")).hasTextContaining(\"https://myhost.mydomain/custom-synchrony/v1\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo\", \"bitbucket\", \"confluence\", \"crowd\", \"jira\"})\n    void ingress_proxy_settings(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n\n        for (KubeResource ingress : ingresses) {\n                if ( ingress.getMetadata().path(\"name\").asText().contains(\"-setup\") ) {\n                    assertThat(ingress.getMetadata().path(\"annotations\"))\n                        .isObject(Map.of(\n                            \"nginx.ingress.kubernetes.io/proxy-connect-timeout\", \"300\",\n                            \"nginx.ingress.kubernetes.io/proxy-read-timeout\", \"300\",\n                            \"nginx.ingress.kubernetes.io/proxy-send-timeout\", \"300\"));\n                } else {\n                    assertThat(ingress.getMetadata().path(\"annotations\"))\n                        .isObject(Map.of(\n                            \"nginx.ingress.kubernetes.io/proxy-connect-timeout\", \"60\",\n                            \"nginx.ingress.kubernetes.io/proxy-read-timeout\", \"60\",\n                            \"nginx.ingress.kubernetes.io/proxy-send-timeout\", \"60\"));\n                }\n        }\n    }\n\n    private List<String> extractAllPaths(Traversable<KubeResource> ingresses) {\n        return ingresses\n                .flatMap(ingress -> ingress.getNode(\"spec\", \"rules\"))\n                .flatMap(rule -> rule.path(\"http\").path(\"paths\"))\n                .map(path -> path.path(\"path\").asText())\n                .collect(Collectors.toList());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"crowd\"})\n    void crowd_ingress_path_contextPath(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                product + \".service.contextPath\", \"/my-path\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/\");\n\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"crowd\"})\n    void crowd_ingress_path_value(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.path\", \"/mypath\",\n                product + \".service.contextPath\", \"/my-path\"));\n\n        final var ingresses = resources.getAll(Kind.Ingress);\n        Assertions.assertEquals(1, ingresses.size());\n\n        assertThat(ingresses.head().getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(0).path(\"path\"))\n                .hasTextEqualTo(\"/mypath\");\n\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void ingress_additional_paths(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \".synchrony.enabled\", \"false\",\n                \"ingress.create\", \"true\",\n                \"ingress.host\", \"myhost.mydomain\",\n                \"ingress.additionalPaths[0].path\", \"/my-path\",\n                \"ingress.additionalPaths[0].pathType\", \"ImplementationSpecific\",\n                \"ingress.additionalPaths[0].service\", \"my-svc\",\n                \"ingress.additionalPaths[0].portNumber\", \"80\"));\n\n        final var ingressList = resources.getAll(Kind.Ingress).toStream().toList();\n        final var ingressToCheck = product == Product.confluence\n                ? ingressList.get(1)\n                : ingressList.get(0);\n        assertThat(ingressToCheck.getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(1).path(\"path\")).hasTextEqualTo(\"/my-path\");\n        assertThat(ingressToCheck.getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(1).path(\"pathType\")).hasTextEqualTo(\"ImplementationSpecific\");\n        assertThat(ingressToCheck.getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(1).path(\"backend\").path(\"service\").path(\"name\")).hasTextEqualTo(\"my-svc\");\n        assertThat(ingressToCheck.getNode(\"spec\", \"rules\").required(0).path(\"http\").path(\"paths\").required(1).path(\"backend\").path(\"service\").path(\"port\").path(\"number\")).hasValueEqualTo(80);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/JiraOpenSearchTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Base64;\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertDoesNotThrow;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.Secret;\n\nclass JiraOpenSearchTest {\n\n    private static final Product JIRA = Product.jira;\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @Test\n    void opensearch_statefulset_is_created_when_enabled() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of(\n                \"opensearch.enabled\", \"true\"\n        ));\n        final var statefulSet = resources.getStatefulSet(\"opensearch-cluster-master\");\n        assertThat(statefulSet.getSpec()).isNotNull();\n    }\n\n    @Test\n    void opensearch_secret_contains_valid_base64_password() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of(\n                \"opensearch.enabled\", \"true\"\n        ));\n        final var secret = resources.get(Secret, \"opensearch-initial-password\");\n        JsonNode password = secret.getConfigMapData().path(\"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n        assertThat(password).isNotNull();\n        assertDoesNotThrow(() -> {\n            Base64.getDecoder().decode(password.asText());\n        }, \"Password should be a valid Base64 encoded string\");\n        byte[] decodedPassword = Base64.getDecoder().decode(password.asText());\n        assertEquals(40, decodedPassword.length, \"The decoded password should have a length of 40 bytes.\");\n    }\n\n    @Test\n    void opensearch_env_vars_are_set_with_default_credentials() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of(\n                \"opensearch.enabled\", \"true\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(JIRA.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_SEARCH_PLATFORM\", \"search.platform=opensearch\");\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_SEARCH_URL\", \"opensearch.http.url=http://opensearch-cluster-master:9200\");\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_SEARCH_USERNAME\", \"opensearch.username=admin\");\n        env.assertHasSecretRef(\"OPENSEARCH_ADMIN_PASSWORD\", \"opensearch-initial-password\", \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n        env.assertHasValue(\"ADDITIONAL_JIRA_CONFIG_SEARCH_PASSWORD__EXPAND_ENV\", \"opensearch.password={OPENSEARCH_ADMIN_PASSWORD}\");\n    }\n\n    @Test\n    void opensearch_env_vars_use_existing_secret_when_configured() throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(JIRA, Map.of(\n                \"opensearch.enabled\", \"true\",\n                \"opensearch.credentials.existingSecretRef.name\", \"my-opensearch-secret\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(JIRA.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasSecretRef(\"OPENSEARCH_ADMIN_PASSWORD\", \"my-opensearch-secret\", \"OPENSEARCH_INITIAL_ADMIN_PASSWORD\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/JiraS3EnabledTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.List;\nimport java.util.Map;\n\nclass JiraS3EnabledTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    private static final List<String> STORAGE_TYPES = List.of(\"avatars\", \"attachments\", \"backups\");\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\"})\n    void s3_storage_env_vars(Product product) throws Exception {\n        for (String storageType : STORAGE_TYPES) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    product + \".s3Storage.\" + storageType + \".bucketName\", \"my-bucket\",\n                    product + \".s3Storage.\" + storageType + \".bucketRegion\", \"my-region\"\n            ));\n\n            resources.getStatefulSet(product.getHelmReleaseName())\n                    .getContainer()\n                    .getEnv()\n                    .assertHasValue(\"ATL_S3\" + storageType.toUpperCase() + \"_BUCKET_NAME\", \"my-bucket\")\n                    .assertHasValue(\"ATL_S3\" + storageType.toUpperCase() + \"_REGION\", \"my-region\")\n                    .assertDoesNotHaveAnyOf(\"ATL_S3\" + storageType.toUpperCase() + \"_ENDPOINT_OVERRIDE\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\"})\n    void s3_storage_endpoint_override(Product product) throws Exception {\n        for (String storageType : STORAGE_TYPES) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    product + \".s3Storage.\" + storageType + \".bucketName\", \"my-bucket\",\n                    product + \".s3Storage.\" + storageType + \".bucketRegion\", \"my-region\",\n                    product + \".s3Storage.\" + storageType + \".endpointOverride\", \"http://minio.svc.cluster.local\"\n            ));\n\n            resources.getStatefulSet(product.getHelmReleaseName())\n                    .getContainer()\n                    .getEnv()\n                    .assertHasValue(\"ATL_S3\" + storageType.toUpperCase() + \"_BUCKET_NAME\", \"my-bucket\")\n                    .assertHasValue(\"ATL_S3\" + storageType.toUpperCase() + \"_REGION\", \"my-region\")\n                    .assertHasValue(\"ATL_S3\" + storageType.toUpperCase() + \"_ENDPOINT_OVERRIDE\", \"http://minio.svc.cluster.local\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"jira\"})\n    void jira_s3_avatars_storage_missing_env_vars(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".s3Storage.avatars.bucketName\", \"my-bucket\"\n        ));\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertDoesNotHaveAnyOf(\"ATL_S3AVATARS_BUCKET_NAME\")\n                .assertDoesNotHaveAnyOf(\"ATL_S3AVATARS_REGION\")\n                .assertDoesNotHaveAnyOf(\"ATL_S3AVATARS_ENDPOINT_OVERRIDE\");\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/JmxMetricsTest.java",
    "content": "package test;\n\nimport org.assertj.vavr.api.VavrAssertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Kind;\nimport test.model.Product;\nimport test.model.Service;\nimport test.model.StatefulSet;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.Secret;\nimport static test.model.Kind.ServiceMonitor;\n\nclass JmxMetricsTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void expose_jmx_metrics_enabled_init_container(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\"\n        ));\n\n        String sharedHomePath = \"/var/atlassian/application-data/shared-home\";\n        if (product.name().equals(\"crowd\")) {\n            sharedHomePath= \"/var/atlassian/application-data/crowd/shared\";\n        }\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        // assert jmx_exporter init container\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"image\")).hasTextEqualTo(\"bitnamilegacy/jmx-exporter:0.18.0\");\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"command\").get(0)).hasTextEqualTo(\"cp\");\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"args\").get(0)).hasTextEqualTo(\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\");\n\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"args\").get(1)).hasTextEqualTo(sharedHomePath);\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"volumeMounts\").get(0).path(\"mountPath\")).hasTextEqualTo(sharedHomePath);\n\n        // assert jmx port\n        assertThat(statefulSet.getContainer(product.name()).getPort(\"jmx\").path(\"containerPort\")).hasValueEqualTo(9999);\n        assertThat(statefulSet.getContainer(product.name()).getPort(\"jmx\").path(\"protocol\")).hasTextEqualTo(\"TCP\");\n\n        // assert no resources are set\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"resources\")).isEmpty();\n\n        if (product.name().equals(\"bitbucket\")) {\n            final var jmvConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n            assertThat(jmvConfigMap).hasTextContaining(\"-javaagent:\"+sharedHomePath+\"/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\");\n        } else {\n            // assert CATALINA_OPTS env var has javaagent\n            statefulSet.getContainer().getEnv().assertHasValue(\"CATALINA_OPTS\", \"-javaagent:\"+sharedHomePath+\"/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\");\n        }\n\n        // assert jmx configmap created and has expected config\n        final var jmxConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jmx-config\").getDataByKey(\"jmx-config.yaml\");\n        assertThat(jmxConfigMap).hasTextContaining(\"- pattern: \");\n\n        if (product.name().equals(\"bitbucket\")) {\n            // assert jmx env var\n            statefulSet.getContainer().getEnv().assertHasValue(\"JMX_ENABLED\", \"true\");\n        }\n    }\n\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void expose_jmx_metrics_enabled_init_container_run_as_root(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\"\n        ));\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"securityContext\").path(\"runAsUser\")).hasValueEqualTo(0);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void jmx_init_container_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"monitoring.jmxExporterInitContainer.resources.requests.cpu\", \"1\",\n                \"monitoring.jmxExporterInitContainer.resources.requests.memory\", \"2Gi\",\n                \"monitoring.jmxExporterInitContainer.resources.limits.cpu\", \"2\",\n                \"monitoring.jmxExporterInitContainer.resources.limits.memory\", \"3Gi\"));\n\n        final var jmxContainerResources = resources.getStatefulSet(product.getHelmReleaseName()).getInitContainers().get(1);\n\n        assertThat(jmxContainerResources.get(\"resources\").get(\"requests\").get(\"cpu\")).hasValueEqualTo(1);\n        assertThat(jmxContainerResources.get(\"resources\").get(\"requests\").get(\"memory\")).hasTextEqualTo(\"2Gi\");\n        assertThat(jmxContainerResources.get(\"resources\").get(\"limits\").get(\"cpu\")).hasValueEqualTo(2);\n        assertThat(jmxContainerResources.get(\"resources\").get(\"limits\").get(\"memory\")).hasTextEqualTo(\"3Gi\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void expose_jmx_metrics_enabled_init_container_no_root(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"monitoring.jmxExporterInitContainer.runAsRoot\", \"false\"\n        ));\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"securityContext\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void expose_jmx_metrics_enabled_init_container_custom_security_context(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"monitoring.jmxExporterInitContainer.runAsRoot\", \"false\",\n                \"monitoring.jmxExporterInitContainer.customSecurityContext.fsGroup\", \"1009\",\n                \"monitoring.jmxExporterInitContainer.customSecurityContext.runAsUser\", \"true\"\n        ));\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"securityContext\").path(\"fsGroup\")).hasValueEqualTo(1009);\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"securityContext\").path(\"runAsUser\")).hasToString(\"true\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void expose_jmx_metrics_enabled_custom_vol_paths(Product product) throws Exception {\n        String sharedHomePath = \"/var/atlassian/application-data/custom-shared-home\";\n        if (product.name().equals(\"crowd\")) {\n            sharedHomePath= \"/var/atlassian/application-data/crowd/custom-shared\";\n        }\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"volumes.sharedHome.subPath\", product.name(),\n                \"volumes.sharedHome.mountPath\", sharedHomePath\n\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        // assert jmx_exporter init container\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"args\").get(1)).hasTextEqualTo(sharedHomePath);\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"volumeMounts\").get(0).path(\"mountPath\")).hasTextEqualTo(sharedHomePath);\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"volumeMounts\").get(0).path(\"subPath\")).hasTextEqualTo(product.name());\n\n        if (product.name().equals(\"bitbucket\")) {\n            // assert jvm configmap has javaagent\n            final var jmvConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n            assertThat(jmvConfigMap).hasTextContaining(\"-javaagent:\"+ sharedHomePath + \"/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\");\n        } else {\n            // assert CATALINA_OPTS env var has javaagent\n            statefulSet.getContainer().getEnv().assertHasValue(\"CATALINA_OPTS\", \"-javaagent:\"+ sharedHomePath + \"/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void expose_jmx_metrics_enabled_custom_init_container(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"monitoring.jmxExporterImageRepo\", \"myregistry/myrepo\",\n                \"monitoring.jmxExporterImageTag\", \"0.17.0\"\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        // assert jmx_exporter init container\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"image\")).hasTextEqualTo(\"myregistry/myrepo:0.17.0\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void expose_jmx_metrics_enabled_custom_jar(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"monitoring.fetchJmxExporterJar\", \"false\",\n                \"monitoring.jmxExporterCustomJarLocation\", \"/tmp/custom.jar\",\n                \"monitoring.jmxExporterPort\", \"9000\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        // assert jmx_exporter init container does not exist\n        assertThat(statefulSet.getInitContainers().path(0).path(\"name\")).hasTextNotContaining(\"fetch-jmx-exporter\");\n\n        if (product.name().equals(\"bitbucket\")) {\n            // assert jvm configmap has custom javaagent path and port\n            final var jmvConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n            assertThat(jmvConfigMap).hasTextContaining(\"-javaagent:/tmp/custom.jar=9000:/opt/atlassian/jmx/jmx-config.yaml\");\n        } else {\n            // assert CATALINA_OPTS has custom javaagent path and port\n            statefulSet.getContainer().getEnv().assertHasValue(\"CATALINA_OPTS\", \"-javaagent:/tmp/custom.jar=9000:/opt/atlassian/jmx/jmx-config.yaml\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, mode = EnumSource.Mode.EXCLUDE, names = {\"bamboo_agent\"})\n    void expose_jmx_metrics_enabled_custom_config(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"monitoring.jmxExporterCustomConfig.rules[0].name\", \"custom-rule\",\n                \"monitoring.jmxExporterCustomConfig.rules[0].pattern\", \"^abc\"\n        ));\n\n        // assert jmx configmap has custom config\n        final var jmvConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jmx-config\").getDataByKey(\"jmx-config.yaml\");\n        assertThat(jmvConfigMap).hasTextContaining(\"rules:\");\n        assertThat(jmvConfigMap).hasTextContaining(\"- name: custom-rule\");\n        assertThat(jmvConfigMap).hasTextContaining(\"pattern: ^abc\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void jmx_service_test(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                \"monitoring.jmxExporterPort\", \"9000\",\n                \"monitoring.jmxExporterPortType\", \"NodePort\",\n                \"monitoring.jmxServiceAnnotations.foo\", \"bar\"\n        ));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName()+\"-jmx\");\n\n        assertThat(service.getType())\n                .hasTextEqualTo(\"NodePort\");\n        VavrAssertions.assertThat(service.getPort(\"jmx\"))\n                .hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(9000));\n        assertThat(service.getAnnotations()).isObject(Map.of(\n                \"foo\", \"bar\"\n        ));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void expose_jmx_metrics_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                product+\".mesh.enabled\", \"true\"\n        ));\n\n        String localHomePath = \"/var/atlassian/application-data/mesh\";\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n\n        // assert jmx_exporter init container\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"image\")).hasTextEqualTo(\"bitnamilegacy/jmx-exporter:0.18.0\");\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"command\").get(0)).hasTextEqualTo(\"cp\");\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"args\").get(0)).hasTextEqualTo(\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\");\n\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"args\").get(1)).hasTextEqualTo(localHomePath);\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"volumeMounts\").get(0).path(\"mountPath\")).hasTextEqualTo(localHomePath);\n\n        // assert jmx port\n        assertThat(statefulSet.getContainer(product.name()+\"-mesh\").getPort(\"jmx\").path(\"containerPort\")).hasValueEqualTo(9999);\n        assertThat(statefulSet.getContainer(product.name()+\"-mesh\").getPort(\"jmx\").path(\"protocol\")).hasTextEqualTo(\"TCP\");\n\n        // assert jmx env vars\n        statefulSet.getContainer().getEnv().assertHasValue(\"JMX_ENABLED\", \"true\");\n\n        // assert jvm configmap has javaagent\n        final var jmvConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config-mesh\").getDataByKey(\"additional_jvm_args\");\n        assertThat(jmvConfigMap).hasTextContaining(\"-javaagent:\"+localHomePath+\"/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\");\n\n        // assert jmx configmap created and has expected config\n        final var jmxConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jmx-config\").getDataByKey(\"jmx-config.yaml\");\n        assertThat(jmxConfigMap).hasTextContaining(\"- pattern: \");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void expose_jmx_metrics_enabled_bitbucket_mirror(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.exposeJmxMetrics\", \"true\",\n                product.name() + \".applicationMode\", \"mirror\"\n        ));\n\n        String sharedHomePath = \"/var/atlassian/application-data/shared-home\";\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        // assert jmx_exporter init container\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"image\")).hasTextEqualTo(\"bitnamilegacy/jmx-exporter:0.18.0\");\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"command\").get(0)).hasTextEqualTo(\"cp\");\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"args\").get(0)).hasTextEqualTo(\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\");\n\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"args\").get(1)).hasTextEqualTo(sharedHomePath);\n        assertThat(statefulSet.getInitContainer(\"fetch-jmx-exporter\").get().path(\"volumeMounts\").get(0).path(\"mountPath\")).hasTextEqualTo(sharedHomePath);\n\n        // assert jmx port\n        assertThat(statefulSet.getContainer(product.name()).getPort(\"jmx\").path(\"containerPort\")).hasValueEqualTo(9999);\n        assertThat(statefulSet.getContainer(product.name()).getPort(\"jmx\").path(\"protocol\")).hasTextEqualTo(\"TCP\");\n\n        // assert jvm configmap has javaagent\n        final var jmvConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n        assertThat(jmvConfigMap).hasTextContaining(\"-javaagent:\"+sharedHomePath+\"/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\");\n\n        // assert jmx configmap created and has expected config\n        final var jmxConfigMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jmx-config\").getDataByKey(\"jmx-config.yaml\");\n        assertThat(jmxConfigMap).hasTextContaining(\"- pattern: \");\n\n        // assert shared-home volume mount and volume are defined even though not explicitly set in volumes.SharedHome\n\n        assertThat(statefulSet.getContainer(\"bitbucket\").getVolumeMount(\"shared-home\").path(\"mountPath\")).hasTextEqualTo(sharedHomePath);\n\n        assertThat(statefulSet.getVolumes().get(1).path(\"name\")).hasTextEqualTo(\"shared-home\");\n        assertThat(statefulSet.getVolumes().get(1).path(\"emptyDir\")).isNotNull();\n\n        statefulSet.getContainer().getEnv().assertHasValue(\"JMX_ENABLED\", \"true\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void service_monitor_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.serviceMonitor.create\", \"true\",\n                product + \".mesh.enabled\", \"true\",\n                product + \".mesh.replicaCount\", \"3\"\n        ));\n\n        for (int i = 0; i < 3; i++) {\n            String meshReplicaName = product.getHelmReleaseName() + \"-mesh-\" + i + \"-service-monitor\";\n            resources.assertContains(ServiceMonitor, meshReplicaName);\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void service_monitor_enabled_with_custom_values(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.serviceMonitor.create\", \"true\",\n                \"monitoring.serviceMonitor.prometheusLabelSelector.release\", \"myprometheus\"\n        ));\n\n        resources.assertContains(ServiceMonitor, product.getHelmReleaseName() + \"-service-monitor\");\n\n        final var serviceMonitorSpec = resources.get(ServiceMonitor).getSpec();\n        assertThat(serviceMonitorSpec.path(\"endpoints\").path(0).path(\"interval\")).hasTextEqualTo(\"30s\");\n\n        final var serviceMonitorMetadata = resources.get(ServiceMonitor).getMetadata();\n        assertThat(serviceMonitorMetadata.path(\"labels\").path(\"release\")).hasTextEqualTo(\"myprometheus\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void service_monitor_enabled_(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"monitoring.serviceMonitor.create\", \"true\"\n        ));\n\n        resources.assertContains(ServiceMonitor, product.getHelmReleaseName() + \"-service-monitor\");\n        final var serviceMonitorSpec = resources.get(ServiceMonitor).getSpec();\n        assertThat(serviceMonitorSpec.path(\"endpoints\").path(0).path(\"interval\")).hasTextEqualTo(\"30s\");\n        assertThat(serviceMonitorSpec.path(\"endpoints\").path(0).path(\"path\")).hasTextEqualTo(\"/metrics\");\n        assertThat(serviceMonitorSpec.path(\"endpoints\").path(0).path(\"port\")).hasTextEqualTo(\"jmx\");\n        assertThat(serviceMonitorSpec.path(\"endpoints\").path(0).path(\"scheme\")).hasTextEqualTo(\"http\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/JvmResourcesTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\n/**\n * Tests the \"resources.jvm\" value structure in the Helm charts\n */\nclass JvmResourcesTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void changes_annotation_checksum(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".resources.jvm.maxHeap\", \"768m\"\n        ));\n\n        final var metadata = resources.getStatefulSet(product.getHelmReleaseName()).getPodMetadata();\n        final var checksum = metadata.get(\"annotations\").get(\"checksum/config-jvm\");\n\n        assertThat(checksum).isNotNull();\n\n        final var resourcesWithChanges = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".resources.jvm.maxHeap\", \"1024m\"\n        ));\n\n        final var metadataWithChanges = resourcesWithChanges.getStatefulSet(product.getHelmReleaseName()).getPodMetadata();\n        final var checksumWithChanges = metadataWithChanges.get(\"annotations\").get(\"checksum/config-jvm\");\n\n        assertThat(checksumWithChanges)\n                .isNotNull()\n                .isNotEqualTo(checksum);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void changes_annotation_checksum_for_bamboo_agent(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.resources.jvm.maxHeap\", \"768m\"\n        ));\n\n        final var metadata = resources.getDeployment(product.getHelmReleaseName()).getSpec().get(\"template\").get(\"metadata\");\n        final var checksum = metadata.get(\"annotations\").get(\"checksum/config-jvm\");\n\n        assertThat(checksum).isNotNull();\n\n        final var resourcesWithChanges = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.resources.jvm.maxHeap\", \"1024m\"\n        ));\n\n        final var metadataWithChanges = resourcesWithChanges.getDeployment(product.getHelmReleaseName()).getSpec().get(\"template\").get(\"metadata\");\n        final var checksumWithChanges = metadataWithChanges.get(\"annotations\").get(\"checksum/config-jvm\");\n\n        assertThat(checksumWithChanges)\n                .isNotNull()\n                .isNotEqualTo(checksum);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/LicenseTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\n/**\n * Tests the various permutations of the \"<product>.license\" value structure in the Helm charts\n */\nclass LicenseTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void confluence_license_secret_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"confluence.license.secretName\", \"license_secret\",\n                \"confluence.license.secretKey\", \"mykey\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasSecretRef(\"ATL_LICENSE_KEY\", \"license_secret\", \"mykey\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucket_license_secret_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.license.secretName\", \"license_secret\",\n                \"bitbucket.license.secretKey\", \"mykey\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasSecretRef(\"SETUP_LICENSE\", \"license_secret\", \"mykey\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo\")\n    void bamboo_license_secret_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bamboo.license.secretName\", \"license_secret\",\n                \"bamboo.license.secretKey\", \"mykey\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasSecretRef(\"ATL_LICENSE\", \"license_secret\", \"mykey\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/LifecycleHooksTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\npublic class LifecycleHooksTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void default_pre_stop_hook(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertEquals(\"sh\", statefulSet.getContainer().get(\"lifecycle\").get(\"preStop\").get(\"exec\").get(\"command\").get(0).asText());\n        assertEquals(\"-c\", statefulSet.getContainer().get(\"lifecycle\").get(\"preStop\").get(\"exec\").get(\"command\").get(1).asText());\n        assertEquals(\"/shutdown-wait.sh\", statefulSet.getContainer().get(\"lifecycle\").get(\"preStop\").get(\"exec\").get(\"command\").get(2).asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void custom_pre_stop_hook(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".shutdown.command\", \"echo hello\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertEquals(\"sh\", statefulSet.getContainer().get(\"lifecycle\").get(\"preStop\").get(\"exec\").get(\"command\").get(0).asText());\n        assertEquals(\"-c\", statefulSet.getContainer().get(\"lifecycle\").get(\"preStop\").get(\"exec\").get(\"command\").get(1).asText());\n        assertEquals(\"echo hello\", statefulSet.getContainer().get(\"lifecycle\").get(\"preStop\").get(\"exec\").get(\"command\").get(2).asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void custom_post_start_hook(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".postStart.command\", \"echo hello\"\n        ));\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertEquals(\"/bin/sh\", statefulSet.getContainer().get(\"lifecycle\").get(\"postStart\").get(\"exec\").get(\"command\").get(0).asText());\n        assertEquals(\"-c\", statefulSet.getContainer().get(\"lifecycle\").get(\"postStart\").get(\"exec\").get(\"command\").get(1).asText());\n        assertEquals(\"echo hello\", statefulSet.getContainer().get(\"lifecycle\").get(\"postStart\").get(\"exec\").get(\"command\").get(2).asText());\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/MirrorsTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\n/**\n * Tests the various permutations of the \"persistence\" value structure in the\n * Helm charts\n */\nclass MirrorsTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void applicationMode(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(pname + \".applicationMode\", \"mirror\", pname + \".mirror.upstreamUrl\", \"https://upstream.com\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"APPLICATION_MODE\", \"mirror\");\n        env.assertHasValue(\"PLUGIN_MIRRORING_UPSTREAM_URL\", \"https://upstream.com\");\n        env.assertHasValue(\"PLUGIN_MIRRORING_UPSTREAM_TYPE\", \"server\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void defaultMode(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product,\n                Map.of(pname + \".applicationMode\", \"default\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        final var env = statefulSet.getContainer().getEnv();\n        env.assertHasValue(\"APPLICATION_MODE\", \"default\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/PodAnnotationsTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass PodAnnotationsTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void pod_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"podAnnotations.podAnnotation1\", \"podOfHumpbacks\",\n                \"podAnnotations.podAnnotation2\", \"podOfOrcas\",\n                \"podAnnotations.podAnnotation3\", \"'{{ \\\"podOfTucuxis\\\" | b64enc }}'\",\n                \"podAnnotations.podAnnotation4\", \"'{{ \\\"podOfTucuxis\\\" | upper }}'\"\n\n        ));\n\n        final var annotations = resources.getStatefulSet(product.getHelmReleaseName()).getPodMetadata().get(\"annotations\");\n\n        assertThat(annotations).isObject(Map.of(\n                \"podAnnotation1\", \"podOfHumpbacks\",\n                \"podAnnotation2\", \"podOfOrcas\",\n                \"podAnnotation3\", \"'\" + b64enc(\"podOfTucuxis\") + \"'\",\n                \"podAnnotation4\", \"'PODOFTUCUXIS'\"\n        ));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bamboo_agent\")\n    void bamboo_agent_pod_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"podAnnotations.podAnnotation1\", \"podOfHumpbacks\",\n                \"podAnnotations.podAnnotation2\", \"podOfOrcas\",\n                \"podAnnotations.podAnnotation3\", \"'{{ \\\"podOfTucuxis\\\" | b64enc }}'\",\n                \"podAnnotations.podAnnotation4\", \"'{{ \\\"podOfTucuxis\\\" | upper }}'\"\n        ));\n\n        final var annotations = resources.getDeployment(product.getHelmReleaseName()).getPodMetadata().get(\"annotations\");\n\n        assertThat(annotations).isObject(Map.of(\n                \"podAnnotation1\", \"podOfHumpbacks\",\n                \"podAnnotation2\", \"podOfOrcas\",\n                \"podAnnotation3\", \"'\" + b64enc(\"podOfTucuxis\") + \"'\",\n                \"podAnnotation4\", \"'PODOFTUCUXIS'\"\n        ));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_pod_default_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"podAnnotations.confluence\", \"annotation\",\n                \"podAnnotations.confluence1\", \"annotation1\",\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        final var annotations = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\").getPodMetadata().get(\"annotations\");\n\n        assertThat(annotations).isObject(Map.of(\n                \"confluence\", \"annotation\",\n                \"confluence1\", \"annotation1\"\n        ));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_pod_custom_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.podAnnotations.synchrony\", \"annotation\",\n                \"synchrony.podAnnotations.synchrony1\", \"annotation1\",\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        final var annotations = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\").getPodMetadata().get(\"annotations\");\n\n        assertThat(annotations).isObject(Map.of(\n                \"synchrony\", \"annotation\",\n                \"synchrony1\", \"annotation1\"\n\n        ));\n    }\n\n    private static String b64enc(String string) {\n        return new String(java.util.Base64.getEncoder().encode(string.getBytes()));\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/PodDisruptionBudgetTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.*;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\npublic class PodDisruptionBudgetTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void pod_disruption_budget_enabled_min_available(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"podDisruptionBudget.enabled\", \"true\",\n                \"podDisruptionBudget.minAvailable\", \"1\"\n        ));\n\n        KubeResource pdb = resources.get(Kind.PodDisruptionBudget, product.getHelmReleaseName());\n        assertThat(pdb.getSpec().get(\"minAvailable\")).hasValueEqualTo(1);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void pod_disruption_budget_min_available_max_unavailable(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"podDisruptionBudget.enabled\", \"true\",\n                \"podDisruptionBudget.minAvailable\", \"1\",\n                \"podDisruptionBudget.maxUnavailable\", \"2\"\n        ));\n\n        // assert that when both mixAvailable and maxUnavailable are defined, only maxUnavailable is set in pdb\n        KubeResource pdb = resources.get(Kind.PodDisruptionBudget, product.getHelmReleaseName());\n        assertThat(pdb.getSpec().get(\"maxUnavailable\")).hasValueEqualTo(2);\n        assertThat(pdb.getSpec().path(\"minAvailable\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void pod_disruption_budget_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"podDisruptionBudget.enabled\", \"true\",\n                \"podDisruptionBudget.minAvailable\", \"1\",\n                \"podDisruptionBudget.annotations.foo\", \"bar\"\n        ));\n\n        KubeResource pdb = resources.get(Kind.PodDisruptionBudget, product.getHelmReleaseName());\n        assertThat(pdb.getAnnotations().path(\"foo\")).hasTextEqualTo(\"bar\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void pod_disruption_budget_labels(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"podDisruptionBudget.enabled\", \"true\",\n                \"podDisruptionBudget.minAvailable\", \"1\",\n                \"podDisruptionBudget.labels.foo\", \"bar\"\n        ));\n\n        KubeResource pdb = resources.get(Kind.PodDisruptionBudget, product.getHelmReleaseName());\n        assertThat(pdb.getMetadata().path(\"labels\").path(\"foo\")).hasTextEqualTo(\"bar\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/PodTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nimport java.util.Map;\n\nclass PodTest {\n\tprivate Helm helm;\n\n\t@BeforeEach\n\tvoid initHelm(TestInfo testInfo) {\n\t\thelm = new Helm(testInfo);\n\t}\n\n\t@ParameterizedTest\n\t@EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n\tvoid podLabels(Product product) throws Exception {\n\t\tfinal var pname = product.name().toLowerCase();\n\t\tfinal var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n\t\t\t\t\"podLabels.customlabel\", \"MY_LABEL_VAR\",\n\t\t\t\t\"podLabels.customlabel2\", \"my-label-var-2\"\n\t\t));\n\n\t\tfinal var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\t\tassertThat(statefulSet.getLabels().path(\"customlabel\")).hasTextEqualTo(\"MY_LABEL_VAR\");\n\t\tassertThat(statefulSet.getLabels().path(\"customlabel2\")).hasTextEqualTo(\"my-label-var-2\");\n\t}\n}\n"
  },
  {
    "path": "src/test/java/test/PriorityClassNameTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Deployment;\nimport test.model.Product;\nimport test.model.StatefulSet;\n\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\nclass PriorityClassNameTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void priority_class_names(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"priorityClassName\", \"high\"\n                ));\n\n        StatefulSet dcProduct = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode priorityClassName = dcProduct.getPodSpec().get(\"priorityClassName\");\n        assertEquals(\"high\", priorityClassName.asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.INCLUDE)\n    void priority_class_names_bamboo_agent(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"priorityClassName\", \"high\"\n        ));\n\n        Deployment bambooAgent = resources.getDeployment(product.getHelmReleaseName());\n        JsonNode priorityClassName = bambooAgent.getPodSpec().get(\"priorityClassName\");\n        assertEquals(\"high\", priorityClassName.asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void priority_class_names_bitbucket_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"priorityClassName\", \"high\",\n                \"bitbucket.mesh.enabled\", \"true\",\n                \"bitbucket.mesh.priorityClassName\", \"high\"\n        ));\n\n        StatefulSet bitbucketMeshSts = resources.getStatefulSet(\"unittest-bitbucket-mesh\");\n        JsonNode priorityClassName = bitbucketMeshSts.getPodSpec().get(\"priorityClassName\");\n        assertEquals(\"high\", priorityClassName.asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void priority_class_names_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"priorityClassName\", \"high\",\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        StatefulSet synchronySts = resources.getStatefulSet(\"unittest-confluence-synchrony\");\n        JsonNode priorityClassName = synchronySts.getPodSpec().get(\"priorityClassName\");\n        assertEquals(\"high\", priorityClassName.asText());\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ReadinessLivenessProbesTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\nimport java.util.Map;\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\npublic class ReadinessLivenessProbesTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_readiness_probe_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".readinessProbe.enabled\", \"false\"));\n\n        assertThat(resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_liveness_probe_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        assertThat(resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_liveness_probe_overrides(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".livenessProbe.enabled\", \"true\",\n                product + \".livenessProbe.initialDelaySeconds\", \"1111\",\n                product + \".livenessProbe.periodSeconds\", \"2222\",\n                product + \".livenessProbe.failureThreshold\", \"3333\",\n                product + \".livenessProbe.timeoutSeconds\", \"4444\"));\n\n        assertEquals(\"1111\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"initialDelaySeconds\").asText());\n        assertEquals(\"2222\", resources.getStatefulSet(\n                        product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"periodSeconds\").asText());\n        assertEquals(\"3333\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"failureThreshold\").asText());\n        assertEquals(\"4444\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"timeoutSeconds\").asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_liveness_probe_enabled_defaults(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".livenessProbe.enabled\", \"true\"));\n\n        assertEquals(\"60\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"initialDelaySeconds\").asText());\n        assertEquals(\"5\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"periodSeconds\").asText());\n        assertEquals(\"12\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"failureThreshold\").asText());\n        assertEquals(\"1\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"timeoutSeconds\").asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_liveness_probe_custom_probe(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".livenessProbe.enabled\", \"true\",\n                product + \".livenessProbe.customProbe.tcpSocket.port\", \"9999\",\n                product + \".livenessProbe.customProbe.periodSeconds\", \"3333\",\n                product + \".livenessProbe.customProbe.failureThreshold\", \"3333\",\n                product + \".livenessProbe.customProbe.timeoutSeconds\", \"4444\",\n                product + \".livenessProbe.customProbe.foo\", \"bar\"));\n\n        assertEquals(\"9999\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"tcpSocket\").get(\"port\").asText());\n        assertEquals(\"3333\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"periodSeconds\").asText());\n        assertEquals(\"3333\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"failureThreshold\").asText());\n        assertEquals(\"4444\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"timeoutSeconds\").asText());\n        assertEquals(\"bar\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"livenessProbe\").get(\"foo\").asText());\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_readiness_probe_overrides(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".readinessProbe.initialDelaySeconds\", \"2222\",\n                product + \".readinessProbe.periodSeconds\", \"2222\",\n                product + \".readinessProbe.failureThreshold\", \"2222\",\n                product + \".readinessProbe.timeoutSeconds\", \"3333\"));\n\n        assertEquals(\"2222\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"initialDelaySeconds\").asText());\n        assertEquals(\"2222\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"periodSeconds\").asText());\n        assertEquals(\"2222\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"failureThreshold\").asText());\n        assertEquals(\"3333\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"timeoutSeconds\").asText());\n\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_readiness_probe_custom_probe(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".readinessProbe.customProbe.tcpSocket.port\", \"9999\",\n                product + \".readinessProbe.customProbe.periodSeconds\", \"3333\",\n                product + \".readinessProbe.customProbe.failureThreshold\", \"3333\",\n                product + \".readinessProbe.customProbe.timeoutSeconds\", \"4444\",\n                product + \".readinessProbe.customProbe.foo\", \"bar\"));\n\n        assertEquals(\"9999\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"tcpSocket\").get(\"port\").asText());\n        assertEquals(\"3333\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"periodSeconds\").asText());\n        assertEquals(\"3333\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"failureThreshold\").asText());\n        assertEquals(\"4444\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"timeoutSeconds\").asText());\n        assertEquals(\"bar\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"readinessProbe\").get(\"foo\").asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_startup_probe_enabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".startupProbe.enabled\", \"true\"));\n\n        assertThat(resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\")).isNotNull();\n\n        assertEquals(\"120\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\").get(\"failureThreshold\").asText());\n        assertEquals(\"60\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\").get(\"initialDelaySeconds\").asText());\n        assertEquals(\"5\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\").get(\"periodSeconds\").asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_startup_probe_defaults(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        assertThat(resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_startup_probe_customized(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".startupProbe.enabled\", \"true\",\n                product + \".startupProbe.failureThreshold\", \"1200\",\n                product + \".startupProbe.initialDelaySeconds\", \"1200\",\n                product + \".startupProbe.periodSeconds\", \"14\"));\n\n        assertEquals(\"1200\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\").get(\"failureThreshold\").asText());\n        assertEquals(\"1200\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\").get(\"initialDelaySeconds\").asText());\n        assertEquals(\"14\", resources.getStatefulSet(\n                product.getHelmReleaseName()).getContainer().get(\"startupProbe\").get(\"periodSeconds\").asText());\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/RequestsTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Kind;\nimport test.model.Product;\nimport test.model.StatefulSet;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\npublic class RequestsTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void sts_empty_limits(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        StatefulSet productSts = resources.getStatefulSet(product.getHelmReleaseName());\n\n        assertThat(productSts.getContainer(product.name()).getLimits()).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void sts_resource_requests_and_limits(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".resources.container.requests.cpu\", \"10\",\n                product + \".resources.container.requests.memory\", \"10GB\",\n                product + \".resources.container.limits.cpu\", \"20\",\n                product + \".resources.container.limits.memory\", \"20GB\"\n        ));\n\n        StatefulSet productSts = resources.getStatefulSet(product.getHelmReleaseName());\n\n        // verify requests\n        assertThat(productSts.getContainer(product.name()).getRequests().path(\"cpu\")).hasValueEqualTo(10);\n        assertThat(productSts.getContainer(product.name()).getRequests().path(\"memory\")).hasTextEqualTo(\"10GB\");\n\n        // verify limits\n        assertThat(productSts.getContainer(product.name()).getLimits().path(\"cpu\")).hasValueEqualTo(20);\n        assertThat(productSts.getContainer(product.name()).getLimits().path(\"memory\")).hasTextEqualTo(\"20GB\");\n\n        // verify ActiveProcessorCount\n        final var additionalJvmArgs = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\")\n            .getNode(\"data\", \"additional_jvm_args\");\n        assertThat(additionalJvmArgs)\n            .hasSeparatedTextContaining(\"-XX:ActiveProcessorCount=10\");\n\n        final var resourcesMilliCpu = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n            product + \".resources.container.requests.cpu\", \"3100m\"\n        ));\n        final var additionalJvmArgsMilliCpu = resourcesMilliCpu\n            .get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\").getNode(\"data\", \"additional_jvm_args\");\n        assertThat(additionalJvmArgsMilliCpu)\n            .hasSeparatedTextContaining(\"-XX:ActiveProcessorCount=3\");\n\n        final var resourcesBelow1000m = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n            product + \".resources.container.requests.cpu\", \"200m\"\n        ));\n        final var additionalJvmArgsBelow1000m = resourcesBelow1000m\n            .get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\").getNode(\"data\", \"additional_jvm_args\");\n        assertThat(additionalJvmArgsBelow1000m)\n            .hasSeparatedTextContaining(\"-XX:ActiveProcessorCount=1\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void fractional_cpu_active_processors(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".resources.container.requests.cpu\", \"3.2\"\n        ));\n\n        final var additionalJvmArgs = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\")\n                .getNode(\"data\", \"additional_jvm_args\");\n        assertThat(additionalJvmArgs)\n                .hasSeparatedTextContaining(\"-XX:ActiveProcessorCount=3\");\n\n        final var resourcesFractionalCPU = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".resources.container.requests.cpu\", \"0.1\"\n        ));\n        final var additionalJvmArgsMilliCpu = resourcesFractionalCPU\n                .get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\").getNode(\"data\", \"additional_jvm_args\");\n        assertThat(additionalJvmArgsMilliCpu)\n                .hasSeparatedTextContaining(\"-XX:ActiveProcessorCount=1\");\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/SchedulerNameTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\n/**\n * Tests the \"schedulerName\" value structure in the Helm charts\n */\nclass SchedulerNameTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void custom_scheduler(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"schedulerName\", \"second_scheduler\"));\n\n        JsonNode podSpec = resources.getStatefulSet(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"schedulerName\")).hasTextEqualTo(\"second_scheduler\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void default_scheduler(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"schedulerName\", \"\"));\n\n        JsonNode podSpec = resources.getStatefulSet(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"schedulerName\")).isEmpty();\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/SecurityContextTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.CsvSource;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\n/**\n * Tests the various permutations of the \"<product>.securityContext\" and \"<product>.containerSecurityContext\" value structure in the Helm charts\n */\nclass SecurityContextTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pod_security_context(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".securityContext.fsGroup\", \"1000\",\n                product + \".securityContext.runAsGroup\", \"1000\"));\n\n        JsonNode podSpec = resources.getStatefulSet(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"securityContext\").path(\"fsGroup\")).hasValueEqualTo(1000);\n        assertThat(podSpec.path(\"securityContext\").path(\"runAsGroup\")).hasValueEqualTo(1000);\n\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_no_pod_security_context(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".securityContextEnabled\", \"false\"));\n\n        JsonNode podSpec = resources.getStatefulSet(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"securityContext\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @CsvSource({\n            \"jira,2001\",\n            \"confluence,2002\",\n            \"bitbucket,2003\",\n            \"crowd,2004\",\n            \"bamboo,2005\"\n    })\n    void test_pod_security_context_without_fsGroup(Product product, int fsGroup) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".securityContext.runAsGroup\", \"1000\"));\n\n        JsonNode podSpec = resources.getStatefulSet(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"securityContext\").path(\"fsGroup\")).hasValueEqualTo(fsGroup);\n        assertThat(podSpec.path(\"securityContext\").path(\"runAsGroup\")).hasValueEqualTo(1000);\n\n    }\n\n    @ParameterizedTest\n    @CsvSource({\n            \"jira,2001\",\n            \"confluence,2002\",\n            \"bitbucket,2003\",\n            \"crowd,2004\" // Bamboo didn't have 1.0.0 release that needs to be backward compatible\n    })\n\n    void test_pod_security_context_backward_compatible_disabled_context(Product product, int fsGroup) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".securityContext.fsGroup\", \"null\",\n                product + \".securityContext.gid\", \"1000\",\n                product + \".securityContext.enabled\", \"false\"));\n\n        JsonNode podSpec = resources.getStatefulSet(product.getHelmReleaseName()).getPodSpec();\n        assertThat(podSpec.path(\"securityContext\").path(\"fsGroup\")).hasValueEqualTo(fsGroup);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_container_security_context(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".containerSecurityContext.runAsGroup\", \"2000\"));\n\n        JsonNode containerSecurityContext = resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getSecurityContext();\n        assertThat(containerSecurityContext.path(\"runAsGroup\")).hasValueEqualTo(2000);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void test_synchrony_security_context(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.securityContext.fsGroup\", \"2000\",\n                \"synchrony.enabled\", \"true\"));\n\n        JsonNode podSecurityContext = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\").getPodSpec();\n        assertThat(podSecurityContext.path(\"securityContext\").path(\"fsGroup\")).hasValueEqualTo(2000);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void test_synchrony_container_security_context(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.containerSecurityContext.runAsGroup\", \"2000\",\n                \"synchrony.enabled\", \"true\"));\n\n        JsonNode containerSecurityContext = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\")\n                .getContainer()\n                .getSecurityContext();\n        assertThat(containerSecurityContext.path(\"runAsGroup\")).hasValueEqualTo(2000);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_cfs_group_change_policy_default(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        JsonNode containerSecurityContext = resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec().get(\"securityContext\");\n        assertThat(containerSecurityContext.path(\"fsGroupChangePolicy\")).hasTextEqualTo(\"OnRootMismatch\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_cfs_group_change_policy_override(Product product) throws Exception {\n\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".securityContext.fsGroupChangePolicy\", \"Always\"\n        ));\n\n        JsonNode containerSecurityContext = resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec().get(\"securityContext\");\n        assertThat(containerSecurityContext.path(\"fsGroupChangePolicy\")).hasTextEqualTo(\"Always\");\n    }\n}\n\n"
  },
  {
    "path": "src/test/java/test/ServerConfigTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.*;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass ServerConfigTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\", \"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void non_root_tests(Product product) throws Exception {\n        for (String[] args : new String[][]{{\"true\", \"false\"}, {\"false\", \"true\"}}) {\n            server_config_volumes(product, args[0], args[1]);\n            server_config_volume_mounts(product, args[0], args[1]);\n            server_config_config_map(product, args[0], args[1]);\n            use_custom_server_xml(product, args[0], args[1]);\n            enable_server_xml_config_map_ingress_defaults(product, args[0], args[1]);\n            enable_server_xml_config_map_ingress_http(product, args[0], args[1]);\n            server_xml_proxy_secure_overrides(product, args[0], args[1]);\n        }\n    }\n\n    void server_config_volumes(Product product, String generatedByHelm, String restrictedSCC) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", restrictedSCC,\n                product.name() + \".tomcatConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".seraphConfig.generateByHelm\", generatedByHelm\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        //assert server.xml volume\n        assertThat(statefulSet.getVolume(\"server-xml\").get().path(\"configMap\").get(\"name\")).hasTextEqualTo(product.getHelmReleaseName() + \"-server-config\");\n        assertThat(statefulSet.getVolume(\"server-xml\").get().path(\"configMap\").get(\"items\").path(0).path(\"key\")).hasTextEqualTo(\"server.xml\");\n        assertThat(statefulSet.getVolume(\"server-xml\").get().path(\"configMap\").get(\"items\").path(0).path(\"path\")).hasTextEqualTo(\"server.xml\");\n\n        //assert seraph-config.xml volume\n        if (!product.name().equals(\"crowd\")) {\n            assertThat(statefulSet.getVolume(\"seraph-config-xml\").get().path(\"configMap\").get(\"name\")).hasTextEqualTo(product.getHelmReleaseName() + \"-server-config\");\n            assertThat(statefulSet.getVolume(\"seraph-config-xml\").get().path(\"configMap\").get(\"items\").path(0).path(\"key\")).hasTextEqualTo(\"seraph-config.xml\");\n            assertThat(statefulSet.getVolume(\"seraph-config-xml\").get().path(\"configMap\").get(\"items\").path(0).path(\"path\")).hasTextEqualTo(\"seraph-config.xml\");\n        }\n\n        if (product.name().equals(\"bamboo\")) {\n            assertThat(statefulSet.getVolume(\"init-properties\").get().path(\"configMap\").get(\"name\")).hasTextEqualTo(product.getHelmReleaseName() + \"-init-properties\");\n        }\n    }\n\n    void server_config_volume_mounts(Product product, String generatedByHelm, String restrictedSCC) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", restrictedSCC,\n                product.name() + \".tomcatConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".seraphConfig.generateByHelm\", generatedByHelm\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        // assert server.xml volumeMount\n        String expectedServerXmlPath = String.format(\"/opt/atlassian/%s/conf/server.xml\", product.name());\n        if (product.name().equals(\"crowd\")) {\n            expectedServerXmlPath = String.format(\"/opt/atlassian/%s/apache-tomcat/conf/server.xml\", product.name());\n        }\n        assertThat(statefulSet.getContainer().getVolumeMount(\"server-xml\").path(\"mountPath\"))\n                .hasTextEqualTo(expectedServerXmlPath);\n        assertThat(statefulSet.getContainer().getVolumeMount(\"server-xml\").path(\"subPath\")).hasTextEqualTo(\"server.xml\");\n\n        // assert seraph-config.xml volumeMount\n        String productDirectory = product.name();\n        if (product.name().contains(\"jira\") || product.name().contains(\"bamboo\")) {\n            productDirectory = String.format(\"atlassian-%s\", product);\n        }\n\n        if (!product.name().equals(\"crowd\")) {\n            String expectedSeraphXmlPath = String.format(\"/opt/atlassian/%s/%s/WEB-INF/classes/seraph-config.xml\",\n                    product.name(), productDirectory);\n            assertThat(statefulSet.getContainer().getVolumeMount(\"seraph-config-xml\").path(\"mountPath\"))\n                    .hasTextEqualTo(expectedSeraphXmlPath);\n            assertThat(statefulSet.getContainer().getVolumeMount(\"seraph-config-xml\").path(\"subPath\")).hasTextEqualTo(\"seraph-config.xml\");\n        }\n\n        if (product.name().equals(\"bamboo\")) {\n            assertThat(statefulSet.getContainer().getVolumeMount(\"init-properties\").path(\"mountPath\"))\n                    .hasTextEqualTo(\"/opt/atlassian/bamboo/atlassian-bamboo/WEB-INF/classes/bamboo-init.properties\");\n        }\n    }\n\n    void server_config_config_map(Product product, String generatedByHelm, String restrictedSCC) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", restrictedSCC,\n                product.name() + \".tomcatConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".seraphConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".tomcatConfig.port\", \"1234\",\n                product.name() + \".tomcatConfig.acceptCount\", \"5678\",\n                product.name() + \".tomcatConfig.maxHttpHeaderSize\", \"9876\",\n                product.name() + \".tomcatConfig.maxThreads\", \"1000\",\n                product.name() + \".tomcatConfig.minSpareThreads\", \"200\",\n                product.name() + \".tomcatConfig.connectionTimeout\", \"30000\",\n                \"ingress.host\", String.format(\"%s.com\", product.name())\n                ));\n\n        // assert a few server.xml elements in server-config ConfigMap\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"Connector port=\\\"1234\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"maxDays=\\\"-1\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"requestAttributesEnabled=\\\"false\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"acceptCount=\\\"5678\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"maxHttpHeaderSize=\\\"9876\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyPort=\\\"443\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyName=\\\"\" + String.format(\"%s.com\", product.name()));\n\n    }\n    void use_custom_server_xml(Product product, String generatedByHelm, String restrictedSCC) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", restrictedSCC,\n                product.name() + \".tomcatConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".seraphConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".tomcatConfig.customServerXml\", \"<xml><Server>proxyName=\\\"example.com\\\"</Server></xml>\"\n        ));\n\n        // assert custom server.xml is used in configmap data\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyName=\\\"example.com\\\"\");\n    }\n\n    void enable_server_xml_config_map_ingress_defaults(Product product, String generatedByHelm, String restrictedSCC) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", restrictedSCC,\n                product.name() + \".tomcatConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".seraphConfig.generateByHelm\", generatedByHelm,\n                \"ingress.host\", String.format(\"%s.com\", product.name())\n        ));\n\n        // assert custom server.xml is used in configmap data\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyPort=\\\"443\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"secure=\\\"true\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"scheme=\\\"https\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyName=\\\"\" + String.format(\"%s.com\", product.name()));\n    }\n\n    void enable_server_xml_config_map_ingress_http(Product product, String generatedByHelm, String restrictedSCC) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", restrictedSCC,\n                product.name() + \".tomcatConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".seraphConfig.generateByHelm\", generatedByHelm,\n                \"ingress.https\", \"false\",\n                \"ingress.host\", String.format(\"%s.com\", product.name())\n        ));\n\n        // assert that ingress related properties are correctly set\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyPort=\\\"80\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"secure=\\\"false\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"scheme=\\\"http\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyName=\\\"\" + String.format(\"%s.com\", product.name()));\n    }\n\n    void server_xml_proxy_secure_overrides(Product product, String generatedByHelm, String restrictedSCC) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", restrictedSCC,\n                product.name() + \".tomcatConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".seraphConfig.generateByHelm\", generatedByHelm,\n                product.name() + \".tomcatConfig.proxyPort\", \"1234\",\n                product.name() + \".tomcatConfig.secure\", \"true\",\n                product.name() + \".tomcatConfig.scheme\", \"https\",\n                product.name() + \".tomcatConfig.proxyName\", \"foo.bar\"\n        ));\n\n        // assert that ingress related properties are correctly set\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyPort=\\\"1234\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"secure=\\\"true\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"scheme=\\\"https\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"proxyName=\\\"foo.bar\\\"\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void security_context_disabled_with_openshift(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", \"true\"\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getSpec().path(\"securityContext\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void disable_nfs_perm_fixer_openshift(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", \"true\"\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainers()).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void disable_security_context_jmx_openshift(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"openshift.runWithRestrictedSCC\", \"true\",\n                \"monitoring.exposeJmxMetrics\", \"true\"\n        ));\n\n        StatefulSet statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n        assertThat(statefulSet.getInitContainers().path(0).path(\"securityContext\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_connector_defaults(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".tomcatConfig.generateByHelm\", \"true\",\n                product.name() + \".tunnel.additionalConnector.port\", \"8093\"\n        ));\n\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"port=\\\"8093\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"connectionTimeout=\\\"20000\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"maxThreads=\\\"50\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"minSpareThreads=\\\"10\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"enableLookups=\\\"false\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"acceptCount=\\\"10\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"URIEncoding=\\\"UTF-8\\\"\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"}, mode = EnumSource.Mode.INCLUDE)\n    void additional_connector_overrides(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".tomcatConfig.generateByHelm\", \"true\",\n                product.name() + \".tunnel.additionalConnector.port\", \"8093\",\n                product.name() + \".tunnel.additionalConnector.connectionTimeout\", \"11\",\n                product.name() + \".tunnel.additionalConnector.maxThreads\", \"11\",\n                product.name() + \".tunnel.additionalConnector.minSpareThreads\", \"11\",\n                product.name() + \".tunnel.additionalConnector.enableLookups\", \"true\",\n                product.name() + \".tunnel.additionalConnector.acceptCount\", \"11\",\n                product.name() + \".tunnel.additionalConnector.secure\", \"true\",\n                product.name() + \".tunnel.additionalConnector.URIEncoding\", \"UTF-9\"\n        ));\n\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"port=\\\"8093\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"connectionTimeout=\\\"11\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"maxThreads=\\\"11\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"minSpareThreads=\\\"11\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"enableLookups=\\\"true\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"acceptCount=\\\"11\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"secure=\\\"true\\\"\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"URIEncoding=\\\"UTF-9\\\"\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"}, mode = EnumSource.Mode.INCLUDE)\n    void access_log_pattern_default(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".tomcatConfig.generateByHelm\", \"true\"\n        ));\n        String expectedPattern;\n        if (product == Product.confluence) {\n            expectedPattern = \"pattern=\\\"%h %{X-AUSERNAME}o %t &quot;%r&quot; %s %b %D %U %I &quot;%{User-Agent}i&quot;\";\n        } else expectedPattern = \"pattern=\\\"%a %{jira.request.id}r %{jira.request.username}r %t &quot;%m %U%q %H&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; &quot;%{jira.request.assession.id}r&quot;\";\n\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(expectedPattern);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"}, mode = EnumSource.Mode.INCLUDE)\n    void access_log_pattern_overrides(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".tomcatConfig.generateByHelm\", \"true\",\n                product.name() + \".tomcatConfig.accessLogPattern\", \"%%\"\n        ));\n        KubeResource serverConfigMap = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-server-config\");\n        assertThat(serverConfigMap.getConfigMapData().path(\"server.xml\")).hasTextContaining(\"%%\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ServiceAccountTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.KubeResource;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.ClusterRole;\nimport static test.model.Kind.ClusterRoleBinding;\nimport static test.model.Kind.ServiceAccount;\n\n/**\n * Tests the various permutations of the \"serviceAccount\" value structure in the Helm charts\n */\nclass ServiceAccountTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void serviceAccount_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"serviceAccount.name\", \"foo\"));\n\n        assertThat(resources.get(ServiceAccount).getName()).isEqualTo(\"foo\");\n\n        resources.getStatefulSets()\n                .forEach(statefulSet ->\n                        assertThat(statefulSet.getPodSpec().path(\"serviceAccountName\"))\n                                .describedAs(\"StatefulSet %s should have the configured ServiceAccount name\", statefulSet.getName())\n                                .hasTextEqualTo(\"foo\"));\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void serviceAccount_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"serviceAccount.annotations.myAnnotation\", \"myValue\"));\n\n        assertThat(resources.get(ServiceAccount).getAnnotations()).isObject(Map.of(\"myAnnotation\", \"myValue\"));\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void serviceAccount_create_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"serviceAccount.create\", \"false\"));\n\n        assertThat(resources.getAll(ServiceAccount))\n                .describedAs(\"No ServiceAccount resources should be created\")\n                .isEmpty();\n\n        resources.getStatefulSets()\n                .forEach(statefulSet ->\n                        assertThat(statefulSet.getPodSpec().path(\"serviceAccountName\"))\n                                .describedAs(\"StatefulSet %s should have the default ServiceAccount name\", statefulSet.getName())\n                                .hasTextEqualTo(\"default\"));\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void serviceAccount_name_create_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"serviceAccount.create\", \"false\",\n                \"serviceAccount.name\", \"foo\"));\n\n        assertThat(resources.getAll(ServiceAccount))\n                .describedAs(\"No ServiceAccount resources should be created\")\n                .isEmpty();\n\n        resources.getStatefulSets()\n                .forEach(statefulSet ->\n                        assertThat(statefulSet.getPodSpec().path(\"serviceAccountName\"))\n                                .describedAs(\"StatefulSet %s should have the configured ServiceAccount name\", statefulSet.getName())\n                                .hasTextEqualTo(\"foo\"));\n    }\n\n    @ParameterizedTest\n    @EnumSource(Product.class)\n    void serviceAccount_imagePullSecrets(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"serviceAccount.imagePullSecrets\", \"{foo,bar}\"));\n\n        assertThat(resources.get(ServiceAccount).getNode(\"imagePullSecrets\"))\n                .isArrayWithChildren(\"foo\", \"bar\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"bitbucket\"})\n    void cluster_role_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                \"serviceAccount.clusterRoleBinding.create\", \"true\",\n                \"serviceAccount.clusterRole.create\", \"true\",\n                \"serviceAccount.clusterRole.name\", \"foo\"));\n\n        assertThat(resources.get(ServiceAccount).getName())\n                .isEqualTo(product.getHelmReleaseName());\n        assertThat(resources.get(ClusterRole).getName())\n                .isEqualTo(\"foo\");\n\n        verifyClusterRoleBinding(resources.get(ClusterRoleBinding),\n                \"foo\", \"foo\", product.getHelmReleaseName());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"bitbucket\"})\n    void cluster_role_create_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                \"serviceAccount.clusterRoleBinding.create\", \"true\",\n                \"serviceAccount.clusterRole.create\", \"false\"));\n\n        assertThat(resources.get(ServiceAccount).getName())\n                .isEqualTo(product.getHelmReleaseName());\n\n        assertThat(resources.getAll(ClusterRole))\n                .describedAs(\"No ClusterRole resources should be created\")\n                .isEmpty();\n\n        verifyClusterRoleBinding(resources.get(ClusterRoleBinding),\n                product.getHelmReleaseName(), product.getHelmReleaseName(), product.getHelmReleaseName());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"bitbucket\"})\n    void cluster_role_binding_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".clustering.enabled\", \"true\",\n                \"serviceAccount.clusterRoleBinding.create\", \"true\",\n                \"serviceAccount.clusterRole.create\", \"true\",\n                \"serviceAccount.clusterRoleBinding.name\", \"foo\"));\n\n        assertThat(resources.get(ServiceAccount).getName())\n                .isEqualTo(product.getHelmReleaseName());\n        assertThat(resources.get(ClusterRole).getName())\n                .isEqualTo(product.getHelmReleaseName());\n\n        verifyClusterRoleBinding(resources.get(ClusterRoleBinding),\n                \"foo\", product.getHelmReleaseName(), product.getHelmReleaseName());\n    }\n\n    private void verifyClusterRoleBinding(final KubeResource clusterRoleBinding,\n                                          final String expectedName,\n                                          final String expectedRoleName,\n                                          final String expectedServiceAccountName) {\n        assertThat(clusterRoleBinding.getName())\n                .isEqualTo(expectedName);\n\n        assertThat(clusterRoleBinding.getNode(\"roleRef\", \"name\"))\n                .hasTextEqualTo(expectedRoleName);\n        assertThat(clusterRoleBinding.getNode(\"subjects\"))\n                .isArrayWithNumberOfChildren(1);\n\n        assertThat(clusterRoleBinding.getNode(\"subjects\").get(0))\n                .isObject(Map.of(\n                        \"kind\", \"ServiceAccount\",\n                        \"name\", expectedServiceAccountName));\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"})\n    void service_account_iam_annotation(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"serviceAccount.eksIrsa.roleArn\", \"dummy-arn\"));\n\n        assertThat(resources.get(ServiceAccount).getAnnotations()).isObject(Map.of(\"eks.amazonaws.com/role-arn\", \"dummy-arn\"));\n\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/ServiceTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Kind;\nimport test.model.Product;\nimport test.model.Service;\n\nimport java.util.Map;\n\nimport static org.assertj.vavr.api.VavrAssertions.assertThat;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\n/**\n * Tests the various permutations of the \"<product>.service\" value structure in the Helm charts\n */\nclass ServiceTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void service_port_type(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.port\", \"1234\",\n                product + \".service.type\", \"NodePort\",\n                product + \".service.nodePort\", \"30001\",\n                product + \".service.sshNodePort\", \"30002\",\n                \"synchrony.enabled\", \"true\"\n\n        ));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n\n        assertThat(service.getType())\n                .hasTextEqualTo(\"NodePort\");\n        assertThat(service.getPort(\"http\"))\n                .hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(1234));\n        assertThat(service.getPort(\"http\"))\n                .hasValueSatisfying(node -> assertThat(node.path(\"nodePort\")).hasValueEqualTo(30001));\n        if (product.name().equals(\"bitbucket\")) {\n            assertThat(service.getPort(\"ssh\"))\n                    .hasValueSatisfying(node -> assertThat(node.path(\"nodePort\")).hasValueEqualTo(30002));\n        }\n        if (product.name().equals(\"confluence\")) {\n            final var synchronyService = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n            assertThat(synchronyService.getPort(\"http\"))\n                    .hasValueSatisfying(node -> assertThat(node.path(\"nodePort\")).hasValueEqualTo(30001));\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void service_default_session_affinity(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.port\", \"1234\",\n                product + \".service.type\", \"NodePort\"\n        ));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n\n        assertThat(service.getSpec().path(\"sessionAffinity\")).hasTextEqualTo(\"None\");\n        assertThat(service.getSpec().path(\"sessionAffinityConfig\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void service_client_ip_session_affinity(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.sessionAffinity\", \"ClientIP\",\n                product + \".service.sessionAffinityConfig.clientIP.timeoutSeconds\", \"10\"\n        ));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n\n        assertThat(service.getSpec().path(\"sessionAffinity\")).hasTextEqualTo(\"ClientIP\");\n        assertThat(service.getSpec().path(\"sessionAffinityConfig\").path(\"clientIP\").path(\"timeoutSeconds\")).hasValueEqualTo(10);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void service_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.annotations.testAnnotation1\", \"test1\",\n                product + \".service.annotations.testAnnotation1\\\\.property\", \"test1.1\",\n                product + \".service.annotations.testAnnotation2\", \"test2\"\n        ));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n\n        assertThat(service.getAnnotations()).isObject(Map.of(\n                \"testAnnotation1\", \"test1\",\n                \"testAnnotation1.property\", \"test1.1\",\n                \"testAnnotation2\", \"test2\"\n        ));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void service_loadbalancer_type(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".service.type\", \"LoadBalancer\",\n                product + \".service.loadBalancerIP\", \"1.1.1.1\"\n        ));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n\n        assertThat(service.getType())\n                .hasTextEqualTo(\"LoadBalancer\");\n        assertThat(service.getLoadBalancerIP()).hasTextEqualTo(\"1.1.1.1\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_service_default_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"confluence.service.annotations.confluence\", \"qwerty\",\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        final var annotations = resources.get(Kind.Service, Service.class, product.getHelmReleaseName() + \"-synchrony\").getAnnotations();\n\n        assertThat(annotations).isObject(Map.of(\n                \"confluence\", \"qwerty\"\n        ));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_service_custom_annotations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.service.annotations.confluence\", \"qwerty-synchrony\",\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        final var annotations = resources.get(Kind.Service, Service.class, product.getHelmReleaseName() + \"-synchrony\").getAnnotations();\n\n        assertThat(annotations).isObject(Map.of(\n                \"confluence\", \"qwerty-synchrony\"\n        ));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\", \"confluence\"})\n    void dedicated_hazelcast_service(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product.name() + \".hazelcastService.enabled\", \"true\",\n                product.name() + \".hazelcastService.type\", \"myType\"\n\n        ));\n\n        final var hazelcastService = resources.get(Kind.Service, Service.class, product.getHelmReleaseName() + \"-hazelcast\");\n\n        assertThat(hazelcastService.getType()).hasTextEqualTo(\"myType\");\n        assertThat(hazelcastService.getPort(\"hazelcast\"))\n                .hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(5701));\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n        assertThat(service.getPort(\"hazelcast\")).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\", \"confluence\"})\n    void hazelcast_one_service(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        final var service = resources.get(Kind.Service, Service.class, product.getHelmReleaseName());\n        assertThat(service.getPort(\"hazelcast\"))\n                .hasValueSatisfying(node -> assertThat(node.path(\"port\")).hasValueEqualTo(5701));\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/SetPermissionTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.CsvSource;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport org.junit.jupiter.params.provider.ValueSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.model.Synchrony.synchronyStatefulSetName;\n\n/**\n * Tests the various permutations of the \"<product>.setPermissions\" value structure in the Helm charts\n */\nclass SetPermissionTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @CsvSource({\n            \"confluence,true\",\n            \"jira,false\",\n            \"bitbucket,true\",\n            \"crowd,false\",\n            \"bamboo,true\"\n    })\n    void test_set_permissions(String productName, String setPermission) throws Exception {\n        final var product = Product.valueOf(productName);\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".setPermissions\", setPermission));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"SET_PERMISSIONS\", setPermission);\n    }\n\n    @ParameterizedTest\n    @ValueSource(strings = {\"true\", \"false\"})\n    void test_set_permissions_synchrony(String setPermission) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(Product.confluence, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.setPermissions\", setPermission));\n\n        resources.getStatefulSet(synchronyStatefulSetName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"SET_PERMISSIONS\", setPermission);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/StatefulSetUpdateTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport com.fasterxml.jackson.databind.JsonNode;\nimport test.model.Product;\nimport test.model.StatefulSet;\n\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\npublic class StatefulSetUpdateTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void sts_on_delete_update(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"updateStrategy.type\", \"OnDelete\"\n        ));\n        StatefulSet sts = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode updateStrategy = sts.getSpec().path(\"updateStrategy\").path(\"type\");\n        assertEquals(\"OnDelete\", updateStrategy.asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void sts_on_not_set(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n        StatefulSet sts = resources.getStatefulSet(product.getHelmReleaseName());\n        JsonNode updateStrategy = sts.getSpec().path(\"updateStrategy\").path(\"type\");\n        assertThat(updateStrategy).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void sts_on_delete_update_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"updateStrategy.type\", \"OnDelete\",\n                \"synchrony.enabled\", \"true\"\n        ));\n        StatefulSet sts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode updateStrategy = sts.getSpec().path(\"updateStrategy\").path(\"type\");\n        assertEquals(\"OnDelete\", updateStrategy.asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void sts_on_not_set_synchrony(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\"\n        ));\n        StatefulSet sts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode updateStrategy = sts.getSpec().path(\"updateStrategy\").path(\"type\");\n        assertThat(updateStrategy).isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void sts_on_delete_update_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"updateStrategy.type\", \"OnDelete\",\n                \"bitbucket.mesh.enabled\", \"true\"\n        ));\n        StatefulSet sts = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        JsonNode updateStrategy = sts.getSpec().path(\"updateStrategy\").path(\"type\");\n        assertEquals(\"OnDelete\", updateStrategy.asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"}, mode = EnumSource.Mode.INCLUDE)\n    void sts_on_not_set_mesh(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"bitbucket.mesh.enabled\", \"true\"\n        ));\n        StatefulSet sts = resources.getStatefulSet(product.getHelmReleaseName() + \"-mesh\");\n        JsonNode updateStrategy = sts.getSpec().path(\"updateStrategy\").path(\"type\");\n        assertThat(updateStrategy).isEmpty();\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/SynchronyTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.node.IntNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.*;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass SynchronyTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_enable(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"ingress.host\", \"atlassian.net\",\n                \"ingress.path\", \"confluence\",\n                \"ingress.https\", \"true\"\n        ));\n\n        resources.assertContains(Kind.StatefulSet, product.getHelmReleaseName() + \"-synchrony\");\n        resources.assertContains(Kind.Service, product.getHelmReleaseName() + \"-synchrony\");\n\n        final var sysProps = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\")\n                .getNode(\"data\", \"additional_jvm_args\");\n\n        assertThat(sysProps)\n                .hasTextContaining(\"-Dsynchrony.service.url=https://atlassian.net/synchrony/v1\")\n                .hasTextNotContaining(\"synchrony.btf.disabled\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_disabled(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"false\"\n        ));\n\n        final var sysProps = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\")\n                .getNode(\"data\", \"additional_jvm_args\");\n\n        assertThat(sysProps).hasTextContaining(\"synchrony.btf.disabled\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_entrypoint(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        final var entrypoint = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-synchrony-entrypoint\")\n                .getNode(\"data\", \"start-synchrony.sh\");\n\n        assertThat(entrypoint)\n                .hasTextContaining(\"-Xss2048k\")\n                .hasTextContaining(\"-Xms1g\")\n                .hasTextContaining(\"-Xmx2g\")\n                .hasTextContaining(\"-XX:ActiveProcessorCount=2\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_small_cpu_request(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.resources.container.requests.cpu\", \"20m\"\n        ));\n\n        final var entrypoint = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-synchrony-entrypoint\")\n                .getNode(\"data\", \"start-synchrony.sh\");\n\n        assertThat(entrypoint)\n                .hasTextContaining(\"-XX:ActiveProcessorCount=1\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_custom_cpu_request(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.resources.container.requests.cpu\", \"5\"\n        ));\n\n        final var entrypoint = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-synchrony-entrypoint\")\n                .getNode(\"data\", \"start-synchrony.sh\");\n\n        assertThat(entrypoint)\n                .hasTextContaining(\"-XX:ActiveProcessorCount=5\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_replica_count(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.replicaCount\", \"2\"\n        ));\n\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n\n        IntNode expectedReplicas = new IntNode(2);\n\n        assertThat(synchronySts.getSpec().path(\"replicas\")).isEqualTo(expectedReplicas);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_additionalJvmArgs(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalJvmArgs[0]\", \"-Dfoo=1\",\n                \"synchrony.additionalJvmArgs[1]\", \"-Dbar=2\"\n        ));\n\n        final var entrypoint = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-synchrony-entrypoint\")\n                .getNode(\"data\", \"start-synchrony.sh\");\n\n        assertThat(entrypoint)\n                .hasSeparatedTextContaining(\"-Dfoo=1\")\n                .hasSeparatedTextContaining(\"-Dbar=2\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.resources.container.requests.cpu\", \"10\",\n                \"synchrony.resources.container.requests.memory\", \"10GB\",\n                \"synchrony.resources.container.limits.cpu\", \"20\",\n                \"synchrony.resources.container.limits.memory\", \"20GB\"\n        ));\n\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n\n        // verify requests\n        assertThat(synchronySts.getContainer(\"synchrony\").getRequests().path(\"cpu\")).hasValueEqualTo(10);\n        assertThat(synchronySts.getContainer(\"synchrony\").getRequests().path(\"memory\")).hasTextEqualTo(\"10GB\");\n\n        // verify limits\n        assertThat(synchronySts.getContainer(\"synchrony\").getLimits().path(\"cpu\")).hasValueEqualTo(20);\n        assertThat(synchronySts.getContainer(\"synchrony\").getLimits().path(\"memory\")).hasTextEqualTo(\"20GB\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_changesAnnotationChecksum(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        final var metadata = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\").getPodMetadata();\n        final var checksum = metadata.get(\"annotations\").get(\"checksum/config-jvm\");\n\n        assertThat(checksum).isNotNull();\n\n        final var resourcesWithChanges = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.additionalJvmArgs[0]\", \"-Dfoo=1\"));\n\n        final var metadataWithChanges = resourcesWithChanges.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\").getPodMetadata();\n        final var checksumWithChanges = metadataWithChanges.get(\"annotations\").get(\"checksum/config-jvm\");\n\n        assertThat(checksumWithChanges)\n                .isNotNull()\n                .isNotEqualTo(checksum);\n    }\n\n    @Test\n    void synchrony_custom_ports_are_include_in_jvm_args() throws Exception {\n        Product product = Product.confluence;\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.ports.http\", \"1234\",\n                \"synchrony.ports.hazelcast\", \"9876\"\n        ));\n\n        JsonNode startScript = resources.get(\n                Kind.ConfigMap,\n                product.getHelmReleaseName() + \"-synchrony-entrypoint\").getNode(\"data\").path(\"start-synchrony.sh\");\n\n        assertThat(startScript).hasTextContaining(\"-Dsynchrony.port=1234\");\n        assertThat(startScript).hasTextContaining(\"-Dcluster.listen.port=9876\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_custom_node_selector(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.nodeSelector.nodename\", \"special-node\"\n        ));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        assertThat(synchronySts.getPodSpec().path(\"nodeSelector\").path(\"nodename\")).hasTextEqualTo(\"special-node\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_confluence_node_selector(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"nodeSelector.nodename\", \"special-node\"\n        ));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        assertThat(synchronySts.getPodSpec().path(\"nodeSelector\").path(\"nodename\")).hasTextEqualTo(\"special-node\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_custom_scheduler_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.schedulerName\", \"my-scheduler\"));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        assertEquals(\"my-scheduler\", synchronySts.getPodSpec().path(\"schedulerName\").asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_confluence_scheduler_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"schedulerName\", \"my-scheduler1\"));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        assertEquals(\"my-scheduler1\", synchronySts.getPodSpec().path(\"schedulerName\").asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_custom_tolerations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.tolerations[0].key\", \"other-pod\",\n                \"synchrony.tolerations[0].operator\", \"Exists\",\n                \"synchrony.tolerations[0].effect\", \"NoSchedule\"));\n\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode tolerations = synchronySts.getPodSpec().get(\"tolerations\");\n        assertThat(tolerations).isArrayWithNumberOfChildren(1);\n        assertThat(tolerations.get(0).get(\"key\")).hasTextEqualTo(\"other-pod\");\n        assertThat(tolerations.get(0).get(\"operator\")).hasTextEqualTo(\"Exists\");\n        assertThat(tolerations.get(0).get(\"effect\")).hasTextContaining(\"NoSchedule\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_confluence_tolerations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"tolerations[0].key\", \"another-pod\",\n                \"tolerations[0].operator\", \"Exists\",\n                \"tolerations[0].effect\", \"NoSchedule\"));\n\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode tolerations = synchronySts.getPodSpec().get(\"tolerations\");\n        assertThat(tolerations).isArrayWithNumberOfChildren(1);\n        assertThat(tolerations.get(0).get(\"key\")).hasTextEqualTo(\"another-pod\");\n        assertThat(tolerations.get(0).get(\"operator\")).hasTextEqualTo(\"Exists\");\n        assertThat(tolerations.get(0).get(\"effect\")).hasTextContaining(\"NoSchedule\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_custom_affinity(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key\", \"kubernetes.io/os\",\n                \"synchrony.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator\", \"in\",\n                \"synchrony.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]\", \"centos\"));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode affinity = synchronySts.getPodSpec().get(\"affinity\");\n        assertThat(affinity.path(\"nodeAffinity\").path(\"requiredDuringSchedulingIgnoredDuringExecution\").path(\"nodeSelectorTerms\").get(0).path(\"matchExpressions\").get(0).path(\"values\").get(0)).hasTextEqualTo(\"centos\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_confluence_affinity(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key\", \"kubernetes.io/os\",\n                \"affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator\", \"in\",\n                \"affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]\", \"ubuntu\"));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode affinity = synchronySts.getPodSpec().get(\"affinity\");\n        assertThat(affinity.path(\"nodeAffinity\").path(\"requiredDuringSchedulingIgnoredDuringExecution\").path(\"nodeSelectorTerms\").get(0).path(\"matchExpressions\").get(0).path(\"values\").get(0)).hasTextEqualTo(\"ubuntu\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_custom_priority_class_names(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.priorityClassName\", \"high\"\n        ));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode priorityClassName = synchronySts.getPodSpec().get(\"priorityClassName\");\n        assertEquals(\"high\", priorityClassName.asText());\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_confluence_priority_class_names(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"priorityClassName\", \"high\"\n        ));\n        StatefulSet synchronySts = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\");\n        JsonNode priorityClassName = synchronySts.getPodSpec().get(\"priorityClassName\");\n        assertEquals(\"high\", priorityClassName.asText());\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_custom_topology_constraints(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"synchrony.topologySpreadConstraints[0].maxSkew\", \"1\",\n                \"synchrony.topologySpreadConstraints[0].topologyKey\", \"kubernetes.io/hostname\",\n                \"synchrony.topologySpreadConstraints[0].whenUnsatisfiable\", \"ScheduleAnyway\",\n                \"synchrony.topologySpreadConstraints[0].labelSelector.matchLabels.yourLabel\", \"yourSelector\"));\n        JsonNode topologySpreadConstraints = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\")\n                .getPodSpec()\n                .get(\"topologySpreadConstraints\");\n\n        assertThat(topologySpreadConstraints).isArrayWithNumberOfChildren(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"maxSkew\")).hasValueEqualTo(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"topologyKey\")).hasTextEqualTo(\"kubernetes.io/hostname\");\n        assertThat(topologySpreadConstraints.get(0).get(\"whenUnsatisfiable\")).hasTextContaining(\"ScheduleAnyway\");\n        assertThat(topologySpreadConstraints.get(0).get(\"labelSelector\").get(\"matchLabels\").get(\"yourLabel\")).hasTextContaining(\"yourSelector\");\n    }\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\"}, mode = EnumSource.Mode.INCLUDE)\n    void synchrony_confluence_topology_constraints(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                product + \".topologySpreadConstraints[0].maxSkew\", \"1\",\n                product + \".topologySpreadConstraints[0].topologyKey\", \"kubernetes.io/hostname\",\n                product + \".topologySpreadConstraints[0].whenUnsatisfiable\", \"ScheduleAnyway\",\n                product + \".topologySpreadConstraints[0].labelSelector.matchLabels.myLabel\", \"mySelector\"));\n\n\n        JsonNode topologySpreadConstraints = resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\")\n                .getPodSpec()\n                .get(\"topologySpreadConstraints\");\n        assertThat(topologySpreadConstraints).isArrayWithNumberOfChildren(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"maxSkew\")).hasValueEqualTo(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"topologyKey\")).hasTextEqualTo(\"kubernetes.io/hostname\");\n        assertThat(topologySpreadConstraints.get(0).get(\"whenUnsatisfiable\")).hasTextContaining(\"ScheduleAnyway\");\n        assertThat(topologySpreadConstraints.get(0).get(\"labelSelector\").get(\"matchLabels\").get(\"myLabel\")).hasTextContaining(\"mySelector\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_service_url(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"ingress.host\", \"atlassian.net\",\n                \"ingress.path\", \"confluence\",\n                \"ingress.https\", \"false\",\n                \"synchrony.service.url\", \"https://atlassian.net/synchrony\"\n        ));\n\n        resources.assertContains(Kind.StatefulSet, product.getHelmReleaseName() + \"-synchrony\");\n        resources.assertContains(Kind.Service, product.getHelmReleaseName() + \"-synchrony\");\n\n        final var sysProps = resources.get(Kind.ConfigMap, product.getHelmReleaseName() + \"-jvm-config\")\n                .getNode(\"data\", \"additional_jvm_args\");\n\n        assertThat(sysProps)\n                .hasTextContaining(\"-Dsynchrony.service.url=https://atlassian.net/synchrony/v1\")\n                .hasTextNotContaining(\"-Dsynchrony.service.url=http://atlassian.net/synchrony/v1\");\n\n        resources.getStatefulSet(product.getHelmReleaseName() + \"-synchrony\")\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"SYNCHRONY_SERVICE_URL\", \"https://atlassian.net/synchrony\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/TestPodsTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.assertj.vavr.api.VavrAssertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.*;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass TestPodsTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_default_annotations(Product product) throws Exception {\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    \"database.credentials.secretName\", \"db-secret\"\n            ));\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            assertThat(pod.getAnnotations()).isObject(Map.of(\n                    \"helm.sh/hook\", \"test\",\n                    \"helm.sh/hook-delete-policy\", \"before-hook-creation,hook-succeeded\"\n            ));\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_annotations(Product product) throws Exception {\n\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    \"database.credentials.secretName\", \"db-secret\",\n                    \"testPods.annotations.podAnnotation1\", \"podOfHumpbacks\",\n                    \"testPods.annotations.podAnnotation2\", \"podOfOrcas\"\n            ));\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            assertThat(pod.getAnnotations()).isObject(Map.of(\n                    \"podAnnotation1\", \"podOfHumpbacks\",\n                    \"podAnnotation2\", \"podOfOrcas\"\n            ));\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_default_labels(Product product) throws Exception {\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        String helmChartVersion = product.getHelmChartVersion();\n        String appVersion = product.getAppVersion();\n        for (String testPod : testPods) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    \"database.credentials.secretName\", \"db-secret\"\n            ));\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            assertThat(pod.getMetadata().path(\"labels\")).isObject(Map.of(\n                    \"helm.sh/chart\", product.name() + \"-\" + helmChartVersion,\n                    \"app.kubernetes.io/name\",product.name(),\n                    \"app.kubernetes.io/instance\", product.getHelmReleaseName(),\n                    \"app.kubernetes.io/version\", appVersion,\n                    \"app.kubernetes.io/managed-by\", \"Helm\"\n            ));\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_labels(Product product) throws Exception {\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n            final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                    \"database.credentials.secretName\", \"db-secret\",\n                    \"testPods.labels.label1\", \"value1\",\n                    \"testPods.labels.label2\", \"value2\"\n            ));\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            assertThat(pod.getMetadata().path(\"labels\")).isObject(Map.of(\n                    \"label1\", \"value1\",\n                    \"label2\", \"value2\"\n            ));\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_node_selector(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.credentials.secretName\", \"db-secret\",\n                \"testPods.nodeSelector.nodename\", \"special-node\"\n        ));\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n\n            assertThat(pod.getSpec().path(\"nodeSelector\").path(\"nodename\")).hasTextEqualTo(\"special-node\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_scheduler_name(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.credentials.secretName\", \"db-secret\",\n                \"testPods.schedulerName\", \"my-scheduler\"));\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            assertEquals(\"my-scheduler\", pod.getSpec().path(\"schedulerName\").asText());\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_resources(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.credentials.secretName\", \"db-secret\",\n                \"testPods.resources.requests.cpu\", \"1\",\n                \"testPods.resources.limits.cpu\", \"2\",\n                \"testPods.resources.requests.memory\", \"2Mi\",\n                \"testPods.resources.limits.memory\", \"3Mi\"));\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            assertEquals(\"1\", pod.getSpec().path(\"containers\").path(0).path(\"resources\").path(\"requests\").path(\"cpu\").asText());\n            assertEquals(\"2\", pod.getSpec().path(\"containers\").path(0).path(\"resources\").path(\"limits\").path(\"cpu\").asText());\n            assertEquals(\"2Mi\", pod.getSpec().path(\"containers\").path(0).path(\"resources\").path(\"requests\").path(\"memory\").asText());\n            assertEquals(\"3Mi\", pod.getSpec().path(\"containers\").path(0).path(\"resources\").path(\"limits\").path(\"memory\").asText());\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_images(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"testPods.image.statusTestContainer\", \"centos\",\n                \"testPods.image.permissionsTestContainer\", \"centos\"));\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        for (String testPod : testPods) {\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            assertEquals(\"centos\", pod.getSpec().path(\"containers\").path(0).path(\"image\").asText());\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_tolerations(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.credentials.secretName\", \"db-secret\",\n                \"testPods.tolerations[0].key\", \"other-pod\",\n                \"testPods.tolerations[0].operator\", \"Exists\",\n                \"testPods.tolerations[0].effect\", \"NoSchedule\"));\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            JsonNode tolerations = pod.getSpec().get(\"tolerations\");\n            assertThat(tolerations).isArrayWithNumberOfChildren(1);\n            assertThat(tolerations.get(0).get(\"key\")).hasTextEqualTo(\"other-pod\");\n            assertThat(tolerations.get(0).get(\"operator\")).hasTextEqualTo(\"Exists\");\n            assertThat(tolerations.get(0).get(\"effect\")).hasTextContaining(\"NoSchedule\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_pods_custom_affinity(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"database.credentials.secretName\", \"db-secret\",\n                \"testPods.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key\", \"kubernetes.io/os\",\n                \"testPods.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator\", \"in\",\n                \"testPods.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]\", \"centos\"));\n        List<String> testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\", \"db-connectivity-test\");\n        if (product.name().equals(\"crowd\")) {\n            testPods = List.of(\"application-status-test\", \"shared-home-permissions-test\");\n        }\n        for (String testPod : testPods) {\n            final var pod = resources.get(Kind.Pod, Pod.class, product.getHelmReleaseName() + \"-\" + testPod);\n            JsonNode affinity = pod.getSpec().get(\"affinity\");\n            assertThat(affinity.path(\"nodeAffinity\").path(\"requiredDuringSchedulingIgnoredDuringExecution\").path(\"nodeSelectorTerms\").get(0).path(\"matchExpressions\").get(0).path(\"values\").get(0)).hasTextEqualTo(\"centos\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/TopologySpreadConstraintsTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\nclass TopologySpreadConstraintsTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_topology_constraint_on_pods_in_statefulset(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".topologySpreadConstraints[0].maxSkew\", \"1\",\n                product + \".topologySpreadConstraints[0].topologyKey\", \"kubernetes.io/hostname\",\n                product + \".topologySpreadConstraints[0].whenUnsatisfiable\", \"ScheduleAnyway\",\n                product + \".topologySpreadConstraints[0].labelSelector.matchLabels.myLabel\", \"mySelector\"));\n\n\n        JsonNode topologySpreadConstraints = resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec()\n                .get(\"topologySpreadConstraints\");\n        assertThat(topologySpreadConstraints).isArrayWithNumberOfChildren(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"maxSkew\")).hasValueEqualTo(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"topologyKey\")).hasTextEqualTo(\"kubernetes.io/hostname\");\n        assertThat(topologySpreadConstraints.get(0).get(\"whenUnsatisfiable\")).hasTextContaining(\"ScheduleAnyway\");\n        assertThat(topologySpreadConstraints.get(0).get(\"labelSelector\").get(\"matchLabels\").get(\"myLabel\")).hasTextContaining(\"mySelector\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.INCLUDE)\n    void test_topology_constraints_on_pods_in_agent_deployment(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"agent.topologySpreadConstraints[0].maxSkew\", \"1\",\n                \"agent.topologySpreadConstraints[0].topologyKey\", \"kubernetes.io/hostname\",\n                \"agent.topologySpreadConstraints[0].whenUnsatisfiable\", \"ScheduleAnyway\",\n                \"agent.topologySpreadConstraints[0].labelSelector.matchLabels.myLabel\", \"mySelector\"));\n\n\n        JsonNode topologySpreadConstraints = resources.getDeployment(product.getHelmReleaseName())\n                .getPodSpec()\n                .get(\"topologySpreadConstraints\");\n        assertThat(topologySpreadConstraints).isArrayWithNumberOfChildren(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"maxSkew\")).hasValueEqualTo(1);\n        assertThat(topologySpreadConstraints.get(0).get(\"topologyKey\")).hasTextEqualTo(\"kubernetes.io/hostname\");\n        assertThat(topologySpreadConstraints.get(0).get(\"whenUnsatisfiable\")).hasTextContaining(\"ScheduleAnyway\");\n        assertThat(topologySpreadConstraints.get(0).get(\"labelSelector\").path(\"matchLabels\").path(\"myLabel\")).hasTextContaining(\"mySelector\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void test_default_topology_doesnt_exist_in_statefulset(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        assertThat(resources.getStatefulSet(product.getHelmReleaseName())\n                .getPodSpec()\n                .get(\"topologySpreadConstraints\")).isNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.INCLUDE)\n    void test_default_topology_doesnt_exist_in_deployment(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of());\n\n        assertThat(resources.getDeployment(product.getHelmReleaseName())\n                .getPodSpec()\n                .get(\"topologySpreadConstraints\")).isNull();\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/TunnelTest.java",
    "content": "package test;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static test.jackson.JsonNodeAssert.assertThat;\n\npublic class TunnelTest {\n\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"})\n    void confluenceTunnelJvmArg(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".tunnel.additionalConnector.port\", \"8093\"));\n\n        final var configMap = resources.getConfigMap(product.getHelmReleaseName() + \"-jvm-config\").getDataByKey(\"additional_jvm_args\");\n        assertThat(configMap).hasTextContaining(\"-Dsecure.tunnel.upstream.port=8093\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"})\n    void confluenceAdditionalConnectorVarsDefaults(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".tunnel.additionalConnector.port\", \"8093\"));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_PORT\", \"8093\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_CONNECTION_TIMEOUT\", \"20000\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_MAX_THREADS\", \"50\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_MIN_SPARE_THREADS\", \"10\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_ENABLE_LOOKUPS\", \"false\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_ACCEPT_COUNT\", \"10\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_URI_ENCODING\", \"UTF-8\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"confluence\", \"jira\"})\n    void confluenceAdditionalConnectorVarsOverrides(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                product + \".tunnel.additionalConnector.port\", \"8093\",\n                product + \".tunnel.additionalConnector.connectionTimeout\", \"30000\",\n                product + \".tunnel.additionalConnector.maxThreads\", \"100\",\n                product + \".tunnel.additionalConnector.minSpareThreads\", \"20\",\n                product + \".tunnel.additionalConnector.enableLookups\", \"true\",\n                product + \".tunnel.additionalConnector.acceptCount\", \"20\",\n                product + \".tunnel.additionalConnector.URIEncoding\", \"ISO-8859-1\",\n                product + \".tunnel.additionalConnector.secure\", \"true\"\n\n        ));\n\n        resources.getStatefulSet(product.getHelmReleaseName())\n                .getContainer()\n                .getEnv()\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_PORT\", \"8093\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_CONNECTION_TIMEOUT\", \"30000\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_MAX_THREADS\", \"100\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_MIN_SPARE_THREADS\", \"20\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_ENABLE_LOOKUPS\", \"true\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_ACCEPT_COUNT\", \"20\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_URI_ENCODING\", \"ISO-8859-1\")\n                .assertHasValue(\"ATL_TOMCAT_ADDITIONAL_CONNECTOR_SECURE\", \"true\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/VolumesTest.java",
    "content": "package test;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.assertj.core.api.Assertions;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.TestInfo;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.EnumSource;\nimport test.helm.Helm;\nimport test.model.Product;\n\nimport java.util.Map;\n\nimport static org.assertj.vavr.api.VavrAssertions.assertThat;\nimport static test.jackson.JsonNodeAssert.assertThat;\nimport static test.model.Kind.PersistentVolume;\nimport static test.model.Kind.PersistentVolumeClaim;\nimport static test.model.Synchrony.synchronyStatefulSetName;\n\n/**\n * Tests the various permutations of the \"persistence\" value structure in the Helm charts\n */\nclass VolumesTest {\n    private Helm helm;\n\n    @BeforeEach\n    void initHelm(TestInfo testInfo) {\n        helm = new Helm(testInfo);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void localHome_pvc_create(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.localHome.persistentVolumeClaim.create\", \"true\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        assertThat(statefulSet.getVolumeClaimTemplates())\n                .describedAs(\"StatefulSet %s should have a single volumeClaimTemplate\", statefulSet.getName())\n                .hasSize(1);\n\n        verifyVolumeClaimTemplate(\n                statefulSet.getVolumeClaimTemplates().head(),\n                \"local-home\", \"ReadWriteOnce\");\n\n        assertThat(statefulSet.getVolume(\"local-home\"))\n                .describedAs(\"StatefulSet %s should not have a local-home volume in the pod spec\", statefulSet.getName())\n                .isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void sharedHome_pvc_create(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n\n        final var kubeResource = resources.get(PersistentVolumeClaim);\n        Assertions.assertThat(kubeResource.getName()).isEqualTo(product.getHelmReleaseName() + \"-shared-home\");\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        assertThat(statefulSet.getVolume(\"shared-home\"))\n                .describedAs(\"StatefulSet %s should not have a local-home volume in the pod spec\", statefulSet.getName())\n                .hasValueSatisfying(volume ->\n                        assertThat(volume.required(\"persistentVolumeClaim\").required(\"claimName\"))\n                                .hasTextEqualTo(product.getHelmReleaseName() + \"-shared-home\"));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\", \"bitbucket\"}, mode = EnumSource.Mode.EXCLUDE)\n    void sharedHome_pvc_create_access_modes(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.sharedHome.persistentVolumeClaim.accessModes[0]\", \"ReadWriteOnce\"\n        ));\n\n        final var accessModes = resources.get(PersistentVolumeClaim).getSpec().get(\"accessModes\");\n        assertThat(accessModes).isArrayWithChildren(\"ReadWriteOnce\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bitbucket\"})\n    void sharedHome_pvc_create_access_mode(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.sharedHome.persistentVolumeClaim.accessMode\", \"ReadWriteOnce\"\n        ));\n\n        final var accessModes = resources.get(PersistentVolumeClaim).getSpec().get(\"accessModes\");\n        assertThat(accessModes).isArrayWithChildren(\"ReadWriteOnce\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void localHome_custom_volume(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.localHome.customVolume.hostPath\", \"/foo/bar\" // not actually a valid hostPath definition, but it works for the test\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        assertThat(statefulSet.getVolume(\"local-home\"))\n                .hasValueSatisfying(localHomeVolume -> assertThat(localHomeVolume).isObject(Map.of(\"hostPath\", \"/foo/bar\")));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void localHome_pvc_custom(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.localHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.localHome.persistentVolumeClaim.storageClassName\", \"foo\",\n                \"volumes.localHome.persistentVolumeClaim.resources.requests.storage\", \"2Gi\",\n                \"volumes.localHome.mountPath\", \"/foo/bar\",\n                \"volumes.localHome.subPath\", \"sub\"));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        final var localHomeVolumeClaimTemplate = statefulSet.getVolumeClaimTemplates().head();\n        verifyVolumeClaimTemplate(localHomeVolumeClaimTemplate, \"local-home\", \"ReadWriteOnce\");\n        assertThat(localHomeVolumeClaimTemplate.path(\"spec\").path(\"storageClassName\"))\n                .hasTextEqualTo(\"foo\");\n        assertThat(localHomeVolumeClaimTemplate.path(\"spec\").path(\"resources\").path(\"requests\").path(\"storage\"))\n                .hasTextEqualTo(\"2Gi\");\n        final var mount = statefulSet.getContainer().getVolumeMount(\"local-home\");\n        assertThat(mount.get(\"name\")).hasTextEqualTo(\"local-home\");\n        assertThat(mount.get(\"mountPath\")).hasTextEqualTo(\"/foo/bar\");\n        assertThat(mount.get(\"subPath\")).hasTextEqualTo(\"sub\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void localHome_pvc_custom_with_retention_policy(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.localHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted\", \"Delete\",\n                \"volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled\", \"Retain\"));\n\n        final var pvcRetentionPolicy = resources.getStatefulSet(product.getHelmReleaseName()).\n                getSpec().get(\"persistentVolumeClaimRetentionPolicy\");\n\n        assertThat(pvcRetentionPolicy.get(\"whenDeleted\")).hasTextEqualTo(\"Delete\");\n        assertThat(pvcRetentionPolicy.get(\"whenScaled\")).hasTextEqualTo(\"Retain\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void localHome_pvc_custom_without_retention_policy(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.localHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.localHome.persistentVolumeClaimRetentionPolicy.whenDeleted\", \"\",\n                \"volumes.localHome.persistentVolumeClaimRetentionPolicy.whenScaled\", \"\"));\n\n        final var pvcRetentionPolicy = resources.getStatefulSet(product.getHelmReleaseName()).\n                getSpec().get(\"persistentVolumeClaimRetentionPolicy\");\n\n        assertThat(pvcRetentionPolicy).isNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void sharedHome_custom_volume(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.customVolume.hostPath\", \"/foo/bar\" // not actually a valid hostPath definition, but it works for the test\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        assertThat(statefulSet.getVolume(\"shared-home\"))\n                .hasValueSatisfying(localHomeVolume -> assertThat(localHomeVolume).isObject(Map.of(\"hostPath\", \"/foo/bar\")));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class)\n    void additionalVolumeDefinition(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.additional[0].name\", \"my-volume\",\n                \"volumes.additional[0].persistentVolumeClaim.claimName\", \"my-volume-pvc\"\n        ));\n        if (product.name().equals(\"bamboo_agent\")) {\n            final var deployment = resources.getDeployment(product.getHelmReleaseName());\n            assertThat(deployment.getVolume(\"my-volume\").get().path(\"persistentVolumeClaim\").path(\"claimName\"))\n                    .hasTextEqualTo(\"my-volume-pvc\");\n        } else {\n            final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n            assertThat(statefulSet.getVolume(\"my-volume\").get().path(\"persistentVolumeClaim\").path(\"claimName\"))\n                    .hasTextEqualTo(\"my-volume-pvc\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class)\n    void additionalVolumeMounts(Product product) throws Exception {\n        var pname = product.name().toLowerCase();\n        if (product.name().equals(\"bamboo_agent\")) {\n            pname = \"agent\";\n        }\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                pname + \".additionalVolumeMounts[0].name\", \"my-volume-mount\",\n                pname + \".additionalVolumeMounts[0].mountPath\", \"/my-volume-path\",\n                pname + \".additionalVolumeMounts[0].subPath\", \"extra_path\"\n        ));\n\n        if (product.name().equals(\"bamboo_agent\")) {\n            final var deployment = resources.getDeployment(product.getHelmReleaseName());\n            final var mount = deployment.getContainer().getVolumeMount(\"my-volume-mount\");\n            assertThat(mount.get(\"mountPath\")).hasTextEqualTo(\"/my-volume-path\");\n            assertThat(mount.get(\"subPath\")).hasTextEqualTo(\"extra_path\");\n\n        } else {\n            final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n            final var mount = statefulSet.getContainer().getVolumeMount(\"my-volume-mount\");\n            assertThat(mount.get(\"mountPath\")).hasTextEqualTo(\"/my-volume-path\");\n            assertThat(mount.get(\"subPath\")).hasTextEqualTo(\"extra_path\");\n        }\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucketSharedHomeClaimUsesDefaultVolumeName(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolume.create\", \"true\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\"\n        ));\n\n        final String volumeName = product.getHelmReleaseName() + \"-shared-home-pv\";\n        final var pvc = resources.get(PersistentVolumeClaim);\n        final var pv = resources.get(PersistentVolume);\n        Assertions.assertThat(pv.getName()).isEqualTo(volumeName);\n        Assertions.assertThat(pvc.getNode(\"spec\").get(\"volumeName\").asText()).isEqualTo(volumeName);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"bitbucket\")\n    void bitbucketSharedHomeClaimUsesSuppliedVolumeName(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"volumes.sharedHome.persistentVolume.create\", \"false\",\n                \"volumes.sharedHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.sharedHome.persistentVolumeClaim.volumeName\", \"my-custom-volume\"\n        ));\n        final var pvc = resources.get(PersistentVolumeClaim);\n        Assertions.assertThat(pvc.getNode(\"spec\").get(\"volumeName\").asText()).isEqualTo(\"my-custom-volume\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchronyHome_pvc_create(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"volumes.synchronyHome.persistentVolumeClaim.create\", \"true\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n\n        assertThat(statefulSet.getVolumeClaimTemplates())\n                .describedAs(\"StatefulSet %s should have a single volumeClaimTemplate\", statefulSet.getName())\n                .hasSize(1);\n\n        verifyVolumeClaimTemplate(\n                statefulSet.getVolumeClaimTemplates().head(),\n                \"synchrony-home\", \"ReadWriteOnce\");\n\n        assertThat(statefulSet.getVolume(\"synchrony-home\"))\n                .describedAs(\"StatefulSet %s should not have a synchrony-home volume in the pod spec\", statefulSet.getName())\n                .isEmpty();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchronyHome_custom_volume(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"volumes.synchronyHome.customVolume.hostPath\", \"/foo/bar\" // not actually a valid hostPath definition, but it works for the test\n        ));\n\n        final var statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n\n        assertThat(statefulSet.getVolume(\"synchrony-home\"))\n                .hasValueSatisfying(synchronyHomeVolume -> assertThat(synchronyHomeVolume).isObject(Map.of(\"hostPath\", \"/foo/bar\")));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_additional_volume(Product product) throws Exception {\n        String volumeName = \"cache\";\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"volumes.additionalSynchrony[0].name\", volumeName,\n                \"volumes.additionalSynchrony[0].emptyDir\", \"{}\",\n                \"synchrony.additionalVolumeMounts[0].name\", \"cache-mount\",\n                \"synchrony.additionalVolumeMounts[0].volumeName\", volumeName,\n                \"synchrony.additionalVolumeMounts[0].mountPath\", \"/path\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n\n        long additionalCacheVolumeCount = statefulSet.getVolumes()\n                .findValues(\"name\")\n                .stream()\n                .filter(it -> it.textValue().contains(volumeName))\n                .count();\n        Assertions.assertThat(additionalCacheVolumeCount).isEqualTo(1);\n\n        assertThat(statefulSet.getContainer(\"synchrony\").getVolumeMount(\"cache-mount\"))\n                .isObject(\n                        Map.of(\"mountPath\", \"/path\", \"volumeName\", volumeName));\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchronyHome_pvc_custom(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"volumes.synchronyHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.synchronyHome.persistentVolumeClaim.storageClassName\", \"foo\",\n                \"volumes.synchronyHome.persistentVolumeClaim.resources.requests.storage\", \"2Gi\",\n                \"volumes.synchronyHome.mountPath\", \"/foo/bar\"));\n\n        final var statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n\n        final var synchronyHomeVolumeClaimTemplate = statefulSet.getVolumeClaimTemplates().head();\n        verifyVolumeClaimTemplate(synchronyHomeVolumeClaimTemplate, \"synchrony-home\", \"ReadWriteOnce\");\n        assertThat(synchronyHomeVolumeClaimTemplate.path(\"spec\").path(\"storageClassName\"))\n                .hasTextEqualTo(\"foo\");\n        assertThat(synchronyHomeVolumeClaimTemplate.path(\"spec\").path(\"resources\").path(\"requests\").path(\"storage\"))\n                .hasTextEqualTo(\"2Gi\");\n        final var mount = statefulSet.getContainer(\"synchrony\").getVolumeMount(\"synchrony-home\");\n        assertThat(mount.get(\"name\")).hasTextEqualTo(\"synchrony-home\");\n        assertThat(mount.get(\"mountPath\")).hasTextEqualTo(\"/foo/bar\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchronyHome_pvc_custom_with_retention_policy(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"volumes.synchronyHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenDeleted\", \"Delete\",\n                \"volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenScaled\", \"Retain\"));\n\n        final var pvcRetentionPolicy = resources.getStatefulSet(synchronyStatefulSetName()).\n                getSpec().get(\"persistentVolumeClaimRetentionPolicy\");\n\n        assertThat(pvcRetentionPolicy.get(\"whenDeleted\")).hasTextEqualTo(\"Delete\");\n        assertThat(pvcRetentionPolicy.get(\"whenScaled\")).hasTextEqualTo(\"Retain\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchronyHome_pvc_custom_without_retention_policy(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"volumes.synchronyHome.persistentVolumeClaim.create\", \"true\",\n                \"volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenDeleted\", \"\",\n                \"volumes.synchronyHome.persistentVolumeClaimRetentionPolicy.whenScaled\", \"\"));\n\n        final var pvcRetentionPolicy = resources.getStatefulSet(synchronyStatefulSetName()).\n                getSpec().get(\"persistentVolumeClaimRetentionPolicy\");\n\n        assertThat(pvcRetentionPolicy).isNull();\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = {\"bamboo_agent\"}, mode = EnumSource.Mode.EXCLUDE)\n    void additionalVolumeClaimTemplate(Product product) throws Exception {\n        final var pname = product.name().toLowerCase();\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                pname + \".additionalVolumeClaimTemplates[0].name\", \"my-additional-volume-claim-template\",\n                pname + \".additionalVolumeClaimTemplates[0].storageClassName\", \"foo\",\n                pname + \".additionalVolumeClaimTemplates[0].resources.requests.storage\", \"2Gi\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(product.getHelmReleaseName());\n\n        final var additionalVolumeClaimTemplate = statefulSet.getVolumeClaimTemplates().head();\n        verifyVolumeClaimTemplate(additionalVolumeClaimTemplate, \"my-additional-volume-claim-template\", \"ReadWriteOnce\");\n        assertThat(additionalVolumeClaimTemplate.path(\"spec\").path(\"storageClassName\"))\n                .hasTextEqualTo(\"foo\");\n        assertThat(additionalVolumeClaimTemplate.path(\"spec\").path(\"resources\").path(\"requests\").path(\"storage\"))\n                .hasTextEqualTo(\"2Gi\");\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_volume_default_mode(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n        ObjectMapper objectMapper = new ObjectMapper();\n        JsonNode jsonNode = objectMapper.readTree(\"{\\\"name\\\":\\\"entrypoint-script\\\",\\\"configMap\\\":{\\\"name\\\":\\\"unittest-confluence-synchrony-entrypoint\\\",\\\"defaultMode\\\":484}}\");\n        assertThat(statefulSet.getVolume(\"entrypoint-script\")).contains(jsonNode);\n    }\n\n    @ParameterizedTest\n    @EnumSource(value = Product.class, names = \"confluence\")\n    void synchrony_volume_custom_default_mode(Product product) throws Exception {\n        final var resources = helm.captureKubeResourcesFromHelmChart(product, Map.of(\n                \"synchrony.enabled\", \"true\",\n                \"volumes.defaultPermissionsMode\", \"485\"\n        ));\n\n        final var statefulSet = resources.getStatefulSet(synchronyStatefulSetName());\n        ObjectMapper objectMapper = new ObjectMapper();\n        JsonNode jsonNode = objectMapper.readTree(\"{\\\"name\\\":\\\"entrypoint-script\\\",\\\"configMap\\\":{\\\"name\\\":\\\"unittest-confluence-synchrony-entrypoint\\\",\\\"defaultMode\\\":485}}\");\n        assertThat(statefulSet.getVolume(\"entrypoint-script\")).contains(jsonNode);\n    }\n\n    private void verifyVolumeClaimTemplate(JsonNode volumeClaimTemplate, final String expectedVolumeName, final String... expectedAccessModes) {\n        assertThat(volumeClaimTemplate.path(\"metadata\").path(\"name\"))\n                .hasTextEqualTo(expectedVolumeName);\n        assertThat(volumeClaimTemplate.path(\"spec\").path(\"accessModes\"))\n                .isArrayWithChildren(expectedAccessModes);\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/helm/Helm.java",
    "content": "package test.helm;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\nimport io.vavr.collection.HashMap;\nimport org.junit.jupiter.api.TestInfo;\nimport test.model.KubeResources;\nimport test.model.Product;\n\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.lang.reflect.Method;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.Map;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\n/**\n * A wrapper around the helm CLI tool, which we use for rendering a chart's templates and capturing the output.\n */\npublic final class Helm {\n    private final TestInfo testInfo;\n\n    public Helm(TestInfo testInfo) {\n        this.testInfo = testInfo;\n    }\n\n    public Path captureHelmTemplateOutput(Product product, Path valuesFile) throws Exception {\n        final var outputFile = getHelmTemplateOutputFile(product);\n        captureHelmTemplateOutput(product, valuesFile, outputFile);\n        return outputFile;\n    }\n\n    public void assertLintedHelm(Product product) throws Exception {\n        final var process = new ProcessBuilder()\n                .command(\"helm\", \"lint\",\n                        getHelmChartPath(product).toString())\n                .start();\n        final var exitCode = process.waitFor();\n        if (exitCode != 0) {\n            System.out.println(new String(process.getInputStream().readAllBytes()));\n        }\n        assertThat(exitCode).isEqualTo(0);\n    }\n\n    private static void captureHelmTemplateOutput(Product product, Path valuesFile, Path outputFile) throws Exception {\n        final var process = new ProcessBuilder()\n                .command(\"helm\", \"template\",\n                        product.getHelmReleaseName(),\n                        getHelmChartPath(product).toString(),\n                        \"--debug\",\n                        \"-n mynamespace\",\n                        \"--values\",\n                        valuesFile.toString())\n                .redirectOutput(outputFile.toFile())\n                .redirectError(outputFile.toFile())\n                .start();\n        final var exitCode = process.waitFor();\n        assertThat(exitCode).isEqualTo(0);\n    }\n\n    public KubeResources captureKubeResourcesFromHelmChart(Product product, Map<String, String> values) throws Exception {\n        final var outputFile = getHelmTemplateOutputFile(product);\n        captureHelmTemplateOutput(product, outputFile, values);\n        return KubeResources.parse(outputFile);\n    }\n\n    private static void captureHelmTemplateOutput(Product product, Path outputFile, Map<String, String> values) throws Exception {\n        final var process = new ProcessBuilder()\n                .command(\"helm\", \"template\",\n                        product.getHelmReleaseName(),\n                        getHelmChartPath(product).toString(),\n                        \"--debug\",\n                        \"-n mynamespace\",\n                        \"--set\",\n                        HashMap.ofAll(values).map(pair -> pair.toSeq().mkString(\"=\")).mkString(\",\"))\n                .redirectOutput(outputFile.toFile())\n                .redirectError(outputFile.toFile())\n                .start();\n        final var exitCode = process.waitFor();\n\n        assertThat(exitCode)\n                .withFailMessage(() -> {\n                    try {\n                        return String.join(\"\\n\", Files.readAllLines(outputFile));\n                    } catch (IOException e) {\n                        return e.getMessage();\n                    }\n                }).isEqualTo(0);\n    }\n\n    public static String getHelmChartVersion(Product product)  {\n\n        Path chartPath = getHelmChartPath(product);\n        String chartYamlPath = chartPath.resolve(\"Chart.yaml\").toString();\n\n        try {\n            ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());\n            JsonNode yamlData = objectMapper.readTree(Paths.get(chartYamlPath).toFile());\n            return yamlData.get(\"version\").asText();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    public static String getAppVersion(Product product)  {\n\n        Path chartPath = getHelmChartPath(product);\n        String chartYamlPath = chartPath.resolve(\"Chart.yaml\").toString();\n\n        try {\n            ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());\n            JsonNode yamlData = objectMapper.readTree(Paths.get(chartYamlPath).toFile());\n            return yamlData.get(\"appVersion\").asText();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    public static String getHelmReleaseName(Product product) {\n        return String.format(\"unittest-%s\", product);\n    }\n\n    private static Path getHelmChartPath(Product product) {\n        return Paths.get(String.format(\"src/main/charts/%s\", product));\n    }\n\n    private Path getHelmTemplateOutputFile(Product product) throws IOException {\n        final var dir = Paths.get(\"target/test-output\");\n        Files.createDirectories(dir);\n        return dir.resolve(String.format(\"%s_%s.yaml\",\n                testInfo.getTestMethod().map(Method::getName).orElse(\"\"),\n                product));\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/jackson/JsonNodeAssert.java",
    "content": "package test.jackson;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.node.JsonNodeType;\nimport io.vavr.collection.Array;\nimport org.assertj.core.api.AbstractAssert;\nimport org.assertj.vavr.api.VavrAssertions;\n\nimport java.util.Map;\nimport java.util.Objects;\n\nimport static com.fasterxml.jackson.databind.node.JsonNodeType.ARRAY;\nimport static com.fasterxml.jackson.databind.node.JsonNodeType.NUMBER;\nimport static com.fasterxml.jackson.databind.node.JsonNodeType.OBJECT;\nimport static com.fasterxml.jackson.databind.node.JsonNodeType.STRING;\n\n/**\n * A simple custom AssertJ assertion class for handling basic {@link JsonNode} assertions.\n */\npublic class JsonNodeAssert extends AbstractAssert<JsonNodeAssert, JsonNode> {\n\n    private JsonNodeAssert(JsonNode actual) {\n        super(actual, JsonNodeAssert.class);\n    }\n\n    public static JsonNodeAssert assertThat(JsonNode actual) {\n        return new JsonNodeAssert(actual);\n    }\n\n    public JsonNodeAssert hasTextEqualTo(String expectedTemplate, Object... args) {\n        return hasTextEqualTo(String.format(expectedTemplate, args));\n    }\n\n    public JsonNodeAssert hasTextEqualTo(String expected) {\n        assertNodeIsOfType(STRING);\n        if (!Objects.equals(actual.asText(), expected)) {\n            failWithMessage(\"Expected JsonNode's text to be <%s> but was <%s>\", expected, actual.asText());\n        }\n        return this;\n    }\n\n    public JsonNodeAssert hasTextContaining(String expectedTemplate, Object... args) {\n        return hasTextContaining(String.format(expectedTemplate, args));\n    }\n\n    public JsonNodeAssert hasTextContaining(final String expected) {\n        assertNodeIsOfType(STRING);\n        if (!actual.asText().contains(expected)) {\n            failWithMessage(\"Expected JsonNode's text to contain <%s> but was <%s>\", expected, actual.asText());\n        }\n        return this;\n    }\n\n    /**\n     * Check that the given text is contained and is positioned either at the beginning/end of the string, or surrounded by spaces\n     * <p>\n     * Examples:\n     * \"A B C\".hasSeparatedTextContaining(\"A\"); // PASS\n     * \"A B C\".hasSeparatedTextContaining(\"B\"); // PASS\n     * \"A B C\".hasSeparatedTextContaining(\"C\"); // PASS\n     * \"A  BC\".hasSeparatedTextContaining(\"B\"); // FAIL\n     */\n    public JsonNodeAssert hasSeparatedTextContaining(final String expected) {\n        hasTextContaining(expected);\n        doesNotContainRegex(\".*[^\\\\s]\" + expected + \".*\");\n        doesNotContainRegex(\".*\" + expected + \"[^\\\\s].*\");\n        return this;\n    }\n\n    public JsonNodeAssert hasTextNotContaining(final String expected) {\n        assertNodeIsOfType(STRING);\n        if (actual.asText().contains(expected)) {\n            failWithMessage(\"Expected JsonNode's text to NOT contain <%s> but was <%s>\", expected, actual.asText());\n        }\n        return this;\n    }\n\n    public JsonNodeAssert doesNotContainRegex(final String regex) {\n        assertNodeIsOfType(STRING);\n        if (actual.asText().matches(regex)) {\n            failWithMessage(\"Expected JsonNode's text to NOT contain regex <%s> but was <%s>\", regex, actual.asText());\n        }\n        return this;\n    }\n\n    public JsonNodeAssert hasValueEqualTo(int expected) {\n        assertNodeIsOfType(NUMBER);\n        if (!Objects.equals(actual.intValue(), expected)) {\n            failWithMessage(\"Expected JsonNode's text to be <%s> but was <%s>\", expected, actual.intValue());\n        }\n        return this;\n    }\n\n    public JsonNodeAssert isArrayWithNumberOfChildren(int expected) {\n        assertNodeIsOfType(ARRAY);\n        if (!Objects.equals(actual.size(), expected)) {\n            failWithMessage(\"Expected JsonNode child count to be <%s> but was <%s>\", expected, actual.size());\n        }\n        return this;\n    }\n\n    public JsonNodeAssert isArrayWithChildren(String... expected) {\n        assertNodeIsOfType(ARRAY);\n        VavrAssertions.assertThat(Array.ofAll(actual).map(JsonNode::asText)).containsExactly(expected);\n        return this;\n    }\n\n    public JsonNodeAssert isEmpty() {\n        if (!Objects.equals(actual.isEmpty(), true)) {\n            failWithMessage(\"Expected JsonNode to be empty but was not\");\n        }\n        return this;\n    }\n\n    public JsonNodeAssert isObject(Map<String, String> expected) {\n        assertNodeIsOfType(OBJECT);\n\n        expected.forEach((key, value) -> assertThat(actual.path(key)).hasTextEqualTo(value));\n\n        return this;\n    }\n\n    private void assertNodeIsOfType(JsonNodeType type) {\n        if (!Objects.equals(actual.getNodeType(), type)) {\n            failWithMessage(\"Expected JsonNode to be of type <%s> but was <%s>\", type, actual.getNodeType());\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/AnalyticsData.java",
    "content": "package test.model;\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\npublic class AnalyticsData {\n    @JsonProperty(\"imageTag\")\n    private String imageTag;\n\n    @JsonProperty(\"replicas\")\n    private int replicas;\n\n    @JsonProperty(\"isJmxEnabled\")\n    private boolean isJmxEnabled;\n\n    @JsonProperty(\"k8sVersion\")\n    private String k8sVersion;\n\n    @JsonProperty(\"serviceType\")\n    private String serviceType;\n\n    @JsonProperty(\"dbType\")\n    private String dbType;\n\n    @JsonProperty(\"ingressType\")\n    private String ingressType;\n\n    @JsonProperty(\"isS3AttachmentsStorageEnabled\")\n    private boolean isS3AttachmentsStorageEnabled;\n\n    @JsonProperty(\"isS3AvatarsEnabled\")\n    private boolean isS3AvatarsEnabled;\n\n    @JsonProperty(\"isClusteringEnabled\")\n    private boolean isClusteringEnabled;\n\n    @JsonProperty(\"isSharedHomePVCCreated\")\n    private boolean isSharedHomePVCCreated;\n\n    @JsonProperty(\"isServiceMonitorCreated\")\n    private boolean isServiceMonitorCreated;\n\n    @JsonProperty(\"isGrafanaDashboardsCreated\")\n    private boolean isGrafanaDashboardsCreated;\n\n    @JsonProperty(\"isBitbucketMeshEnabled\")\n    private boolean isBitbucketMeshEnabled;\n\n    @JsonProperty(\"isRunOnOpenshift\")\n    private boolean isRunOnOpenshift;\n\n    @JsonProperty(\"isRunWithRestrictedSCC\")\n    private boolean isRunWithRestrictedSCC;\n\n    @JsonProperty(\"isOpenshiftRouteCreated\")\n    private boolean isOpenshiftRouteCreated;\n\n    public String getImageTag() {\n        return imageTag;\n    }\n\n    public void setImageTag(String imageTag) {\n        this.imageTag = imageTag;\n    }\n\n    public String getIngressType() {\n        return ingressType;\n    }\n\n    public void setIngressType(String ingressType) {\n        this.ingressType = ingressType;\n    }\n\n    public int getReplicas() {\n        return replicas;\n    }\n\n    public void setReplicas(int replicas) {\n        this.replicas = replicas;\n    }\n\n    public boolean isJmxEnabled() {\n        return isJmxEnabled;\n    }\n\n    public void setJmxEnabled(boolean jmxEnabled) {\n        isJmxEnabled = jmxEnabled;\n    }\n\n    public String getK8sVersion() {\n        return k8sVersion;\n    }\n\n    public void setK8sVersion(String k8sVersion) {\n        this.k8sVersion = k8sVersion;\n    }\n\n    public String getServiceType() {\n        return serviceType;\n    }\n\n    public void setServiceType(String serviceType) {\n        this.serviceType = serviceType;\n    }\n\n    public String getDbType() {\n        return dbType;\n    }\n\n    public void setDbType(String dbType) {\n        this.dbType = dbType;\n    }\n\n    public boolean isS3AttachmentsStorageEnabled() {\n        return isS3AttachmentsStorageEnabled;\n    }\n\n    public void setS3AttachmentsStorageEnabled(boolean s3AttachmentsStorageEnabled) {\n        isS3AttachmentsStorageEnabled = s3AttachmentsStorageEnabled;\n    }\n    public boolean isS3AvatarsEnabled() {\n        return isS3AvatarsEnabled;\n    }\n\n    public void setS3AvatarsEnabled(boolean s3AvatarsEnabled) {\n        isS3AvatarsEnabled = s3AvatarsEnabled;\n    }\n\n    public boolean isBitbucketMeshEnabled() {\n        return isBitbucketMeshEnabled;\n    }\n\n    public void setBitbucketMeshEnabled(boolean bitbucketMeshEnabled) {\n        isBitbucketMeshEnabled = bitbucketMeshEnabled;\n    }\n\n    public boolean isClusteringEnabled() {\n        return isClusteringEnabled;\n    }\n\n    public void setClusteringEnabled(boolean clusteringEnabled) {\n        isClusteringEnabled = clusteringEnabled;\n    }\n\n    public boolean isSharedHomePVCCreated() {\n        return isSharedHomePVCCreated;\n    }\n\n    public void setSharedHomePVCCreated(boolean sharedHomePVCCreated) {\n        isSharedHomePVCCreated = sharedHomePVCCreated;\n    }\n\n    public boolean isServiceMonitorCreated() {\n        return isServiceMonitorCreated;\n    }\n\n    public void setServiceMonitorCreated(boolean serviceMonitorCreated) {\n        isServiceMonitorCreated = serviceMonitorCreated;\n    }\n\n    public boolean isGrafanaDashboardsCreated() {\n        return isGrafanaDashboardsCreated;\n    }\n\n    public void setGrafanaDashboardsCreated(boolean grafanaDashboardsCreated) {\n        isGrafanaDashboardsCreated = grafanaDashboardsCreated;\n    }\n\n    public boolean isRunOnOpenshift() {\n        return isRunOnOpenshift;\n    }\n\n    public void setRunOnOpenshift(boolean runOnOpenshift) {\n        isRunOnOpenshift = runOnOpenshift;\n    }\n\n    public boolean isRunWithRestrictedSCC() {\n        return isRunWithRestrictedSCC;\n    }\n\n    public void setRunWithRestrictedSCC(boolean runWithRestrictedSCC) {\n        isRunWithRestrictedSCC = runWithRestrictedSCC;\n    }\n\n    public boolean isOpenshiftRouteCreated() {\n        return isOpenshiftRouteCreated;\n    }\n\n    public void setOpenshiftRouteCreated(boolean openshiftRouteCreated) {\n        isOpenshiftRouteCreated = openshiftRouteCreated;\n    }\n\n    public AnalyticsData() {\n    }\n\n    public AnalyticsData(String imageTag, int replicas, boolean isJmxEnabled, String ingressType, String k8sVersion, String serviceType, String dbType, boolean isS3AttachmentsStorageEnabled, boolean isS3AvatarsEnabled, boolean isClusteringEnabled, boolean isSharedHomePVCCreated, boolean isBitbucketMeshEnabled, boolean isServiceMonitorCreated, boolean isGrafanaDashboardsCreated, boolean isRunOnOpenshift, boolean isRunWithRestrictedSCC, boolean isOpenshiftRouteCreated) {\n        this.imageTag = imageTag;\n        this.replicas = replicas;\n        this.isJmxEnabled = isJmxEnabled;\n        this.ingressType = ingressType;\n        this.k8sVersion = k8sVersion;\n        this.serviceType = serviceType;\n        this.dbType = dbType;\n        this.isS3AttachmentsStorageEnabled = isS3AttachmentsStorageEnabled;\n        this.isS3AvatarsEnabled = isS3AvatarsEnabled;\n        this.isClusteringEnabled = isClusteringEnabled;\n        this.isSharedHomePVCCreated = isSharedHomePVCCreated;\n        this.isBitbucketMeshEnabled = isBitbucketMeshEnabled;\n        this.isServiceMonitorCreated = isServiceMonitorCreated;\n        this.isGrafanaDashboardsCreated = isGrafanaDashboardsCreated;\n        this.isRunOnOpenshift = isRunOnOpenshift;\n        this.isRunWithRestrictedSCC = isRunWithRestrictedSCC;\n        this.isOpenshiftRouteCreated = isOpenshiftRouteCreated;\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/ClusterType.java",
    "content": "package test.model;\n\npublic enum ClusterType {\n    EKS,\n    AKS,\n    KITT,\n    UNKNOWN\n}\n"
  },
  {
    "path": "src/test/java/test/model/ConfigMap.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\n\npublic final class ConfigMap extends KubeResource {\n\n    ConfigMap(JsonNode node) {\n        super(Kind.ConfigMap, node);\n    }\n\n    public JsonNode getDataByKey(String key) {\n        return getConfigMapData().path(key);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/Container.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Array;\n\npublic final class Container {\n    private final JsonNode node;\n\n    public Container(JsonNode node) {\n        this.node = node;\n    }\n\n    public JsonNode get(String fieldName) {\n        return node.path(fieldName);\n    }\n\n    public Env getEnv() {\n        return new Env(node.path(\"env\"));\n    }\n\n    public JsonNode getVolumeMounts() {\n        return node.path(\"volumeMounts\");\n    }\n\n    public JsonNode getVolumeMount(String name) {\n        return Array.ofAll(getVolumeMounts())\n                .find(v -> v.path(\"name\").asText().equals(name))\n                .getOrElseThrow(() -> new AssertionError(\"cannot find the volume mount: \" + name));\n\n    }\n\n    public JsonNode getPorts() {\n        return get(\"ports\");\n    }\n    public JsonNode getPort(String name) {\n        return Array.ofAll(getPorts())\n                .find(p -> p.path(\"name\").asText().equals(name))\n                .getOrElseThrow(() -> new AssertionError(\"cannot find port: \" + name));\n    }\n\n    public JsonNode getResources() {\n        return get(\"resources\");\n    }\n\n    public JsonNode getRequests() {\n        return getResources().path(\"requests\");\n    }\n\n    public JsonNode getLimits() {\n        return getResources().path(\"limits\");\n    }\n\n    public JsonNode getSecurityContext() {\n        return get(\"securityContext\");\n    }\n\n    public JsonNode getReadinessProbe() {\n        return get(\"readinessProbe\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/Deployment.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Seq;\nimport io.vavr.control.Option;\n\n/**\n * A specialisation of {@link KubeResource} which adds convenience methods for making Deployments easier to handle.\n */\npublic final class Deployment extends KubeResource {\n    Deployment(JsonNode node) {\n        super(Kind.Deployment, node);\n    }\n\n    private Seq<Container> getContainers() {\n        return Array.ofAll(getPodSpec().required(\"containers\")).map(Container::new);\n    }\n\n    public Container getContainer() {\n        return getContainers().single();\n    }\n\n    public Container getContainer(String name) {\n        return getContainers()\n                .find(c -> name.equals(c.get(\"name\").textValue()))\n                .getOrElseThrow(() ->\n                        new AssertionError(\"No container found with name \" + name));\n    }\n\n    public JsonNode getPodMetadata() {\n        return getNode(\"spec\", \"template\", \"metadata\");\n    }\n\n    public JsonNode getPodSpec() {\n        return getNode(\"spec\", \"template\", \"spec\");\n    }\n    \n    public JsonNode getVolumes() {\n        return getPodSpec().required(\"volumes\");\n    }\n\n    public Option<JsonNode> getVolume(String volumeName) {\n        return Array.ofAll(getVolumes())\n                .find(volume -> volume.path(\"name\").asText().equals(volumeName));\n    }\n\n    public JsonNode getInitContainers() {\n        return getPodSpec().required(\"initContainers\");\n    }\n\n    public Option<JsonNode> getInitContainer(String name) {\n        return Array.ofAll(getInitContainers())\n                .find(volume -> volume.path(\"name\").asText().equals(name));\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/Env.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Array;\nimport io.vavr.control.Option;\n\nimport java.util.Arrays;\nimport java.util.Map;\n\nimport static org.assertj.vavr.api.VavrAssertions.assertThat;\nimport static test.jackson.JsonNodeAssert.assertThat;\n\npublic class Env {\n    private final JsonNode node;\n\n    public Env(JsonNode node) {\n        this.node = node;\n    }\n\n    public Env assertHasValue(String envName, String expectedValue) {\n        assertThat(findEnv(envName))\n                .describedAs(\"Expected env '%s' to have a value\", envName)\n                .hasValueSatisfying(node ->\n                        assertThat(node.path(\"value\"))\n                                .describedAs(\"Expected env '%s' to have the expected value\", envName)\n                                .hasTextEqualTo(expectedValue));\n\n        return this;\n    }\n\n    public Env assertHasSecretRef(String envName, String expectedSecretName, String expectedSecretKey) {\n        assertThat(findEnv(envName))\n                .describedAs(\"Expected env '%s' to have a value\", envName)\n                .hasValueSatisfying(node ->\n                        assertThat(node.path(\"valueFrom\").path(\"secretKeyRef\"))\n                                .describedAs(\"Expected env '%s' to have the expected value\", envName)\n                                .isObject(Map.of(\n                                        \"name\", expectedSecretName,\n                                        \"key\", expectedSecretKey)));\n\n        return this;\n    }\n\n    public Env assertHasConfigMapRef(String envName, String expectedConfigMapName, String expectedConfigMapKey) {\n        assertThat(findEnv(envName))\n                .describedAs(\"Expected env '%s' to have a value\", envName)\n                .hasValueSatisfying(node ->\n                        assertThat(node.path(\"valueFrom\").path(\"configMapKeyRef\"))\n                                .describedAs(\"Expected env '%s' to have the expected value\", envName)\n                                .isObject(Map.of(\n                                        \"name\", expectedConfigMapName,\n                                        \"key\", expectedConfigMapKey)));\n\n        return this;\n    }\n\n    public Env assertHasFieldRef(String envName, String expectedFieldPath) {\n        assertThat(findEnv(envName))\n                .describedAs(\"Expected env '%s' to have a value\", envName)\n                .hasValueSatisfying(node ->\n                        assertThat(node.path(\"valueFrom\").path(\"fieldRef\"))\n                                .describedAs(\"Expected env '%s' to have the expected value\", envName)\n                                .isObject(Map.of(\"fieldPath\", expectedFieldPath)));\n\n        return this;\n    }\n\n    public Env assertDoesNotHaveAnyOf(String... envNames) {\n        assertThat(Array.of(envNames).flatMap(this::findEnv).map(node -> node.path(\"name\").asText()))\n                .describedAs(\"None of the environment variables %s should be present\", Arrays.asList(envNames))\n                .isEmpty();\n        return this;\n    }\n\n    private Option<JsonNode> findEnv(String envName) {\n        return Array.ofAll(node)\n                .find(node -> envName.equals(node.required(\"name\").asText()));\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/Kind.java",
    "content": "package test.model;\n\n/**\n * The different types of Kubernetes resource we use.\n */\npublic enum Kind {\n    StatefulSet, Deployment, ServiceAccount, ConfigMap, Secret, Service, Pod, Job, ClusterRole, Role, ClusterRoleBinding, RoleBinding, PersistentVolume, PersistentVolumeClaim, Ingress, HTTPRoute, ServiceMonitor, PodDisruptionBudget\n}\n"
  },
  {
    "path": "src/test/java/test/model/KubeResource.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Seq;\n\n/**\n * Represents a single Kubernetes resource descriptor.\n */\npublic class KubeResource {\n    private final Kind kind;\n    private final JsonNode node;\n\n    KubeResource(Kind kind, JsonNode node) {\n        this.kind = kind;\n        this.node = node;\n    }\n\n    public Kind getKind() {\n        return kind;\n    }\n\n    public JsonNode getMetadata() {\n        return node.required(\"metadata\");\n    }\n\n    public JsonNode getSpec() {\n        return node.required(\"spec\");\n    }\n    public JsonNode getConfigMapData() {\n        return node.required(\"data\");\n    }\n    public String getName() {\n        return getMetadata().required(\"name\").asText();\n    }\n\n    public JsonNode getAnnotations() {\n        return getMetadata().required(\"annotations\");\n    }\n\n    public JsonNode getNode(String... paths) {\n        return get(node, Array.of(paths));\n    }\n\n    private static JsonNode get(JsonNode node, Seq<String> paths) {\n        if (paths.isEmpty()) {\n            return node;\n        } else {\n            return get(node.required(paths.head()), paths.tail());\n        }\n    }\n\n    static KubeResource wrap(JsonNode node) {\n        final var kind = Kind.valueOf(node.required(\"kind\").asText());\n        switch (kind) {\n            case StatefulSet:\n                return new StatefulSet(node);\n            case Service:\n                return new Service(node);\n            case Deployment:\n                return new Deployment(node);\n            case ConfigMap:\n                return new ConfigMap(node);\n            case Pod:\n                return new Pod(node);\n            default:\n                return new KubeResource(kind, node);\n        }\n    }\n\n    @Override\n    public String toString() {\n        return String.format(\"%s[%s]\", getKind(), getName());\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/KubeResources.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.node.ObjectNode;\nimport com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Map;\nimport io.vavr.collection.Traversable;\nimport io.vavr.jackson.datatype.VavrModule;\n\nimport java.io.IOException;\nimport java.nio.file.Path;\n\n/**\n * Represents a collection of {@link KubeResources}, e.g. the YAML document generated by a Helm chart.\n */\npublic final class KubeResources {\n    private final Map<Kind, Array<KubeResource>> map;\n\n    private KubeResources(Map<Kind, Array<KubeResource>> map) {\n        this.map = map;\n    }\n\n    public Traversable<StatefulSet> getStatefulSets() {\n        return getAll(Kind.StatefulSet, StatefulSet.class);\n    }\n\n    public Traversable<ConfigMap> getConfigMaps() {\n        return getAll(Kind.ConfigMap, ConfigMap.class);\n    }\n    public Traversable<Deployment> getDeployments() {\n        return getAll(Kind.Deployment, Deployment.class);\n    }\n\n    public <T extends KubeResource> Traversable<T> getAll(Kind kind, Class<T> type) {\n        return getAll(kind).map(type::cast);\n    }\n\n    public StatefulSet getStatefulSet(final String name) {\n        return getStatefulSets().find(ss -> name.equals(ss.getName()))\n                .getOrElseThrow(() -> new AssertionError(\"No StatefulSet found with name \" + name));\n    }\n\n    public Deployment getDeployment(final String name) {\n        return getDeployments().find(dep -> name.equals(dep.getName()))\n                .getOrElseThrow(() -> new AssertionError(\"No Deployment found with name \" + name));\n    }\n\n    public ConfigMap getConfigMap(final String name) {\n        return getConfigMaps().find(cm -> name.equals(cm.getName()))\n                .getOrElseThrow(() -> new AssertionError(\"No ConfigMap found with name \" + name));\n    }\n\n    public KubeResource get(Kind kind) {\n        return getAll(kind)\n                .singleOption()\n                .getOrElseThrow(() -> new AssertionError(\"No single \" + kind + \" found\"));\n    }\n\n    public <T extends KubeResource> T get(Kind kind, Class<T> type, String name) {\n        return getAll(kind)\n                .find(resource -> name.equals(resource.getName()))\n                .map(type::cast)\n                .getOrElseThrow(() -> new AssertionError(\"No \" + kind + \" found with name \" + name));\n    }\n\n    public KubeResources assertContains(Kind kind, String name) {\n        get(kind, name);\n        return this;\n    }\n\n    public KubeResource get(Kind kind, String name) {\n        return getAll(kind)\n                .find(resource -> name.equals(resource.getName()))\n                .getOrElseThrow(() -> new AssertionError(\"No \" + kind + \" found with name \" + name));\n    }\n\n    public Traversable<KubeResource> getAll(Kind kind) {\n        return map.get(kind)\n                .getOrElse(Array::empty);\n    }\n\n    public static KubeResources parse(Path outputFile) throws IOException {\n        final var yamlParser = new YAMLFactory().createParser(outputFile.toFile());\n        final var objectMapper = new ObjectMapper().registerModule(new VavrModule());\n\n        var map = Array.ofAll(objectMapper\n                .readValues(yamlParser, new TypeReference<ObjectNode>() {\n                })\n                .readAll())\n                .map(KubeResource::wrap)\n                .groupBy(KubeResource::getKind);\n\n        return new KubeResources(map);\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/Pod.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Traversable;\n\npublic class Pod extends KubeResource {\n    Pod(JsonNode node) {\n        super(Kind.Pod, node);\n    }\n\n    public JsonNode getPodMetadata() {\n        return getNode(\"metadata\");\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/model/Product.java",
    "content": "package test.model;\n\nimport test.helm.Helm;\n\n/*\n * When adding additional products charts, products names comprising more than\n * one word should be separated by an underscore(s) \"_\". Hyphens \"-\" are not valid\n * when declaring enum names. See \"bamboo_agent\" below as an example of this\n */\npublic enum Product {\n    jira {\n        @Override\n        public String getDockerImageName() {\n            return \"atlassian/jira-software\";\n        }\n\n        @Override\n        public String getContainerGid() {\n            return \"2001\";\n        }\n    },\n    confluence {\n        @Override\n        public String getDockerImageName() {\n            return \"atlassian/confluence\";\n        }\n\n        @Override\n        public String getContainerGid() {\n            return \"2002\";\n        }\n    },\n    crowd {\n        @Override\n        public String getDockerImageName() {\n            return \"atlassian/crowd\";\n        }\n\n        @Override\n        public String getContainerGid() {\n            return \"2004\";\n        }\n    },\n    bitbucket {\n        @Override\n        public String getDockerImageName() {\n            return \"atlassian/bitbucket\";\n        }\n\n        @Override\n        public String getContainerGid() {\n            return \"2003\";\n        }\n    },\n    bamboo {\n        @Override\n        // TODO: this image will need to be updated once Stevs changes are in\n        public String getDockerImageName() { return \"atlassian/bamboo\"; }\n\n        @Override\n        public String getContainerGid() { return \"2005\"; }\n    },\n    bamboo_agent {\n        @Override\n        // TODO: this image will need to be updated once Stevs changes are in\n        public String getDockerImageName() { return \"atlassian/bamboo-agent-base\"; }\n\n        @Override\n        public String getContainerGid() { return \"2005\"; }\n    };\n\n    public abstract String getDockerImageName();\n\n    public abstract String getContainerGid();\n\n    public String getHelmReleaseName() {\n        return Helm.getHelmReleaseName(this);\n    }\n\n    public String getHelmChartVersion() {\n        return Helm.getHelmChartVersion(this);\n    }\n\n    public String getAppVersion() {\n        return Helm.getAppVersion(this);\n    }\n\n    /*\n     * So that we can create Chart directories of the form:\n     *\n     * \"src/main/charts/bamboo-agent\"\n     *\n     * but also ensure our tests still work, we override this method\n     * to replace underscores with hyphens.\n     *\n     */\n    @Override\n    public String toString() {\n        return super.toString().replaceAll(\"_\", \"-\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/Service.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Traversable;\nimport io.vavr.control.Option;\n\npublic class Service extends KubeResource {\n    Service(JsonNode node) {\n        super(Kind.Service, node);\n    }\n\n    public JsonNode getType() {\n        return getSpec().path(\"type\");\n    }\n\n    public Traversable<JsonNode> getPorts() {\n        return Array.ofAll(getSpec().path(\"ports\"));\n    }\n\n    public Option<JsonNode> getPort(String name) {\n        return getPorts().find(portNode -> name.equals(portNode.path(\"name\").asText()));\n    }\n\n    public JsonNode getLoadBalancerIP() {\n        return getSpec().path(\"loadBalancerIP\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/StatefulSet.java",
    "content": "package test.model;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Seq;\nimport io.vavr.control.Option;\n\n/**\n * A specialisation of {@link KubeResource} which adds convenience methods for making StatefulSets easier to handle.\n */\npublic final class StatefulSet extends KubeResource {\n    StatefulSet(JsonNode node) {\n        super(Kind.StatefulSet, node);\n    }\n\n    private Seq<Container> getContainers() {\n        return Array.ofAll(getPodSpec().required(\"containers\")).map(Container::new);\n    }\n\n    public Container getContainer() {\n        return getContainers().single();\n    }\n\n    public Container getContainer(String name) {\n        return getContainers()\n                .find(c -> name.equals(c.get(\"name\").textValue()))\n                .getOrElseThrow(() ->\n                        new AssertionError(\"No container found with name \" + name));\n    }\n\n    public int getReplicas() {\n        return getSpec().get(\"replicas\").intValue();\n    }\n\n    public JsonNode getPodSpec() {\n        return getNode(\"spec\", \"template\", \"spec\");\n    }\n\n    public JsonNode getPodMetadata() {\n        return getNode(\"spec\", \"template\", \"metadata\");\n    }\n\n    public Seq<JsonNode> getVolumeClaimTemplates() {\n        return Array.ofAll(getSpec().path(\"volumeClaimTemplates\"));\n    }\n\n    public JsonNode getVolumes() {\n        return getPodSpec().required(\"volumes\");\n    }\n\n    public JsonNode getNodeSelector() { return getNode(\"spec\", \"template\", \"spec\", \"nodeSelector\"); }\n\n    public Option<JsonNode> getVolume(String volumeName) {\n        return Array.ofAll(getVolumes())\n                .find(volume -> volume.path(\"name\").asText().equals(volumeName));\n    }\n\n    public JsonNode getInitContainers() {\n        return getPodSpec().required(\"initContainers\");\n    }\n\n    public Option<JsonNode> getInitContainer(String name) {\n        return Array.ofAll(getInitContainers())\n                .find(volume -> volume.path(\"name\").asText().equals(name));\n    }\n\n    public JsonNode getLabels() {\n        return getPodMetadata().path(\"labels\");\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/model/Synchrony.java",
    "content": "package test.model;\n\n/**\n * Helpers to deal with Synchrony in tests\n */\npublic class Synchrony {\n\n    public static String synchronyStatefulSetName() {\n        return Product.confluence.getHelmReleaseName() + \"-synchrony\";\n    }\n\n}\n"
  },
  {
    "path": "src/test/java/test/postinstall/KubeClient.java",
    "content": "package test.postinstall;\n\nimport io.fabric8.kubernetes.api.model.Node;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.PodSpec;\nimport io.fabric8.kubernetes.api.model.apps.StatefulSet;\nimport io.fabric8.kubernetes.api.model.metrics.v1beta1.NodeMetrics;\nimport io.fabric8.kubernetes.client.DefaultKubernetesClient;\nimport io.fabric8.kubernetes.client.KubernetesClient;\nimport io.vavr.Lazy;\nimport io.vavr.Tuple;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Traversable;\nimport io.vavr.control.Option;\nimport io.vavr.control.Try;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport test.model.ClusterType;\n\nimport javax.annotation.Nullable;\nimport java.util.Map;\nimport java.util.function.Consumer;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static test.postinstall.Utils.getNS;\nimport static test.postinstall.Utils.getRelease;\n\nfinal class KubeClient implements AutoCloseable {\n    private static final Logger log = LoggerFactory.getLogger(KubeClient.class);\n\n    private final Lazy<KubernetesClient> clientRef = Lazy.of(DefaultKubernetesClient::new);\n\n    ClusterType getClusterType() {\n        final var host = client().getMasterUrl().getHost();\n        if (host.contains(\"eks.amazonaws.com\")) {\n            return ClusterType.EKS;\n        } else if (host.contains(\"azmk8s.io\")) {\n            return ClusterType.AKS;\n        } else if (host.contains(\"kitt-inf.net\")) {\n            return ClusterType.KITT;\n        } else {\n            return ClusterType.UNKNOWN;\n        }\n    }\n\n    io.vavr.collection.Map<Node, Option<NodeMetrics>> getNodeMetrics(final PodSpec podSpec) {\n        return getNodes(podSpec.getNodeSelector())\n                .toMap(node -> Tuple.of(node, getNodeMetrics(node)));\n    }\n\n    private Option<NodeMetrics> getNodeMetrics(Node node) {\n        return Try.of(() -> client().top().nodes().metrics(node.getMetadata().getName()))\n                .onFailure(ex -> log.warn(\"Failed to call K8S Ketrics API: {}\", ex.getMessage()))\n                .toOption();\n    }\n\n    /**\n     * @return all k8s custer nodes which are available for pod scheduling, based on the node selector in the\n     * StatefulSet spec.\n     */\n    private Traversable<Node> getNodes(final Map<String, String> nodeSelector) {\n        return Array.ofAll(client()\n                .nodes()\n                .withLabels(nodeSelector)\n                .list()\n                .getItems());\n    }\n\n    @Nullable\n    StatefulSet getStatefulSet(String statefulSetName, final String namespaceName) {\n        return client()\n                .apps().statefulSets()\n                .inNamespace(namespaceName)\n                .withName(statefulSetName)\n                .get();\n    }\n\n    @Nullable\n    Pod getPod(final String podName, final String namespaceName) {\n        return client()\n                .pods()\n                .inNamespace(namespaceName)\n                .withName(podName)\n                .get();\n    }\n\n    void forEachPodOfStatefulSet(Consumer<Pod> consumer) {\n        forEachPodOfStatefulSet(getRelease(), consumer);\n    }\n\n    void forEachPodOfStatefulSet(String statefulSetName, Consumer<Pod> consumer) {\n        final var statefulSet = getStatefulSet(statefulSetName);\n        final var replicaCount = statefulSet.getStatus().getReplicas();\n\n        for (var idx = 0; idx < replicaCount; idx++) {\n            consumer.accept(getPod(statefulSet.getMetadata().getName() + \"-\" + idx, getNS()));\n        }\n    }\n\n    StatefulSet getStatefulSet() {\n        return getStatefulSet(getRelease());\n    }\n\n    StatefulSet getStatefulSet(String statefulSetName) {\n        final var statefulSet = getStatefulSet(statefulSetName, getNS());\n\n        assertThat(statefulSet)\n                .describedAs(\"StatefulSet %s not found\", statefulSetName)\n                .isNotNull();\n        return statefulSet;\n    }\n\n    private KubernetesClient client() {\n        return clientRef.get();\n    }\n\n    @Override\n    public void close() {\n        if (clientRef.isEvaluated()) {\n            clientRef.forEach(KubernetesClient::close);\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/postinstall/OpenSearchInstallTest.java",
    "content": "package test.postinstall;\n\nimport io.fabric8.kubernetes.api.model.ContainerStatus;\nimport io.fabric8.kubernetes.api.model.Node;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.apps.StatefulSet;\nimport io.fabric8.kubernetes.api.model.metrics.v1beta1.NodeMetrics;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Map;\nimport io.vavr.control.Option;\nimport org.assertj.core.description.Description;\nimport org.assertj.core.description.LazyTextDescription;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.BeforeAll;\nimport org.junit.jupiter.api.RepeatedTest;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.condition.EnabledIf;\nimport test.model.Product;\n\nimport java.lang.annotation.Repeatable;\nimport java.util.function.Consumer;\n\nimport static io.restassured.RestAssured.*;\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.assertj.core.api.Assumptions.assumeThat;\nimport static org.hamcrest.Matchers.*;\nimport static test.postinstall.Utils.*;\n\n@EnabledIf(\"isOSDeployed\")\nclass OpenSearchInstallTest {\n    static boolean isOSDeployed() {\n        return productIs(Product.bitbucket);\n    }\n\n    private static KubeClient client;\n    private static String osIngressBase;\n\n    @BeforeAll\n    static void initKubeClient() {\n        client = new KubeClient();\n\n        // See helm_install.sh for where this host is generated.\n        final var ingressDomain = getIngressDomain(client.getClusterType());\n        osIngressBase = \"https://\" + getRelease() + \"-opensearch-cluster-master-0.\"+ingressDomain;\n    }\n\n    @Test\n    void openSearchIsRunning() {\n        var osSetName = \"opensearch-cluster-master\";\n        client.forEachPodOfStatefulSet(osSetName, pod -> {\n            final var podPhase = pod.getStatus().getPhase();\n            assertThat(podPhase)\n                    .describedAs(\"Pod %s should be running\", pod.getMetadata().getName())\n                    .isEqualToIgnoringCase(\"Running\");\n        });\n    }\n\n    @Test\n    void openSearchBeingUsed() {\n        int retries = 120; // It might take a little while to propagate.\n        while (retries > 0) {\n            try {\n                // Relies on the backdoor ingress controller installed by helm_install.sh.\n                // If this changes an alternative would be to use the fabric8 client ExecWatch/ExecListener to\n                // invoke curl from a pod.\n                final var indexURL = osIngressBase + \"/_cat/indices?format=json\";\n                when().get(indexURL).then()\n                        .body(\"findAll { it.index == 'bitbucket-index-version' }[0]\", hasEntry(\"docs.count\", \"1\"));\n            } catch (Exception e) {\n                retries--;\n                try {\n                    Thread.sleep(1000);\n                } catch (Exception _e) {\n                }\n            }\n            return;\n        }\n    }\n\n    @AfterAll\n    static void disposeOfClient() {\n        client.close();\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/postinstall/PostInstallStatusTest.java",
    "content": "package test.postinstall;\n\nimport io.fabric8.kubernetes.api.model.ContainerStatus;\nimport io.fabric8.kubernetes.api.model.Node;\nimport io.fabric8.kubernetes.api.model.Pod;\nimport io.fabric8.kubernetes.api.model.apps.StatefulSet;\nimport io.fabric8.kubernetes.api.model.metrics.v1beta1.NodeMetrics;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.Map;\nimport io.vavr.control.Option;\nimport org.assertj.core.description.Description;\nimport org.assertj.core.description.LazyTextDescription;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.BeforeAll;\nimport org.junit.jupiter.api.Test;\n\nimport java.util.function.Consumer;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.assertj.core.api.Assumptions.assumeThat;\nimport static test.postinstall.Utils.*;\n\nclass PostInstallStatusTest {\n    private static final KubeClient client = new KubeClient();\n\n    @Test\n    void applicationPodsShouldAllBeRunning() {\n        client.forEachPodOfStatefulSet(pod -> {\n            final var podPhase = pod.getStatus().getPhase();\n\n            // First assert that the phase is not \"pending\", and if so we show a special failure message\n            assertThat(podPhase)\n                    .describedAs(schedulingFailure(pod))\n                    .isNotEqualToIgnoringCase(\"pending\");\n\n            // otherwise assert that the pod is running\n            assertThat(podPhase)\n                    .describedAs(\"Pod %s should be running\", pod.getMetadata().getName())\n                    .isEqualToIgnoringCase(\"Running\");\n        });\n    }\n\n    private Description schedulingFailure(Pod pod) {\n        return new LazyTextDescription(() -> {\n            final var podSpec = client.getStatefulSet()\n                    .getSpec()\n                    .getTemplate()\n                    .getSpec();\n            return schedulingFailure(pod.getMetadata().getName(), client.getNodeMetrics(podSpec));\n        });\n    }\n\n    private String schedulingFailure(final String podName, Map<Node, Option<NodeMetrics>> nodeMetrics) {\n        final var resourceSummary = netNodesResourceSummary(nodeMetrics);\n\n        return String.format(\"Pod %s should be running, but has yet to be scheduled on the cluster. Current node usage is %s\",\n                podName, resourceSummary);\n    }\n\n    @Test\n    void applicationPodContainersShouldAllBeReady() {\n        client.forEachPodOfStatefulSet(pod -> {\n            final var containerStatuses = Array.ofAll(pod.getStatus().getContainerStatuses());\n\n            assumeThat(containerStatuses)\n                    .describedAs(\"No container statuses present in pod %s\", pod.getMetadata().getName())\n                    .isNotEmpty();\n\n            final var containerNames = containerStatuses.map(ContainerStatus::getName).mkCharSeq(\"[\", \",\", \"]\");\n\n            assertThat(containerStatuses)\n                    .extracting(ContainerStatus::getReady)\n                    .describedAs(\"Containers %s of pod %s should all be ready\", containerNames, pod.getMetadata().getName())\n                    .containsOnly(true);\n        });\n    }\n\n    @BeforeAll\n    static void configure() throws Exception {\n        assumeThat(getRelease())\n                .describedAs(\"Cannot run test without Helm release name\")\n                .isNotEmpty();\n        assumeThat(getNS())\n                .describedAs(\"Cannot run test without namespace name\")\n                .isNotEmpty();\n    }\n\n    @AfterAll\n    static void disposeOfClient() {\n        client.close();\n    }\n}\n"
  },
  {
    "path": "src/test/java/test/postinstall/Utils.java",
    "content": "package test.postinstall;\n\nimport io.fabric8.kubernetes.api.model.Node;\nimport io.fabric8.kubernetes.api.model.Quantity;\nimport io.fabric8.kubernetes.api.model.metrics.v1beta1.NodeMetrics;\nimport io.vavr.Tuple;\nimport io.vavr.Tuple2;\nimport io.vavr.collection.Array;\nimport io.vavr.collection.HashMap;\nimport io.vavr.collection.Map;\nimport io.vavr.control.Option;\nimport test.model.ClusterType;\nimport test.model.Product;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.nio.file.Path;\nimport java.util.Properties;\nimport java.util.concurrent.atomic.AtomicReference;\n\nimport static io.fabric8.kubernetes.api.model.Quantity.getAmountInBytes;\nimport static java.nio.file.Files.newBufferedReader;\nimport static org.apache.commons.io.FileUtils.byteCountToDisplaySize;\n\nfinal class Utils {\n\n    static Map<String, String> readPropertiesFile() throws IOException {\n        final var helmParametersFileLocation = System.getProperty(\"helmParametersFileLocation\");\n        return Utils.readPropertiesFile(Path.of(helmParametersFileLocation));\n    }\n\n    static Map<String, String> readPropertiesFile(final Path fileLocation) throws IOException {\n        final var properties = new Properties();\n        try (var reader = newBufferedReader(fileLocation)) {\n            properties.load(reader);\n        }\n        return HashMap.ofAll(properties)\n                .mapKeys(String.class::cast)\n                .mapValues(String.class::cast);\n    }\n\n    static String getQuantitiesDescription(final java.util.Map<String, Quantity> allocatable) {\n        return Array.empty()\n                .appendAll(HashMap.ofAll(allocatable)\n                        .get(\"memory\")\n                        .map(Utils::getDataSize)\n                        .map(dataSize -> String.format(\"memory=%s\", dataSize)))\n                .appendAll(HashMap.ofAll(allocatable)\n                        .get(\"cpu\")\n                        .map(quantity -> String.format(\"cpu=%s\", quantity)))\n                .mkString(\", \");\n    }\n\n    private static String getDataSize(Quantity quantity) {\n        return byteCountToDisplaySize(getAmountInBytes(quantity).toBigInteger());\n    }\n\n    static String netNodesResourceSummary(final Map<Node, Option<NodeMetrics>> nodes) {\n        return nodes.map(Utils::getNodeResourceSummary)\n                .toJavaMap()\n                .toString();\n    }\n\n    private static Tuple2<String, String> getNodeResourceSummary(Node node, Option<NodeMetrics> metrics) {\n        final var allocatableDescription = getQuantitiesDescription(node.getStatus().getAllocatable());\n        final var usageDescription = metrics.map(m -> getQuantitiesDescription(m.getUsage()))\n                .getOrElse(\"metrics unavailable\");\n\n        final var description = String.format(\"usage=[%s], capacity=[%s]\", usageDescription, allocatableDescription);\n\n        return Tuple.of(node.getMetadata().getName(), description);\n    }\n\n    private final static Map<String, String> helmParameters = loadHelmParameters();\n    private static Map<String, String> loadHelmParameters() {\n        try {\n            final var helmParametersFileLocation = System.getProperty(\"helmParametersFileLocation\");\n            if (helmParametersFileLocation != null) {\n                final var fileParameters = Utils.readPropertiesFile(Path.of(helmParametersFileLocation));\n\n                final var productName = fileParameters.get(\"PRODUCT_NAME\").get();\n                var prefix = fileParameters.get(\"RELEASE_PREFIX\").get();\n                var ns = fileParameters.get(\"TARGET_NAMESPACE\").get();\n                var helmReleaseName = Array.of(prefix, productName).mkString(\"-\");\n\n                return HashMap.of(\n                        \"product\", productName,\n                        \"prefix\", prefix,\n                        \"release\", helmReleaseName,\n                        \"ns\", ns\n                );\n\n            } else {\n                return HashMap.of(\n                        \"product\", System.getProperty(\"helmProduct\"),\n                        \"prefix\", System.getProperty(\"helmProduct\"),\n                        \"release\", System.getProperty(\"helmRelease\"),\n                        \"ns\", System.getProperty(\"namespace\")\n                );\n            }\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    static String getNS() {\n        return helmParameters.get(\"ns\").get();\n    }\n\n    static String getRelease() {\n        return helmParameters.get(\"release\").get();\n    }\n\n    static Product getProduct() {\n        final var str = helmParameters.get(\"product\").get();\n        return Product.valueOf(str);\n    }\n\n    static boolean productIs(Product product) {\n        try {\n            return product == getProduct();\n        } catch(Exception _e) {\n            return false;\n        }\n    }\n\n    static String getIngressDomain(ClusterType cluster) {\n        try {\n            var props = readPropertiesFile();\n            return props.get(\"INGRESS_DOMAIN_\"+cluster.name()).get();\n        } catch (IOException e) {\n            throw new UncheckedIOException(e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/README.txt",
    "content": "The files in this directory contain the captured output of the processed Helm charts for each product,\ni.e. the output of the `helm template` command. These are used for unit testing changes to the Helm charts."
  },
  {
    "path": "src/test/resources/expected_helm_output/bamboo/output.yaml",
    "content": "---\n# Source: bamboo/templates/serviceaccount.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: unittest-bamboo\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\n---\n# Source: bamboo/templates/config-jvm.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bamboo-jvm-config\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  additional_jvm_args: >-\n    -XX:ActiveProcessorCount=2\n  max_heap: 1024m\n  min_heap: 512m\n---\n# Source: bamboo/templates/configmap-jmx-config.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bamboo-jmx-config\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  jmx-config.yaml: |\n    rules:\n      - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n        name: java_lang_$2_$3\n        labels:\n          product: \"bamboo\"\n      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n        name: java_lang_Memory_HeapMemoryUsage_$1\n        labels:\n          product: \"bamboo\"\n      - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n        name: java_lang_G1_$1_Generation_$2\n        labels:\n          product: \"bamboo\"\n      - pattern: '.*'\n---\n# Source: bamboo/templates/configmap-values-analytics.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bamboo-helm-values\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  values.yaml: |\n    additionalConfigMaps: []\n    additionalContainers: []\n    additionalFiles: []\n    additionalHosts:\n    - hostnames:\n      - foo.local\n      - bar.local\n      ip: 127.0.0.1\n    additionalInitContainers: []\n    additionalLabels: {}\n    affinity: {}\n    atlassianAnalyticsAndSupport:\n      analytics:\n        enabled: false\n      helmValues:\n        enabled: true\n    bamboo:\n      accessLog:\n        localHomeSubPath: log\n        mountPath: /opt/atlassian/bamboo/logs\n      additionalAnnotations:\n        argocd.argoproj.io/sync-wave: \"10\"\n      additionalBundledPlugins: []\n      additionalCertificates:\n        customCmd: null\n        initContainer:\n          resources: {}\n          securityContext: {}\n        secretList: []\n        secretName: null\n      additionalEnvironmentVariables: []\n      additionalJvmArgs: []\n      additionalLibraries: []\n      additionalPorts: []\n      additionalVolumeClaimTemplates: []\n      additionalVolumeMounts: []\n      baseUrl: https://testUrl/\n      brokerUrl: tcp://testBroker:1234\n      containerSecurityContext: {}\n      disableAgentAuth: false\n      forceConfigUpdate: false\n      import:\n        path: null\n        type: clean\n      jmsService:\n        annotations: {}\n        enabled: true\n        loadBalancerIP: null\n        port: 54663\n        type: ClusterIP\n      license:\n        secretKey: licenseTestKey\n        secretName: licenseTestSecret\n      livenessProbe:\n        customProbe: {}\n        enabled: false\n        failureThreshold: 12\n        initialDelaySeconds: 60\n        periodSeconds: 5\n        timeoutSeconds: 1\n      ports:\n        http: 8085\n        jms: 54663\n      postStart:\n        command: null\n      readinessProbe:\n        customProbe: {}\n        enabled: true\n        failureThreshold: 30\n        initialDelaySeconds: 30\n        periodSeconds: 10\n        timeoutSeconds: 1\n      resources:\n        container:\n          requests:\n            cpu: \"2\"\n            memory: 2G\n        jvm:\n          maxHeap: 1024m\n          minHeap: 512m\n      securityContext:\n        fsGroup: 2005\n        fsGroupChangePolicy: OnRootMismatch\n      securityContextEnabled: true\n      securityToken:\n        secretKey: agentTestKey\n        secretName: agentTestSecret\n      seraphConfig:\n        autoLoginCookieAge: \"1209600\"\n        generateByHelm: false\n      service:\n        annotations: {}\n        contextPath: null\n        loadBalancerIP: null\n        nodePort: null\n        port: 80\n        sessionAffinity: None\n        sessionAffinityConfig:\n          clientIP:\n            timeoutSeconds: null\n        type: ClusterIP\n      setPermissions: true\n      shutdown:\n        command: /shutdown-wait.sh\n        terminationGracePeriodSeconds: 30\n      startupProbe:\n        enabled: false\n        failureThreshold: 120\n        initialDelaySeconds: 60\n        periodSeconds: 5\n      sysadminCredentials:\n        displayNameSecretKey: adminFullnameTestKey\n        emailAddressSecretKey: adminEmailTestKey\n        passwordSecretKey: adminPasswordTestKey\n        secretName: adminTestSecret\n        usernameSecretKey: adminTestUsernameKey\n      tomcatConfig:\n        acceptCount: \"100\"\n        accessLogMaxDays: \"-1\"\n        address: null\n        bambooEncryptionKey: null\n        clientAuth: null\n        compressibleMimeType: null\n        compression: null\n        compressionMinSize: null\n        connectionTimeout: \"20000\"\n        customServerXml: \"\"\n        enableLookups: \"false\"\n        generateByHelm: false\n        keyPass: null\n        keystoreFile: null\n        keystorePass: null\n        maxHttpHeaderSize: \"8192\"\n        maxThreads: \"100\"\n        mgmtPort: \"8005\"\n        minSpareThreads: \"10\"\n        port: \"8085\"\n        protocol: HTTP/1.1\n        proxyInternalIps: null\n        proxyName: null\n        proxyPort: null\n        redirectPort: \"8443\"\n        requestAttributesEnabled: \"false\"\n        scheme: null\n        secret: null\n        secretRequired: null\n        secure: null\n        sslCertificateFile: null\n        sslCertificateKeyFile: null\n        sslEnabled: null\n        sslPass: null\n        sslProtocol: null\n        stuckThreadDetectionValveThreshold: \"120\"\n        trustedProxies: null\n        truststoreFile: null\n        truststorePass: null\n      topologySpreadConstraints: []\n      unattendedSetup: true\n      useHelmReleaseNameAsContainerName: false\n    common:\n      global: {}\n    database:\n      credentials:\n        passwordSecretKey: password\n        secretName: null\n        usernameSecretKey: username\n      type: null\n      url: null\n    fluentd:\n      command: null\n      customConfigFile: false\n      elasticsearch:\n        enabled: true\n        hostname: elasticsearch\n        indexNamePrefix: bamboo\n      enabled: false\n      extraVolumes: []\n      fluentdCustomConfig: {}\n      httpPort: 9880\n      imageRepo: fluent/fluentd-kubernetes-daemonset\n      imageTag: v1.11.5-debian-elasticsearch7-1.2\n      resources: {}\n    gateway:\n      additionalRules: []\n      annotations: {}\n      create: false\n      filters: []\n      hostnames: []\n      https: true\n      labels: {}\n      parentRefs: []\n      path: null\n      pathType: PathPrefix\n      timeouts:\n        backendRequest: 60s\n        request: 60s\n    hostNamespaces: {}\n    image:\n      pullPolicy: IfNotPresent\n      repository: atlassian/bamboo\n      tag: \"\"\n    ingress:\n      additionalPaths: []\n      annotations: {}\n      className: nginx\n      create: false\n      host: null\n      https: true\n      maxBodySize: 250m\n      nginx: true\n      openShiftRoute: false\n      path: null\n      proxyConnectTimeout: 60\n      proxyReadTimeout: 60\n      proxySendTimeout: 60\n      routeHttpHeaders: {}\n      tlsSecretName: null\n    monitoring:\n      exposeJmxMetrics: true\n      fetchJmxExporterJar: true\n      grafana:\n        createDashboards: false\n        dashboardAnnotations: {}\n        dashboardLabels: {}\n      jmxExporterCustomConfig: {}\n      jmxExporterCustomJarLocation: null\n      jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n      jmxExporterImageTag: 0.18.0\n      jmxExporterInitContainer:\n        customSecurityContext: {}\n        jmxJarLocation: null\n        resources: {}\n        runAsRoot: true\n      jmxExporterPort: 9999\n      jmxExporterPortType: ClusterIP\n      jmxServiceAnnotations: {}\n      serviceMonitor:\n        create: false\n        prometheusLabelSelector: {}\n        scrapeIntervalSeconds: 30\n        scrapeTimeoutSeconds: 20\n    nodeSelector: {}\n    openshift:\n      runWithRestrictedSCC: false\n    ordinals:\n      enabled: false\n      start: 0\n    podAnnotations: {}\n    podDisruptionBudget:\n      annotations: {}\n      enabled: false\n      labels: {}\n      maxUnavailable: null\n      minAvailable: null\n    podLabels: {}\n    priorityClassName: high\n    replicaCount: 1\n    serviceAccount:\n      annotations: {}\n      create: true\n      imagePullSecrets: []\n      name: null\n    testPods:\n      affinity: {}\n      annotations: {}\n      image:\n        permissionsTestContainer: debian:stable-slim\n        statusTestContainer: alpine:latest\n      labels: {}\n      nodeSelector: {}\n      resources: {}\n      schedulerName: null\n      tolerations: []\n    tolerations: []\n    updateStrategy: {}\n    volumes:\n      additional: []\n      localHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/bamboo\n        persistentVolumeClaim:\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        persistentVolumeClaimRetentionPolicy:\n          whenDeleted: null\n          whenScaled: null\n        subPath: null\n      sharedHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/shared-home\n        nfsPermissionFixer:\n          command: null\n          enabled: true\n          imageRepo: alpine\n          imageTag: latest\n          mountPath: /shared-home\n          resources: {}\n        persistentVolumeClaim:\n          accessModes:\n          - ReadWriteMany\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        subPath: null\n---\n# Source: bamboo/templates/service-jms.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bamboo-jms\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 54663\n      targetPort: jms\n      protocol: TCP\n      name: jms\n  selector:\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n---\n# Source: bamboo/templates/service-jmx.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bamboo-jmx\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n---\n# Source: bamboo/templates/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bamboo\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  sessionAffinity: None\n  ports:\n    - port: 80\n      targetPort: http\n      protocol: TCP\n      name: http\n  selector:\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n---\n# Source: bamboo/templates/statefulset.yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: unittest-bamboo\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\n    argocd.argoproj.io/sync-wave: \"10\"\nspec:\n  replicas: 1\n  serviceName: unittest-bamboo\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: bamboo\n      app.kubernetes.io/instance: unittest-bamboo\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: 0beb89d800d70492a211c5a22083c98b05c7a3c0e0a3eabb1397e08671db8083\n      labels:\n        helm.sh/chart: bamboo-2.0.13\n        app.kubernetes.io/name: bamboo\n        app.kubernetes.io/instance: unittest-bamboo\n        app.kubernetes.io/version: \"12.1.7\"\n        app.kubernetes.io/managed-by: Helm\n    spec:\n      serviceAccountName: unittest-bamboo\n      terminationGracePeriodSeconds: 30\n      hostAliases:\n        - hostnames:\n          - foo.local\n          - bar.local\n          ip: 127.0.0.1\n      securityContext:\n        fsGroup: 2005\n        fsGroupChangePolicy: OnRootMismatch\n      initContainers:\n        - name: nfs-permission-fixer\n          image: alpine:latest\n          imagePullPolicy: IfNotPresent\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: \"/shared-home\"\n          command: [\"sh\", \"-c\", \"(chgrp 2005 /shared-home; chmod g+w /shared-home)\"]\n        - name: fetch-jmx-exporter\n          image: bitnamilegacy/jmx-exporter:0.18.0\n          command: [\"cp\"]\n          args: [\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\", \"/var/atlassian/application-data/shared-home\"]\n          securityContext:\n            runAsUser: 0\n          volumeMounts:\n            - mountPath: \"/var/atlassian/application-data/shared-home\"\n              name: shared-home\n      containers:\n        - name: bamboo\n          image: \"atlassian/bamboo:12.1.7\"\n          imagePullPolicy: IfNotPresent\n          env:\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            - name: ATL_BASE_URL\n              value: \"http://localhost:8085/\"\n            - name: ATL_TOMCAT_PORT\n              value: \"8085\"\n            - name: SET_PERMISSIONS\n              value: \"true\"\n            - name: BAMBOO_SHARED_HOME\n              value: \"/var/atlassian/application-data/shared-home\"\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: unittest-bamboo-jvm-config\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: unittest-bamboo-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: unittest-bamboo-jvm-config\n            - name: ATL_CLIENT_BROKER_URL\n              value: \"tcp://testBroker:1234\"\n            - name: SECURITY_TOKEN\n              valueFrom:\n                secretKeyRef:\n                  name: agentTestSecret\n                  key: agentTestKey\n            - name: ATL_LICENSE\n              valueFrom:\n                secretKeyRef:\n                  name: licenseTestSecret\n                  key: licenseTestKey\n            - name: ATL_ADMIN_USERNAME\n              valueFrom:\n                secretKeyRef:\n                  name: adminTestSecret\n                  key: adminTestUsernameKey\n            - name: ATL_ADMIN_PASSWORD\n              valueFrom:\n                secretKeyRef:\n                  name: adminTestSecret\n                  key: adminPasswordTestKey\n            - name: ATL_ADMIN_FULLNAME\n              valueFrom:\n                secretKeyRef:\n                  name: adminTestSecret\n                  key: adminFullnameTestKey\n            - name: ATL_ADMIN_EMAIL\n              valueFrom:\n                secretKeyRef:\n                  name: adminTestSecret\n                  key: adminEmailTestKey\n            - name: ATL_IMPORT_OPTION\n              value: clean\n            - name: ATL_IMPORT_PATH\n              value: \n            - name: ATL_BAMBOO_ENABLE_UNATTENDED_SETUP\n              value: \"true\"\n            - name: CATALINA_OPTS\n              value: \"-javaagent:/var/atlassian/application-data/shared-home/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\"\n          ports:\n            - name: http\n              containerPort: 8085\n              protocol: TCP\n            - name: jms\n              containerPort: 54663\n              protocol: TCP\n            - name: jmx\n              containerPort: 9999\n              protocol: TCP\n          readinessProbe:\n            httpGet:\n              port: 8085\n              path: /rest/api/latest/status\n            initialDelaySeconds: 30\n            periodSeconds: 10\n            timeoutSeconds: 1\n            failureThreshold: 30\n          resources:\n            requests:\n              cpu: \"2\"\n              memory: 2G\n          volumeMounts:\n            - name: local-home\n              mountPath: \"/var/atlassian/application-data/bamboo\"\n            - name: local-home\n              mountPath: \"/opt/atlassian/bamboo/logs\"\n              subPath: \"log\"\n            - name: shared-home\n              mountPath: \"/var/atlassian/application-data/shared-home\"\n            - name: helm-values\n              mountPath: /opt/atlassian/helm\n            - name: jmx-config\n              mountPath: /opt/atlassian/jmx\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", \"/shutdown-wait.sh\"]\n      priorityClassName: high\n      volumes:\n        - name: local-home\n          emptyDir: {}\n        - name: shared-home\n          emptyDir: {}\n        - name: helm-values\n          configMap:\n            name: unittest-bamboo-helm-values\n        - name: jmx-config\n          configMap:\n            name: unittest-bamboo-jmx-config\n---\n# Source: bamboo/templates/tests/test-application-status.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-bamboo-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: alpine:latest\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: STATUS_URL\n          value: \"http://unittest-bamboo:80/rest/api/latest/status\"\n      command:\n        - /bin/sh\n        - -c\n        - |\n          apk add -q jq curl\n          count=1\n          while [ $count -le 20 ]\n          do\n            STATUS=$(curl -s \"$STATUS_URL\")\n            RESPONSE_CODE=$(curl -s -o /dev/null -I -w \"%{http_code}\" \"$STATUS_URL\")\n            echo \"Status URL is: $STATUS_URL\"\n            echo \"Response code for status test: $RESPONSE_CODE\"\n            echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n            echo $STATUS | jq -e '.status|test(\"RUNNING|FIRST_RUN\")'\n            if [ $? == 0 ]; then\n              exit 0\n            fi\n            sleep 10\n            count=$(( $count + 1 ))\n          done\n  restartPolicy: Never\n---\n# Source: bamboo/templates/tests/test-shared-home-permissions.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-bamboo-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: bamboo-2.0.13\n    app.kubernetes.io/name: bamboo\n    app.kubernetes.io/instance: unittest-bamboo\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: debian:stable-slim\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        runAsUser: 2005\n        runAsGroup: 2005\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n  volumes:\n    - name: shared-home\n      emptyDir: {}\n  restartPolicy: Never\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/bamboo/values.yaml",
    "content": "# This file contains chart value overrides for the Helm output unit test\nvolumes:\n  sharedHome:\n    nfsPermissionFixer:\n      enabled: true\n\nbamboo:\n  baseUrl: \"https://testUrl/\"\n\n  brokerUrl: \"tcp://testBroker:1234\"\n\n  securityToken:\n    secretName: agentTestSecret\n    secretKey: agentTestKey\n\n  license:\n    secretName: licenseTestSecret\n    secretKey: licenseTestKey\n\n  sysadminCredentials:\n    secretName: adminTestSecret\n    usernameSecretKey: adminTestUsernameKey\n    passwordSecretKey: adminPasswordTestKey\n    displayNameSecretKey: adminFullnameTestKey\n    emailAddressSecretKey: adminEmailTestKey\n\n  import:\n    type: \"clean\"\n\n  jmsService:\n    enabled: true\n\n  additionalAnnotations:\n    argocd.argoproj.io/sync-wave: \"10\"\n\npriorityClassName: \"high\"\nadditionalHosts:\n  - ip: \"127.0.0.1\"\n    hostnames:\n    - \"foo.local\"\n    - \"bar.local\"\n\nmonitoring:\n  exposeJmxMetrics: true\n\natlassianAnalyticsAndSupport:\n  analytics:\n    enabled: false"
  },
  {
    "path": "src/test/resources/expected_helm_output/bamboo-agent/output.yaml",
    "content": "---\n# Source: bamboo-agent/templates/serviceaccount.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: unittest-bamboo-agent\n  labels:\n    helm.sh/chart: bamboo-agent-2.0.13\n    app.kubernetes.io/name: bamboo-agent\n    app.kubernetes.io/instance: unittest-bamboo-agent\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\n---\n# Source: bamboo-agent/templates/config-jvm.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bamboo-agent-jvm-config\n  labels:\n    helm.sh/chart: bamboo-agent-2.0.13\n    app.kubernetes.io/name: bamboo-agent\n    app.kubernetes.io/instance: unittest-bamboo-agent\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  max_heap: 512m\n  min_heap: 256m\n---\n# Source: bamboo-agent/templates/deployment-agent.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: unittest-bamboo-agent\n  labels:\n    helm.sh/chart: bamboo-agent-2.0.13\n    app.kubernetes.io/name: bamboo-agent\n    app.kubernetes.io/instance: unittest-bamboo-agent\n    app.kubernetes.io/version: \"12.1.7\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: bamboo-agent\n      app.kubernetes.io/instance: unittest-bamboo-agent\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: d4ebf8887d91b71507c2fbaadd0a7acddb7d61248b427ccbeff869373399e4c0\n      labels:\n        app.kubernetes.io/name: bamboo-agent\n        app.kubernetes.io/instance: unittest-bamboo-agent\n    spec:\n      serviceAccountName: unittest-bamboo-agent\n      terminationGracePeriodSeconds: 30\n      hostAliases:\n        - hostnames:\n          - foo.local\n          - bar.local\n          ip: 127.0.0.1\n      securityContext:\n        fsGroup: 2005\n        fsGroupChangePolicy: OnRootMismatch\n      initContainers:\n      containers:\n        - name: bamboo-agent\n          image: \"atlassian/bamboo-agent-base:12.1.7\"\n          imagePullPolicy: IfNotPresent\n          env:\n            - name: BAMBOO_SERVER\n              value: http://bamboo.bamboo.svc.cluster.local\n            - name: WRAPPER_JAVA_INITMEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: unittest-bamboo-agent-jvm-config\n            - name: WRAPPER_JAVA_MAXMEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: unittest-bamboo-agent-jvm-config\n          startupProbe:\n            exec:\n              command: [\"sh\", \"-c\", \"/probe-startup.sh\"]\n            initialDelaySeconds: 1\n            periodSeconds: 1\n            failureThreshold: 120\n          readinessProbe:\n            exec:\n              command: [\"sh\", \"-c\", \"/probe-readiness.sh\"]\n            initialDelaySeconds: 1\n            periodSeconds: 5\n            failureThreshold: 30\n          resources:\n            requests:\n              cpu: \"1\"\n              memory: 2G\n          volumeMounts:\n      priorityClassName: high\n      volumes:\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/bamboo-agent/values.yaml",
    "content": "agent:\n  server: \"bamboo.bamboo.svc.cluster.local\"\n\npriorityClassName: \"high\"\nadditionalHosts:\n  - ip: \"127.0.0.1\"\n    hostnames:\n    - \"foo.local\"\n    - \"bar.local\"\n\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/bitbucket/output.yaml",
    "content": "---\n# Source: bitbucket/templates/serviceaccount.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: unittest-bitbucket\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n---\n# Source: bitbucket/templates/config-jvm-mesh.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bitbucket-jvm-config-mesh\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  additional_jvm_args: >-\n    -XX:ActiveProcessorCount=1\n    -javaagent:/var/atlassian/application-data/mesh/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\n  max_heap: 1g\n  min_heap: 512m\n---\n# Source: bitbucket/templates/config-jvm.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bitbucket-jvm-config\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  additional_jvm_args: >-\n    -XX:ActiveProcessorCount=2\n    -javaagent:/var/atlassian/application-data/shared-home/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\n    -Dplugin.bitbucket-git.mesh.sidecar.jvmArgs=-javaagent:/var/atlassian/application-data/shared-home/jmx_prometheus_javaagent.jar=9998:/opt/atlassian/jmx/jmx-config.yaml\n  max_heap: 1g\n  min_heap: 512m\n---\n# Source: bitbucket/templates/configmap-jmx-config.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bitbucket-jmx-config\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  jmx-config.yaml: |\n    rules:\n    - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n      name: java_lang_$2_$3\n    - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n      name: java_lang_Memory_HeapMemoryUsage_$1\n    - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n      name: java_lang_G1_$1_Generation_$2\n    - pattern: '.*'\n---\n# Source: bitbucket/templates/configmap-values-analytics.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-bitbucket-helm-values\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  values.yaml: |\n    additionalConfigMaps: []\n    additionalContainers: []\n    additionalFiles: []\n    additionalHosts:\n    - hostnames:\n      - foo.local\n      - bar.local\n      ip: 127.0.0.1\n    additionalInitContainers: []\n    additionalLabels: {}\n    affinity: {}\n    atlassianAnalyticsAndSupport:\n      analytics:\n        enabled: false\n      helmValues:\n        enabled: true\n    bitbucket:\n      additionalAnnotations:\n        argocd.argoproj.io/sync-wave: \"10\"\n      additionalBundledPlugins: []\n      additionalCertificates:\n        customCmd: null\n        initContainer:\n          resources: {}\n          securityContext: {}\n        secretList: []\n        secretName: null\n      additionalEnvironmentVariables: []\n      additionalJvmArgs: []\n      additionalLibraries: []\n      additionalPorts: []\n      additionalVolumeClaimTemplates: []\n      additionalVolumeMounts: []\n      applicationMode: default\n      clustering:\n        enabled: false\n        group:\n          nameSecretKey: name\n          passwordSecretKey: password\n          secretName: null\n      containerSecurityContext: {}\n      elasticSearch:\n        baseUrl: null\n        credentials:\n          passwordSecretKey: password\n          secretName: null\n          usernameSecretKey: username\n      hazelcastService:\n        annotations: {}\n        enabled: false\n        port: 5701\n        type: ClusterIP\n      license:\n        secretKey: license-key\n        secretName: null\n      livenessProbe:\n        customProbe: {}\n        enabled: false\n        failureThreshold: 12\n        initialDelaySeconds: 60\n        periodSeconds: 5\n        timeoutSeconds: 1\n      mesh:\n        additionalAnnotations:\n          argocd.argoproj.io/sync-wave: \"10\"\n        additionalCertificates:\n          customCmd: null\n          initContainer:\n            resources: {}\n            securityContext: {}\n          secretList: []\n          secretName: null\n        additionalEnvironmentVariables: {}\n        additionalFiles: null\n        additionalInitContainers: {}\n        additionalJvmArgs: []\n        affinity: {}\n        enabled: true\n        hostNamespaces: {}\n        image:\n          pullPolicy: IfNotPresent\n          repository: atlassian/bitbucket-mesh\n          tag: 4.2.0\n        nodeAutoRegistration: false\n        nodeSelector: {}\n        podAnnotations: {}\n        podLabels: {}\n        podManagementPolicy: OrderedReady\n        priorityClassName: high\n        replicaCount: 3\n        resources:\n          container:\n            limits:\n              cpu: \"2\"\n              memory: 2G\n            requests:\n              cpu: \"1\"\n              memory: 2G\n          jvm:\n            maxHeap: 1g\n            minHeap: 512m\n        schedulerName: null\n        service:\n          annotations: {}\n          loadBalancerIP: null\n          port: 7777\n          type: ClusterIP\n        setByDefault: false\n        shutdown:\n          terminationGracePeriodSeconds: 35\n        tolerations: {}\n        topologySpreadConstraints: {}\n        volume:\n          create: true\n          mountPath: /var/atlassian/application-data/mesh\n          persistentVolumeClaimRetentionPolicy:\n            whenDeleted: null\n            whenScaled: null\n          resources:\n            requests:\n              storage: 1Gi\n          storageClass: null\n      mirror:\n        upstreamUrl: null\n      podManagementStrategy: OrderedReady\n      ports:\n        hazelcast: 5701\n        http: 7990\n        ssh: 7999\n      postStart:\n        command: null\n      readinessProbe:\n        customProbe: {}\n        enabled: true\n        failureThreshold: 60\n        initialDelaySeconds: 10\n        periodSeconds: 5\n        timeoutSeconds: 1\n      resources:\n        container:\n          requests:\n            cpu: \"2\"\n            memory: 2G\n        jvm:\n          maxHeap: 1g\n          minHeap: 512m\n      securityContext:\n        fsGroup: 2003\n        fsGroupChangePolicy: OnRootMismatch\n      securityContextEnabled: true\n      service:\n        annotations: {}\n        contextPath: null\n        loadBalancerIP: null\n        nodePort: null\n        port: 80\n        sessionAffinity: None\n        sessionAffinityConfig:\n          clientIP:\n            timeoutSeconds: null\n        sshNodePort: null\n        sshPort: 7999\n        type: ClusterIP\n      setPermissions: true\n      shutdown:\n        command: /shutdown-wait.sh\n        terminationGracePeriodSeconds: 35\n      sshService:\n        annotations: {}\n        enabled: false\n        host: null\n        loadBalancerIP: null\n        nodePort: null\n        port: 22\n        type: LoadBalancer\n      startupProbe:\n        enabled: false\n        failureThreshold: 120\n        initialDelaySeconds: 60\n        periodSeconds: 5\n      sysadminCredentials:\n        displayNameSecretKey: displayName\n        emailAddressSecretKey: emailAddress\n        passwordSecretKey: password\n        secretName: null\n        usernameSecretKey: username\n      topologySpreadConstraints: []\n      useHelmReleaseNameAsContainerName: false\n    common:\n      global: {}\n    database:\n      credentials:\n        passwordSecretKey: password\n        secretName: null\n        usernameSecretKey: username\n      driver: null\n      url: null\n    fluentd:\n      command: null\n      customConfigFile: false\n      elasticsearch:\n        enabled: true\n        hostname: elasticsearch\n      enabled: false\n      extraVolumes: []\n      fluentdCustomConfig: {}\n      imageRepo: fluent/fluentd-kubernetes-daemonset\n      imageTag: v1.11.5-debian-elasticsearch7-1.2\n      resources: {}\n    gateway:\n      additionalRules: []\n      annotations: {}\n      create: false\n      filters: []\n      hostnames: []\n      https: true\n      labels: {}\n      parentRefs: []\n      path: null\n      pathType: PathPrefix\n      timeouts:\n        backendRequest: 60s\n        request: 60s\n    hostNamespaces: {}\n    image:\n      pullPolicy: IfNotPresent\n      repository: atlassian/bitbucket\n      tag: \"\"\n    ingress:\n      additionalPaths: []\n      annotations: {}\n      className: nginx\n      create: false\n      host: null\n      https: true\n      maxBodySize: 250m\n      nginx: true\n      openShiftRoute: false\n      path: null\n      proxyConnectTimeout: 60\n      proxyReadTimeout: 60\n      proxySendTimeout: 60\n      routeHttpHeaders: {}\n      tlsSecretName: null\n    monitoring:\n      exposeJmxMetrics: true\n      fetchJmxExporterJar: true\n      grafana:\n        createDashboards: false\n        dashboardAnnotations: {}\n        dashboardLabels: {}\n      jmxExporterCustomConfig: {}\n      jmxExporterCustomJarLocation: null\n      jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n      jmxExporterImageTag: 0.18.0\n      jmxExporterInitContainer:\n        customSecurityContext: {}\n        jmxJarLocation: null\n        resources: {}\n        runAsRoot: true\n      jmxExporterPort: 9999\n      jmxExporterPortType: ClusterIP\n      jmxServiceAnnotations: {}\n      serviceMonitor:\n        create: false\n        prometheusLabelSelector: {}\n        scrapeIntervalSeconds: 30\n        scrapeTimeoutSeconds: 20\n    nodeSelector: {}\n    opensearch:\n      baseUrl: null\n      credentials:\n        passwordSecretKey: password\n        secretName: null\n        usernameSecretKey: username\n      envFrom:\n      - secretRef:\n          name: opensearch-initial-password\n      extraEnvs:\n      - name: plugins.security.ssl.http.enabled\n        value: \"false\"\n      install: false\n      persistence:\n        size: 10Gi\n      resources:\n        requests:\n          cpu: 1\n          memory: 1Gi\n      securityConfig:\n        internalUsersSecret: null\n      singleNode: true\n    openshift:\n      runWithRestrictedSCC: false\n    ordinals:\n      enabled: false\n      start: 0\n    podAnnotations: {}\n    podDisruptionBudget:\n      annotations: {}\n      enabled: false\n      labels: {}\n      maxUnavailable: null\n      minAvailable: null\n    podLabels: {}\n    priorityClassName: high\n    replicaCount: 1\n    serviceAccount:\n      annotations: {}\n      clusterRole:\n        create: false\n        name: null\n      clusterRoleBinding:\n        create: false\n        name: null\n      create: true\n      imagePullSecrets: []\n      name: null\n      role:\n        create: true\n      roleBinding:\n        create: true\n    testPods:\n      affinity: {}\n      annotations: {}\n      image:\n        permissionsTestContainer: debian:stable-slim\n        statusTestContainer: alpine:latest\n      labels: {}\n      nodeSelector: {}\n      resources: {}\n      schedulerName: null\n      tolerations: []\n    tolerations: []\n    updateStrategy: {}\n    volumes:\n      additional: []\n      localHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/bitbucket\n        persistentVolumeClaim:\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        persistentVolumeClaimRetentionPolicy:\n          whenDeleted: null\n          whenScaled: null\n        subPath: null\n      sharedHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/shared-home\n        nfsPermissionFixer:\n          command: null\n          enabled: true\n          imageRepo: alpine\n          imageTag: latest\n          mountPath: /shared-home\n          resources: {}\n        persistentVolume:\n          create: false\n          mountOptions: []\n          nfs:\n            path: \"\"\n            server: \"\"\n        persistentVolumeClaim:\n          accessMode: ReadWriteMany\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n          volumeName: null\n        subPath: null\n---\n# Source: bitbucket/templates/service-jmx.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bitbucket-jmx\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n    - port: 9998\n      targetPort: 9998\n      name: jmx-mesh-sidecar\n  selector:\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n---\n# Source: bitbucket/templates/service-mesh.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bitbucket-mesh-0\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 7777\n      targetPort: mesh\n      protocol: TCP\n      name: mesh\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n    statefulset.kubernetes.io/pod-name: unittest-bitbucket-mesh-0\n---\n# Source: bitbucket/templates/service-mesh.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bitbucket-mesh-1\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 7777\n      targetPort: mesh\n      protocol: TCP\n      name: mesh\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n    statefulset.kubernetes.io/pod-name: unittest-bitbucket-mesh-1\n---\n# Source: bitbucket/templates/service-mesh.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bitbucket-mesh-2\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 7777\n      targetPort: mesh\n      protocol: TCP\n      name: mesh\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n    statefulset.kubernetes.io/pod-name: unittest-bitbucket-mesh-2\n---\n# Source: bitbucket/templates/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-bitbucket\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  sessionAffinity: None\n  ports:\n    - port: 80\n      targetPort: http\n      protocol: TCP\n      name: http\n    - port: 7999\n      targetPort: ssh\n      protocol: TCP\n      name: ssh\n    - port: 5701\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  selector:\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n---\n# Source: bitbucket/templates/statefulset-mesh.yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: unittest-bitbucket-mesh\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\n    argocd.argoproj.io/sync-wave: \"10\"\nspec:\n  replicas: 3\n  podManagementPolicy: OrderedReady\n  serviceName: unittest-bitbucket-mesh\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: bitbucket-mesh\n      app.kubernetes.io/instance: unittest-bitbucket\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: 15d75721ea7bf27f574774d872fa8844f4f6d59a0491cbdba13966c94ba624f5\n      labels:\n        app.kubernetes.io/name: bitbucket-mesh\n        app.kubernetes.io/instance: unittest-bitbucket\n    spec:\n      serviceAccountName: unittest-bitbucket\n      terminationGracePeriodSeconds: 35\n      hostAliases:\n        - hostnames:\n          - foo.local\n          - bar.local\n          ip: 127.0.0.1\n      initContainers:\n        - name: fetch-jmx-exporter\n          image: bitnamilegacy/jmx-exporter:0.18.0\n          command: [\"cp\"]\n          args: [\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\", \"/var/atlassian/application-data/mesh\"]\n          volumeMounts:\n            - mountPath: \"/var/atlassian/application-data/mesh\"\n              name: mesh-home\n          securityContext:\n            runAsUser: 0\n      containers:\n        - name: bitbucket-mesh\n          image: atlassian/bitbucket-mesh:4.2.0\n          imagePullPolicy: IfNotPresent\n          ports:\n            - name: mesh\n              containerPort: 7777\n              protocol: TCP\n            - name: jmx\n              containerPort: 9999\n              protocol: TCP\n          readinessProbe:\n            tcpSocket:\n              port: 7777\n            periodSeconds: 5\n            failureThreshold: 60\n            initialDelaySeconds: 10\n          volumeMounts:\n            - name: mesh-home\n              mountPath: \"/var/atlassian/application-data/mesh\"\n            - name: jmx-config\n              mountPath: /opt/atlassian/jmx\n          resources:\n            limits:\n              cpu: \"2\"\n              memory: 2G\n            requests:\n              cpu: \"1\"\n              memory: 2G\n          env:\n            - name: GRPC_SERVER_PORT\n              value: \"7777\"\n            - name: MESH_HOME\n              value: /var/atlassian/application-data/mesh\n            - name: KUBE_POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: JAVA_OPTS\n              value: \"-Dcluster.node.name=$(KUBE_POD_NAME)\"\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: unittest-bitbucket-jvm-config-mesh\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: unittest-bitbucket-jvm-config-mesh\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: unittest-bitbucket-jvm-config-mesh\n            - name: JMX_ENABLED\n              value: \"true\"\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", \"/shutdown-wait.sh\"]\n      priorityClassName: high\n      volumes:\n        - name: jmx-config\n          configMap:\n            name: unittest-bitbucket-jmx-config\n  volumeClaimTemplates:\n  - metadata:\n      name: mesh-home\n    spec:\n      accessModes: [ \"ReadWriteOnce\" ]\n      resources:\n        requests:\n          storage: 1Gi\n---\n# Source: bitbucket/templates/statefulset.yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: unittest-bitbucket\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\n    argocd.argoproj.io/sync-wave: \"10\"\nspec:\n  replicas: 1\n  podManagementPolicy: OrderedReady\n  serviceName: unittest-bitbucket\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: bitbucket\n      app.kubernetes.io/instance: unittest-bitbucket\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: acfb698512b9526808dc628771d6bdc8d1436661ba64c228a626a51eaefe4046\n      labels:\n        helm.sh/chart: bitbucket-2.0.13\n        app.kubernetes.io/name: bitbucket\n        app.kubernetes.io/instance: unittest-bitbucket\n        app.kubernetes.io/version: \"10.2.3\"\n        app.kubernetes.io/managed-by: Helm\n    spec:\n      serviceAccountName: unittest-bitbucket\n      terminationGracePeriodSeconds: 35\n      hostAliases:\n        - hostnames:\n          - foo.local\n          - bar.local\n          ip: 127.0.0.1\n      securityContext:\n        fsGroup: 2003\n        fsGroupChangePolicy: OnRootMismatch\n      initContainers:\n        - name: fetch-jmx-exporter\n          image: bitnamilegacy/jmx-exporter:0.18.0\n          command: [\"cp\"]\n          args: [\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\", \"/var/atlassian/application-data/shared-home\"]\n          securityContext:\n            runAsUser: 0\n          volumeMounts:\n            - mountPath: \"/var/atlassian/application-data/shared-home\"\n              name: shared-home\n      containers:\n        - name: bitbucket\n          image: \"atlassian/bitbucket:10.2.3\"\n          imagePullPolicy: IfNotPresent\n          ports:\n            - name: http\n              containerPort: 7990\n              protocol: TCP\n            - name: ssh\n              containerPort: 7999\n              protocol: TCP\n            - name: hazelcast\n              containerPort: 5701\n              protocol: TCP\n            - name: jmx\n              containerPort: 9999\n              protocol: TCP\n          readinessProbe:\n            httpGet:\n              port: 7990\n              path: /status\n            initialDelaySeconds: 10\n            periodSeconds: 5\n            timeoutSeconds: 1\n            failureThreshold: 60\n          volumeMounts:\n            - name: local-home\n              mountPath: \"/var/atlassian/application-data/bitbucket\"\n            - name: helm-values\n              mountPath: /opt/atlassian/helm\n            - name: jmx-config\n              mountPath: /opt/atlassian/jmx\n          resources:\n            requests:\n              cpu: \"2\"\n              memory: 2G\n          env:\n            - name: KUBE_POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: JAVA_OPTS\n              value: \"-Dcluster.node.name=$(KUBE_POD_NAME)\"\n            - name: PLUGIN_SSH_PORT\n              value: \"7999\"\n            - name: SERVER_CONTEXT_PATH\n              value: \"/\"\n            - name: SERVER_PORT\n              value: \"7990\"\n            - name: SERVER_SCHEME\n              value: \"https\"\n            - name: SERVER_SECURE\n              value: \"true\"\n            - name: SET_PERMISSIONS\n              value: \"true\"\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: unittest-bitbucket-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: unittest-bitbucket-jvm-config\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: unittest-bitbucket-jvm-config\n            - name: APPLICATION_MODE\n              value: \"default\"\n            - name: JMX_ENABLED\n              value: \"true\"\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", \"/shutdown-wait.sh\"]\n      priorityClassName: high\n      volumes:\n        - name: local-home\n          emptyDir: {}\n        - name: helm-values\n          configMap:\n            name: unittest-bitbucket-helm-values\n        - name: jmx-config\n          configMap:\n            name: unittest-bitbucket-jmx-config\n---\n# Source: bitbucket/templates/tests/test-application-status.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-bitbucket-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: alpine:latest\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: STATUS_URL\n          value: \"http://unittest-bitbucket:80/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n  restartPolicy: Never\n---\n# Source: bitbucket/templates/tests/test-shared-home-permissions.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-bitbucket-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: bitbucket-2.0.13\n    app.kubernetes.io/name: bitbucket\n    app.kubernetes.io/instance: unittest-bitbucket\n    app.kubernetes.io/version: \"10.2.3\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: debian:stable-slim\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        runAsUser: 2003\n        runAsGroup: 2003\n      volumeMounts:\n        - name: local-home\n          mountPath: /shared-home\n          subPath: shared\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n  volumes:\n    - name: local-home\n      emptyDir: {}\n  restartPolicy: Never\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/bitbucket/values.yaml",
    "content": "# This file contains chart value overrides for the Helm output unit test\nvolumes:\n  sharedHome:\n    nfsPermissionFixer:\n      enabled: true\n\nbitbucket:\n  mesh:\n    enabled: true\n    priorityClassName: \"high\"\n\n    additionalAnnotations:\n      argocd.argoproj.io/sync-wave: \"10\"\n\n  additionalAnnotations:\n    argocd.argoproj.io/sync-wave: \"10\"\n\npriorityClassName: \"high\"\nadditionalHosts:\n  - ip: \"127.0.0.1\"\n    hostnames:\n    - \"foo.local\"\n    - \"bar.local\"\n\nmonitoring:\n  exposeJmxMetrics: true\n\natlassianAnalyticsAndSupport:\n  analytics:\n    enabled: false\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/confluence/output.yaml",
    "content": "---\n# Source: confluence/templates/serviceaccount.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: unittest-confluence\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\n---\n# Source: confluence/templates/config-jvm.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-confluence-jvm-config\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  additional_jvm_args: >-\n    -Dconfluence.cluster.hazelcast.listenPort=5701\n    -Dsynchrony.service.url=https:///synchrony/v1\n    -Dsynchrony.by.default.enable.collab.editing.if.manually.managed=true\n    -Dconfluence.clusterNodeName.useHostname=true\n    -Datlassian.logging.cloud.enabled=false\n    -XX:ActiveProcessorCount=2    \n  max_heap: 1g\n  min_heap: 1g\n  reserved_code_cache: 256m\n---\n# Source: confluence/templates/configmap-jmx-config.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-confluence-jmx-config\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  jmx-config.yaml: |\n    rules:\n    - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n      name: java_lang_$2_$3\n    - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n      name: java_lang_Memory_HeapMemoryUsage_$1\n    - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n      name: java_lang_G1_$1_Generation_$2\n    - pattern: '.*'\n---\n# Source: confluence/templates/configmap-values-analytics.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-confluence-helm-values\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  values.yaml: |\n    additionalConfigMaps: []\n    additionalContainers: []\n    additionalFiles: []\n    additionalHosts:\n    - hostnames:\n      - test.example.com\n      ip: 192.168.1.1\n    additionalInitContainers: []\n    additionalLabels: {}\n    affinity: {}\n    atlassianAnalyticsAndSupport:\n      analytics:\n        enabled: false\n      helmValues:\n        enabled: true\n    common:\n      global: {}\n    confluence:\n      accessLog:\n        enabled: true\n        localHomeSubPath: logs\n        mountPath: /opt/atlassian/confluence/logs\n      additionalAnnotations:\n        argocd.argoproj.io/sync-wave: \"10\"\n      additionalBundledPlugins: []\n      additionalCertificates:\n        customCmd: null\n        initContainer:\n          resources: {}\n          securityContext: {}\n        secretList: []\n        secretName: null\n      additionalEnvironmentVariables: []\n      additionalJvmArgs: []\n      additionalLibraries: []\n      additionalPorts: []\n      additionalVolumeClaimTemplates: []\n      additionalVolumeMounts: []\n      clustering:\n        enabled: false\n        usePodNameAsClusterNodeName: true\n      containerSecurityContext: {}\n      forceConfigUpdate: false\n      hazelcastService:\n        annotations: {}\n        enabled: false\n        port: 5701\n        type: ClusterIP\n      jvmDebug:\n        enabled: false\n      license:\n        secretKey: license-key\n        secretName: null\n      livenessProbe:\n        customProbe: {}\n        enabled: false\n        failureThreshold: 12\n        initialDelaySeconds: 60\n        periodSeconds: 5\n        timeoutSeconds: 1\n      ports:\n        hazelcast: 5701\n        http: 8090\n      postStart:\n        command: null\n      readinessProbe:\n        customProbe: {}\n        enabled: true\n        failureThreshold: 6\n        initialDelaySeconds: 10\n        periodSeconds: 5\n        timeoutSeconds: 1\n      resources:\n        container:\n          requests:\n            cpu: \"2\"\n            memory: 2G\n        jvm:\n          maxHeap: 1g\n          minHeap: 1g\n          reservedCodeCache: 256m\n      s3AttachmentsStorage:\n        bucketName: null\n        bucketRegion: null\n        endpointOverride: null\n      securityContext:\n        fsGroup: 2002\n        fsGroupChangePolicy: OnRootMismatch\n      securityContextEnabled: true\n      seraphConfig:\n        autoLoginCookieAge: \"1209600\"\n        generateByHelm: false\n      service:\n        annotations: {}\n        contextPath: null\n        loadBalancerIP: null\n        nodePort: null\n        port: 80\n        sessionAffinity: None\n        sessionAffinityConfig:\n          clientIP:\n            timeoutSeconds: null\n        type: ClusterIP\n      session:\n        autologinCookieAge: null\n        timeout: null\n      setPermissions: true\n      shutdown:\n        command: /shutdown-wait.sh\n        terminationGracePeriodSeconds: 25\n      startupProbe:\n        enabled: false\n        failureThreshold: 120\n        initialDelaySeconds: 60\n        periodSeconds: 5\n      tomcatConfig:\n        acceptCount: \"100\"\n        accessLogMaxDays: \"-1\"\n        accessLogPattern: '%h %{X-AUSERNAME}o %t &quot;%r&quot; %s %b %D %U %I &quot;%{User-Agent}i&quot;'\n        connectionTimeout: \"20000\"\n        customServerXml: \"\"\n        debug: \"0\"\n        enableLookups: \"false\"\n        generateByHelm: false\n        maxHttpHeaderSize: \"8192\"\n        maxThreads: \"100\"\n        mgmtPort: \"8000\"\n        minSpareThreads: \"10\"\n        port: \"8090\"\n        protocol: org.apache.coyote.http11.Http11NioProtocol\n        proxyInternalIps: null\n        proxyName: null\n        proxyPort: null\n        redirectPort: \"8443\"\n        requestAttributesEnabled: \"false\"\n        scheme: null\n        secure: null\n        stuckThreadDetectionValveThreshold: \"60\"\n        trustedProxies: null\n        uriEncoding: UTF-8\n      topologySpreadConstraints: []\n      tunnel:\n        additionalConnector:\n          URIEncoding: UTF-8\n          acceptCount: \"10\"\n          connectionTimeout: \"20000\"\n          enableLookups: \"false\"\n          maxThreads: \"50\"\n          minSpareThreads: \"10\"\n          port: null\n          secure: false\n      umask: \"0022\"\n      useHelmReleaseNameAsContainerName: false\n    database:\n      credentials:\n        passwordSecretKey: password\n        secretName: null\n        usernameSecretKey: username\n      type: null\n      url: null\n    fluentd:\n      command: null\n      customConfigFile: false\n      elasticsearch:\n        enabled: true\n        hostname: elasticsearch\n        indexNamePrefix: confluence\n      enabled: false\n      extraVolumes: []\n      fluentdCustomConfig: {}\n      httpPort: 9880\n      imageRepo: fluent/fluentd-kubernetes-daemonset\n      imageTag: v1.11.5-debian-elasticsearch7-1.2\n      resources: {}\n    gateway:\n      additionalRules: []\n      annotations: {}\n      create: false\n      filters: []\n      hostnames: []\n      https: true\n      labels: {}\n      parentRefs: []\n      path: null\n      pathType: PathPrefix\n      timeouts:\n        backendRequest: 60s\n        request: 60s\n    hostNamespaces: {}\n    image:\n      pullPolicy: IfNotPresent\n      repository: atlassian/confluence\n      tag: \"\"\n    ingress:\n      additionalPaths: []\n      annotations: {}\n      className: nginx\n      create: false\n      host: null\n      https: true\n      maxBodySize: 250m\n      nginx: true\n      openShiftRoute: false\n      path: null\n      proxyConnectTimeout: 60\n      proxyReadTimeout: 60\n      proxySendTimeout: 60\n      routeHttpHeaders: {}\n      tlsSecretName: null\n    monitoring:\n      exposeJmxMetrics: true\n      fetchJmxExporterJar: true\n      grafana:\n        createDashboards: false\n        dashboardAnnotations: {}\n        dashboardLabels: {}\n      jmxExporterCustomConfig: {}\n      jmxExporterCustomJarLocation: null\n      jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n      jmxExporterImageTag: 0.18.0\n      jmxExporterInitContainer:\n        customSecurityContext: {}\n        jmxJarLocation: null\n        resources: {}\n        runAsRoot: true\n      jmxExporterPort: 9999\n      jmxExporterPortType: ClusterIP\n      jmxServiceAnnotations: {}\n      serviceMonitor:\n        create: false\n        prometheusLabelSelector: {}\n        scrapeIntervalSeconds: 30\n        scrapeTimeoutSeconds: 20\n    nodeSelector: {}\n    opensearch:\n      credentials:\n        createSecret: true\n        existingSecretRef:\n          name: null\n      enabled: false\n      envFrom:\n      - secretRef:\n          name: opensearch-initial-password\n      extraEnvs:\n      - name: plugins.security.ssl.http.enabled\n        value: \"false\"\n      persistence:\n        size: 10Gi\n      resources:\n        requests:\n          cpu: 1\n          memory: 1Gi\n      singleNode: true\n    openshift:\n      runWithRestrictedSCC: false\n    ordinals:\n      enabled: false\n      start: 0\n    podAnnotations: {}\n    podDisruptionBudget:\n      annotations: {}\n      enabled: false\n      labels: {}\n      maxUnavailable: null\n      minAvailable: null\n    podLabels: {}\n    priorityClassName: high\n    replicaCount: 1\n    serviceAccount:\n      annotations: {}\n      clusterRole:\n        create: false\n        name: null\n      clusterRoleBinding:\n        create: false\n        name: null\n      create: true\n      eksIrsa:\n        roleArn: null\n      imagePullSecrets: []\n      name: null\n      role:\n        create: true\n      roleBinding:\n        create: true\n    synchrony:\n      additionalAnnotations:\n        argocd.argoproj.io/sync-wave: \"10\"\n      additionalCertificates:\n        customCmd: null\n        initContainer:\n          resources: {}\n          securityContext: {}\n        secretList: []\n        secretName: null\n      additionalEnvironmentVariables: []\n      additionalJvmArgs: []\n      additionalLibraries: []\n      additionalPorts: []\n      additionalVolumeMounts: []\n      affinity: {}\n      containerSecurityContext: {}\n      enabled: true\n      hostNamespaces: {}\n      ingress:\n        annotations: null\n        path: null\n        pathType: null\n      nodeSelector: {}\n      podAnnotations: {}\n      ports:\n        hazelcast: 5701\n        http: 8091\n      priorityClassName: null\n      readinessProbe:\n        failureThreshold: 10\n        healthcheckPath: /synchrony/heartbeat\n        initialDelaySeconds: 5\n        periodSeconds: 1\n      replicaCount: 1\n      resources:\n        container:\n          requests:\n            cpu: \"2\"\n            memory: 2.5G\n        jvm:\n          maxHeap: 2g\n          minHeap: 1g\n          stackSize: 2048k\n      schedulerName: null\n      securityContext:\n        fsGroup: 2002\n      securityContextEnabled: true\n      service:\n        annotations: {}\n        loadBalancerIP: null\n        nodePort: null\n        port: 80\n        type: ClusterIP\n        url: null\n      setPermissions: true\n      shutdown:\n        terminationGracePeriodSeconds: 25\n      tolerations: []\n      topologySpreadConstraints: []\n    testPods:\n      affinity: {}\n      annotations: {}\n      image:\n        permissionsTestContainer: debian:stable-slim\n        statusTestContainer: alpine:latest\n      labels: {}\n      nodeSelector: {}\n      resources: {}\n      schedulerName: null\n      tolerations: []\n    tolerations: []\n    updateStrategy: {}\n    volumes:\n      additional: []\n      additionalSynchrony: []\n      defaultPermissionsMode: 484\n      localHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/confluence\n        persistentVolumeClaim:\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        persistentVolumeClaimRetentionPolicy:\n          whenDeleted: null\n          whenScaled: null\n        subPath: null\n      sharedHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/shared-home\n        nfsPermissionFixer:\n          command: null\n          enabled: true\n          imageRepo: alpine\n          imageTag: latest\n          mountPath: /shared-home\n          resources: {}\n        persistentVolumeClaim:\n          accessModes:\n          - ReadWriteMany\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        subPath: null\n      synchronyHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/confluence\n        persistentVolumeClaim:\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        persistentVolumeClaimRetentionPolicy:\n          whenDeleted: null\n          whenScaled: null\n---\n# Source: confluence/templates/synchrony-start-script.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-confluence-synchrony-entrypoint\ndata:\n  # The script we use as the entrypoint for the Synchrony container, because there isn't one we can use out of the box.\n  # Note that the classpath ony really needs to contain synchrony-standalone.jar and the JDBC driver JAR, but for simplicitly\n  # we just add every JAR in the Confluence lib directory.\n  start-synchrony.sh: |\n    #!/usr/bin/env bash\n    java \\\n       -Xms1g \\\n       -Xmx2g \\\n       -Xss2048k \\\n       -Dsynchrony.port=8091 \\\n       -Dcluster.listen.port=5701 \\\n       -XX:ActiveProcessorCount=2 \\\n       -classpath /opt/atlassian/confluence/confluence/WEB-INF/packages/synchrony-standalone.jar:/opt/atlassian/confluence/confluence/WEB-INF/lib/* \\\n       synchrony.core \\\n       sql\n---\n# Source: confluence/templates/service-jmx.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-confluence-jmx\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n---\n# Source: confluence/templates/service-synchrony.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-confluence-synchrony\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence-synchrony\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 80\n      targetPort: http\n      protocol: TCP\n      name: http\n    - port: 5701\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  selector:\n    app.kubernetes.io/name: confluence-synchrony\n    app.kubernetes.io/instance: unittest-confluence\n---\n# Source: confluence/templates/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-confluence\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  sessionAffinity: None\n  ports:\n    - port: 80\n      targetPort: http\n      protocol: TCP\n      name: http\n    - port: 5701\n      targetPort: hazelcast\n      protocol: TCP\n      name: hazelcast\n  selector:\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n---\n# Source: confluence/templates/statefulset-synchrony.yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: unittest-confluence-synchrony\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence-synchrony\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\n    argocd.argoproj.io/sync-wave: \"10\"\nspec:\n  replicas: 1\n  serviceName: unittest-confluence-synchrony\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: confluence-synchrony\n      app.kubernetes.io/instance: unittest-confluence\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: 5c7e4f3183d49bd4e8c82a29b06246e551e4120042495652f1f9b27a0599a882\n      labels:\n        helm.sh/chart: confluence-2.0.13\n        app.kubernetes.io/name: confluence-synchrony\n        app.kubernetes.io/instance: unittest-confluence\n        app.kubernetes.io/version: \"10.2.11\"\n        app.kubernetes.io/managed-by: Helm\n    spec:\n      serviceAccountName: unittest-confluence\n      terminationGracePeriodSeconds: 25\n      securityContext:\n        fsGroup: 2002\n      hostAliases:\n        - hostnames:\n          - test.example.com\n          ip: 192.168.1.1\n      containers:\n        - name: synchrony\n          image: \"atlassian/confluence:10.2.11\"\n          imagePullPolicy: IfNotPresent\n          command: [\"/scripts/start-synchrony.sh\"]\n          volumeMounts:\n            - name: synchrony-home\n              mountPath: \"/var/atlassian/application-data/confluence\"\n            - mountPath: /scripts\n              name: entrypoint-script\n          ports:\n            - name: http\n              containerPort: 8091\n              protocol: TCP\n            - name: hazelcast\n              containerPort: 5701\n              protocol: TCP\n          readinessProbe:\n            httpGet:\n              port: 8091\n              path: /synchrony/heartbeat\n            initialDelaySeconds: 5\n            periodSeconds: 1\n            failureThreshold: 10\n          resources:\n            requests:\n              cpu: \"2\"\n              memory: 2.5G\n          env:\n            - name: SET_PERMISSIONS\n              value: \"true\"\n            - name: SYNCHRONY_BIND\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: SYNCHRONY_SERVICE_URL\n              value: \"https:///synchrony\"\n      priorityClassName: high\n      volumes:\n        - name: entrypoint-script\n          configMap:\n            name: unittest-confluence-synchrony-entrypoint\n            defaultMode: 484\n        - name: synchrony-home\n          emptyDir: {}\n---\n# Source: confluence/templates/statefulset.yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: unittest-confluence\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\n    argocd.argoproj.io/sync-wave: \"10\"\nspec:\n  replicas: 1\n  serviceName: unittest-confluence\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: confluence\n      app.kubernetes.io/instance: unittest-confluence\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: bd462a81b39db2da8ef53e5576ad8bd11ff0c9de4477e7e42900daff3f3d0bd4\n      labels:\n        helm.sh/chart: confluence-2.0.13\n        app.kubernetes.io/name: confluence\n        app.kubernetes.io/instance: unittest-confluence\n        app.kubernetes.io/version: \"10.2.11\"\n        app.kubernetes.io/managed-by: Helm\n    spec:\n      serviceAccountName: unittest-confluence\n      terminationGracePeriodSeconds: 25\n      securityContext:\n        fsGroup: 2002\n        fsGroupChangePolicy: OnRootMismatch\n      hostAliases:\n        - hostnames:\n          - test.example.com\n          ip: 192.168.1.1\n      initContainers:\n        - name: nfs-permission-fixer\n          image: alpine:latest\n          imagePullPolicy: IfNotPresent\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: \"/shared-home\"\n          command: [\"sh\", \"-c\", \"(chgrp 2002 /shared-home; chmod g+w /shared-home)\"]\n        - name: fetch-jmx-exporter\n          image: bitnamilegacy/jmx-exporter:0.18.0\n          command: [\"cp\"]\n          args: [\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\", \"/var/atlassian/application-data/shared-home\"]\n          securityContext:\n            runAsUser: 0\n          volumeMounts:\n            - mountPath: \"/var/atlassian/application-data/shared-home\"\n              name: shared-home\n      containers:\n        - name: confluence\n          image: \"atlassian/confluence:10.2.11\"\n          imagePullPolicy: IfNotPresent\n          ports:\n            - name: http\n              containerPort: 8090\n              protocol: TCP\n            - name: hazelcast\n              containerPort: 5701\n              protocol: TCP\n            - name: jmx\n              containerPort: 9999\n              protocol: TCP\n          readinessProbe:\n            httpGet:\n              port: 8090\n              path: /status\n            initialDelaySeconds: 10\n            periodSeconds: 5\n            timeoutSeconds: 1\n            failureThreshold: 6\n          resources:\n            requests:\n              cpu: \"2\"\n              memory: 2G\n          volumeMounts:\n            - name: local-home\n              mountPath: \"/var/atlassian/application-data/confluence\"\n            - name: local-home\n              mountPath: \"/opt/atlassian/confluence/logs\"\n              subPath: \"logs\"\n            - name: shared-home\n              mountPath: \"/var/atlassian/application-data/shared-home\"\n            - name: helm-values\n              mountPath: /opt/atlassian/helm\n            - name: jmx-config\n              mountPath: /opt/atlassian/jmx\n          env:\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            - name: ATL_TOMCAT_PORT\n              value: \"8090\"\n            - name: ATL_TOMCAT_ACCESS_LOG\n              value: \"true\"\n            - name: UMASK\n              value: \"0022\"\n            - name: SET_PERMISSIONS\n              value: \"true\"\n            - name: ATL_PRODUCT_HOME_SHARED\n              value: \"/var/atlassian/application-data/shared-home\"\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: unittest-confluence-jvm-config\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: unittest-confluence-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: unittest-confluence-jvm-config\n            - name: JVM_RESERVED_CODE_CACHE_SIZE\n              valueFrom:\n                configMapKeyRef:\n                  key: reserved_code_cache\n                  name: unittest-confluence-jvm-config\n            - name: CATALINA_OPTS\n              value: \"-javaagent:/var/atlassian/application-data/shared-home/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\"\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", \"/shutdown-wait.sh\"]\n      priorityClassName: high\n      volumes:\n        - name: local-home\n          emptyDir: {}\n        - name: shared-home\n          emptyDir: {}\n        - name: helm-values\n          configMap:\n            name: unittest-confluence-helm-values\n        - name: jmx-config\n          configMap:\n            name: unittest-confluence-jmx-config\n---\n# Source: confluence/templates/tests/test-application-status.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-confluence-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: alpine:latest\n      env:\n        - name: STATUS_URL\n          value: \"http://unittest-confluence:80/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n  restartPolicy: Never\n---\n# Source: confluence/templates/tests/test-shared-home-permissions.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-confluence-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: confluence-2.0.13\n    app.kubernetes.io/name: confluence\n    app.kubernetes.io/instance: unittest-confluence\n    app.kubernetes.io/version: \"10.2.11\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: debian:stable-slim\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        runAsUser: 2002\n        runAsGroup: 2002\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n  volumes:\n    - name: shared-home\n      emptyDir: {}\n  restartPolicy: Never\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/confluence/values.yaml",
    "content": "# This file contains chart value overrides for the Helm output unit test\nvolumes:\n  sharedHome:\n    nfsPermissionFixer:\n      enabled: true\n\nsynchrony:\n  enabled: true\n\n  additionalAnnotations:\n    argocd.argoproj.io/sync-wave: \"10\"\n\nadditionalHosts:\n- ip: \"192.168.1.1\"\n  hostnames:\n    - \"test.example.com\"\n\npriorityClassName: \"high\"\n\nmonitoring:\n  exposeJmxMetrics: true\n\natlassianAnalyticsAndSupport:\n  analytics:\n    enabled: false\n\nconfluence:\n  additionalAnnotations:\n    argocd.argoproj.io/sync-wave: \"10\"\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/crowd/output.yaml",
    "content": "---\n# Source: crowd/templates/serviceaccount.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: unittest-crowd\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\n---\n# Source: crowd/templates/config-jvm.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-crowd-jvm-config\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  additional_jvm_args: >-\n    -Dcluster.node.name=${KUBE_POD_NAME}\n    -Datlassian.logging.cloud.enabled=false\n    -XX:ActiveProcessorCount=2\n  max_heap: 768m\n  min_heap: 384m\n---\n# Source: crowd/templates/configmap-jmx-config.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-crowd-jmx-config\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  jmx-config.yaml: |\n    rules:\n      - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n        name: java_lang_$2_$3\n        labels:\n          product: \"crowd\"\n      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n        name: java_lang_Memory_HeapMemoryUsage_$1\n        labels:\n          product: \"crowd\"\n      - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n        name: java_lang_G1_$1_Generation_$2\n        labels:\n          product: \"crowd\"\n      - pattern: '.*'\n---\n# Source: crowd/templates/configmap-values-analytics.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-crowd-helm-values\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  values.yaml: |\n    additionalConfigMaps: []\n    additionalContainers: []\n    additionalFiles: []\n    additionalHosts:\n    - hostnames:\n      - foo.local\n      - bar.local\n      ip: 127.0.0.1\n    additionalInitContainers: []\n    additionalLabels: {}\n    affinity: {}\n    atlassianAnalyticsAndSupport:\n      analytics:\n        enabled: false\n      helmValues:\n        enabled: true\n    common:\n      global: {}\n    crowd:\n      accessLog:\n        enabled: true\n        localHomeSubPath: logs\n        mountPath: /opt/atlassian/crowd/apache-tomcat/logs\n      additionalAnnotations:\n        argocd.argoproj.io/sync-wave: \"10\"\n      additionalBundledPlugins: []\n      additionalCertificates:\n        customCmd: null\n        initContainer:\n          resources: {}\n          securityContext: {}\n        secretList: []\n        secretName: null\n      additionalEnvironmentVariables: []\n      additionalJvmArgs: []\n      additionalLibraries: []\n      additionalPorts: []\n      additionalVolumeClaimTemplates: []\n      additionalVolumeMounts: []\n      containerSecurityContext: {}\n      livenessProbe:\n        customProbe: {}\n        enabled: false\n        failureThreshold: 12\n        initialDelaySeconds: 60\n        periodSeconds: 5\n        timeoutSeconds: 1\n      ports:\n        http: 8095\n      postStart:\n        command: null\n      readinessProbe:\n        customProbe: {}\n        enabled: true\n        failureThreshold: 10\n        initialDelaySeconds: 10\n        periodSeconds: 5\n        timeoutSeconds: 1\n      resources:\n        container:\n          requests:\n            cpu: \"2\"\n            memory: 1G\n        jvm:\n          maxHeap: 768m\n          minHeap: 384m\n      securityContext:\n        fsGroup: 2004\n        fsGroupChangePolicy: OnRootMismatch\n      securityContextEnabled: true\n      service:\n        annotations: {}\n        contextPath: /crowd\n        loadBalancerIP: null\n        nodePort: null\n        port: 80\n        sessionAffinity: None\n        sessionAffinityConfig:\n          clientIP:\n            timeoutSeconds: null\n        type: ClusterIP\n      setPermissions: true\n      shutdown:\n        command: /shutdown-wait.sh\n        terminationGracePeriodSeconds: 30\n      startupProbe:\n        enabled: false\n        failureThreshold: 120\n        initialDelaySeconds: 60\n        periodSeconds: 5\n      tomcatConfig:\n        acceptCount: \"100\"\n        accessLogsMaxDays: \"-1\"\n        connectionTimeout: \"20000\"\n        enableLookups: \"false\"\n        generateByHelm: false\n        maxHttpHeaderSize: \"8192\"\n        maxThreads: \"150\"\n        mgmtPort: \"8020\"\n        minSpareThreads: \"25\"\n        port: \"8095\"\n        protocol: HTTP/1.1\n        proxyInternalIps: null\n        proxyName: null\n        proxyPort: null\n        redirectPort: \"8443\"\n        requestAttributesEnabled: \"false\"\n        scheme: null\n        secure: null\n      topologySpreadConstraints: []\n      umask: \"0022\"\n      useHelmReleaseNameAsContainerName: false\n    fluentd:\n      command: null\n      customConfigFile: false\n      elasticsearch:\n        enabled: true\n        hostname: elasticsearch\n        indexNamePrefix: crowd\n      enabled: false\n      extraVolumes: []\n      fluentdCustomConfig: {}\n      httpPort: 9880\n      imageRepo: fluent/fluentd-kubernetes-daemonset\n      imageTag: v1.11.5-debian-elasticsearch7-1.2\n      resources: {}\n    gateway:\n      additionalRules: []\n      annotations: {}\n      create: false\n      filters: []\n      hostnames: []\n      https: true\n      labels: {}\n      parentRefs: []\n      path: /\n      pathType: PathPrefix\n      timeouts:\n        backendRequest: 60s\n        request: 60s\n    hostNamespaces: {}\n    image:\n      pullPolicy: IfNotPresent\n      repository: atlassian/crowd\n      tag: \"\"\n    ingress:\n      additionalPaths: []\n      annotations: {}\n      className: nginx\n      create: false\n      host: null\n      https: true\n      maxBodySize: 250m\n      nginx: true\n      openShiftRoute: false\n      path: /\n      proxyConnectTimeout: 60\n      proxyReadTimeout: 60\n      proxySendTimeout: 60\n      routeHttpHeaders: {}\n      tlsSecretName: null\n    monitoring:\n      exposeJmxMetrics: true\n      fetchJmxExporterJar: true\n      grafana:\n        createDashboards: false\n        dashboardAnnotations: {}\n        dashboardLabels: {}\n      jmxExporterCustomConfig: {}\n      jmxExporterCustomJarLocation: null\n      jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n      jmxExporterImageTag: 0.18.0\n      jmxExporterInitContainer:\n        customSecurityContext: {}\n        jmxJarLocation: null\n        resources: {}\n        runAsRoot: true\n      jmxExporterPort: 9999\n      jmxExporterPortType: ClusterIP\n      jmxServiceAnnotations: {}\n      serviceMonitor:\n        create: false\n        prometheusLabelSelector: {}\n        scrapeIntervalSeconds: 30\n    nodeSelector: {}\n    openshift:\n      runWithRestrictedSCC: false\n    ordinals:\n      enabled: false\n      start: 0\n    podAnnotations: {}\n    podDisruptionBudget:\n      annotations: {}\n      enabled: false\n      labels: {}\n      maxUnavailable: null\n      minAvailable: null\n    podLabels: {}\n    priorityClassName: high\n    replicaCount: 1\n    serviceAccount:\n      annotations: {}\n      create: true\n      imagePullSecrets: []\n      name: null\n    terminationGracePeriodSeconds: 30\n    testPods:\n      affinity: {}\n      annotations: {}\n      image:\n        permissionsTestContainer: debian:stable-slim\n        statusTestContainer: alpine:latest\n      labels: {}\n      nodeSelector: {}\n      resources: {}\n      schedulerName: null\n      tolerations: []\n    tolerations: []\n    updateStrategy: {}\n    volumes:\n      additional: []\n      localHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/crowd\n        persistentVolumeClaim:\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        persistentVolumeClaimRetentionPolicy:\n          whenDeleted: null\n          whenScaled: null\n        subPath: null\n      sharedHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/crowd/shared\n        nfsPermissionFixer:\n          command: null\n          enabled: true\n          imageRepo: alpine\n          imageTag: latest\n          mountPath: /shared-home\n          resources: {}\n        persistentVolumeClaim:\n          accessModes:\n          - ReadWriteMany\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        subPath: null\n---\n# Source: crowd/templates/service-jmx.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-crowd-jmx\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n---\n# Source: crowd/templates/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-crowd\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  sessionAffinity: None\n  ports:\n    - port: 80\n      targetPort: http\n      protocol: TCP\n      name: http\n  selector:\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n---\n# Source: crowd/templates/statefulset.yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: unittest-crowd\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\n    argocd.argoproj.io/sync-wave: \"10\"\nspec:\n  replicas: 1\n  serviceName: unittest-crowd\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: crowd\n      app.kubernetes.io/instance: unittest-crowd\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: 7aac18d0b223bc187ccac594d2762fd2aade00c8efee7323fae0d3147a540e08\n      labels:\n        helm.sh/chart: crowd-2.0.13\n        app.kubernetes.io/name: crowd\n        app.kubernetes.io/instance: unittest-crowd\n        app.kubernetes.io/version: \"7.1.5\"\n        app.kubernetes.io/managed-by: Helm\n    spec:\n      serviceAccountName: unittest-crowd\n      terminationGracePeriodSeconds: 30\n      hostAliases:\n        - hostnames:\n          - foo.local\n          - bar.local\n          ip: 127.0.0.1\n      securityContext:\n        fsGroup: 2004\n        fsGroupChangePolicy: OnRootMismatch\n      initContainers:\n        - name: nfs-permission-fixer\n          image: alpine:latest\n          imagePullPolicy: IfNotPresent\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: \"/shared-home\"\n          command: [\"sh\", \"-c\", \"(chgrp 2004 /shared-home; chmod g+w /shared-home)\"]\n        - name: fetch-jmx-exporter\n          image: bitnamilegacy/jmx-exporter:0.18.0\n          command: [\"cp\"]\n          args: [\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\", \"/var/atlassian/application-data/crowd/shared\"]\n          securityContext:\n            runAsUser: 0\n          volumeMounts:\n            - mountPath: \"/var/atlassian/application-data/crowd/shared\"\n              name: shared-home\n      containers:\n        - name: crowd\n          image: \"atlassian/crowd:7.1.5\"\n          imagePullPolicy: IfNotPresent\n          ports:\n            - name: http\n              containerPort: 8095\n              protocol: TCP\n            - name: jmx\n              containerPort: 9999\n              protocol: TCP\n          readinessProbe:\n            httpGet:\n              port: 8095\n              path: /crowd/status\n            initialDelaySeconds: 10\n            periodSeconds: 5\n            timeoutSeconds: 1\n            failureThreshold: 10\n          resources:\n            requests:\n              cpu: \"2\"\n              memory: 1G\n          volumeMounts:\n            - name: local-home\n              mountPath: \"/var/atlassian/application-data/crowd\"\n            - name: local-home\n              mountPath: \"/opt/atlassian/crowd/apache-tomcat/logs\"\n              subPath: \"logs\"\n            - name: shared-home\n              mountPath: \"/var/atlassian/application-data/crowd/shared\"\n            - name: helm-values\n              mountPath: /opt/atlassian/helm\n            - name: jmx-config\n              mountPath: /opt/atlassian/jmx\n          env:\n            - name: KUBE_POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            - name: ATL_TOMCAT_CONTEXTPATH\n              value: \"/crowd\"\n            - name: ATL_TOMCAT_PORT\n              value: \"8095\"\n            - name: ATL_TOMCAT_ACCESS_LOG\n              value: \"true\"\n            - name: UMASK\n              value: \"0022\"\n            - name: SET_PERMISSIONS\n              value: \"true\"\n            - name: ATL_PRODUCT_HOME_SHARED\n              value: \"/var/atlassian/application-data/crowd/shared\"\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: unittest-crowd-jvm-config\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: unittest-crowd-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: unittest-crowd-jvm-config\n            - name: CATALINA_OPTS\n              value: \"-javaagent:/var/atlassian/application-data/crowd/shared/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\"\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", \"/shutdown-wait.sh\"]\n      priorityClassName: high\n      volumes:\n        - name: local-home\n          emptyDir: {}\n        - name: shared-home\n          emptyDir: {}\n        - name: helm-values\n          configMap:\n            name: unittest-crowd-helm-values\n        - name: jmx-config\n          configMap:\n            name: unittest-crowd-jmx-config\n---\n# Source: crowd/templates/tests/test-application-status.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-crowd-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: alpine:latest\n      env:\n        - name: STATUS_URL\n          value: \"http://unittest-crowd:80/crowd/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n  restartPolicy: Never\n---\n# Source: crowd/templates/tests/test-shared-home-permissions.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-crowd-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: crowd-2.0.13\n    app.kubernetes.io/name: crowd\n    app.kubernetes.io/instance: unittest-crowd\n    app.kubernetes.io/version: \"7.1.5\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: debian:stable-slim\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        runAsUser: 2004\n        runAsGroup: 2004\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n  volumes:\n    - name: shared-home\n      emptyDir: {}\n  restartPolicy: Never\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/crowd/values.yaml",
    "content": "# This file contains chart value overrides for the Helm output unit test\nvolumes:\n  sharedHome:\n    nfsPermissionFixer:\n      enabled: true\n\n\npriorityClassName: \"high\"\n\nadditionalHosts:\n  - ip: \"127.0.0.1\"\n    hostnames:\n    - \"foo.local\"\n    - \"bar.local\"\n\nmonitoring:\n  exposeJmxMetrics: true\n\natlassianAnalyticsAndSupport:\n  analytics:\n    enabled: false\n\ncrowd:\n  additionalAnnotations:\n    argocd.argoproj.io/sync-wave: \"10\"\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/jira/output.yaml",
    "content": "---\n# Source: jira/templates/serviceaccount.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: unittest-jira\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\n---\n# Source: jira/templates/config-jvm.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-jira-jvm-config\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  additional_jvm_args: >-\n    -Datlassian.logging.cloud.enabled=false\n    -XX:ActiveProcessorCount=2\n  max_heap: 768m\n  min_heap: 384m\n  reserved_code_cache: 512m\n---\n# Source: jira/templates/configmap-jmx-config.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-jira-jmx-config\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  jmx-config.yaml: |\n    ---\n    startDelaySeconds: 0\n    rules:\n      - pattern: '(java.lang)<type=(\\w+)><>(\\w+):'\n        name: java_lang_$2_$3\n      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\\w+)'\n        name: java_lang_Memory_HeapMemoryUsage_$1\n      - pattern: 'java.lang<name=G1 (\\w+) Generation, type=GarbageCollector><>(\\w+)'\n        name: java_lang_G1_$1_Generation_$2\n      - pattern: '.*'\n    blacklistObjectNames:\n      - 'com.atlassian.jira:connectionpool=connections,connection=*,name=BasicDataSource'\n---\n# Source: jira/templates/configmap-values-analytics.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: unittest-jira-helm-values\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\ndata:\n  values.yaml: |\n    additionalConfigMaps: []\n    additionalContainers: []\n    additionalFiles: []\n    additionalHosts:\n    - hostnames:\n      - foo.local\n      - bar.local\n      ip: 127.0.0.1\n    additionalInitContainers: []\n    additionalLabels: {}\n    affinity: {}\n    atlassianAnalyticsAndSupport:\n      analytics:\n        enabled: false\n      helmValues:\n        enabled: true\n    common:\n      global: {}\n    database:\n      credentials:\n        passwordSecretKey: password\n        secretName: null\n        usernameSecretKey: username\n      driver: null\n      type: null\n      url: null\n    fluentd:\n      command: null\n      customConfigFile: false\n      elasticsearch:\n        enabled: true\n        hostname: elasticsearch\n        indexNamePrefix: jira\n      enabled: false\n      extraVolumes: []\n      fluentdCustomConfig: {}\n      httpPort: 9880\n      imageRepo: fluent/fluentd-kubernetes-daemonset\n      imageTag: v1.11.5-debian-elasticsearch7-1.2\n      resources: {}\n    gateway:\n      additionalRules: []\n      annotations: {}\n      create: false\n      filters: []\n      hostnames: []\n      https: true\n      labels: {}\n      parentRefs: []\n      path: null\n      pathType: PathPrefix\n      timeouts:\n        backendRequest: 60s\n        request: 60s\n    hostNamespaces: {}\n    image:\n      pullPolicy: IfNotPresent\n      repository: atlassian/jira-software\n      tag: \"\"\n    ingress:\n      additionalPaths: []\n      annotations: {}\n      className: nginx\n      create: false\n      host: null\n      https: true\n      maxBodySize: 250m\n      nginx: true\n      openShiftRoute: false\n      path: null\n      proxyConnectTimeout: 60\n      proxyReadTimeout: 60\n      proxySendTimeout: 60\n      routeHttpHeaders: {}\n      tlsSecretName: null\n    jira:\n      accessLog:\n        localHomeSubPath: log\n        mountPath: /opt/atlassian/jira/logs\n      additionalAnnotations:\n        argocd.argoproj.io/sync-wave: \"10\"\n      additionalBundledPlugins: []\n      additionalCertificates:\n        customCmd: null\n        initContainer:\n          resources: {}\n          securityContext: {}\n        secretList: []\n        secretName: null\n      additionalConfigProperties: []\n      additionalConfigPropertiesExpandEnv: []\n      additionalEnvironmentVariables: []\n      additionalJvmArgs: []\n      additionalLibraries: []\n      additionalPorts: []\n      additionalVolumeClaimTemplates: []\n      additionalVolumeMounts: []\n      clustering:\n        enabled: false\n      containerSecurityContext: {}\n      forceConfigUpdate: false\n      livenessProbe:\n        customProbe: {}\n        enabled: false\n        failureThreshold: 12\n        initialDelaySeconds: 60\n        periodSeconds: 5\n        timeoutSeconds: 1\n      ports:\n        ehcache: 40001\n        ehcacheobject: 40011\n        http: 8080\n      postStart:\n        command: null\n      readinessProbe:\n        customProbe: {}\n        enabled: true\n        failureThreshold: 10\n        initialDelaySeconds: 10\n        periodSeconds: 5\n        timeoutSeconds: 1\n      resources:\n        container:\n          requests:\n            cpu: \"2\"\n            memory: 2G\n        jvm:\n          maxHeap: 768m\n          minHeap: 384m\n          reservedCodeCache: 512m\n      s3Storage:\n        attachments:\n          bucketName: null\n          bucketRegion: null\n          endpointOverride: null\n        avatars:\n          bucketName: null\n          bucketRegion: null\n          endpointOverride: null\n        backups:\n          bucketName: null\n          bucketRegion: null\n          endpointOverride: null\n      securityContext:\n        fsGroup: 2001\n        fsGroupChangePolicy: OnRootMismatch\n      securityContextEnabled: true\n      seraphConfig:\n        autoLoginCookieAge: \"1209600\"\n        generateByHelm: false\n      service:\n        annotations: {}\n        contextPath: null\n        loadBalancerIP: null\n        nodePort: null\n        port: 80\n        sessionAffinity: None\n        sessionAffinityConfig:\n          clientIP:\n            timeoutSeconds: null\n        type: ClusterIP\n      session:\n        autologinCookieAge: null\n        timeout: null\n      setPermissions: true\n      shutdown:\n        command: /shutdown-wait.sh\n        terminationGracePeriodSeconds: 30\n      startupProbe:\n        enabled: false\n        failureThreshold: 120\n        initialDelaySeconds: 60\n        periodSeconds: 5\n      tomcatConfig:\n        acceptCount: \"100\"\n        accessLogMaxDays: \"-1\"\n        accessLogPattern: '%a %{jira.request.id}r %{jira.request.username}r %t &quot;%m\n          %U%q %H&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; &quot;%{jira.request.assession.id}r&quot;'\n        connectionTimeout: \"20000\"\n        customServerXml: \"\"\n        enableLookups: \"false\"\n        generateByHelm: false\n        maxHttpHeaderSize: \"8192\"\n        maxThreads: \"100\"\n        mgmtPort: \"8005\"\n        minSpareThreads: \"10\"\n        port: \"8080\"\n        protocol: HTTP/1.1\n        proxyName: null\n        proxyPort: null\n        redirectPort: \"8443\"\n        requestAttributesEnabled: \"false\"\n        scheme: null\n        secure: null\n        stuckThreadDetectionValveThreshold: \"120\"\n      topologySpreadConstraints: []\n      tunnel:\n        additionalConnector:\n          URIEncoding: UTF-8\n          acceptCount: \"10\"\n          connectionTimeout: \"20000\"\n          enableLookups: \"false\"\n          maxThreads: \"50\"\n          minSpareThreads: \"10\"\n          port: null\n          secure: false\n      useHelmReleaseNameAsContainerName: false\n    monitoring:\n      exposeJmxMetrics: true\n      fetchJmxExporterJar: true\n      grafana:\n        createDashboards: false\n        dashboardAnnotations: {}\n        dashboardLabels: {}\n      jmxExporterCustomConfig: {}\n      jmxExporterCustomJarLocation: null\n      jmxExporterImageRepo: bitnamilegacy/jmx-exporter\n      jmxExporterImageTag: 0.18.0\n      jmxExporterInitContainer:\n        customSecurityContext: {}\n        jmxJarLocation: null\n        resources: {}\n        runAsRoot: true\n      jmxExporterPort: 9999\n      jmxExporterPortType: ClusterIP\n      jmxServiceAnnotations: {}\n      serviceMonitor:\n        create: false\n        prometheusLabelSelector: {}\n        scrapeIntervalSeconds: 30\n        scrapeTimeoutSeconds: 20\n    nodeSelector: {}\n    opensearch:\n      credentials:\n        createSecret: true\n        existingSecretRef:\n          name: null\n      enabled: false\n      envFrom:\n      - secretRef:\n          name: opensearch-initial-password\n      extraEnvs:\n      - name: plugins.security.ssl.http.enabled\n        value: \"false\"\n      persistence:\n        size: 10Gi\n      resources:\n        requests:\n          cpu: 1\n          memory: 1Gi\n      singleNode: true\n    openshift:\n      runWithRestrictedSCC: false\n    ordinals:\n      enabled: false\n      start: 0\n    podAnnotations: {}\n    podDisruptionBudget:\n      annotations: {}\n      enabled: false\n      labels: {}\n      maxUnavailable: null\n      minAvailable: null\n    podLabels: {}\n    priorityClassName: high\n    replicaCount: 1\n    serviceAccount:\n      annotations: {}\n      create: true\n      eksIrsa:\n        roleArn: null\n      imagePullSecrets: []\n      name: null\n    testPods:\n      affinity: {}\n      annotations: {}\n      image:\n        permissionsTestContainer: debian:stable-slim\n        statusTestContainer: alpine:latest\n      labels: {}\n      nodeSelector: {}\n      resources: {}\n      schedulerName: null\n      tolerations: []\n    tolerations: []\n    updateStrategy: {}\n    volumes:\n      additional: []\n      localHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/jira\n        persistentVolumeClaim:\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        persistentVolumeClaimRetentionPolicy:\n          whenDeleted: null\n          whenScaled: null\n        subPath: null\n      sharedHome:\n        customVolume: {}\n        mountPath: /var/atlassian/application-data/shared-home\n        nfsPermissionFixer:\n          command: null\n          enabled: true\n          imageRepo: alpine\n          imageTag: latest\n          mountPath: /shared-home\n          resources: {}\n        persistentVolumeClaim:\n          accessModes:\n          - ReadWriteMany\n          create: false\n          resources:\n            requests:\n              storage: 1Gi\n          storageClassName: null\n        subPath: null\n---\n# Source: jira/templates/service-jmx.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-jira-jmx\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  ports:\n    - port: 9999\n      targetPort: jmx\n      appProtocol: http\n      name: jmx\n  selector:\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n---\n# Source: jira/templates/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: unittest-jira\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\nspec:\n  type: ClusterIP\n  sessionAffinity: None\n  ports:\n    - port: 80\n      targetPort: http\n      protocol: TCP\n      name: http\n  selector:\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n---\n# Source: jira/templates/statefulset.yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: unittest-jira\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\n  annotations:\n    argocd.argoproj.io/sync-wave: \"10\"\nspec:\n  replicas: 1\n  serviceName: unittest-jira\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: jira\n      app.kubernetes.io/instance: unittest-jira\n  template:\n    metadata:\n      annotations:\n        checksum/config-jvm: 83a2e202b7e63d8c21e942f1015c499fe99e269b9186cb191f5490c96c56eb78\n      labels:\n        helm.sh/chart: jira-2.0.13\n        app.kubernetes.io/name: jira\n        app.kubernetes.io/instance: unittest-jira\n        app.kubernetes.io/version: \"11.3.6\"\n        app.kubernetes.io/managed-by: Helm\n    spec:\n      serviceAccountName: unittest-jira\n      terminationGracePeriodSeconds: 30\n      hostAliases:\n        - hostnames:\n          - foo.local\n          - bar.local\n          ip: 127.0.0.1\n      securityContext:\n        fsGroup: 2001\n        fsGroupChangePolicy: OnRootMismatch\n      initContainers:\n        - name: nfs-permission-fixer\n          image: alpine:latest\n          imagePullPolicy: IfNotPresent\n          securityContext:\n            runAsUser: 0 # make sure we run as root so we get the ability to change the volume permissions\n          volumeMounts:\n            - name: shared-home\n              mountPath: \"/shared-home\"\n          command: [\"sh\", \"-c\", \"(chgrp 2001 /shared-home; chmod g+w /shared-home)\"]\n        - name: fetch-jmx-exporter\n          image: bitnamilegacy/jmx-exporter:0.18.0\n          command: [\"cp\"]\n          args: [\"/opt/bitnami/jmx-exporter/jmx_prometheus_javaagent.jar\", \"/var/atlassian/application-data/shared-home\"]\n          securityContext:\n            runAsUser: 0\n          volumeMounts:\n            - mountPath: \"/var/atlassian/application-data/shared-home\"\n              name: shared-home\n      containers:\n        - name: jira\n          image: \"atlassian/jira-software:11.3.6\"\n          imagePullPolicy: IfNotPresent\n          env:\n            - name: ATL_TOMCAT_SCHEME\n              value: \"https\"\n            - name: ATL_TOMCAT_SECURE\n              value: \"true\"\n            - name: ATL_TOMCAT_PORT\n              value: \"8080\"\n            - name: SET_PERMISSIONS\n              value: \"true\"\n            - name: JIRA_SHARED_HOME\n              value: \"/var/atlassian/application-data/shared-home\"\n            - name: JVM_SUPPORT_RECOMMENDED_ARGS\n              valueFrom:\n                configMapKeyRef:\n                  key: additional_jvm_args\n                  name: unittest-jira-jvm-config\n            - name: JVM_MINIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: min_heap\n                  name: unittest-jira-jvm-config\n            - name: JVM_MAXIMUM_MEMORY\n              valueFrom:\n                configMapKeyRef:\n                  key: max_heap\n                  name: unittest-jira-jvm-config\n            - name: JVM_RESERVED_CODE_CACHE_SIZE\n              valueFrom:\n                configMapKeyRef:\n                  key: reserved_code_cache\n                  name: unittest-jira-jvm-config\n            - name: CATALINA_OPTS\n              value: \"-javaagent:/var/atlassian/application-data/shared-home/jmx_prometheus_javaagent.jar=9999:/opt/atlassian/jmx/jmx-config.yaml\"\n          ports:\n            - name: http\n              containerPort: 8080\n              protocol: TCP\n            - name: ehcache\n              containerPort: 40001\n              protocol: TCP\n            - name: ehcacheobject\n              containerPort: 40011\n              protocol: TCP\n            - name: jmx\n              containerPort: 9999\n              protocol: TCP\n          readinessProbe:\n            httpGet:\n              port: 8080\n              path: /status\n            initialDelaySeconds: 10\n            periodSeconds: 5\n            timeoutSeconds: 1\n            failureThreshold: 10\n          resources:\n            requests:\n              cpu: \"2\"\n              memory: 2G\n          volumeMounts:\n            - name: local-home\n              mountPath: \"/var/atlassian/application-data/jira\"\n            - name: local-home\n              mountPath: \"/opt/atlassian/jira/logs\"\n              subPath: \"log\"\n            - name: shared-home\n              mountPath: \"/var/atlassian/application-data/shared-home\"\n            - name: helm-values\n              mountPath: /opt/atlassian/helm\n            - name: jmx-config\n              mountPath: /opt/atlassian/jmx\n          lifecycle:\n            preStop:\n              exec:\n                command: [\"sh\", \"-c\", \"/shutdown-wait.sh\"]\n      priorityClassName: high\n      volumes:\n        - name: local-home\n          emptyDir: {}\n        - name: shared-home\n          emptyDir: {}\n        - name: helm-values\n          configMap:\n            name: unittest-jira-helm-values\n        - name: jmx-config\n          configMap:\n            name: unittest-jira-jmx-config\n---\n# Source: jira/templates/tests/test-application-status.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-jira-application-status-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: alpine:latest\n      imagePullPolicy: IfNotPresent\n      env:\n        - name: STATUS_URL\n          value: \"http://unittest-jira:80/status\"\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          apk add -q jq curl\n          STATUS=$(curl -s \"$STATUS_URL\")\n          echo \"Verifying application state is RUNNING or FIRST_RUN: $STATUS\"\n          echo $STATUS | jq -e '.state|test(\"RUNNING|FIRST_RUN\")'\n  restartPolicy: Never\n---\n# Source: jira/templates/tests/test-shared-home-permissions.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"unittest-jira-shared-home-permissions-test\"\n  annotations:\n    \"helm.sh/hook\": test\n    \"helm.sh/hook-delete-policy\": \"before-hook-creation,hook-succeeded\"\n  labels:\n    helm.sh/chart: jira-2.0.13\n    app.kubernetes.io/name: jira\n    app.kubernetes.io/instance: unittest-jira\n    app.kubernetes.io/version: \"11.3.6\"\n    app.kubernetes.io/managed-by: Helm\nspec:\n  containers:\n    - name: test\n      image: debian:stable-slim\n      imagePullPolicy: IfNotPresent\n      securityContext:\n        # We assume that the UID and GID used by the product images are the same, which in practice they are\n        runAsUser: 2001\n        runAsGroup: 2001\n      volumeMounts:\n        - name: shared-home\n          mountPath: /shared-home\n      command:\n        - /bin/sh\n        - -ec\n        - |\n          ls -ld /shared-home\n          echo \"Creating temporary file in shared home as user $(id -u):$(id -g)\"\n          touch /shared-home/permissions-test\n          ls -l /shared-home/permissions-test\n          rm /shared-home/permissions-test\n  volumes:\n    - name: shared-home\n      emptyDir: {}\n  restartPolicy: Never\n"
  },
  {
    "path": "src/test/resources/expected_helm_output/jira/values.yaml",
    "content": "# This file contains chart value overrides for the Helm output unit test\nvolumes:\n  sharedHome:\n    nfsPermissionFixer:\n      enabled: true\n\nadditionalHosts:\n  - ip: \"127.0.0.1\"\n    hostnames:\n    - \"foo.local\"\n    - \"bar.local\"\n\npriorityClassName: \"high\"\n\nmonitoring:\n  exposeJmxMetrics: true\n\natlassianAnalyticsAndSupport:\n  analytics:\n    enabled: false\n\njira:\n  additionalAnnotations:\n    argocd.argoproj.io/sync-wave: \"10\"\n"
  },
  {
    "path": "src/test/scripts/download_logs.sh",
    "content": "#!/usr/bin/env bash\n\nset -x\n\nsource \"$1\"\n\nRELEASE_PREFIX=$(echo \"${RELEASE_PREFIX}\" | tr '[:upper:]' '[:lower:]')\nPRODUCT_RELEASE_NAME=$RELEASE_PREFIX-$PRODUCT_NAME\n\nmkdir -p \"$LOG_DOWNLOAD_DIR\"\n\ngetPodLogs() {\n    local releaseName=\"$1\"\n\n    local podNames=$(kubectl -n \"${TARGET_NAMESPACE}\" get pods --selector app.kubernetes.io/instance=\"$releaseName\" --output=jsonpath={.items..metadata.name})\n\n    for podName in $podNames ; do\n      echo Downloading logs from $podName...\n      kubectl -n \"${TARGET_NAMESPACE}\" describe pod \"$podName\" > \"$LOG_DOWNLOAD_DIR/$podName.yaml\"\n      local containers=$(kubectl -n \"${TARGET_NAMESPACE}\" get pod \"$podName\" -o 'jsonpath={.spec.containers[*].name}')\n      for container in $containers; do\n        kubectl -n \"${TARGET_NAMESPACE}\" logs --container=\"$container\" \"$podName\" > \"$LOG_DOWNLOAD_DIR/${podName}--${container}.log\"\n      done\n    done\n}\n\ngetIngresses() {\n    local releaseName=\"$1\"\n\n    local ingressNames=$(kubectl -n \"${TARGET_NAMESPACE}\" get ingress --selector app.kubernetes.io/instance=\"$releaseName\" --output=jsonpath={.items..metadata.name})\n\n    for ingressName in $ingressNames; do\n      echo Describing ingress $ingressName...\n      kubectl -n \"${TARGET_NAMESPACE}\" describe ingress \"$ingressName\" > \"$LOG_DOWNLOAD_DIR/ingress-$ingressName.yaml\"\n    done\n}\n\ngetServices() {\n    local releaseName=\"$1\"\n\n    local serviceNames=$(kubectl -n \"${TARGET_NAMESPACE}\" get service --selector app.kubernetes.io/instance=\"$releaseName\" --output=jsonpath={.items..metadata.name})\n\n    for serviceName in $serviceNames; do\n      echo Describing service $serviceName...\n      kubectl -n \"${TARGET_NAMESPACE}\" describe ingress \"$serviceName\" > \"$LOG_DOWNLOAD_DIR/service-$serviceName.yaml\"\n    done\n}\n\ngetPodLogs \"$PRODUCT_RELEASE_NAME\"\ngetPodLogs \"$PRODUCT_RELEASE_NAME-agent\"\ngetPodLogs \"$PRODUCT_RELEASE_NAME-nfs\"\ngetPodLogs \"$PRODUCT_RELEASE_NAME-pgsql\"\n\ngetIngresses \"$PRODUCT_RELEASE_NAME\"\ngetServices \"$PRODUCT_RELEASE_NAME\"\ngetServices \"$PRODUCT_RELEASE_NAME-nfs\"\n\n#this is the same format as kubectl get events, but with absolute timestamps instead of relative\nfilter='.items[] | .firstTimestamp + \"..\" + .lastTimestamp + \"\\u0009\" + .type + \"\\u0009\" + .reason + \"\\u0009\" + .involvedObject.kind + \"/\" + .involvedObject.name + \"\\u0009\" + .message'\n\nkubectl get events -n \"${TARGET_NAMESPACE}\" --sort-by=.metadata.creationTimestamp  -o json | \\\n  jq -r \"$filter\" > \"$LOG_DOWNLOAD_DIR/events.txt\"\n\nexit 0\n"
  },
  {
    "path": "src/test/scripts/helm_install.sh",
    "content": "#!/usr/bin/env bash\n\nHELM_PARAMETERS_FILE=$1\n\nset -e\nset -x\n\ntasknum=0\n\n[ \"$DOCKER_LTS_VERSION\" ] && echo DOCKER_LTS_VERSION=$DOCKER_LTS_VERSION\n\n# Many of the variables used in this script are sourced from the\n# parameter file provided to it, i.e. `helm_parameters'. As such,\n# 'source' those values in\nsource \"$HELM_PARAMETERS_FILE\"\n\nget_current_cluster_type() {\n  local server_address=$(kubectl config view --minify -o json | jq -r '.clusters[0].cluster.server')\n\n  case \"${server_address}\" in\n     *.eks.amazonaws.com*)\n    echo EKS\n    return\n    ;;\n  *.azmk8s.io*)\n    echo AKS\n    return\n    ;;\n  *.kitt-inf.net*)\n    echo KITT\n    return\n    ;;\n  esac\n\n  local cluster_name=$(kubectl config view --minify -o json | jq -r '.clusters[0].name')\n  case \"$cluster_name\" in\n    gke*) echo GKE;;\n    *) echo CUSTOM;;\n  esac\n}\n\ncheck_bash_version() {\n  echo \"Task $((tasknum+=1)) - Checking Bash version.\" >&2\n  if [ \"${BASH_VERSINFO:-0}\" -lt 4 ]; then\n    echo \"Your Bash version ${BASH_VERSINFO} is too old, update to version 5 or later.\"\n    echo \"If you're on OS X, you can follow this guide: https://itnext.io/upgrading-bash-on-macos-7138bd1066ba\".\n    exit 1\n  fi\n}\n\ncheck_for_jq() {\n  echo \"Task $((tasknum+=1)) - Checking for presence of executable.\" >&2\n  if ! command -v jq &> /dev/null\n  then\n      echo \"The 'jq' command line JSON processor is required to run this script.\"\n      exit 1\n  fi\n}\n\nsetup() {\n  echo \"Task $((tasknum+=1)) - Performing preliminary setup.\" >&2\n  THISDIR=$(dirname \"$0\")\n  RELEASE_PREFIX=\"$(echo \"${RELEASE_PREFIX}\" | tr '[:upper:]' '[:lower:]')\"\n  PRODUCT_RELEASE_NAME=\"$RELEASE_PREFIX-$PRODUCT_NAME\"\n  PRODUCT_AGENT_RELEASE_NAME=\"$PRODUCT_RELEASE_NAME-agent\"\n  POSTGRES_RELEASE_NAME=\"$PRODUCT_RELEASE_NAME-pgsql\"\n  ELASTICSEARCH_RELEASE_NAME=\"$PRODUCT_RELEASE_NAME-elasticsearch\"\n  FUNCTEST_RELEASE_NAME=\"$PRODUCT_RELEASE_NAME-functest\"\n  HELM_PACKAGE_DIR=target/helm\n  [ \"$HELM_DEBUG\" = \"true\" ] && HELM_DEBUG_OPTION=\"--debug\"\n\n  local current_context=$(kubectl config current-context)\n\n  echo \"Current context: $current_context\"\n\n  CLUSTER_TYPE=$(get_current_cluster_type)\n\n  echo \"Cluster type is $CLUSTER_TYPE\"\n\n  # CloudNativePG repository will be added in bootstrap_database function\n\n  # add elastic helm repo\n  helm repo add elastic https://helm.elastic.co --force-update\n\n  mkdir -p \"$LOG_DOWNLOAD_DIR\"\n  touch $LOG_DOWNLOAD_DIR/helm_install_log.txt\n\n  chartValueFiles=$(for file in $CHART_TEST_VALUES_BASEDIR/$PRODUCT_NAME/{values.yaml,values-${CLUSTER_TYPE}.yaml}; do\n    ls \"$file\" 2>/dev/null || true\n  done)\n}\n\nbootstrap_nfs() {\n  local BASEDIR=$(dirname \"$0\")\n  echo \"Task $((tasknum+=1)) - Bootstrapping NFS server.\" >&2\n  if grep -q nfs: ${chartValueFiles} /dev/null || grep -q 'nfs[.]' <<<\"$EXTRA_PARAMETERS\"; then\n    echo \"This configuration requires a private NFS server, starting...\"\n    \"$BASEDIR\"/start_nfs_server.sh \"${TARGET_NAMESPACE}\" \"${PRODUCT_RELEASE_NAME}\"\n\n    for ((try = 0; try < 60; try++)) ; do\n      echo \"Detecting NFS server IP...\"\n      local nfs_server_ip=$(kubectl get service -n \"${TARGET_NAMESPACE}\" -l \"app.kubernetes.io/instance=$PRODUCT_RELEASE_NAME-nfs\" -o jsonpath='{.items[0].spec.clusterIP}')\n\n      if [ -z \"$nfs_server_ip\" ]; then\n        echo \"NFS server not found.\"\n        exit 1\n      fi\n\n      if [ \"$nfs_server_ip\" != \"null\" ] ; then\n        break\n      fi\n      sleep 1\n    done\n\n    echo Detected NFS server IP: $nfs_server_ip\n    valueOverrides+=\"--set volumes.sharedHome.persistentVolume.nfs.server=$nfs_server_ip \"\n  fi\n}\n\nbootstrap_database() {\n  echo \"Task $((tasknum+=1)) - Bootstrapping CloudNativePG database server.\" >&2\n  \n  # Add CloudNativePG Helm repository\n  helm repo add cloudnative-pg https://cloudnative-pg.github.io/charts --force-update\n  helm repo update\n  \n  # Install CloudNativePG operator if not already installed\n  if ! kubectl get crd clusters.postgresql.cnpg.io >/dev/null 2>&1; then\n    echo \"Installing CloudNativePG operator...\" >&2\n    CNPG_CHART_VALUES=\"$THISDIR/../infrastructure/cloudnativepg/operator-values.yaml\"\n    helm install -n cnpg-system --create-namespace --wait --timeout 15m \\\n       cnpg-operator \\\n       --values $CNPG_CHART_VALUES \\\n       $HELM_DEBUG_OPTION \\\n       cloudnative-pg/cloudnative-pg >> $LOG_DOWNLOAD_DIR/helm_install_log.txt\n    \n    # Wait for operator to be ready\n    echo \"Waiting for CloudNativePG CRDs to be available...\" >&2\n    for i in {1..60}; do\n      if kubectl get crd clusters.postgresql.cnpg.io >/dev/null 2>&1; then\n        echo \"CloudNativePG operator is ready\" >&2\n        break\n      fi\n      echo \"Waiting for CloudNativePG CRDs... ($i/60)\" >&2\n      sleep 5\n    done\n  fi\n  \n  # Create database credentials secret\n  kubectl create secret generic ${PRODUCT_NAME}-db-credentials \\\n    --from-literal=username=\"$PRODUCT_NAME\" \\\n    --from-literal=password=\"$PRODUCT_NAME\" \\\n    --namespace \"${TARGET_NAMESPACE}\" \\\n    --dry-run=client -o yaml | kubectl apply -f -\n  \n  # Create PostgreSQL cluster from template\n  TMP_DIR=$(mktemp -d)\n  cp \"$THISDIR/../infrastructure/cloudnativepg/cluster-template.yaml\" ${TMP_DIR}/cluster.yaml\n  \n  # Replace placeholders in cluster template\n  if [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n    SED_COMMAND=\"sed -i ''\"\n  else\n    SED_COMMAND=\"sed -i\"\n  fi\n  \n  ${SED_COMMAND} \"s/\\${DC_APP}/${PRODUCT_NAME}/g\" ${TMP_DIR}/cluster.yaml\n  ${SED_COMMAND} \"s/\\${NAMESPACE}/${TARGET_NAMESPACE}/g\" ${TMP_DIR}/cluster.yaml\n  \n  # Apply the cluster configuration\n  kubectl apply -f ${TMP_DIR}/cluster.yaml\n  \n  # Wait for cluster to be ready\n  kubectl wait --for=condition=Ready cluster/${PRODUCT_NAME}-db \\\n    --namespace \"${TARGET_NAMESPACE}\" --timeout=900s\n  \n  # Wait for primary pod to be ready\n  kubectl wait --for=condition=Ready pod -l cnpg.io/cluster=${PRODUCT_NAME}-db,role=primary \\\n    --namespace \"${TARGET_NAMESPACE}\" --timeout=300s\n\n  if [[ \"$DB_INIT_SCRIPT_FILE\" ]]; then\n    echo \"Executing database initialization script...\" >&2\n    # Get the primary pod name\n    PRIMARY_POD=$(kubectl get pods -n \"${TARGET_NAMESPACE}\" -l cnpg.io/cluster=${PRODUCT_NAME}-db,role=primary -o jsonpath='{.items[0].metadata.name}')\n    \n    # Copy and execute the initialization script\n    kubectl cp -n \"${TARGET_NAMESPACE}\" $DB_INIT_SCRIPT_FILE ${PRIMARY_POD}:/tmp/db-init-script.sql\n    kubectl exec -n \"${TARGET_NAMESPACE}\" ${PRIMARY_POD} -- psql -U ${PRODUCT_NAME} -d ${DB_NAME} -f /tmp/db-init-script.sql\n  fi\n}\n\n# Download required dependencies for the product chart\ndownload_dependencies() {\n  echo \"Task $((tasknum+=1)) - Downloading dependencies for the helm chart ${CHART_SRC_PATH}.\" >&2\n  helm dependency update \"${CHART_SRC_PATH}\"\n\n  if [[ -n \"$PRODUCT_AGENT_CHART\" && -e $CHART_TEST_VALUES_BASEDIR/$PRODUCT_NAME/values-agent.yaml ]]; then\n    echo \"Installing dependencies for agent chart\"\n    helm dependency update \"${PRODUCT_AGENT_CHART}\"\n  fi\n}\n\n# Package the product's Helm chart\npackage_product_helm_chart() {\n  echo \"Task $((tasknum+=1)) - Packaging product helm chart.\" >&2\n  for chartValueFile in $chartValueFiles; do\n    valueOverrides+=\"--values $chartValueFile \"\n  done\n\n  [ \"$PERSISTENT_VOLUMES\" = true ] && valueOverrides+=\"--set persistence.enabled=true \"\n  [ \"$DOCKER_IMAGE_REGISTRY\" ] && valueOverrides+=\"--set image.registry=$DOCKER_IMAGE_REGISTRY \"\n  [ \"$DOCKER_IMAGE_REPOSITORY\" ] && valueOverrides+=\"--set image.repository=$DOCKER_IMAGE_REPOSITORY \"\n  # Assign DOCKER_LTS_VERSION env variable to image.tag if defined. This value will be overriden by\n  # dockerImage.version ($DOCKER_IMAGE_VERSION) if defined.\n  dockerVersion=''\n  [ \"$DOCKER_LTS_VERSION\" ] && dockerVersion=\"--set image.tag=$DOCKER_LTS_VERSION \"\n  [ \"$DOCKER_IMAGE_VERSION\" ] && dockerVersion=\"--set image.tag=$DOCKER_IMAGE_VERSION \"\n  valueOverrides+=$dockerVersion\n  [ \"$SKIP_IMAGE_PULL\" != true ] && valueOverrides+=\"--set image.pullPolicy=Always \"\n  [ -n \"$EXTRA_PARAMETERS\" ] && for i in $EXTRA_PARAMETERS; do valueOverrides+=\"--set $i \"; done\n\n  # Ask Helm to generate the YAML that it will send to Kubernetes in the \"install\" step later, so\n  # that we can look at it for diagnostics.\n  helm template \\\n     \"$PRODUCT_RELEASE_NAME\" \\\n     \"$CHART_SRC_PATH\" \\\n     --debug \\\n     ${valueOverrides} \\\n      > $LOG_DOWNLOAD_DIR/$PRODUCT_RELEASE_NAME.yaml\n\n  helm package \"$CHART_SRC_PATH\" \\\n     --destination \"$HELM_PACKAGE_DIR\"\n}\n\n# Package the functest Helm chart\npackage_functest_helm_chart() {\n  echo \"Task $((tasknum+=1)) - Packaging functional tests helm chart.\" >&2\n  INGRESS_DOMAIN_VARIABLE_NAME=\"INGRESS_DOMAIN_$CLUSTER_TYPE\"\n  INGRESS_DOMAIN=\"${!INGRESS_DOMAIN_VARIABLE_NAME}\"\n  FUNCTEST_CHART_PATH=\"$THISDIR/../charts/functest\"\n  FUNCTEST_CHART_VALUES=\"clusterType=$CLUSTER_TYPE,ingressDomain=$INGRESS_DOMAIN,productReleaseName=$PRODUCT_RELEASE_NAME,product=$PRODUCT_NAME\"\n\n  ## Build values chartValueFile to expose node services and ingresses\n  ## to create routes to individual nodes; disabled if TARGET_REPLICA_COUNT is undef\n  NEWLINE=$'\\n'\n  local backdoor_services=\"backdoorServiceNames:${NEWLINE}\"\n  local ingress_services=\"ingressNames:${NEWLINE}\"\n  ingress_services+=\"- ${PRODUCT_RELEASE_NAME}${NEWLINE}\"\n  for ((NODE = 0; NODE < ${TARGET_REPLICA_COUNT:-0}; NODE += 1)); do\n    backdoor_services+=\"- ${PRODUCT_RELEASE_NAME}-${NODE}${NEWLINE}\"\n  done\n  if [[ \"$PRODUCT_NAME\" == \"bitbucket\" || \"$PRODUCT_NAME\" == \"jira\" ]]; then\n    echo \"OpenSearch is being deployed, adding a backdoor\"\n    backdoor_services+=\"- opensearch-cluster-master-0${NEWLINE}\"\n  fi\n  EXPOSE_NODES_FILE=\"${LOG_DOWNLOAD_DIR}/${PRODUCT_RELEASE_NAME}-service-expose.yaml\"\n\n  echo \"Defining ingress/backdoor services as:\"\n  echo \"${backdoor_services}${ingress_services}\"\n  echo \"${backdoor_services}${ingress_services}\" > ${EXPOSE_NODES_FILE}\n\n  helm template \\\n     \"$FUNCTEST_RELEASE_NAME\" \\\n     \"$FUNCTEST_CHART_PATH\" \\\n     --set \"$FUNCTEST_CHART_VALUES\" \\\n     --values ${EXPOSE_NODES_FILE} \\\n     > \"$LOG_DOWNLOAD_DIR/$FUNCTEST_RELEASE_NAME.yaml\"\n\n  helm package \"$FUNCTEST_CHART_PATH\" --destination \"$HELM_PACKAGE_DIR\"\n}\n\n# Install the product's Helm chart\ninstall_product() {\n  echo \"Task $((tasknum+=1)) - Installing product helm chart.\" >&2\n  helm install -n \"${TARGET_NAMESPACE}\" --wait --timeout 15m \\\n     \"$PRODUCT_RELEASE_NAME\" \\\n     $HELM_DEBUG_OPTION \\\n     ${valueOverrides} \\\n     \"$HELM_PACKAGE_DIR/${PRODUCT_NAME}\"-*.tgz >> $LOG_DOWNLOAD_DIR/helm_install_log.txt\n}\n\ninstall_product_agent() {\n  # Deploy any product support agent. Currently just Bamboo, but this\n  # is where Bitbucket GitAgents would probably go.\n  if [[ -z \"$PRODUCT_AGENT_CHART\" || ! -e $CHART_TEST_VALUES_BASEDIR/$PRODUCT_NAME/values-agent.yaml ]]; then\n      echo \"No product agent defined, skipping provisioning\"\n      return\n  fi\n\n  agentValueFiles=''\n  for file in $CHART_TEST_VALUES_BASEDIR/$PRODUCT_NAME/{values-agent.yaml,values-${CLUSTER_TYPE}.yaml}; do\n    agentValueFiles+=\"--values $file \"\n  done\n\n  echo \"Task $((tasknum+=1)) - Installing product agent helm chart.\" >&2\n  helm install -n \"${TARGET_NAMESPACE}\" --wait --timeout 15m \\\n       \"$PRODUCT_AGENT_RELEASE_NAME\" \\\n       $HELM_DEBUG_OPTION \\\n       ${agentValueFiles} \\\n       \"$PRODUCT_AGENT_CHART\" >> $LOG_DOWNLOAD_DIR/helm_install_log.txt\n}\n\n# Install the functest Helm chart\ninstall_functional_tests() {\n  echo \"Task $((tasknum+=1)) - Installing functional tests.\" >&2\n  helm install --wait --timeout 15m \\\n     -n \"${TARGET_NAMESPACE}\" \\\n     \"$FUNCTEST_RELEASE_NAME\" \\\n     --set \"$FUNCTEST_CHART_VALUES\" \\\n     --values ${EXPOSE_NODES_FILE} \\\n     $HELM_DEBUG_OPTION \\\n     \"$HELM_PACKAGE_DIR/functest-0.1.0.tgz\"\n}\n\n# Wait until the Ingress we just created starts serving up non-error responses - there may be a lag\nwait_for_ingress() {\n  echo \"Task $((tasknum+=1)) - Waiting for Ingress to come up.\" >&2\n  if [[ \"$CLUSTER_TYPE\" == \"CUSTOM\" ]]; then\n    INGRESS_URI=\"${CUSTOM_INGRESS_URI}\"\n  else\n    INGRESS_URI=\"https://${PRODUCT_RELEASE_NAME}.${INGRESS_DOMAIN}/\"\n  fi\n  echo \"Waiting for $INGRESS_URI to be ready\"\n  for (( i=0; i<10; ++i ));\n  do\n     echo \"checking ingress status: i = ${i}\"\n\n     STATUS_CODE=$(curl -s -o /dev/null -w %{http_code} \"$INGRESS_URI\")\n     echo \"Received status code $STATUS_CODE from $INGRESS_URI\"\n     if [ \"$STATUS_CODE\" -lt 400 ]; then\n       echo \"Ingress is ready\"\n       break\n     else\n       echo \"Ingress is not yet ready\"\n       sleep 3\n     fi\n  done\n}\n\n# Run the chart's tests\nrun_tests() {\n  echo \"Task $((tasknum+=1)) - Running tests.\" >&2\n  helm test \\\n  $HELM_DEBUG_OPTION \\\n  \"$PRODUCT_RELEASE_NAME\" -n \"${TARGET_NAMESPACE}\"\n}\n\n# Execute\ncheck_bash_version\ncheck_for_jq\nsetup\nbootstrap_nfs\nbootstrap_database\ndownload_dependencies\npackage_product_helm_chart\npackage_functest_helm_chart\ninstall_product\ninstall_product_agent\ninstall_functional_tests\nwait_for_ingress\nrun_tests\n\nexit 0\n"
  },
  {
    "path": "src/test/scripts/helm_uninstall.sh",
    "content": "#!/usr/bin/env bash\n\nset -x\n\nsource \"$1\" || exit 1\n\ncd \"$(dirname \"$0\")\" || exit 1\n\nRELEASE_PREFIX=$(echo \"${RELEASE_PREFIX}\" | tr '[:upper:]' '[:lower:]')\nPRODUCT_RELEASE_NAME=$RELEASE_PREFIX-$PRODUCT_NAME\nPRODUCT_AGENT_RELEASE_NAME=$RELEASE_PREFIX-$PRODUCT_NAME-agent\nPOSTGRES_RELEASE_NAME=$PRODUCT_RELEASE_NAME-pgsql\nFUNCTEST_RELEASE_NAME=$PRODUCT_RELEASE_NAME-functest\nELASTICSEARCH_RELEASE_NAME=$PRODUCT_RELEASE_NAME-elasticsearch\n\n\nhelm uninstall -n \"${TARGET_NAMESPACE}\" \"${FUNCTEST_RELEASE_NAME}\" || true\nhelm uninstall -n \"${TARGET_NAMESPACE}\" \"${PRODUCT_RELEASE_NAME}\" || true\nhelm uninstall -n \"${TARGET_NAMESPACE}\" \"${PRODUCT_AGENT_RELEASE_NAME}\" || true\nhelm uninstall -n \"${TARGET_NAMESPACE}\" \"${POSTGRES_RELEASE_NAME}\" || true\nhelm uninstall -n \"${TARGET_NAMESPACE}\" \"${ELASTICSEARCH_RELEASE_NAME}\" || true\n\nnfsReleaseName=${PRODUCT_RELEASE_NAME}-nfs\n\nhelm get notes -n \"$TARGET_NAMESPACE\" \"$PRODUCT_RELEASE_NAME-nfs\" && shouldCleanNfsPod=true\n\nif [ \"$shouldCleanNfsPod\" != true ]; then\n  # we are using a \"shared shared home\", remove the subdirectory of the shared-home\n  ./shared_home_browser_install.sh \"${TARGET_NAMESPACE}\"\n  kubectl exec -n \"${TARGET_NAMESPACE}\" shared-home-browser -- rm -rf \"/shared-home/$PRODUCT_RELEASE_NAME\"\nfi\n\n# delete any and all persistent volumes and claims by label\necho Deleting PVCs, if the uninstall script gets stuck deleting the shared pvc here, run:\nsharedPvcName=$(kubectl get -n ${TARGET_NAMESPACE} pvc -l app.kubernetes.io/instance=\"$PRODUCT_RELEASE_NAME\" | grep shared | awk '{print $1;}')\necho kubectl patch pvc -n \"${TARGET_NAMESPACE}\" \"$sharedPvcName\" -p \"'{\\\"metadata\\\":{\\\"finalizers\\\":null}}'\"\nkubectl delete -n \"${TARGET_NAMESPACE}\" pvc -l app.kubernetes.io/instance=\"${PRODUCT_RELEASE_NAME}\" --ignore-not-found=true\necho Deleting PVs...\nkubectl delete -n \"${TARGET_NAMESPACE}\" pv -l app.kubernetes.io/instance=\"${PRODUCT_RELEASE_NAME}\" --ignore-not-found=true\n\nif [ \"$shouldCleanNfsPod\" == true ]; then\n  helm uninstall -n \"$TARGET_NAMESPACE\" \"$PRODUCT_RELEASE_NAME-nfs\" 2>/dev/null || true\n  kubectl delete -n \"$TARGET_NAMESPACE\" pvc -l \"app.kubernetes.io/instance=$PRODUCT_RELEASE_NAME-nfs\" --ignore-not-found=true 2>/dev/null || true\nfi\n\nkubectl delete -n \"$TARGET_NAMESPACE\" jobs -l app.kubernetes.io/instance=\"${PRODUCT_RELEASE_NAME}\" --ignore-not-found=true \n\n# Always exit with a zero status code, to avoid failing the build during uninstall\nexit 0\n"
  },
  {
    "path": "src/test/scripts/kind/configure_kind.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nkubectl cluster-info\necho \"[INFO]: current-context:\" $(kubectl config current-context)\necho \"[INFO]: environment-kubeconfig:\" \"${KUBECONFIG}\"\n\nkubectl create namespace atlassian --dry-run=client -o yaml | kubectl apply -f -\n\n# even though there's a kind command to load a local image directly to KinD container runtime\n# let's deploy an insecure registry in case we need it for any further tests\necho \"[INFO]: Deploy ephemeral container registry\"\nkubectl apply -f src/test/config/kind/registry.yaml\n\n# Install Gateway API CRDs and Controller\nif [ -z \"${SKIP_GATEWAY_API}\" ]; then\n  echo \"[INFO]: Installing Gateway API CRDs\"\n  kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml\n  kubectl apply --server-side=true -f https://raw.githubusercontent.com/envoyproxy/gateway/v1.2.5/charts/gateway-helm/crds/generated/gateway.envoyproxy.io_envoyproxies.yaml\n\n  echo \"[INFO]: Waiting for Gateway API CRDs to be established\"\n  kubectl wait --for condition=established --timeout=60s crd/gateways.gateway.networking.k8s.io\n  kubectl wait --for condition=established --timeout=60s crd/httproutes.gateway.networking.k8s.io\n  kubectl wait --for condition=established --timeout=60s crd/gatewayclasses.gateway.networking.k8s.io\n  kubectl wait --for condition=established --timeout=60s crd/envoyproxies.gateway.envoyproxy.io\n\n  echo \"[INFO]: Installing Envoy Gateway\"\n  # Envoy Gateway uses OCI registry, not a traditional Helm repo\n  helm install eg oci://docker.io/envoyproxy/gateway-helm \\\n      --version v1.2.5 \\\n      --create-namespace \\\n      --namespace envoy-gateway-system \\\n      --set deployment.envoyGateway.resources.requests.cpu=50m \\\n      --set deployment.envoyGateway.resources.requests.memory=100Mi \\\n      --skip-crds \\\n      --timeout=300s \\\n      --wait\n  \n  echo \"[INFO]: Waiting for Envoy Gateway to be ready\"\n  kubectl wait --for=condition=available deployment/envoy-gateway \\\n      --namespace envoy-gateway-system \\\n      --timeout=300s\n\n  # EnvoyProxy CR tells the controller to create the data-plane proxy Service\n  # as NodePort with nodePort 30080 — matching the KinD extraPortMappings.\n  # This must be applied BEFORE the GatewayClass so the controller picks it up.\n  echo \"[INFO]: Applying EnvoyProxy configuration (NodePort 30080)\"\n  kubectl apply -f src/test/config/kind/envoy-proxy.yaml\n\n  # GatewayClass references the EnvoyProxy CR via parametersRef so every\n  # Gateway using this class gets the NodePort configuration automatically.\n  echo \"[INFO]: Creating GatewayClass 'eg' with parametersRef\"\n  cat << EOF | kubectl apply -f -\napiVersion: gateway.networking.k8s.io/v1\nkind: GatewayClass\nmetadata:\n  name: eg\nspec:\n  controllerName: gateway.envoyproxy.io/gatewayclass-controller\n  parametersRef:\n    group: gateway.envoyproxy.io\n    kind: EnvoyProxy\n    name: kind-proxy-config\n    namespace: envoy-gateway-system\nEOF\n\n  echo \"[INFO]: Waiting for GatewayClass 'eg' to be accepted\"\n  kubectl wait --for=condition=Accepted gatewayclass/eg --timeout=180s || {\n    echo \"[ERROR]: GatewayClass not accepted in time\"\n    kubectl get gatewayclass/eg -o yaml\n    exit 1\n  }\n  \n  echo \"[INFO]: Creating test Gateway resource in atlassian namespace\"\n  kubectl apply -f src/test/config/kind/gateway.yaml\n  \n  echo \"[INFO]: Waiting for Gateway to be reconciled\"\n  # In KinD there is no real LoadBalancer implementation, so the Gateway may never become\n  # fully Programmed (AddressNotAssigned). Instead, wait for:\n  # 1) Gateway Accepted=True (control-plane picked it up)\n  # 2) The Envoy proxy Deployment for this Gateway to become Available (data-plane ready)\n  kubectl wait --for=condition=Accepted gateway/atlassian-gateway -n atlassian --timeout=300s || {\n    echo \"[ERROR]: Gateway not accepted in time\"\n    kubectl describe gateway/atlassian-gateway -n atlassian\n    exit 1\n  }\n\n  echo \"[INFO]: Waiting for Envoy proxy deployment for the Gateway\"\n  kubectl wait --for=condition=Available deployment \\\n    -n envoy-gateway-system \\\n    -l gateway.envoyproxy.io/owning-gateway-name=atlassian-gateway \\\n    --timeout=300s || {\n      echo \"[ERROR]: Envoy proxy deployment not ready in time\"\n      kubectl get deployments -n envoy-gateway-system -o wide\n      kubectl get pods -n envoy-gateway-system -o wide\n      exit 1\n    }\n  \n  # Add /etc/hosts entry so dc-app.test resolves to localhost on the runner.\n  echo \"[INFO]: Adding dc-app.test to /etc/hosts\"\n  if [ \"$(id -u)\" -ne 0 ]; then\n    SUDO=$(which sudo)\n    echo \"127.0.0.1 dc-app.test\" | ${SUDO} tee -a /etc/hosts >/dev/null\n  else\n    echo \"127.0.0.1 dc-app.test\" >> /etc/hosts\n  fi\n\n  echo \"[INFO]: Gateway API installation complete\"\nelse\n  echo \"[INFO]: Skipping Gateway API installation (SKIP_GATEWAY_API is set)\"\nfi\n\n# this is for local runs, because existing nfs server images does not run on arm64 platforms\n# instead, we create a hostPath RWX volume and override the default common settings\nif [ -z \"${HOSTPATH_PV}\" ]; then\n  echo \"[INFO]: Deploy NFS server\"\n  helm install nfs src/test/infrastructure/nfs-server \\\n      --set image.tag=2.0 \\\n       -n atlassian \\\n       --timeout=360s \\\n       --wait\n\n  nfs_server_ip=$(kubectl get svc/nfs-nfs-server -n atlassian -o jsonpath='{.spec.clusterIP}')\n\n  echo \"[INFO]: Deploy NFS volume provisioner. Using ${nfs_server_ip} as NFS server IP\"\n  helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner\n  helm repo update\n\n  helm install nfs-volume-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \\\n       -f src/test/config/kind/nfs-values.yaml \\\n       --set nfs.server=${nfs_server_ip} \\\n       --set nfs.path=/srv/nfs \\\n       -n atlassian \\\n       --timeout=360s \\\n       --wait\nelse\n  echo \"[INFO]: Creating a hostPath PersistentVolume\"\n  kubectl apply -f src/test/config/kind/hostpath-pv.yaml\nfi\n"
  },
  {
    "path": "src/test/scripts/kind/create_kind.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\n# set defaults, in case env vars aren't exported\nexport K8S_VERSION=\"${K8S_VERSION:-v1.30.0}\"\nexport KIND_VERSION=\"${KIND_VERSION:-v0.23.0}\"\n\nif [ -z \"${SKIP_DOWNLOAD_KIND}\" ]; then\n  echo \"[INFO]: Downloading KinD ${KIND_VERSION}\"\n  curl -sLo ./kind \"https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-$(uname)-amd64\"\n  chmod +x ./kind\n  if [ \"$(id -u)\" -ne 0 ]; then\n    echo \"[INFO]: User is not root. Attempting to move kind to PATH with sudo\"\n    SUDO=$(which sudo)\n    ${SUDO} mv ./kind /usr/local/bin/kind \n  else\n    echo \"[INFO]: User is root. Copying kind to PATH\"\n    mv ./kind /usr/local/bin/kind\n  fi\nfi\n\nif command -v kind >/dev/null 2>&1; then\n  echo \"[INFO]: Installed KinD: $(kind version)\"\n  echo \"[INFO]: Kubernetes version: ${K8S_VERSION}\"\n  echo \"[INFO]: Creating 'atl-kind' cluster using config file src/test/config/kind/kind-config.yml\"\n  kind create cluster --name=atl-kind \\\n                      --image=kindest/node:${K8S_VERSION} \\\n                      --config=src/test/config/kind/kind-config.yml \\\n                      --wait=5m\nelse\n  echo \"[ERROR]: Failed to successfully install KinD. Exiting\"\n  exit 1\nfi\n\n\n"
  },
  {
    "path": "src/test/scripts/kind/deploy_app.sh",
    "content": "#!/usr/bin/env bash\n\n# Poll until a command succeeds or timeout is reached.\n# Usage: wait_for \"description\" timeout_seconds interval_seconds command [args...]\nwait_for() {\n  local desc=\"$1\"; shift\n  local timeout=\"$1\"; shift\n  local interval=\"$1\"; shift\n  local elapsed=0\n\n  while ! \"$@\" >/dev/null 2>&1; do\n    if [ $elapsed -ge $timeout ]; then\n      echo \"[ERROR]: Timed out after ${elapsed}s waiting for: ${desc}\"\n      return 1\n    fi\n    echo \"[INFO]: Waiting for ${desc}... (${elapsed}/${timeout}s)\"\n    sleep $interval\n    elapsed=$((elapsed + interval))\n  done\n  echo \"[INFO]: ${desc} — ready\"\n}\n\n# Check if a URL returns HTTP 200.\n# Usage: check_http_200 url [extra-curl-args...]\ncheck_http_200() {\n  local url=\"$1\"; shift\n  test \"$(curl -s -o /dev/null -w '%{http_code}' \"$@\" \"$url\")\" = \"200\"\n}\n\n# Deploy CloudNativePG operator and PostgreSQL cluster\ndeploy_postgres() {\n  echo \"[INFO]: Installing CloudNativePG operator\"\n  \n  # Add CloudNativePG Helm repository\n  helm repo add cloudnative-pg https://cloudnative-pg.github.io/charts --force-update\n  helm repo update\n  \n  # Install CloudNativePG operator only if not already installed\n  echo \"[INFO]: Installing CloudNativePG operator\"\n  if ! kubectl get crd clusters.postgresql.cnpg.io >/dev/null 2>&1; then\n    echo \"[INFO]: CloudNativePG operator not found, installing...\"\n    \n    # Create namespace first to ensure it exists\n    kubectl create namespace cnpg-system --dry-run=client -o yaml | kubectl apply -f -\n    \n    # Use helm template + kubectl apply to completely avoid Helm client timeouts\n    # This is the most reliable method for slow/busy clusters (e2e, MicroShift)\n    echo \"[INFO]: Rendering operator manifests from Helm chart...\"\n    helm template cnpg-operator cloudnative-pg/cloudnative-pg \\\n         --values src/test/infrastructure/cloudnativepg/operator-values.yaml \\\n         --namespace cnpg-system \\\n         --include-crds > /tmp/cnpg-operator-manifests.yaml\n    \n    echo \"[INFO]: Applying operator manifests to cluster...\"\n    # Apply with server-side apply to handle large CRD annotations\n    if ! kubectl apply --server-side=true -f /tmp/cnpg-operator-manifests.yaml 2>&1 | tee /tmp/cnpg-apply.log; then\n      # Check if it's just the poolers CRD annotation issue (non-fatal)\n      if grep -q \"poolers.postgresql.cnpg.io.*Too long\" /tmp/cnpg-apply.log && \\\n         kubectl get deployment -n cnpg-system cnpg-operator-cloudnative-pg >/dev/null 2>&1; then\n        echo \"[WARN]: Poolers CRD has annotation size issue, but operator deployment was created\"\n        echo \"[INFO]: Continuing with deployment...\"\n      else\n        echo \"[ERROR]: Failed to apply operator manifests\"\n        echo \"[DEBUG]: Checking what was created...\"\n        kubectl get all -n cnpg-system || true\n        exit 1\n      fi\n    fi\n    \n    echo \"[INFO]: Operator manifests applied successfully\"\n  else\n    echo \"[INFO]: CloudNativePG operator already installed, skipping...\"\n  fi\n  \n  # Wait for operator to be ready\n  echo \"[INFO]: Waiting for CloudNativePG operator to be ready\"\n  wait_for \"CloudNativePG CRDs\" 300 5 kubectl get crd clusters.postgresql.cnpg.io || {\n    echo \"[ERROR]: CloudNativePG CRDs not available\"\n    exit 1\n  }\n  # Wait for operator deployment to exist\n  echo \"[INFO]: Waiting for operator deployment to be created...\"\n  wait_for \"CloudNativePG operator deployment\" 60 2 \\\n    kubectl get deployment -n cnpg-system -l app.kubernetes.io/name=cloudnative-pg || {\n    echo \"[WARNING]: CloudNativePG operator deployment not found\"\n    # this will be checked again below - keeping old behavior to minimize risk of this change\n  }\n\n  # MicroShift/OpenShift: grant anyuid SCC to operator SA to satisfy UID range constraints\n  if kubectl api-resources | grep -q \"securitycontextconstraints\"; then\n    echo \"[INFO]: Detected SCC support; granting 'anyuid' SCC to operator service account\"\n    SA_NAME=\"cnpg-operator-cloudnative-pg\"\n    # Try with oc if available, otherwise patch SCC directly\n    if command -v oc >/dev/null 2>&1; then\n      oc adm policy add-scc-to-user anyuid -z \"$SA_NAME\" -n cnpg-system || true\n    else\n      kubectl patch scc anyuid --type=json -p='[{\"op\":\"add\",\"path\":\"/users/-\",\"value\":\"system:serviceaccount:cnpg-system:'\"$SA_NAME\"'\"}]' || true\n    fi\n  fi\n  \n  # Verify operator is actually running\n  echo \"[DEBUG]: CloudNativePG operator deployments:\"\n  kubectl get deployments -n cnpg-system\n  echo \"[DEBUG]: CloudNativePG operator pods:\"\n  kubectl get pods -n cnpg-system\n  \n  # Wait for operator pod to be ready\n  echo \"[INFO]: Waiting for operator pod to be ready...\"\n  if kubectl get deployment -n cnpg-system -l app.kubernetes.io/name=cloudnative-pg >/dev/null 2>&1; then\n    kubectl wait --for=condition=Available deployment -n cnpg-system -l app.kubernetes.io/name=cloudnative-pg --timeout=300s || {\n      echo \"[ERROR]: Operator deployment failed to become available\"\n      echo \"[DEBUG]: Deployment description:\"\n      kubectl describe deployment -n cnpg-system\n      echo \"[DEBUG]: Pod description:\"\n      kubectl describe pods -n cnpg-system\n      echo \"[DEBUG]: Events in cnpg-system namespace:\"\n      kubectl get events -n cnpg-system --sort-by='.lastTimestamp'\n      exit 1\n    }\n  else\n    echo \"[ERROR]: No operator deployment found!\"\n    echo \"[DEBUG]: All resources in cnpg-system:\"\n    kubectl get all -n cnpg-system\n    echo \"[DEBUG]: Helm release status:\"\n    helm status cnpg-operator -n cnpg-system\n    exit 1\n  fi\n  \n  echo \"[INFO]: CloudNativePG operator is ready\"\n  \n  # Create database credentials secret\n  echo \"[INFO]: Creating database credentials secret\"\n  kubectl create secret generic ${DC_APP}-db-credentials \\\n    --from-literal=username=\"${DC_APP}\" \\\n    --from-literal=password=\"${DC_APP}pwd\" \\\n    --namespace atlassian \\\n    --dry-run=client -o yaml | kubectl apply -f -\n  \n  # Create PostgreSQL cluster from template\n  echo \"[INFO]: Creating PostgreSQL cluster for ${DC_APP}\"\n  TMP_DIR=$(mktemp -d)\n  cp src/test/infrastructure/cloudnativepg/cluster-template.yaml ${TMP_DIR}/cluster.yaml\n  \n  # Replace placeholders in cluster template\n  if [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n    # macOS requires an empty string argument after -i\n    sed -i '' -e \"s/\\${DC_APP}/${DC_APP}/g\" -e \"s/\\${NAMESPACE}/atlassian/g\" \"${TMP_DIR}/cluster.yaml\"\n  else\n    # Linux version\n    sed -i -e \"s/\\${DC_APP}/${DC_APP}/g\" -e \"s/\\${NAMESPACE}/atlassian/g\" \"${TMP_DIR}/cluster.yaml\"\n  fi\n\n  # Detect default StorageClass in the cluster and use it (MicroShift compatibility)\n  DEFAULT_SC=$(kubectl get sc -o jsonpath='{range .items[*]}{.metadata.name}{\"|\"}{.metadata.annotations.storageclass\\.kubernetes\\.io/is-default-class}{\"\\n\"}{end}' 2>/dev/null | awk -F'|' '$2==\"true\"{print $1; exit}')\n  if [[ -z \"$DEFAULT_SC\" ]]; then\n    DEFAULT_SC=$(kubectl get sc -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo \"\")\n  fi\n  if [[ -n \"$DEFAULT_SC\" ]]; then\n    echo \"[INFO]: Using default StorageClass '$DEFAULT_SC' for database PVCs\"\n    if [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n      sed -i '' -e \"s/storageClass: standard/storageClass: ${DEFAULT_SC}/g\" \"${TMP_DIR}/cluster.yaml\"\n    else\n      sed -i -e \"s/storageClass: standard/storageClass: ${DEFAULT_SC}/g\" \"${TMP_DIR}/cluster.yaml\"\n    fi\n  else\n    echo \"[WARN]: No StorageClass detected; database PVCs may remain Pending\"\n    kubectl get sc || true\n  fi\n  \n  # Debug: Print the generated configuration\n  echo \"[INFO]: Generated PostgreSQL cluster configuration:\"\n  cat ${TMP_DIR}/cluster.yaml\n  \n  # Apply the cluster configuration\n  kubectl apply -f ${TMP_DIR}/cluster.yaml\n  \n  # Wait for cluster to be ready\n  echo \"[INFO]: Waiting for PostgreSQL cluster to be ready\"\n  kubectl wait --for=condition=Ready cluster/${DC_APP}-db \\\n    --namespace atlassian --timeout=300s || {\n      echo \"[ERROR]: Cluster did not become Ready in time\"\n      echo \"[DEBUG]: Cluster description:\"\n      kubectl describe cluster/${DC_APP}-db -n atlassian || true\n      echo \"[DEBUG]: Pods for cluster:\"\n      kubectl get pods -l cnpg.io/cluster=${DC_APP}-db -n atlassian -o wide || true\n      echo \"[DEBUG]: PVCs in namespace:\"\n      kubectl get pvc -n atlassian || true\n      echo \"[DEBUG]: Describe PVCs:\"\n      for pvc in $(kubectl get pvc -n atlassian -o name || true); do kubectl describe $pvc -n atlassian || true; done\n      echo \"[DEBUG]: Events in atlassian namespace:\"\n      kubectl get events -n atlassian --sort-by='.lastTimestamp' | tail -n 200 || true\n      echo \"[DEBUG]: StorageClasses:\"\n      kubectl get sc || true\n      exit 1\n    }\n  \n  # Wait for primary pod to be ready\n  echo \"[INFO]: Waiting for PostgreSQL primary pod to be ready\"\n  kubectl wait --for=condition=Ready pod -l cnpg.io/cluster=${DC_APP}-db,role=primary \\\n    --namespace atlassian --timeout=300s\n  \n  # Execute custom initialization script if provided\n  if [ -f \"${DB_INIT_SCRIPT_FILE}\" ]; then\n    echo \"[INFO]: DB init file '${DB_INIT_SCRIPT_FILE}' found. Initializing the database\"\n    PRIMARY_POD=$(kubectl get pods -n atlassian -l cnpg.io/cluster=${DC_APP}-db,role=primary -o jsonpath='{.items[0].metadata.name}')\n    kubectl cp ${DB_INIT_SCRIPT_FILE} atlassian/${PRIMARY_POD}:/tmp/db-init-script.sql -c postgres\n    kubectl exec -n atlassian ${PRIMARY_POD} -c postgres -- psql -U ${DC_APP} -d ${DC_APP} -f /tmp/db-init-script.sql\n  fi\n}\n\n# not all of the secrets are used by all products\n# Jira won't use license secret and only Bitbucket will use admin secret\ncreate_secrets() {\n  echo \"[INFO]: Creating db, admin and license secrets\"\n  DC_APP_CAPITALIZED=\"$(echo ${DC_APP} | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')\"\n\n  # Database credentials secret is already created in deploy_postgres function\n  # Only create it if it doesn't exist\n  if ! kubectl get secret ${DC_APP}-db-credentials -n atlassian >/dev/null 2>&1; then\n    kubectl create secret generic ${DC_APP}-db-credentials \\\n            --from-literal=username=\"${DC_APP}\" \\\n            --from-literal=password=\"${DC_APP}pwd\" \\\n            -n atlassian\n  fi\n  kubectl create secret generic ${DC_APP}-admin \\\n          --from-literal=username=\"admin\" \\\n          --from-literal=password=\"admin\" \\\n          --from-literal=displayName=\"${DC_APP_CAPITALIZED}\" \\\n          --from-literal=emailAddress=\"${DC_APP}@example.com\" \\\n          -n atlassian\n  kubectl create secret generic ${DC_APP}-app-license \\\n          --from-literal=license=${LICENSE} \\\n          -n atlassian\n\n  # this is to test additionalCertificates init container\n  openssl req -x509 -newkey rsa:4096 -keyout /tmp/key.pem -out /tmp/mycert.crt -days 365 -nodes -subj '/CN=localhost'\n  openssl req -x509 -newkey rsa:4096 -keyout /tmp/key.pem -out /tmp/mycert1.crt -days 365 -nodes -subj '/CN=localhost'\n  openssl req -x509 -newkey rsa:4096 -keyout /tmp/key.pem -out /tmp/mycert3.crt -days 365 -nodes -subj '/CN=localhost'\n\n  # create multiple certificates to test both single secret and secretList\n  kubectl create secret generic dev-certificates --from-file=dev.crt=/tmp/mycert.crt --from-file=stg.crt=/tmp/mycert1.crt -n atlassian\n  kubectl create secret generic certificate-internal --from-file=internal.crt=/tmp/mycert3.crt -n atlassian\n  kubectl create secret generic certificate --from-file=internal.crt=/tmp/mycert3.crt -n atlassian\n}\n\ndeploy_app() {\n  helm repo add atlassian-data-center https://atlassian.github.io/data-center-helm-charts\n  helm repo add opensearch https://opensearch-project.github.io/helm-charts/\n  helm repo update\n  helm dependency build ./src/main/charts/${DC_APP}\n\n  # All apps except Jira have postgresql DB type\n  DB_TYPE=\"postgresql\"\n  if [ ${DC_APP} == \"jira\" ]; then\n    DB_TYPE=\"postgres72\"\n  fi\n\n  TMP_DIR=$(mktemp -d)\n  echo \"Copying values file to ${TMP_DIR}\"\n\n  # copy commmon values template to a tmp location and replace placeholders\n  cp src/test/config/kind/common-values.yaml ${TMP_DIR}/common-values.yaml\n\n  # sed works differently on different platforms\n  if [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n    SED_COMMAND=\"sed -i ''\"\n  else\n    SED_COMMAND=\"sed -i\"\n  fi\n\n  # replace application name, database type and display name (important for Bitbucket functional tests)\n  DC_APP_CAPITALIZED=\"$(echo ${DC_APP} | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')\"\n  ${SED_COMMAND} \"s/DC_APP_REPLACEME/${DC_APP}/g\" ${TMP_DIR}/common-values.yaml\n  ${SED_COMMAND} \"s/DB_TYPE_REPLACEME/${DB_TYPE}/g\" ${TMP_DIR}/common-values.yaml\n  ${SED_COMMAND} \"s/DISPLAY_NAME/${DC_APP_CAPITALIZED}/g\" ${TMP_DIR}/common-values.yaml\n\n  # OpenSearch does not run well in a tiny MicroShift instance, freezing the API,\n  # so we're disabling internal OpenSearch for Bitbucket when tested in MicroShift\n  if [ \"${DC_APP}\" == \"bitbucket\" ] && [ -n \"${OPENSHIFT_VALUES}\" ]; then\n    echo \"[INFO]: Disabling internal OpenSearch and Bitbucket Mesh for Bitbucket\"\n    DISABLE_BITBUCKET_SEARCH_MESH=\"--set bitbucket.additionalEnvironmentVariables[0].name=SEARCH_ENABLED --set bitbucket.additionalEnvironmentVariables[0].value=\\\"false\\\" --set bitbucket.mesh.enabled=false\"\n  fi\n\n  if [ -z \"${OPENSHIFT_VALUES}\" ]; then\n    echo \"[INFO]: Setting external OpenSearch values\"\n    ENABLE_OPENSEARCH=\"--set opensearch.enabled=true,opensearch.install=true,opensearch.resources.requests.cpu=10m,opensearch.resources.requests.memory=10Mi,opensearch.persistence.size=1Gi\"\n  fi\n\n  # use a pre-created PVC and hostPath PV instead of NFS volume when running on arm64 machines\n  # it is safe to do so because KinD is a single node k8s cluster\n  if [ -n \"${HOSTPATH_PV}\" ]; then\n    SHARED_HOME_HOSTPATH=\"--set volumes.sharedHome.persistentVolumeClaim.create=false,volumes.sharedHome.customVolume.persistentVolumeClaim.claimName=hostpath-shared-home-pvc\"\n  fi\n\n  # deploy helm chart and set overrides if any\n  helm upgrade --install ${DC_APP} ./src/main/charts/${DC_APP} \\\n               -f ${TMP_DIR}/common-values.yaml ${OPENSHIFT_VALUES} \\\n               -n atlassian \\\n               --wait --timeout=360s \\\n               --debug \\\n               ${IMAGE_OVERRIDE} \\\n               ${SHARED_HOME_HOSTPATH} \\\n               ${DISABLE_BITBUCKET_SEARCH_MESH} \\\n               ${ENABLE_OPENSEARCH} \\\n               ${MISC_OVERRIDES}\n\n  if [ ${DC_APP} == \"bamboo\" ]; then\n    wait_for_bamboo_setup\n\n    if [[ -n \"${OPENSHIFT_VALUES}\" ]]; then\n      OPENSHIFT_VALUES=\"--set openshift.runWithRestrictedSCC=true\"\n    fi\n    echo \"[INFO]: Deploying Bamboo agent...\"\n    helm dependency build ./src/main/charts/bamboo-agent\n    helm upgrade --install bamboo-agent ./src/main/charts/bamboo-agent -n atlassian \\\n                 --set agent.server=bamboo.atlassian.svc.cluster.local \\\n                 --set agent.resources.container.requests.cpu=20m \\\n                 --set agent.resources.container.requests.memory=10Mi \\\n                ${OPENSHIFT_VALUES} \\\n                ${AGENT_OVERRIDES} \\\n                --wait --timeout=180s \\\n                --debug || {\n      echo \"[ERROR]: Bamboo agent deployment failed.\"\n      echo \"[DEBUG]: Bamboo agent pods:\"\n      kubectl get pods -n atlassian -l app.kubernetes.io/name=bamboo-agent -o wide 2>/dev/null || true\n      echo \"[DEBUG]: Bamboo agent pod describe:\"\n      kubectl describe pods -n atlassian -l app.kubernetes.io/name=bamboo-agent 2>/dev/null || true\n      echo \"[DEBUG]: Bamboo agent container logs (last 500 lines):\"\n      for pod in $(kubectl get pods -n atlassian -l app.kubernetes.io/name=bamboo-agent --no-headers -o custom-columns=\":metadata.name\" 2>/dev/null); do\n        echo \"--- Logs from ${pod} ---\"\n        kubectl logs \"${pod}\" -n atlassian --tail=500 2>/dev/null || true\n      done\n      echo \"[DEBUG]: Bamboo server container logs (last 500 lines):\"\n      for pod in $(kubectl get pods -n atlassian -l app.kubernetes.io/name=bamboo --no-headers -o custom-columns=\":metadata.name\" 2>/dev/null); do\n        echo \"--- Logs from ${pod} ---\"\n        kubectl logs \"${pod}\" -n atlassian --tail=500 2>/dev/null || true\n      done\n      echo \"[DEBUG]: Events in atlassian namespace (last 50):\"\n      kubectl get events -n atlassian --sort-by='.lastTimestamp' 2>/dev/null | tail -50 || true\n      exit 1\n    }\n  fi\n\n  # Deploy Bitbucket Mirror in KinD only. MicroShift can't handle too many pods/processes\n  if [ \"${DC_APP}\" == \"bitbucket\" ] && [ -z \"${OPENSHIFT_VALUES}\" ]; then\n    echo \"[INFO]: Deploying Bitbucket Mirror...\"\n    helm upgrade --install bitbucket-mirror ./src/main/charts/${DC_APP} \\\n                 --set bitbucket.applicationMode=\"mirror\" \\\n                 --set bitbucket.mirror.upstreamUrl=\"http://bitbucket\" \\\n                 --set ingress.host=\"bitbucket-mirror\" \\\n                 --set ingress.https=\"false\" \\\n                 --set monitoring.exposeJmxMetrics=\"true\" \\\n                 --set bitbucket.readinessProbe.enabled=\"false\" \\\n                 --set bitbucket.resources.container.requests.cpu=\"20m\" \\\n                 --set bitbucket.resources.container.requests.memory=\"10Mi\" \\\n                 ${OPENSHIFT_VALUES} \\\n                 --wait --timeout=360s --debug \\\n                 -n atlassian\n  fi\n}\n\n# Resolve the routing hostname based on the deployment environment.\n#\n# - KinD: Envoy Gateway proxy is exposed via NodePort(30080) -> hostPort(80)\n#         and the workflow adds /etc/hosts so dc-app.test resolves locally.\n# - OpenShift/MicroShift: Envoy proxy is exposed via an OpenShift Route on the\n#         CRC apps domain.\nget_routing_hostname() {\n  if [ -n \"${OPENSHIFT_VALUES}\" ]; then\n    echo \"atlassian.apps.crc.testing\"\n  else\n    echo \"dc-app.test\"\n  fi\n}\n\n# Wait for Bamboo server's unattended setup wizard to complete.\n# Bamboo 12+ uses absolute redirects during setup, which prevents the agent from\n# triggering setup advancement (unlike Bamboo 11 which used relative redirects).\n# We poll GET / — during setup it redirects to /bootstrap/selectSetupStep.action,\n# after setup it redirects to /userlogin.action. Following the redirect chain\n# during setup triggers the wizard to advance to the next step.\nwait_for_bamboo_setup() {\n  echo \"[INFO]: Waiting for Bamboo server unattended setup to complete...\"\n\n  SETUP_HOSTNAME=$(get_routing_hostname)\n  SETUP_TIMEOUT=300\n  SETUP_ELAPSED=0\n  while [ ${SETUP_ELAPSED} -lt ${SETUP_TIMEOUT} ]; do\n    RESPONSE=$(curl -s -o /dev/null -w \"%{http_code}|%{redirect_url}\" --max-redirs 0 \"http://${SETUP_HOSTNAME}/\" 2>/dev/null || echo \"000|\")\n    HTTP_CODE=$(echo \"$RESPONSE\" | cut -d'|' -f1)\n    REDIRECT_URL=$(echo \"$RESPONSE\" | cut -d'|' -f2)\n\n    if echo \"${REDIRECT_URL}\" | grep -q \"bootstrap\\|setup\"; then\n      curl -s -o /dev/null -L --max-redirs 10 \"http://${SETUP_HOSTNAME}/\" 2>/dev/null || true\n      echo \"[INFO]: Bamboo setup in progress (HTTP ${HTTP_CODE} → ${REDIRECT_URL}). Triggering setup... (${SETUP_ELAPSED}s/${SETUP_TIMEOUT}s)\"\n    elif [ \"${HTTP_CODE}\" = \"302\" ] && echo \"${REDIRECT_URL}\" | grep -q \"userlogin\"; then\n      echo \"[INFO]: Bamboo server setup complete (redirecting to login page)\"\n      return 0\n    elif [ \"${HTTP_CODE}\" = \"000\" ]; then\n      echo \"[INFO]: Bamboo server not reachable yet. Waiting... (${SETUP_ELAPSED}s/${SETUP_TIMEOUT}s)\"\n    else\n      echo \"[INFO]: Bamboo server responded with HTTP ${HTTP_CODE}. Waiting... (${SETUP_ELAPSED}s/${SETUP_TIMEOUT}s)\"\n    fi\n\n    sleep 10\n    SETUP_ELAPSED=$((SETUP_ELAPSED + 10))\n  done\n\n  echo \"[WARNING]: Bamboo setup did not complete within ${SETUP_TIMEOUT}s. Proceeding with agent deployment anyway.\"\n  curl -v -s -L --max-redirs 10 \"http://${SETUP_HOSTNAME}/\" 2>&1 || true\n}\n\nverify_gateway_ingress() {\n  STATUS_ENDPOINT_PATH=\"status\"\n  if [ ${DC_APP} == \"bamboo\" ]; then\n    STATUS_ENDPOINT_PATH=\"rest/api/latest/status\"\n  elif [ ${DC_APP} == \"crowd\" ]; then\n    STATUS_ENDPOINT_PATH=\"crowd/status\"\n  fi\n\n  echo \"[INFO]: Checking ${DC_APP} status via Gateway API\"\n\n  wait_for \"HTTPRoute ${DC_APP}\" 60 2 kubectl get httproute/${DC_APP} -n atlassian || {\n    echo \"[ERROR]: HTTPRoute ${DC_APP} not found in atlassian namespace\"\n    kubectl get httproute -n atlassian || true\n    exit 1\n  }\n\n  HOSTNAME=$(get_routing_hostname)\n  STATUS_URL=\"http://${HOSTNAME}/${STATUS_ENDPOINT_PATH}\"\n\n  wait_for \"${DC_APP} HTTP 200 via Gateway\" 120 10 \\\n    check_http_200 \"${STATUS_URL}\" || {\n    echo \"[ERROR]: ${DC_APP} did not return HTTP 200 via Gateway\"\n    curl -v \"${STATUS_URL}\"\n    exit 1\n  }\n\n  echo \"[INFO]: ${DC_APP} responded successfully via Gateway\"\n  curl -s \"${STATUS_URL}\"\n  echo -e \"\\n\"\n}\n\nverify_metrics() {\n  METRICS_DEFAULT_PORT=\"9999\"\n  METRICS_DEFAULT_PATH=\"/metrics\"\n\n  DC_PODS=($(kubectl get pods -n atlassian -l=app.kubernetes.io/name=${DC_APP} --no-headers -o custom-columns=\":metadata.name\"))\n  for POD in \"${DC_PODS[@]}\"; do\n    echo \"[INFO]: Checking metrics in pod: atlassian/${POD}\"\n    STATUS=$(kubectl --request-timeout=30s exec \"${POD}\" -c ${DC_APP} -n atlassian -- curl -s -o /dev/null -w '%{http_code}' http://localhost:${METRICS_DEFAULT_PORT}${METRICS_DEFAULT_PATH})\n    if [ $STATUS -ne 200 ]; then\n      echo \"[ERROR]: Status code is ${STATUS}\"\n      exit 1\n    fi\n  done\n\n  kubectl --request-timeout=30s exec ${DC_APP}-0 -c ${DC_APP} -n atlassian -- curl -s http://localhost:${METRICS_DEFAULT_PORT}${METRICS_DEFAULT_PATH} | grep jvm_classes_currently_loaded\n  if [ $? -ne 0 ]; then\n    echo \"[ERROR]: Failed to find jvm_classes_currently_loaded metric\"\n    exit 1\n  fi\n}\n\nverify_dashboards() {\n  echo \"[INFO]: Verifying ConfigMaps with Grafana dashboards\"\n  if [ ${DC_APP} != \"bitbucket\" ]; then\n    PRUNE_MESH_DASHBOARDS=\"-name 'bitbucket-mesh' -prune -o\"\n  fi\n  DASHBOARDS_COUNT=$(find src/main/charts/\"${DC_APP}\"/grafana-dashboards ${PRUNE_MESH_DASHBOARDS} -type f -print | wc -l)\n  CONFIGMAPS_COUNT=$(kubectl get cm -l=grafana_dashboard=dc_monitoring -n atlassian --no-headers -o custom-columns=\":metadata.name\" | wc -l)\n  if [ \"${DASHBOARDS_COUNT}\" -ne \"${CONFIGMAPS_COUNT}\" ]; then\n    echo \"[ERROR]: Count does not match! Dashboards count is ${DASHBOARDS_COUNT}, configmaps count is ${CONFIGMAPS_COUNT}\"\n    echo -e \"[ERROR]: ConfigMaps with grafana_dashboard=dc_monitoring label in atlassian namespace:\\n\"\n    kubectl get cm -l=grafana_dashboard=dc_monitoring -n atlassian --no-headers -o custom-columns=\":metadata.name\"\n    exit 1\n  fi\n\n  DASHBOARDS=($(find src/main/charts/\"${DC_APP}\"/grafana-dashboards -name 'bitbucket-mesh' -prune -o -type f -print))\n  for dashboard in \"${DASHBOARDS[@]}\"; do\n    echo \"[INFO]: Comparing $dashboard with its respective ConfigMap\"\n    dashboard_json=$(cat \"${dashboard}\")\n    file_name=$(basename \"${dashboard}\" |cut -d '.' -f 1)\n    cm_data=$(kubectl get cm/\"${DC_APP}\"-\"${file_name}\"-dashboard -n atlassian -o jsonpath=\"{.data.${DC_APP}-atlassian-${file_name}\\.json}\")\n    if [ \"${dashboard_json}\" != \"${cm_data}\" ]; then\n        echo \"[ERROR]: ConfigMap ${DC_APP}-${file_name}-dashboard data isn't identical to ${file_name}.json\"\n        echo \"******************************************************************\"\n        echo -e \"JSON:\\n\"\n        cat \"${dashboard}\"\n        echo \"******************************************************************\"\n        echo -e \"ConfigMap:\\n\"\n        echo \"${cm_data}\"\n        exit 1\n    fi\n  done\n}\n\nverify_openshift_analytics() {\n  echo \"[INFO]: Verifying analytics.json with Openshift on\"\n  run_on_openshift_entry=$(kubectl get cm ${DC_APP}-helm-values -n atlassian -o jsonpath='{.data.analytics\\.json}' | jq -r '.isRunOnOpenshift')\n  echo $run_on_openshift_entry\n  if [[ $run_on_openshift_entry != \"true\" ]]; then\n    echo \"[ERROR]: Analytics.json does not have isRunOnOpenshift as true.\"\n    exit 1\n  fi\n}\n\nverify_opensearch() {\n  # Only Jira and Bitbucket use OpenSearch in KinD tests\n  if [ \"${DC_APP}\" != \"jira\" ] && [ \"${DC_APP}\" != \"bitbucket\" ]; then\n    echo \"[INFO]: OpenSearch verification is not applicable for ${DC_APP}, skipping\"\n    return 0\n  fi\n\n  # OpenSearch is disabled on MicroShift/OpenShift\n  if [ -n \"${OPENSHIFT_VALUES:-}\" ]; then\n    echo \"[INFO]: OpenSearch is disabled on OpenShift, skipping verification\"\n    return 0\n  fi\n\n  echo \"[INFO]: Verifying OpenSearch is being used by ${DC_APP}\"\n\n  OS_POD=\"opensearch-cluster-master-0\"\n  RETRIES=12\n  SLEEP_INTERVAL=5\n\n  # Retrieve OpenSearch admin password from the Kubernetes secret\n  OS_PASSWORD=$(kubectl get secret opensearch-initial-password -n atlassian -o jsonpath='{.data.OPENSEARCH_INITIAL_ADMIN_PASSWORD}' | base64 -d)\n  if [ -z \"${OS_PASSWORD}\" ]; then\n    echo \"[ERROR]: Failed to retrieve OpenSearch admin password from secret 'opensearch-initial-password'\"\n    exit 1\n  fi\n  OS_CURL_AUTH=\"admin:${OS_PASSWORD}\"\n\n  # First, wait for the OpenSearch pod to be ready\n  echo \"[INFO]: Waiting for OpenSearch pod to be ready\"\n  kubectl wait --for=condition=ready pod/${OS_POD} -n atlassian --timeout=300s || {\n    echo \"[ERROR]: OpenSearch pod ${OS_POD} did not become ready\"\n    kubectl describe pod/${OS_POD} -n atlassian || true\n    exit 1\n  }\n\n  for i in $(seq 1 ${RETRIES}); do\n    INDICES=$(kubectl exec -n atlassian ${OS_POD} -- \\\n      curl -s -u \"${OS_CURL_AUTH}\" http://localhost:9200/_cat/indices?format=json 2>/dev/null) || true\n\n    if [ -z \"${INDICES}\" ] || [ \"${INDICES}\" = \"null\" ]; then\n      echo \"[INFO]: OpenSearch returned empty response, retrying... (${i}/${RETRIES})\"\n      sleep ${SLEEP_INTERVAL}\n      continue\n    fi\n\n    if [ \"${DC_APP}\" = \"bitbucket\" ]; then\n      # Bitbucket creates a 'bitbucket-index-version' index with exactly 1 document\n      DOC_COUNT=$(echo \"${INDICES}\" | jq -r '[.[] | select(.index == \"bitbucket-index-version\")] | .[0] | .[\"docs.count\"] // empty' 2>/dev/null) || true\n      if [ -n \"${DOC_COUNT}\" ] && [ \"${DOC_COUNT}\" = \"1\" ]; then\n        echo \"[INFO]: OpenSearch verification passed for Bitbucket: bitbucket-index-version has docs.count=${DOC_COUNT}\"\n        return 0\n      fi\n      echo \"[INFO]: Waiting for Bitbucket to create index in OpenSearch... (${i}/${RETRIES})\"\n\n    elif [ \"${DC_APP}\" = \"jira\" ]; then\n      # Jira creates a 'jira-issues-*' index on startup; on a fresh instance it will have 0 documents\n      INDEX_EXISTS=$(echo \"${INDICES}\" | jq -r '[.[] | select(.index | test(\"^jira-issues-\"))] | length' 2>/dev/null) || true\n      if [ -n \"${INDEX_EXISTS}\" ] && [ \"${INDEX_EXISTS}\" != \"0\" ]; then\n        DOC_COUNT=$(echo \"${INDICES}\" | jq -r '[.[] | select(.index | test(\"^jira-issues-\"))] | .[0] | .[\"docs.count\"] // \"0\"' 2>/dev/null) || true\n        echo \"[INFO]: OpenSearch verification passed for Jira: jira-issues index exists (docs.count=${DOC_COUNT})\"\n        return 0\n      fi\n      echo \"[INFO]: Waiting for Jira to create index in OpenSearch... (${i}/${RETRIES})\"\n    fi\n\n    sleep ${SLEEP_INTERVAL}\n  done\n\n  echo \"[ERROR]: OpenSearch verification failed for ${DC_APP} after $((RETRIES * SLEEP_INTERVAL)) seconds\"\n  echo \"[DEBUG]: OpenSearch indices:\"\n  kubectl exec -n atlassian ${OS_POD} -- curl -s -u \"${OS_CURL_AUTH}\" http://localhost:9200/_cat/indices?format=json 2>/dev/null | jq . || true\n  echo \"[DEBUG]: OpenSearch cluster health:\"\n  kubectl exec -n atlassian ${OS_POD} -- curl -s -u \"${OS_CURL_AUTH}\" http://localhost:9200/_cat/health 2>/dev/null || true\n  echo \"[DEBUG]: ${DC_APP} pod logs (last 200 lines):\"\n  for pod in $(kubectl get pods -n atlassian -l app.kubernetes.io/name=${DC_APP} --no-headers -o custom-columns=\":metadata.name\" 2>/dev/null); do\n    echo \"--- Logs from ${pod} ---\"\n    kubectl logs \"${pod}\" -n atlassian --tail=200 2>/dev/null || true\n  done\n  exit 1\n}\n\nverify_gateway() {\n  echo \"[INFO]: Verifying HTTPRoute resource for ${DC_APP}\"\n  if ! kubectl get httproute/${DC_APP} -n atlassian >/dev/null 2>&1; then\n    echo \"[ERROR]: HTTPRoute ${DC_APP} not found in atlassian namespace\"\n    kubectl get httproute -n atlassian || true\n    exit 1\n  fi\n\n  echo \"[INFO]: Checking HTTPRoute status\"\n\n  # Wait on Gateway API parent conditions (Envoy Gateway reports conditions under\n  # `.status.parents[*].conditions`). Use a JSONPath filter by type.\n  # Note: Don't escape the double-quotes inside the single-quoted JSONPath.\n\n  kubectl wait \\\n    --for=jsonpath='{.status.parents[0].conditions[?(@.type==\"Accepted\")].status}'=True \\\n    httproute/${DC_APP} -n atlassian --timeout=180s || {\n      echo \"[ERROR]: HTTPRoute not accepted\"\n      echo \"[DEBUG]: HTTPRoute status (YAML)\"\n      kubectl get httproute/${DC_APP} -n atlassian -o yaml | sed -n '/^status:/,$p' || true\n      echo \"[DEBUG]: HTTPRoute status.parents (JSON)\"\n      kubectl get httproute/${DC_APP} -n atlassian -o json | jq '.status.parents' || true\n      echo \"[DEBUG]: Gateway status (YAML)\"\n      kubectl get gateway/atlassian-gateway -n atlassian -o yaml | sed -n '/^status:/,$p' || true\n      echo \"[DEBUG]: Envoy Gateway deployments/pods\"\n      kubectl get deployments -n envoy-gateway-system -o wide || true\n      kubectl get pods -n envoy-gateway-system -o wide || true\n      kubectl describe httproute/${DC_APP} -n atlassian\n      exit 1\n    }\n\n  kubectl wait \\\n    --for=jsonpath='{.status.parents[0].conditions[?(@.type==\"ResolvedRefs\")].status}'=True \\\n    httproute/${DC_APP} -n atlassian --timeout=180s || {\n      echo \"[ERROR]: HTTPRoute ResolvedRefs condition not met\"\n      echo \"[DEBUG]: HTTPRoute status.parents (JSON)\"\n      kubectl get httproute/${DC_APP} -n atlassian -o json | jq '.status.parents' || true\n      kubectl describe httproute/${DC_APP} -n atlassian\n      exit 1\n    }\n\n  echo \"[INFO]: HTTPRoute is Accepted and ResolvedRefs verified\"\n\n  echo \"[INFO]: Verifying Gateway attachment\"\n  GATEWAY_NAME=$(kubectl get httproute/${DC_APP} -n atlassian -o jsonpath='{.spec.parentRefs[0].name}')\n  echo \"[INFO]: HTTPRoute attached to Gateway: ${GATEWAY_NAME}\"\n\n  if [ -z \"${GATEWAY_NAME}\" ]; then\n    echo \"[ERROR]: No Gateway referenced in HTTPRoute\"\n    exit 1\n  fi\n\n  echo \"[INFO]: Checking Gateway status\"\n  kubectl get gateway/${GATEWAY_NAME} -n atlassian -o yaml\n\n  # Verify hostnames are configured\n  HOSTNAMES=$(kubectl get httproute/${DC_APP} -n atlassian -o jsonpath='{.spec.hostnames[*]}')\n  echo \"[INFO]: HTTPRoute hostnames: ${HOSTNAMES}\"\n\n  if [ -z \"${HOSTNAMES}\" ]; then\n    echo \"[ERROR]: No hostnames configured on HTTPRoute\"\n    exit 1\n  fi\n\n  echo \"[INFO]: Gateway API verification complete for ${DC_APP}\"\n}\n\n# create 2 NodePort services to expose each DC pod, required for functional tests\n# where communication between nodes and cache replication is tested\ncreate_backdoor_services() {\n  TMP_DIR=$(mktemp -d)\n  echo \"Copying svc template file to ${TMP_DIR}\"\n  cp src/test/config/kind/backdoor-svc.yaml ${TMP_DIR}/backdoor-svc.yaml\n  if [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n    SED_COMMAND=\"sed -i ''\"\n  else\n    SED_COMMAND=\"sed -i\"\n  fi\n  ${SED_COMMAND} \"s/DC_APP_REPLACEME/${DC_APP}/g\" ${TMP_DIR}/backdoor-svc.yaml\n  echo \"[INFO]: Creating NodePort (30008 and 30009) services for each ${DC_APP} dc node\"\n  kubectl apply -f ${TMP_DIR}/backdoor-svc.yaml\n}\n"
  },
  {
    "path": "src/test/scripts/product_versions.py",
    "content": "import json\nimport os\nimport re\nimport sys\nimport urllib.request\nfrom base64 import b64encode\nimport xml.etree.ElementTree as et\n\nknown_supported_version = {\n\t'bitbucket': '7.21.0',\n\t'jira-software': '8.13.8',\n\t'confluence': '7.12.2',\n\t'stash': '7.12.1',\n\t'mesh': '2.0.1',\n\t'bamboo': '8.1.1'  # Bamboo has no LTS versions.\n}\n\n# If tag suffix is desired - e.g. 7.8.0-jdk11 -> tag_suffix = \"-jdk11\"\ntag_suffix = \"\"\n\n\ndef get_lts_version(argv):\n\tproduct = argv[0].lower()\n\tif product == 'jira':\n\t\tproduct = 'jira-software'\n\telif product == 'bitbucket':\n\t\tproduct = 'stash'\n\tif product == 'mesh':\n\t\targv[0] = 'stash'\n\t\tstash_version = get_lts_version(argv)\n\t\tpom_url = (f\"https://maven.artifacts.atlassian.com/com/atlassian/bitbucket/server/bitbucket-parent/{stash_version}/\"\n\t\t\t\t   f\"bitbucket-parent-{stash_version}.pom\")\n\t\tusername = os.getenv(\"ARTIFACTORY_BOT_USERNAME\")\n\t\tpassword = os.getenv(\"ARTIFACTORY_BOT_PASSWORD\")\n\t\tcredentials = f\"{username}:{password}\"\n\t\tencoded_credentials = b64encode(credentials.encode('utf-8')).decode('utf-8')\n\t\theaders = {\"Authorization\": f\"Basic {encoded_credentials}\"}\n\n\t\ttry:\n\t\t\treq = urllib.request.Request(pom_url, headers=headers)\n\t\t\tresponse = urllib.request.urlopen(req)\n\t\t\tredirect_url = response.url\n\t\t\tresponse = urllib.request.urlopen(redirect_url)\n\t\t\tpom_content = response.read().decode('utf-8')\n\t\t\troot = et.fromstring(pom_content)\n\t\t\tnamespace = {'maven': 'http://maven.apache.org/POM/4.0.0'}\n\t\t\tmesh_version = root.find('.//maven:atl.mesh.libversion', namespace)\n\n\t\t\tif mesh_version is not None:\n\t\t\t\treturn mesh_version.text\n\t\t\telse:\n\t\t\t\tprint(\"Failed to get mesh version\")\n\t\t\t\treturn None\n\t\texcept Exception as e:\n\t\t\tprint(f\"Error fetching or parsing POM: {e}\")\n\t\t\tsys.exit(1)\n\n\tif product in known_supported_version:\n\t\turl_archived = f\"https://my.atlassian.com/download/feeds/archived/{product}.json\"\n\t\turl_current = f\"https://my.atlassian.com/download/feeds/current/{product}.json\"\n\n\t\ttry:\n\t\t\t# load archived feeds\n\t\t\tarchive_feeds = urllib.request.urlopen(url_archived).read()\n\t\t\tfeeds = loadJSON(archive_feeds)\n\n\t\t\t# load current feeds and append to archive\n\t\t\tcurrent_feeds = urllib.request.urlopen(url_current).read()\n\t\t\tfeeds += loadJSON(current_feeds)\n\n\t\t\t# Get the latest non-lts version if the second arg is provided\n\t\t\tif len(argv) > 1:\n\t\t\t    fetch_latest = argv[1].lower()\n\t\t\t    sortedVersions = sorted(feeds, key=lambda k:cversion(k['version']), reverse=True)\n\t\t\telse:\n\t\t\t\t# Filter all LTS versions and sort based on version\n\t\t\t\tlts_versions = [x for x in feeds if x['edition'].lower() == 'enterprise']\n\t\t\t\tsortedVersions = sorted(lts_versions, key=lambda k:cversion(k['version']), reverse=True)\n\n\t\t\tif len(sortedVersions) > 0:\n\t\t\t\t# Pick the latest LTS product version\n\t\t\t\tlts_version = sortedVersions[0]['version']\n\t\t\telse:\n\t\t\t\tlts_version = known_supported_version[product]\n\n\t\t\t# Currently, latest lts version of Bitbucket and Confluence don't support K8s\n\t\t\t# We use non-lts version of those products in the test\n\t\t\tif cversion(lts_version) < cversion(known_supported_version[product]):\n\t\t\t\tlts_version = known_supported_version[product]\n\t\texcept:\n\t\t\tlts_version = known_supported_version[product]\n\n\t\tlts_version = f\"{lts_version}{tag_suffix}\"\n\telse:\n\t\tlts_version = 'unknown'\n\n\treturn lts_version\n\n\ndef loadJSON(fdata):\n\tresult = re.search(\"\\[.*\\]\", fdata.decode(\"utf-8\"))\n\tif result is None:\n\t\treturn []\n\treturn json.loads(result.group(0))\n\n\ndef cversion(version):\n\t# This method converts the version to a unified string to be used to sort and compare versions correctly\n\t# E.g: '7.12.1' => '00007000120000100000'\n\t#      '7.3.19' => '00007000030001900000'\n\tvers = version.split(\".\")\n\tmapped_ver = ''\n\tfor i in range(max(len(vers)-1, 4)):\n\t\tif len(vers) > i:\n\t\t\t# Add zero on left side of version part and make a fixed size of 5 for each part\n\t\t\tmapped_ver += vers[i].zfill(5)\n\t\telse:\n\t\t\t# Add '00000' if build/patch/minor part of version are missing\n\t\t\tmapped_ver += '00000'\n\treturn mapped_ver\n\n\nif __name__ == \"__main__\":\n\tif len(sys.argv) > 1:\n\t\tget_lts_version(sys.argv[1:])\n"
  },
  {
    "path": "src/test/scripts/shared_home_browser_install.sh",
    "content": "#!/usr/bin/env bash\n\nset -x\nset -e\n\ncd \"$(dirname \"$0\")\" || exit 1\nTARGET_NAMESPACE=$1\n\necho Starting shared home browser...\nkubectl apply -n \"${TARGET_NAMESPACE}\" -f \"./../../../target/config/shared-home/shared-home-browser.yaml\"\nkubectl wait -n \"${TARGET_NAMESPACE}\" --for=condition=Ready pod/shared-home-browser --timeout 900s\n"
  },
  {
    "path": "src/test/scripts/start_nfs_server.sh",
    "content": "#!/usr/bin/env bash\n\nset -euo pipefail\n\nBASEDIR=$(dirname \"$0\")\n\nif [ \"$#\" -ne 2 ]; then\n  echo \"We need 2 parameters for the script - kubernetes namespace and helm release name\"\nfi\n\nTARGET_NAMESPACE=$1\nPRODUCT_RELEASE_NAME=$2\n\necho Deleting old NFS resources...\nhelm uninstall -n \"$TARGET_NAMESPACE\" \"$PRODUCT_RELEASE_NAME-nfs\" 2>/dev/null || true\nkubectl delete -n \"$TARGET_NAMESPACE\" pvc -l \"app.kubernetes.io/instance=$PRODUCT_RELEASE_NAME-nfs\" --ignore-not-found=true 2>/dev/null || true\n\necho Starting NFS deployment...\nhelm install -n \"$TARGET_NAMESPACE\" \"$PRODUCT_RELEASE_NAME-nfs\" \"$BASEDIR/../infrastructure/nfs-server\" --debug --wait --timeout 15m\n\necho NFS server is up and running.\n"
  },
  {
    "path": "src/test/scripts/update_versions.py",
    "content": "import json\nimport logging\nimport urllib.request\n\nimport requests\nimport yaml\n\nimport product_versions\n\n# USER_AGENT constant for marketplace API calls\nUSER_AGENT = \"Mozilla_dc_core_eng\"\n\n\"\"\"\nThis script is used to update the product versions in the helm charts descriptors (Chart.yaml).\nIt fetches the latest available version (LTS for products with LTS) from marketplace and updates the required\ntag in the product chart. It also updates expected output for the product.\n\nScript is currently executed manually and is in a fairly rough shape. \n\"\"\"\n\nlogging.basicConfig(level=logging.INFO, format=\"%(levelname).1s %(message)s\")\n\nproducts = [\"bitbucket\", \"jira\", \"bamboo\", \"confluence\", \"crowd\"]\ntag_suffix = \"\"\nlts_products = [\"bitbucket\", \"jira\", \"confluence\"]\n\n\ndef update_versions(product_to_update, new_version):\n    products_to_update = [product_to_update]\n    if product == 'bamboo':\n        products_to_update.append(\"bamboo-agent\")\n\n    chart_files = [f'../../main/charts/{p}/Chart.yaml' for p in products_to_update]\n\n    for chart_file in chart_files:\n        with open(chart_file, \"r\") as stream:\n            content = stream.read()\n            doc = yaml.safe_load(content)\n            current_version = doc['appVersion']\n            logging.info(\"Current version: %s\", current_version)\n\n        new_content = content.replace(current_version, new_version)\n\n        with open(chart_file, \"w\") as stream:\n            stream.write(new_content)\n            logging.info(\"Updated product chart: %s\", chart_file)\n\n    update_expected_output(products_to_update, new_version)\n\n\ndef update_expected_output(products_to_update, new_version):\n    output_files = [f'../resources/expected_helm_output/{p}/output.yaml' for p in products_to_update]\n    for output_file in output_files:\n        with open(output_file, \"r\") as stream:\n            content = stream.read()\n\n        old_version = list(yaml.safe_load_all(content))[0]['metadata']['labels']['app.kubernetes.io/version']\n        new_content = content.replace(old_version, f\"{new_version}\")\n\n        with open(output_file, \"w\") as stream:\n            stream.write(new_content)\n        logging.info('Updated expected output file: %s', output_file)\n\n\ndef product_versions_marketplace(product_key):\n    mac_url = 'https://marketplace.atlassian.com'\n    request_url = f'/rest/2/products/key/{product_key}/versions'\n    params = {'offset': 0, 'limit': 50}\n    versions = set()\n    page = 1\n    while True:\n        logging.debug(f'Retrieving Marketplace product versions for {product_key}: page {page}')\n        headers = {'User-Agent': USER_AGENT}\n        r = requests.get(mac_url + request_url, params=params, headers=headers)\n        version_data = r.json()\n        for version in version_data['_embedded']['versions']:\n            if all(d.isdigit() for d in version['name'].split('.')):\n                logging.debug(f\"Adding version {version['name']}\")\n                versions.add(version['name'])\n        if 'next' not in version_data['_links']:\n            break\n        request_url = version_data['_links']['next']['href']\n        page += 1\n        params = {}\n    logging.debug(f'Found {len(versions)} versions')\n    return sorted(list(versions), reverse=True)\n\n\ndef latest_minor(version, mac_versions):\n    major_minor_version = '.'.join(version.split('.')[:2])\n    minor_versions = [v for v in mac_versions\n                      if v.startswith(f'{major_minor_version}.')]\n    minor_versions.sort(key=lambda s: [int(u) for u in s.split('.')])\n    return minor_versions[-1]\n\n\ndef update_mesh_tag():\n    logging.info(\"-------------------------------\")\n    logging.info('- Updating Bitbucket Mesh tag -')\n    logging.info(\"-------------------------------\")\n    mesh_repo = 'atlassian/bitbucket-mesh'\n    new_version = product_versions.get_lts_version(['mesh']).replace(tag_suffix, \"\")\n    bitbucket_values_file = '../../main/charts/bitbucket/values.yaml'\n    expected_bitbucket_output_file = '../resources/expected_helm_output/bitbucket/output.yaml'\n\n    with open(bitbucket_values_file, \"r\") as stream:\n        content = stream.read()\n        doc = yaml.safe_load(content)\n        current_version = doc['bitbucket']['mesh']['image']['tag']\n        logging.info(\"Current version: %s\", current_version)\n        logging.info(\"New version: %s\", new_version)\n\n    new_content = content.replace(current_version, new_version)\n    with open(bitbucket_values_file, \"w\") as stream:\n        stream.write(new_content)\n\n    logging.info('Updated values file: %s', bitbucket_values_file)\n    with open(expected_bitbucket_output_file, \"r\") as file:\n        file_contents = file.read()\n\n    modified_contents = file_contents.replace(current_version, new_version)\n    logging.info('Updated expected output file: %s', expected_bitbucket_output_file)\n    with open(expected_bitbucket_output_file, 'w') as file:\n        file.write(modified_contents)\n\n\nlogging.info(\"Updating product versions in helm charts\")\nfor product in products:\n    logging.info(\"-------------------------\")\n    logging.info(\"Product: %s\", product)\n\n    if product in lts_products:\n        version = product_versions.get_lts_version([product]).replace(tag_suffix, \"\")\n        logging.info(\"Latest LTS version: %s\", version)\n    else:\n        logging.info(\"Non-LTS product\")\n        headers = {'User-Agent': USER_AGENT}\n        r = requests.get(f'https://marketplace.atlassian.com/rest/2/products/key/{product}/versions/latest', headers=headers)\n        version = r.json()['name']\n\n    new_version_tag = f\"{version}{tag_suffix}\"\n    logging.info(f\"Latest version: %s, tagname: {version}{tag_suffix}\", version)\n    update_versions(product, new_version_tag)\n\nupdate_mesh_tag()\nlogging.info(\">>>> ATTENTION - Don't forget to update the product Changelogs.md - ATTENTION <<<<\")\n"
  }
]